[ 엄밀히 말하면 AWS에만 해당하는 내용은 아닙니다 ]

 

SSL (Secure Sockets Layer)

📌 클라이언트(웹 브라우저)와 서버 간의 데이터를 암호화하여 전송하는 보안 프로토콜입니다.

  • 이를 통해 전송 중인 데이터가 도청, 위조, 변조되는 것을 방지합니다. 현재 SSL은 발전된 형태인 **TLS (Transport Layer Security)**로 대체되었지만, 여전히 SSL이라는 용어가 널리 사용되고 있습니다.

SSL의 주요 특징

  1. 데이터 암호화
    • 클라이언트와 서버 간에 주고받는 데이터가 암호화되어, 도청 및 데이터 유출을 방지.
  2. 인증
    • SSL 인증서를 통해 서버의 신뢰성을 검증.
    • 브라우저는 SSL 인증서를 확인하고, 클라이언트와 안전한 연결을 설정.
  3. 데이터 무결성
    • 전송 중 데이터가 변조되지 않았는지 확인.

SSL의 동작 방식

  1. SSL 핸드셰이크:
    클라이언트와 서버 간 안전한 연결을 설정하는 초기 과정.
    • 클라이언트가 서버에 연결 요청을 보냄.
    • 서버가 SSL 인증서를 클라이언트에 전달.
    • 클라이언트가 인증서를 검증 후 대칭 키를 생성.
    • 이후 암호화된 데이터 전송 시작.
  2. 데이터 암호화:
    • SSL은 대칭 키 암호화(빠르고 효율적)를 사용해 데이터를 암호화.
    • 핸드셰이크 과정에서는 공개 키 암호화(비대칭 키)를 사용.

SSL의 주요 사용 사례

  1. 웹사이트 보안 (HTTPS)
    • HTTPS는 HTTP에 SSL/TLS를 추가하여 데이터를 암호화.
    • 브라우저 주소창에 자물쇠 아이콘과 "https://"로 표시.
  2. 전자 상거래 사이트
    • 온라인 결제 정보(신용카드, 개인정보) 보호.
  3. 이메일 및 채팅 서비스
    • 이메일 전송 및 실시간 채팅의 보안 강화.
  4. VPN 및 데이터 전송
    • 원격 서버와의 안전한 연결 및 데이터 전송.

SSL 인증서

  1. SSL 인증서란?
    • 서버가 신뢰할 수 있는 기관(CA, 인증 기관)에서 발급받는 디지털 인증서.
    • 클라이언트는 이 인증서를 통해 서버의 신원을 확인하고, 안전한 연결을 설정.
  2. SSL 인증서의 유형
    • 도메인 검증(DV): 도메인의 소유권만 인증.
    • 조직 검증(OV): 도메인 소유권과 조직 정보를 인증.
    • 확장 검증(EV): 엄격한 검증 과정을 거쳐 발급되며, 주소창에 회사 이름이 표시됨.

SSL과 TLS의 차이

   SSL TLS
현재 상태 더 이상 업데이트되지 않음 SSL을 대체한 최신 프로토콜
보안 수준 상대적으로 낮음 향상된 보안 기능 제공
이용 사례 예전 시스템에서 일부 사용 현재 HTTPS와 대부분의 애플리케이션

SSL의 장단점

장점 단점
데이터를 암호화해 도청 및 변조 방지 SSL 인증서 발급 및 유지에 추가 비용 발생
신뢰할 수 있는 인증서를 통해 사용자 신뢰 확보 초기 연결(SSL 핸드셰이크)에서 약간의 지연 발생
HTTPS를 통해 검색엔진 최적화(SEO) 효과 잘못된 설정 시 인증서 오류 발생 가능

쉽게 이해하기

**SSL은 웹사이트와 사용자 간의 "비밀 통로"**를 만드는 기술입니다.
이 통로를 통해 데이터를 주고받을 때, 도청이나 해킹 걱정 없이 안전하게 사용할 수 있습니다.


추가 정보

  1. HTTPS의 중요성
    • HTTPS를 적용하면 사용자의 개인정보(로그인 정보, 결제 정보 등)를 안전하게 보호.
    • Google은 HTTPS를 사용하는 웹사이트에 대해 SEO 순위를 높게 평가.
  2. SSL 인증서 설치 과정
    • 도메인 구매 → 인증서 신청 → 인증서 설치 → 브라우저와 안전한 연결 설정.

[ SSL 과 SSH의 연관성 ]

더보기

네, SSL(Secure Sockets Layer)과 SSH(Secure Shell)는 서로 다른 목적으로 설계된 보안 프로토콜로, 관련이 없습니다. 하지만 둘 다 네트워크 보안을 강화하는 역할을 한다는 공통점은 있습니다. = 관련 없다.


SSL (Secure Sockets Layer)

  • 목적:
    웹 브라우저와 서버 간의 데이터 전송을 암호화하여 통신을 보호.
  • 사용 사례:
    • HTTPS(HTTP over SSL/TLS)로 웹사이트 보안 강화.
    • 사용자와 서버 간의 민감한 데이터(예: 로그인 정보, 결제 정보) 보호.
  • 작동 방식:
    SSL 인증서를 사용하여 서버와 클라이언트 간에 암호화된 통신 채널을 설정.
  • 주요 특징:
    • 데이터 암호화.
    • 데이터 무결성.
    • 서버 인증(클라이언트가 서버를 신뢰할 수 있도록 인증).

SSH (Secure Shell)

  • 목적:
    원격 서버와의 안전한 명령줄 접속 및 파일 전송을 암호화.
  • 사용 사례:
    • 서버 관리(예: EC2에 원격 접속).
    • 안전한 파일 전송(SCP, SFTP).
  • 작동 방식:
    SSH 키 페어(공개 키와 개인 키)를 사용해 서버와 클라이언트 간 암호화된 세션을 설정.
  • 주요 특징:
    • 원격 접속 암호화.
    • 사용자 인증.
    • 데이터 암호화.

주요 차이점

  SSL SSH
목적 웹 브라우저와 서버 간 데이터 전송 보호 원격 서버 접속 및 관리
사용 사례 HTTPS 웹사이트 보안 서버 관리, 파일 전송
암호화 방식 SSL/TLS 인증서를 사용 SSH 키 페어 또는 비밀번호를 사용
작동 계층 애플리케이션 계층(OSI 7계층) 애플리케이션 계층(OSI 7계층)
주요 도구/프로토콜 HTTPS, FTPS SSH, SCP, SFTP

간단히 비교

  • SSL: 웹사이트와 브라우저 간의 데이터 암호화를 위한 것.
  • SSH: 원격 서버와의 안전한 접속을 위한 것.

 

 

TLS (Transport Layer Security)

📌 클라이언트와 서버 간의 데이터를 암호화하여 안전하게 전송하기 위한 보안 프로토콜입니다.

  • SSL(Secure Sockets Layer)의 후속 버전으로, 더 높은 보안성과 성능을 제공합니다.
    오늘날 대부분의 HTTPS 트래픽과 보안 네트워크 연결에 TLS가 사용됩니다.

TLS의 주요 특징

  1. 데이터 암호화
    • 클라이언트와 서버 간 전송되는 데이터를 암호화하여 도청을 방지.
  2. 인증
    • TLS 인증서를 사용해 서버 또는 클라이언트의 신원을 검증하여 신뢰성을 보장.
  3. 데이터 무결성
    • 데이터가 전송 중에 변경되거나 변조되지 않았음을 확인.
  4. SSL 대비 향상된 보안
    • 보다 강력한 암호화 알고리즘과 키 교환 방식을 지원.

TLS의 주요 사용 사례

  1. HTTPS
    • HTTP와 TLS를 결합한 HTTPS는 웹 브라우저와 서버 간 안전한 통신을 제공.
  2. 이메일 보안
    • IMAP, POP3, SMTP 프로토콜과 함께 TLS를 사용해 이메일 데이터 암호화.
  3. VPN 및 원격 액세스
    • TLS를 활용하여 원격 서버와 안전하게 연결.
  4. 애플리케이션 보안
    • 금융 서비스, 전자 상거래, 메신저 등에서 데이터 전송 보호.

TLS의 동작 방식

  1. TLS 핸드셰이크 과정
    클라이언트와 서버 간 보안 연결 설정을 위한 초기 과정.
    • 클라이언트가 서버에 연결 요청.
    • 서버가 TLS 인증서를 전달.
    • 클라이언트가 인증서를 검증.
    • 암호화 키를 교환하여 안전한 세션 시작.
  2. 암호화 방식
    • 대칭 암호화: 세션 데이터 암호화(빠른 데이터 처리).
    • 비대칭 암호화: 핸드셰이크 과정에서 암호화 키 교환.

TLS의 주요 버전

  1. TLS 1.0 (1999)
    • SSL 3.0의 후속 버전으로 출시.
    • 현재는 보안상의 이유로 사용 권장되지 않음.
  2. TLS 1.1 (2006)
    • 보안 개선 및 프로토콜 안정화.
    • 2020년 이후 지원 종료.
  3. TLS 1.2 (2008)
    • 강력한 암호화 및 HMAC 해싱 지원.
    • 현재 대부분의 HTTPS 트래픽에서 사용.
  4. TLS 1.3 (2018)
    • 최신 버전으로, 보안 강화와 성능 최적화.
    • 불필요한 핸드셰이크 과정 제거로 빠른 연결 설정.

TLS의 장단점

장점 단점
데이터 암호화로 도청 및 변조 방지 TLS 인증서 발급 및 유지에 비용이 발생
최신 암호화 알고리즘으로 높은 보안성 제공 초기 핸드셰이크에서 약간의 지연 발생 가능
인증서를 통해 신뢰성과 무결성 보장 잘못된 설정 시 연결 오류 발생 가능
HTTPS, 이메일, VPN 등 다양한 사용 사례 지원 초기 구현 및 유지 관리가 복잡할 수 있음

쉽게 이해하기

  • **TLS는 인터넷 통신의 "비밀 통로"**입니다.
  • 서버와 클라이언트 간에 전송되는 데이터를 암호화하고, 통신이 안전하게 이루어지도록 보장합니다.
  • 현재 HTTPS는 TLS를 사용하여 웹사이트의 보안을 강화하고 있습니다.

TLS 인증서

  • TLS 인증서는 서버가 신뢰할 수 있는 기관(CA, Certificate Authority)에서 발급받아 사용.
  • 클라이언트는 인증서를 통해 서버의 신원을 확인하고, 안전한 연결을 설정.

추가 정보

  1. TLS 1.3의 주요 개선점
    • 불필요한 핸드셰이크 제거로 더 빠른 연결 속도.
    • 오래된 암호화 알고리즘 제거로 보안 강화.
  2. HTTPS를 통한 SEO 향상
    • HTTPS를 적용하면 구글과 같은 검색엔진에서 웹사이트 순위를 높게 평가.

TLS와 관련된 추가 질문이 있다면 언제든 말씀해주세요! 😊

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 

 

📌 

  •  

 

 


 

 

 🐳 

  •  

 

 

 

 🐳 

  •  

 

 

 

 🐳 

  •  

 

 


 

소제목 

🧩 부모 타입 변수 = 자식 타입 객체; 는 자동으로 부모 타입으로 변환이 일어납니다.

 


 

소제목 

🎵 클래스가 설계도라면 추상 클래스는 미완성된 설계도입니다.

분산 시스템의 기본 Scalability vs Availability

 

[1] Scalability (확장성)

 

Scalability는 시스템이 사용자 수, 데이터 양, 처리량이 증가하거나 감소할 때, 성능과 처리 능력을 유지하거나 향상시키는 능력을 말합니다.
즉, **"얼마나 잘 확장할 수 있는가?"**를 측정하는 지표입니다.

Scalability의 주요 특징

  1. 확장 방식
    • 수평 확장 (Horizontal Scaling):
      더 많은 서버나 인스턴스를 추가하여 확장.
      예: EC2 인스턴스를 추가하여 부하 분산.
    • 수직 확장 (Vertical Scaling):
      기존 서버의 리소스(CPU, RAM 등)를 업그레이드.
      예: 더 높은 사양의 EC2 인스턴스로 교체.
  2. 목표
    • 높은 처리량성능 유지.
    • 사용자 증가, 데이터 처리량 증가에 따라 유연하게 대처.
  3. 중요한 설계 요소
    • 무중단 확장 지원.
    • 부하 분산(Load Balancer)과 자동 확장(Auto Scaling) 설정.

예시

  • Scalability가 뛰어난 시스템:
    전자상거래 사이트가 트래픽 급증(블랙프라이데이 등)에도 서버를 추가해 안정적으로 작동.
  • AWS 서비스: Auto Scaling, DynamoDB의 확장성 등.

[2] Availability (가용성)

Availability는 시스템이 항상 정상적으로 작동하며, 사용 가능한 상태를 유지하는 능력을 의미합니다.
즉, **"서비스가 항상 사용 가능하게 유지되는가?"**를 측정하는 지표입니다.

Availability의 주요 특징

  1. 주요 목표
    • 서비스가 중단되지 않고 사용 가능한 상태를 유지.
    • 사용자 요청에 대해 항상 응답 가능.
  2. 중요한 설계 요소
    • 장애 복구(Recovery): 장애 발생 시 빠르게 복구.
      예: 장애가 난 인스턴스를 자동으로 교체.
    • 중복 구성(Redundancy): 중요한 시스템은 여러 복사본을 유지.
      예: 여러 AZ(가용 영역)에서 서버 실행.
    • 무중단 배포: 서비스 중단 없이 업데이트 적용.
  3. Availability의 측정
    • **Uptime(가동 시간)**으로 측정.
      예: 99.9% 가용성은 1년 동안 약 8시간 45분의 다운타임 허용.

예시

  • Availability가 높은 시스템:
    금융 서비스가 24/7로 항상 거래 가능.
  • AWS 서비스: Multi-AZ RDS, ELB(Elastic Load Balancer)로 부하 분산.

Scalability와 Availability의 차이점

  Scalability (확장성) Availability (가용성)
정의 시스템의 처리 능력을 유지하거나 확장하는 능력. 시스템이 항상 정상 작동하며 사용 가능한 상태를 유지하는 능력.
목표 증가하는 부하(사용자, 데이터 등)에 유연하게 대응. 서비스 중단 없이 항상 작동 가능.
초점 성능과 처리량 유지 또는 향상. 안정성과 중단 없는 서비스 제공.
주요 설계 요소 부하 분산, 자동 확장(Auto Scaling), 데이터 파티셔닝. 장애 복구, 중복 구성, 무중단 배포.
예시 트래픽 증가 시 인스턴스 추가로 대응. 장애가 발생해도 빠르게 복구하여 사용자에게 영향을 최소화.

Scalability와 Availability의 관계

  • Scalability는 Availability를 지원:
    트래픽 증가에 대응하지 못하면 서비스가 중단될 수 있으므로 확장성이 가용성을 높이는 데 도움.
  • Availability는 Scalability를 필요로 함:
    가용성을 유지하려면 트래픽 증가 시 확장이 가능해야 함.

추가적인 고려 사항

  1. Trade-off
    • Scalability와 Availability를 동시에 극대화하기 어렵기 때문에 우선순위를 설정해야 함.
      예: 초기에 가용성보다는 확장성에 초점을 맞출 수 있음.
  2. AWS에서의 구현
    • Scalability:
      • Auto Scaling으로 EC2 인스턴스 수 조절.
      • DynamoDB의 읽기/쓰기 용량 자동 조정.
    • Availability:
      • ELB로 다중 인스턴스에 부하 분산.
      • Multi-AZ RDS로 장애 복구 및 중단 방지.
  3. 실제 사례
    • Netflix:
      • Scalability: 글로벌 사용자 증가에 맞춰 서버를 확장.
      • Availability: 장애 발생 시에도 스트리밍 서비스가 끊기지 않도록 설계.

쉽게 이해하기

  • Scalability는 "더 많은 손님을 받을 수 있는 큰 식당"을 만드는 것.
  • Availability는 "식당이 항상 열려 있고 손님이 들어올 수 있는 상태"를 유지하는 것.

 

 

ELB (Elastic Load Balancer)

📌  **ELB (Elastic Load Balancer)**는 AWS에서 제공하는 트래픽 분산 서비스로, 애플리케이션의 가용성과 확장성을 높이는 역할을 합니다.

  • ELB는 들어오는 요청(HTTP, HTTPS, TCP 등)을 여러 EC2 인스턴스나 컨테이너로 자동으로 균등하게 분배합니다.
    쉽게 말해, 서버 앞에서 교통 정리를 해주는 신호등 같은 역할을 합니다. 🚦

ELB의 주요 특징

  1. 트래픽 분산
    • 사용자 요청을 여러 서버로 분산하여 트래픽 부하를 줄이고 성능을 최적화.
  2. 고가용성 지원
    • 서버 중 일부가 다운되더라도 정상 작동하는 서버로 트래픽을 전달하여 서비스 중단 방지.
  3. 확장성
    • 서버 수가 늘어나거나 줄어드는 상황에서도 자동으로 적응 가능.
  4. 자동 상태 검사
    • 연결된 인스턴스(서버)의 상태를 지속적으로 모니터링하여 정상적인 인스턴스에만 트래픽 전달.
  5. HTTPS/TLS 지원
    • 암호화된 트래픽(HTTPS)을 처리하여 보안을 강화.

ELB의 유형

AWS에서는 애플리케이션과 트래픽 유형에 따라 4가지 ELB 유형을 제공합니다.

  특징 사용 사례
ALB (Application Load Balancer) - HTTP/HTTPS 트래픽 분산.
- URL, 호스트 이름 기반의 정교한 라우팅 지원.
- OSI 모델 7계층에서 동작
- 컨테이너화된 애플리케이션과 연동하여 사용 가능
웹 애플리케이션, REST API 등.
NLB (Network Load Balancer) - TCP/UDP 트래픽 분산.
- 매우 낮은 지연 시간과 고속 성능 제공.
- OSI 모델 4계층에서 동작
실시간 애플리케이션, 게임 서버, IoT.
CLB (Classic Load Balancer) - 초창기 ELB.
- HTTP/HTTPS, TCP/UDP 트래픽을 처리
- OSI 모델 4~7계층에서 동작
- 초창기 모델인 만큼 잘 사용 안한다.
단순한 트래픽 분산 작업(구형 서비스에 주로 사용).
Gateway Load Balancer - 네트워크 트래픽을 특정 보안 장치(방화벽, IDS/IPS 등)로 라우팅. 보안 애플리케이션 트래픽 관리.

ELB의 주요 사용 사례

  1. 트래픽 부하 분산
    • 웹 서버 또는 애플리케이션 서버 간 요청을 분산하여 성능 최적화.
  2. 서비스 중단 방지
    • 서버 장애 발생 시 정상 상태의 서버로 트래픽을 자동 전달.
  3. HTTPS 지원
    • SSL/TLS 인증서를 로드 밸런서에 설치해 보안 트래픽 처리.
  4. 자동 확장(Auto Scaling)과 결합
    • 서버가 추가되거나 삭제될 때 자동으로 인스턴스를 로드 밸런서에 등록.

ELB의 주요 구성 요소

  1. 리스너 (Listener)
    • 로드 밸런서가 들어오는 요청을 수신하는 구성 요소.
    • 프로토콜과 포트 번호(예: HTTP:80, HTTPS:443)를 설정.
  2. 대상 그룹 (Target Group)
    • 트래픽이 분배될 EC2 인스턴스, 컨테이너, 또는 IP 주소의 집합.
  3. 상태 검사 (Health Check)
    • 대상의 상태를 주기적으로 확인하여, 정상 상태인 대상에만 트래픽 전달.

ELB의 장단점

장점 단점
고가용성 제공: 서버 장애 시 자동 대응 초기 설정이 복잡할 수 있음.
확장성 지원: 증가하는 트래픽에 자동 대응 트래픽 분산 정책에 따라 추가 비용 발생 가능.
보안 강화: HTTPS/TLS 트래픽 지원 복잡한 라우팅 규칙이 필요한 경우 관리가 어려울 수 있음.
유연한 라우팅: URL, 호스트 이름 기반 라우팅 가능 (ALB). 특정 유형에 따라 선택과 설정이 요구됨.

ELB의 동작 과정

  1. 클라이언트 요청이 ELB에 도달.
  2. 리스너가 요청을 수신.
  3. ELB는 요청을 **상태가 양호한 대상 그룹(Target Group)**의 인스턴스에 분배.
  4. 인스턴스가 요청을 처리한 뒤, 클라이언트에 응답.

ELB와 Auto Scaling의 관계

  • ELB는 트래픽을 분산하여 서버의 부하를 줄이고,
  • Auto Scaling은 트래픽 증가/감소에 따라 서버를 자동으로 추가하거나 제거.
    이 둘을 결합하면 높은 가용성과 확장성을 동시에 확보할 수 있습니다.

쉽게 이해하기

  • **ELB는 "트래픽 신호등"**입니다.
    클라이언트 요청이 서버로 몰리지 않도록 여러 서버로 교통정리를 해줍니다.
    고장 난 서버를 자동으로 제외하고, 정상 작동 중인 서버로만 트래픽을 보내줍니다.

 

 

Application Loadbalancer 사용해보기

#!/bin/bash
# 스크립트가 Bash 쉘에서 실행되도록 지정하는 선언.

apt-get update
# 패키지 관리자(Apt)를 통해 패키지 목록을 업데이트하여 최신 정보를 가져옴.

apt-get install -y nginx
# Nginx 웹 서버를 설치. "-y"는 설치 중 사용자 입력을 자동으로 승인.

cat <<EOF > /var/www/html/index.html
# "cat" 명령을 사용하여 HTML 파일을 작성.
# "<<"와 "EOF"를 사용하여 여러 줄의 텍스트를 하나의 파일로 입력.
# 이 텍스트는 "/var/www/html/index.html" 파일에 저장됨.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Nginx</title>
</head>
<body>
<h1>Hello World!</h1>
<p>AWS deployed by Me!</p>
<p>private ip is $(hostname -f)</p>
</body>
</html>
EOF
# HTML 파일 작성 완료.
# $(hostname -f)는 현재 인스턴스의 호스트 이름(프라이빗 IP 포함)을 출력하여 HTML 페이지에 포함.

sudo systemctl start nginx
# Nginx 서비스를 시작.
# "sudo"를 사용하여 관리자 권한으로 실행.

 

Amazon Elastic Block Store (EBS) 

📌  Amazon Elastic Block Store (EBS)는 Amazon EC2 인스턴스에 연결할 수 있는 블록 수준 스토리지 볼륨으로, 데이터의 지속성고가용성을 제공하는 AWS 서비스입니다. EBS는 네트워크 기반 스토리지로, EC2 인스턴스와 연결되어 작동하며, 데이터를 안전하게 저장하고 백업할 수 있습니다. = AWS의 USB라고 생각하면 된다. 실제 USB처럼 다른 인스턴스에 갖다 꽂을 수도 있다. 당연히 인스턴스 1개에 여러 EBS가 연결될 수도 있다.

  • 블록: 데이터를 나누어 저장하는 가장 작은 단위.
  • 스토리지 볼륨: 데이터를 저장하는 하드디스크 같은 공간.
  • 데이터의 지속성: 서버가 꺼져도 데이터가 지워지지 않음.
  • 고가용성: 서비스가 항상 안정적이고 중단 없이 작동.
  • 네트워크 기반 스토리지: 데이터를 인터넷을 통해 서버에 연결해 저장.

EBS의 주요 특징

  1. 블록 수준 스토리지
    • 데이터를 블록 단위로 저장하여 고성능과 유연성을 제공합니다.
    • 운영 체제데이터베이스와 같은 고속 데이터 접근이 필요한 워크로드에 적합.
  2. 데이터 지속성 (Persistent Storage)
    • EC2 인스턴스를 **중지하거나 종료(Terminate)**해도 데이터는 유지됩니다.
    • 지속적인 데이터 보관이 필요할 때 적합.
  3. 내결함성 (Fault Tolerance)
    • EBS 볼륨은 AWS 내부에서 자동 복제되어 데이터 손실 위험을 최소화.
  4. 스냅샷 백업
    • EBS 스냅샷 기능으로 볼륨 데이터를 Amazon S3에 백업하고 복원 가능.
  5. AZ(Availability Zone) 한정
    • EBS 볼륨은 특정 가용 영역(AZ)에만 존재하며, 동일 AZ의 인스턴스와 연결 가능.
    • 다른 AZ에서 사용하려면 스냅샷을 생성 후 새로운 볼륨으로 복사 필요.
    • 더보기
      더보기
      AZ(가용 영역, Availability Zone)

      AWS 데이터센터의 독립적인 물리적 위치로, 같은 리전(region) 안에서 장애(네트워크 문제로 서버스가 중단되는 상황)로부터 분리된 데이터센터라고 생각하면 됩니다. 쉽게 말해, 한 리전에 여러 개의 안전한 건물이 있다고 보면 돼요!

      우리가 이 데이터센터의 일부를 빌려서 사용하는 게 바로 EC2 인스턴스입니다.

      Region(리전)


      AWS가 전 세계에 위치한 데이터 센터 그룹을 묶어 둔 것입니다.
      쉽게 말해, 지리적으로 떨어진 AWS의 데이터센터 묶음으로, 미국, 한국, 일본 같은 지역마다 리전이 하나씩 있습니다.

      예를 들어:

      • 서울 리전(ap-northeast-2): 한국의 AWS 데이터센터 그룹.
      • 도쿄 리전(ap-northeast-1): 일본의 AWS 데이터센터 그룹.

      각 리전은 서로 독립적으로 운영되며, 데이터와 리소스는 기본적으로 리전 간에 공유되지 않습니다.
      그래서 데이터를 특정 국가나 지역에 저장해야 하는 규정을 지킬 때 유용합니다!

  6. 플러그 앤 플레이 (Plug and Play)
    • EBS는 인스턴스의 USB 메모리처럼 동작.
    • 하나의 EC2 인스턴스에서 분리해 다른 인스턴스에 연결 가능.
  7. 다중 볼륨 연결 가능
    • 하나의 EBS는 하나의 인스턴스에만 연결 가능.
    • 하지만 하나의 인스턴스에는 여러 개의 EBS를 연결할 수 있어 스토리지 확장 가능.

 


EBS의 주요 사용 사례

  1. 운영 체제 저장
    • EC2 인스턴스의 루트 디스크로 사용하여 OS 설치.
  2. 데이터베이스 스토리지
    • MySQL, PostgreSQL과 같은 데이터베이스 저장소로 활용.
  3. 애플리케이션 데이터 저장
    • 로그 데이터, 파일 시스템 또는 응용 프로그램 데이터를 저장.
  4. 백업 및 복구
    • EBS 스냅샷을 통해 데이터 백업 및 복구 용도로 활용.
  5. 고성능 분석 작업
    • 머신러닝, 빅데이터 분석 등 IOPS가 중요한 워크로드에 적합.

EBS의 유형

스토리지 유형 특징 사용 사례
범용 SSD (gp3, gp2) 낮은 지연 시간, 다양한 워크로드에 적합. 웹 서버, 소규모 데이터베이스
프로비저닝된 IOPS SSD 높은 IOPS와 낮은 지연 시간 제공. 고성능 데이터베이스, 대규모 트랜잭션 처리
스루풋 최적화 HDD 대규모 순차적 읽기/쓰기 작업에 적합. 로그 처리, 데이터 웨어하우스
콜드 HDD 비용 효율적인 대용량 스토리지. 아카이브 데이터, 잘 사용하지 않는 데이터

 


EBS와 인스턴스 저장소(Instance Store) 비교

특징  EBS 인스턴스 저장소
데이터 지속성 EC2 종료 후에도 데이터 유지 EC2 종료 시 데이터 삭제
백업 가능 여부 스냅샷을 통해 백업 가능 백업 불가
가용성 특정 AZ에서 사용 가능, 다른 AZ로 복제 필요 EC2 인스턴스에만 종속
사용 사례 데이터베이스, 로그, 애플리케이션 데이터 캐시, 임시 데이터 처리

EBS의 장단점

장점 단점
데이터 지속성과 안정성 제공 추가 비용 발생 (스토리지 용량 및 IOPS 기준 과금)
스냅샷을 통한 백업 및 복구 가능 리전 간 이동이 불편 (스냅샷 복사 필요)
다양한 스토리지 옵션 제공 고성능 IOPS 요구 시 비용 증가 가능
플러그 앤 플레이 방식으로 유연한 관리 가능 AZ 내에서만 사용 가능

쉽게 이해하기

  • EBS는 EC2 인스턴스의 USB 메모리 같은 역할을 합니다.
  • 하드디스크처럼 데이터를 저장할 수 있으며, EC2 서버를 꺼도 데이터는 유지됩니다.
  • 한 서버에서 떼어 다른 서버에 붙일 수 있고, 백업(스냅샷)을 통해 안전하게 데이터를 보호할 수 있습니다.

추가 정보

  1. EBS 스냅샷 활용
    • 데이터를 백업하거나 다른 가용 영역(AZ) 또는 리전으로 이동할 때 사용.
  2. 비용 최적화
    • 워크로드에 맞는 스토리지 유형 선택(예: 범용 SSD vs 콜드 HDD).
    • 스냅샷 데이터를 주기적으로 정리하여 저장 비용 절감.

 

EBS snapshot

📌 EBS(Elastic Block Store) Snapshot은 EBS 볼륨의 데이터를 백업하고 복원할 수 있는 AWS 기능입니다. 스냅샷은 EBS 볼륨의 데이터를 복사하여 Amazon S3에 저장하며, 필요할 때 데이터를 복원하거나 새로운 볼륨으로 생성할 수 있습니다.


EBS Snapshot의 주요 특징

  1. 백업 및 복원
    • EBS 볼륨의 데이터를 백업하고, 특정 시점으로 복원할 수 있음.
    • 스냅샷에서 새로운 볼륨을 생성하여 데이터 복구 가능.
  2. 증분 방식 저장
    • 첫 스냅샷은 EBS 볼륨의 전체 데이터를 저장.
    • 이후 스냅샷은 이전 스냅샷과의 변경된 데이터만 저장하여 저장 공간과 비용 절감.
  3. Amazon S3에 저장
    • 스냅샷 데이터는 Amazon S3에 안전하게 보관되며, 높은 내구성을 제공.
  4. 지역 간 복사 가능
    • 스냅샷을 다른 AWS 리전으로 복사하여 데이터 이동 및 마이그레이션에 활용.
  5. 자동 스케줄링
    • 스냅샷 생성 작업을 자동화하여 주기적으로 백업 가능.
      → AWS Backup 또는 Data Lifecycle Manager(DLM)를 사용.

EBS Snapshot의 주요 사용 사례

  1. 데이터 백업 및 복원
    • 스냅샷을 사용하여 데이터를 정기적으로 백업하고, 장애 시 이전 상태로 복구 가능.
  2. 볼륨 확장
    • 기존 EBS 볼륨의 크기를 확장하고 싶을 때 스냅샷을 기반으로 새로운 볼륨을 생성 후 데이터 마이그레이션.
  3. 데이터 마이그레이션
    • 스냅샷을 통해 EBS 볼륨의 데이터를 다른 가용 영역(AZ) 또는 리전으로 이동 가능.
  4. 테스트 및 개발 환경 복제
    • 운영 데이터의 스냅샷을 활용해 개발이나 테스트 환경에서 동일한 데이터를 쉽게 복제 가능.

스냅샷 생성 및 복원

스냅샷 생성

  • 실행 중인 EBS 볼륨에서 스냅샷 생성 가능.
    (인스턴스 중지 없이 가능)
    aws ec2 create-snapshot --volume-id vol-0abc123456789def0 --description "Backup Snapshot"
    

스냅샷 복원

  • 스냅샷을 기반으로 새로운 EBS 볼륨 생성.
    aws ec2 create-volume --snapshot-id snap-0abc123456789def0 --availability-zone us-east-1a
    

리전 간 스냅샷 복사

  • 스냅샷을 다른 리전으로 복사.
    aws ec2 copy-snapshot --source-region us-west-2 --source-snapshot-id snap-0abc123456789def0 --destination-region us-east-1
    

EBS Snapshot의 장단점

장점 단점
데이터를 안전하게 백업하고 복원 가능 스냅샷 생성 시 시간이 걸릴 수 있음
증분 저장으로 비용 및 공간 효율적 저장된 스냅샷이 많아질 경우 관리 복잡도 증가
다른 리전으로 쉽게 복사 가능 스냅샷 저장 비용 추가 발생
장애 복구, 데이터 마이그레이션에 효과적 복원 시 데이터 읽기 속도가 다소 느릴 수 있음

쉽게 이해하기

  • **EBS 스냅샷은 EBS 볼륨의 "사진"**을 찍는 것과 같습니다.
  • 이 사진을 S3에 저장해 두고, 필요하면 이전 상태로 돌아가거나 새로운 서버(볼륨)에서 다시 사용할 수 있어요.
  • 증분 방식이라 사진을 찍을 때 변경된 부분만 저장하니, 공간도 아끼고 빠르게 처리됩니다.

추가 정보

  1. 자동화된 스냅샷 관리
    • AWS Backup 또는 DLM(Data Lifecycle Manager)으로 스냅샷을 자동 생성/삭제 설정 가능.
  2. 비용 관리
    • 불필요한 오래된 스냅샷을 삭제하여 비용 최적화.
  3. 스냅샷 복원 속도
    • 복원된 볼륨은 데이터가 처음 요청될 때 S3에서 읽어오므로, 처음에는 약간 느릴 수 있음.

 

AMI (Amazon Machine Image)

 🐳 AMI(Amazon Machine Image)는 EC2 인스턴스를 생성하기 위한 템플릿입니다.

  • 운영 체제(OS), 애플리케이션, 라이브러리, 설정 등이 포함되어 있어, 개발자는 이미 구성된 환경을 기반으로 인스턴스를 빠르고 쉽게 생성할 수 있습니다.
  • AWS의 Docker image라고 생각하면 편하다.

AMI의 주요 특징

  1. EC2 인스턴스 생성의 기본 요소
    • AMI를 사용하여 운영 체제와 애플리케이션이 미리 설치된 환경으로 인스턴스를 시작할 수 있음.
  2. 환경 설정 단순화
    • 개발자는 한 번 설정한 환경을 AMI로 저장하여 동일한 구성을 반복적으로 적용 가능.
  3. AMI 생성 및 공유
    • 사용자가 직접 구성한 인스턴스를 이미지로 만들어 AMI로 저장 가능.
    • 생성한 AMI를 다른 AWS 계정 또는 조직과 공유 가능.
  4. Amazon 제공 및 사용자 정의 AMI
    • Amazon 제공 AMI: Amazon Linux, Ubuntu, Windows Server 등 기본 운영 체제가 포함된 이미지.
    • 사용자 정의 AMI: 사용자가 직접 운영 체제, 애플리케이션, 설정 등을 포함해 만든 AMI.

AMI의 주요 사용 사례

  1. 빠른 서버 배포
    • 동일한 설정을 가진 EC2 인스턴스를 여러 대 배포할 때 AMI를 사용하면 효율적.
  2. 환경 표준화
    • 운영 체제와 애플리케이션이 미리 설치된 환경을 일관되게 유지 가능.
  3. 백업 및 복구
    • 현재 설정이 저장된 AMI를 생성해 백업하거나, 필요 시 이를 기반으로 복구 가능.
  4. 다른 사람과 공유
    • 팀원 또는 다른 AWS 계정과 AMI를 공유해 동일한 환경에서 작업 가능.
  5. 테스트 환경 복제
    • 운영 중인 인스턴스의 AMI를 활용해 테스트 환경 구축.

AMI 생성 방법

  1. 인스턴스 설정
    • 운영 체제, 애플리케이션, 라이브러리 등을 설정.
  2. AMI 생성
    • AWS Management Console 또는 CLI에서 생성.
      aws ec2 create-image --instance-id i-0abc123456789def0 --name "MyAMI"
      
  3. AMI 관리 및 공유
    • 생성된 AMI는 AWS Console에서 관리.
    • 다른 AWS 계정 또는 퍼블릭으로 AMI를 공유 가능.

AMI의 장단점

장점 단점
동일한 환경을 반복적으로 생성 가능 리전 간 사용 시 AMI를 복사해야 함
설정된 환경을 백업하고 복구 가능 저장된 AMI가 많아지면 관리가 복잡해질 수 있음
다른 계정 또는 팀과 공유 가능 최신 상태를 유지하려면 주기적인 갱신 필요
표준화된 개발 및 운영 환경 제공 AMI 저장 및 사용에 따른 비용 발생 가능

AMI와 EBS의 관계

  • AMI는 루트 볼륨 템플릿으로, EBS 스냅샷이 포함됩니다.
  • EC2 인스턴스를 생성하면, AMI를 기반으로 EBS 볼륨이 만들어지고 인스턴스의 루트 디스크로 사용됩니다.

쉽게 이해하기

  • **AMI는 "서버 템플릿"**입니다.
  • 내가 원하는 대로 운영 체제와 소프트웨어를 설정한 서버를 저장해 두고, 이후에 동일한 서버를 쉽게 만들 때 사용하는 도구라고 보면 됩니다.
  • 필요할 때 다른 사람과 공유하거나, 여러 대의 서버를 빠르게 배포할 수 있어요!
  • 놀랍게도 AMI를 생성하는 데 EBS 스냅샷을 사용할 수 있습니다.

 

EBS와 AMI의 차이

 

EBS와 AMI의 차이점

  EBS (Elastic Block Store) AMI (Amazon Machine Image)
역할 데이터를 저장하는 스토리지 볼륨. EC2 인스턴스를 생성하기 위한 이미지 템플릿.
포함 정보 파일 시스템, 데이터 등 스토리지에 저장된 데이터. 운영 체제, 애플리케이션, 설정 등 인스턴스 구성 정보.
데이터 지속성 인스턴스를 종료해도 데이터 유지. AMI 자체는 실행되지 않음. 인스턴스를 생성할 때만 사용.
스냅샷 사용 여부 EBS 스냅샷으로 데이터 백업 및 복원 가능. AMI 생성 시 EBS 스냅샷을 포함할 수 있음.
사용 목적 EC2 인스턴스의 데이터 저장. EC2 인스턴스의 빠른 배포 및 복제.

EBS와 AMI의 관계

  • AMI는 EBS 스냅샷을 사용하여 생성됩니다.
    → AMI를 기반으로 인스턴스를 생성하면, 해당 AMI에서 EBS 볼륨이 생성되고 이 볼륨이 인스턴스에 연결됩니다.

쉽게 이해하기

  • EBS: EC2 서버에 연결된 "하드디스크" → 데이터 저장용.
  • AMI: EC2 서버를 "복제하는 템플릿" → 운영 체제와 설정 포함.
  • 관계: AMI는 내부적으로 EBS 스냅샷을 활용해 템플릿을 구성하고, 이를 기반으로 새로운 EC2 인스턴스를 생성하면 EBS 볼륨이 생성되어 서버와 연결됩니다.

 

AWS EC2 (Elastic Compute Cloud)

📌 AWS EC2는 가상 서버를 제공하는 IaaS 서비스입니다. 사용자는 필요한 시간만큼 인스턴스를 생성, 시작, 중지, 종료할 수 있습니다. 이 가상 서버는 다양한 운영 체제 및 인스턴스 유형을 지원하며, 유연한 확장성을 제공합니다.

  • 데이터 저장은 안한다. 저장은 S3에서 담당한다.
  • EC2 물리적 서버를 1개 통째 빌리면, 저 붉은 거 하나 빌려준 것(랙이라고 하는데, 데이터 센터의 서버로 특정한 목적에 맞게 설계된 고성능 장비이다. 우리가 쓰는 가상환경에 최적화된 컴퓨터 이자 서버라고 보면 된다.)
  • 저거 하나당 1개의 서버가 아니라, 저 서버 안에 여러가지 가상환경이 있고 이 가상환경 1개씩 제공해준다

주요 특징

  1. 인스턴스: 가상 서버 환경. 독립적으로 관리 가능하며 필요한 대로 생성 및 조작.
  2. 다양한 지원:
    • 운영 체제: Linux, Windows 등.
    • 인스턴스 유형: 범용, 컴퓨팅 최적화, 메모리 최적화 등.

주요 사용 사례

  • 웹 애플리케이션 호스팅.
  • 데이터베이스 호스팅.
  • 데이터 분석 및 머신 러닝 작업.
  • 애플리케이션 테스트 및 개발.

장점

  • 유연한 스케일링: 사용량에 따라 인스턴스를 추가하거나 제거 가능.
  • AWS 서비스 통합: 다른 AWS 서비스와 쉽게 연동 가능.
  • 비용 효율성: 사용한 만큼만 비용 지불.

EC2 기초

클라우드 서비스의 종류

  1. IaaS (Infrastructure as a Service)
    • 정의: 하드웨어 인프라(서버, 네트워크, 스토리지, 운영체제)를 가상화하여 제공.
    • 예시: AWS EC2, Microsoft Azure, Google Compute Engine.
    • 특징: 사용자는 인프라를 직접 설정하고 관리.
  2. PaaS (Platform as a Service)
    • 정의: 애플리케이션 개발과 배포를 위한 플랫폼을 제공.
    • 예시: AWS Elastic Beanstalk, Heroku, Google App Engine.
    • 특징: 개발 환경, 미들웨어 제공으로 개발자 편의성 증대.
  3. SaaS (Software as a Service)
    • 정의: 사용자가 완성된 애플리케이션을 클라우드에서 바로 사용.
    • 예시: Google Drive, Microsoft Office 365, Salesforce.
    • 특징: 사용자는 소프트웨어를 설치하거나 관리할 필요 없음.

EC2의 다양한 옵션들

  1. 인스턴스 유형 (Instance Types)
    • CPU, 메모리, 스토리지, 네트워크 성능에 따라 다양한 유형 제공.
    • 사용 사례에 적합한 유형 선택 가능 (예: 컴퓨팅 최적화, 메모리 최적화).
  2. 운영 체제 (Operating System)
    • 지원 OS: Amazon Linux, Ubuntu, Windows 등.
    • 애플리케이션 요구 사항에 맞는 운영 체제 선택 가능.
  3. 스토리지 옵션 (Storage Options)
    • Amazon EBS: 지속 가능한 블록 스토리지.
    • 인스턴스 스토어: 인스턴스와 함께 제공되는 임시 스토리지.
    • Amazon S3: 객체 스토리지로 장기 데이터 보관에 적합.
  4. 보안 그룹 (Security Groups)
    • EC2 인스턴스의 인바운드 및 아웃바운드 트래픽을 제어.
    • 방화벽 역할 수행: 포트, 프로토콜, IP 범위 지정.
더보기

보안 그룹 (Security Groups) 정리


보안 그룹이란?

  • AWS EC2 인스턴스의 네트워크 트래픽을 제어하는 가상 방화벽 역할을 하는 설정입니다.
  • 인바운드(Inbound)아웃바운드(Outbound) 트래픽 규칙을 정의하여 허용하거나 차단할 수 있습니다.
  • 트래픽을 허용하는 규칙만 설정 가능(명시적으로 허용하지 않은 모든 트래픽은 기본적으로 차단).

보안 그룹의 주요 특징

  1. 인스턴스 수준 적용
    • 보안 그룹은 EC2 인스턴스 단위로 설정됩니다.
    • 여러 인스턴스가 동일한 보안 그룹을 공유할 수 있습니다.
  2. 상태 저장(Stateful)
    • 인바운드 요청이 허용되면, 해당 요청에 대한 응답은 별도의 아웃바운드 규칙 없이 자동으로 허용됩니다.
  3. 허용 규칙만 설정 가능
    • 보안 그룹에서는 특정 트래픽을 명시적으로 허용하는 규칙만 설정 가능하며, 나머지 트래픽은 기본적으로 차단됩니다.
  4. 다중 보안 그룹 적용 가능
    • 하나의 인스턴스에 여러 보안 그룹을 연결할 수 있습니다.
    • 규칙은 모든 연결된 보안 그룹의 합집합으로 적용됩니다.
  5. 리전 및 가용 영역 제한 없음
    • 보안 그룹은 특정 VPC(Virtual Private Cloud) 내에서만 유효하며, 해당 VPC 내 모든 가용 영역에서 사용 가능합니다.

보안 그룹 구성 요소

  1. 인바운드(Inbound) 규칙
    • 인스턴스로 들어오는 네트워크 트래픽을 제어.
    • 예: 특정 IP에서 SSH(포트 22) 접속 허용.
  2. 아웃바운드(Outbound) 규칙
    • 인스턴스에서 나가는 네트워크 트래픽을 제어.
    • 기본적으로 모든 아웃바운드 트래픽은 허용.
  3. 프로토콜
    • TCP, UDP, ICMP 등 네트워크 프로토콜 지정 가능.
  4. 포트 범위
    • 허용할 포트 번호 또는 범위 지정 가능(예: 22, 80-443).
  5. 소스/대상
    • 트래픽의 소스(인바운드) 또는 대상(아웃바운드)을 설정.
    • CIDR(Block), 특정 IP 주소, 또는 다른 보안 그룹을 소스로 지정 가능.

예시 규칙

기능 프로토콜 포트 범위 소스
SSH 접속 허용 TCP 22 특정 IP (예: 192.168.1.0/24)
HTTP 트래픽 허용 TCP 80 0.0.0.0/0 (모든 IP)
HTTPS 트래픽 허용 TCP 443 0.0.0.0/0
다른 보안 그룹 간 트래픽 허용 TCP 모든 포트 특정 보안 그룹 ID

보안 그룹 사용 사례

  1. 웹 서버
    • HTTP(포트 80) 및 HTTPS(포트 443) 트래픽을 허용.
    • 관리용 SSH(포트 22)는 특정 관리 IP만 허용.
  2. 데이터베이스 서버
    • MySQL(포트 3306)이나 PostgreSQL(포트 5432)과 같은 데이터베이스 트래픽만 허용.
    • 트래픽 소스는 웹 서버의 보안 그룹으로 제한.
  3. 어플리케이션 서버
    • 웹 서버에서 오는 트래픽만 허용.
    • 소스를 웹 서버의 보안 그룹으로 설정.

보안 그룹의 장단점

장점 단점
트래픽 제어를 통해 EC2 인스턴스 보안 강화 허용 규칙만 설정 가능하므로 특정 트래픽을 차단하려면 복잡한 설정 필요
상태 저장으로 응답 트래픽을 자동 허용 기본 규칙 이해 및 설정 관리가 복잡할 수 있음
다중 보안 그룹 사용 가능으로 유연성 제공 너무 많은 보안 그룹이 설정되면 관리가 어려워질 수 있음
VPC 내 다른 리소스와 쉽게 통합 가능 잘못된 규칙 설정 시 의도치 않은 접근이 허용될 수 있음

보안규칙

  • 여러 인스턴스에 할당 가능
  • time out → 보안규칙 이슈
  • connection refuse → ec2 내부 이슈
  • 모든 inbound는 디폴트로 막혀있습니다.
  • 모든 outbound는 디폴트로 열려있습니다.

포트

  • 22 = ssh(secure shell)로 인스턴스에 원격 접속
  • 21 = FTP 파일전송 프로토콜
  • 80 = http 웹 접속
  • 443 = https 안전한 http 접속, 현재의 스탠다드

 

추가로 알아야 할 점

  1. 보안 그룹과 네트워크 ACL의 차이점
    • 보안 그룹: 인스턴스 수준, 상태 저장, 허용 규칙만 설정 가능.
    • 네트워크 ACL: 서브넷 수준, 상태 비저장, 허용 및 거부 규칙 모두 설정 가능.
  2. 기본 보안 그룹
    • 기본적으로 모든 트래픽 차단(인바운드) 및 모든 아웃바운드 트래픽 허용.
  3. 로그 및 모니터링
    • VPC Flow Logs를 통해 보안 그룹에서 허용되거나 차단된 트래픽 모니터링 가능.

 

  1. 키 페어 (Key Pair)
    • EC2 인스턴스에 대한 SSH 액세스 허용.
    • 공개 키와 개인 키를 생성하여 보안 액세스 제공.
  2. 탄력적 IP 주소 (Elastic IP Address)
    • 고정 IP 주소를 인스턴스에 할당하여 IP 변경 방지.
    • 서비스 중단 없이 특정 IP를 유지.
  3. 가용 영역 (Availability Zones)
    • 여러 가용 영역에서 인스턴스를 실행 가능.
    • 장애 대응 및 고가용성 확보.

추가로 알아야 할 정보

  1. EC2의 주요 비용 요소
    • 인스턴스 시간당 요금: 실행 시간 기준 과금.
    • 스토리지 비용: EBS 및 S3 사용량에 따라 과금.
    • 데이터 전송 요금: 리전 간 또는 인터넷으로 전송 시 발생.
  2. 비용 절감 방법
    • Spot Instances: 미사용 용량을 저렴한 가격에 활용.
    • Reserved Instances: 장기 약정을 통해 할인 요금 적용.
    • Savings Plans: 다양한 컴퓨팅 서비스에 적용되는 약정 기반 할인.
  3. EC2 스케일링
    • 수직 확장: 더 높은 성능의 인스턴스로 변경.
    • 수평 확장: 추가 인스턴스를 생성해 부하 분산.

장단점 요약

  장점  단점
유연성 필요에 따라 인스턴스 추가/제거 가능 실수로 필요 이상의 자원을 사용할 경우 비용 증가 가능
다양한 옵션 인스턴스 유형, OS, 스토리지 등 맞춤 설정 가능 설정이 복잡할 수 있음
비용 효율성 사용량 기반 과금 및 다양한 절감 옵션 제공 Spot Instances 등은 가용성이 보장되지 않을 수 있음
고가용성 여러 가용 영역 및 리전을 통한 장애 대응 가능 분산 환경 구축 시 설계 복잡도 증가

 

 

SSH 연결

📌 SSH(Secure Shell)는 원격 서버와의 안전한 네트워크 통신을 제공하는 암호화된 프로토콜입니다. AWS에서는 SSH를 사용하여 EC2 인스턴스에 원격 접속하여 관리 및 작업을 수행합니다.


SSH 연결을 위한 주요 개념

  1. SSH 클라이언트
    • SSH 연결을 설정하는 소프트웨어.
    • 예: Linux/macOS 기본 터미널, Windows의 PuTTY, OpenSSH 클라이언트 등.
  2. 키 페어 (Key Pair)
    • SSH 연결을 인증하기 위해 사용되는 퍼블릭 키프라이빗 키.
      • 퍼블릭 키: EC2 인스턴스에 저장.
      • 프라이빗 키: 사용자 클라이언트에 저장.
    • 프라이빗 키를 사용하여 EC2에 접근.
  3. 보안 그룹
    • EC2 인스턴스의 네트워크 트래픽을 제어하는 가상 방화벽.
    • SSH(포트 22)를 허용하는 규칙을 설정해야 연결 가능.

SSH 연결 절차

  1. 키 페어 생성
    • AWS Management Console에서 키 페어 생성 후 프라이빗 키(.pem 파일) 다운로드.
    • 키 페어는 SSH 연결의 인증 수단으로 사용.
  2. 보안 그룹 설정
    • 보안 그룹의 인바운드 규칙에서 포트 22(SSH)를 허용.
    • 특정 IP 주소(예: 203.0.113.25/32)만 허용하여 보안을 강화.
  3. SSH 클라이언트를 사용하여 연결
    • Linux/macOS:
      ssh -i "keypair.pem" ec2-user@<EC2-퍼블릭-IP>
      
    • Windows (PuTTY):
      1. .pem 파일을 .ppk로 변환 (PuTTYgen 사용).
      2. PuTTY 설정에서 "Host Name"에 <EC2-퍼블릭-IP> 입력.
      3. Auth 탭에서 .ppk 파일 선택 후 연결.
  4. 파일 권한 설정
    • 프라이빗 키 파일의 권한을 제한하여 보안 유지:
      chmod 400 keypair.pem
      

chmod 명령어 정리

chmod는 파일이나 디렉토리의 권한을 설정하는 유닉스 명령어입니다.
권한은 소유자(owner), 그룹(group), 나머지(other) 사용자로 나뉘며, 각 사용자 그룹에 대해 다음 세 가지 권한을 설정할 수 있습니다.

  • 읽기(read): 파일 내용을 읽을 수 있는 권한.
  • 쓰기(write): 파일 내용을 수정할 수 있는 권한.
  • 실행(execute): 파일을 실행하거나 디렉토리에 접근할 수 있는 권한.

chmod 숫자 표기법

  • 각 권한은 숫자로 표현되며, 다음과 같은 값이 할당됩니다.
    • 읽기(read): 4
    • 쓰기(write): 2
    • 실행(execute): 1
  • 권한은 세 자리 숫자로 표현되며, 각 자리는 소유자, 그룹, 나머지 사용자의 권한을 나타냅니다.

chmod 예시

  1. chmod 400 keypair.pem
    • 소유자: 읽기 권한만 허용.
    • 그룹 및 나머지 사용자: 권한 없음.
    • 개인 키 파일과 같은 보안 파일에 적용.
  2. chmod 644 file.txt
    • 소유자: 읽기 및 쓰기 권한.
    • 그룹: 읽기 권한.
    • 나머지 사용자: 읽기 권한.
    • 공개적으로 읽을 수 있지만 소유자만 수정 가능한 파일에 사용.

SSH 연결 문제 해결

  1. 권한 오류
    • 프라이빗 키 파일의 권한이 제한되지 않은 경우 발생.
      해결: chmod 400 keypair.pem 명령으로 권한 설정.
  2. Connection timed out
    • 보안 그룹에서 포트 22(SSH)가 허용되지 않거나 IP 주소가 차단된 경우.
      해결: 보안 그룹 설정 확인 및 IP 주소 추가.
  3. 퍼블릭 IP 누락
    • EC2 인스턴스에 퍼블릭 IP가 할당되지 않은 경우 발생.
      해결: **탄력적 IP(Elastic IP)**를 할당하거나 퍼블릭 IP를 확인.

보안 모범 사례

  1. 프라이빗 키 관리
    • 프라이빗 키 파일은 안전한 위치에 보관하고 권한을 제한.
  2. IP 주소 제한
    • 보안 그룹에서 SSH 접근은 특정 IP로 제한하여 보안을 강화.
  3. 포트 변경
    • 기본 포트(22) 대신 사용자 정의 포트를 사용하여 공격 가능성 감소.
  4. MFA와 함께 사용
    • SSH 접속 전에 Multi-Factor Authentication(MFA) 적용 가능.

 

AWS Billing 개요

📌AWS Billing은 AWS 사용량과 비용을 모니터링하고, 요금 청구 정보를 제공하며, 비용 최적화를 지원하는 서비스입니다. 이를 통해 사용자는 AWS 리소스 활용을 투명하게 관리하고, 예산을 효율적으로 계획할 수 있습니다.


주요 기능

  1. 사용량 모니터링
    • AWS에서 제공하는 모든 서비스의 사용량을 실시간, 일간, 월간 단위로 모니터링 가능.
    • 서비스별로 세부 사용량 데이터 제공.
  2. 비용 분석
    • 서비스별, 리전별, 태그별 또는 사용자별 비용 확인 가능.
    • 예상 비용 분석을 통해 최적화 방안 탐색.
    • 태그를 활용해 프로젝트별 비용 관리 가능.
  3. 청구 정보 확인
    • AWS 계정에 대한 요금 청구 정보를 세부적으로 확인 가능.
    • 청구 항목에는 사용량, 비용, 청구 일자 등이 포함.
  4. 예산 설정
    • 예산 한도를 설정해 초과 방지.
    • 예산 초과 시 알림 기능으로 즉각적인 대응 가능.
    • 알림 기준: 서비스 비용, 총 비용, 예상 비용 등.

추가로 알아야 할 정보

  1. 비용 최적화를 위한 서비스
    • Cost Explorer: 서비스별, 시간별 비용 분석 도구로, 사용량과 비용 추이를 시각화하여 최적화 기회를 식별.
    • AWS Budgets: 비용과 사용량에 대한 예산 설정 및 초과 시 알림.
    • Savings Plans: 특정 컴퓨팅 서비스에 대해 장기 약정을 통해 비용을 절감할 수 있는 요금제.
    • Reserved Instances: EC2와 같은 서비스를 예약 구매하여 비용 절약.
  2. 계정 설정 및 관리
    • AWS Organizations를 통해 여러 계정의 비용을 통합 관리 가능.
    • 마스터 계정에서 멤버 계정의 비용 및 사용량을 중앙 집중식으로 모니터링.
  3. 청구 주기
    • AWS는 월 단위 청구 시스템을 사용하며, 사용량에 따라 변동 가능.
    • 미리 설정한 지불 수단(신용카드 등)을 통해 자동 결제.
  4. 사용자 알림 설정
    • 알림 트리거를 설정하여 예산 초과, 비용 급증 등의 이벤트에 대해 경고 수신.

AWS Billing의 장단점

  장점 단점
사용량 모니터링 실시간 데이터로 투명한 관리 가능 서비스별 데이터가 많아 복잡하게 느껴질 수 있음.
비용 분석 태그 및 리전별 분석으로 세밀한 비용 관리 가능 예상 비용은 변동 요소(예: 트래픽)에 따라 정확도가 떨어질 수 있음.
예산 설정 초과 방지와 실시간 알림으로 과도한 비용 발생을 예방 알림 설정이나 예산 한도 관리가 번거로울 수 있음.
비용 절감 옵션 Savings Plans와 Reserved Instances로 장기적인 비용 절감 가능 비용 절감 옵션은 약정 기반으로 유연성이 떨어질 수 있음.

사용 이유

  • 비용 가시성: AWS 리소스 사용량과 비용을 투명하게 확인할 수 있어 재정 관리 효율성을 높임.
  • 비용 최적화: 서비스 활용도를 분석하고 최적화 방안을 탐색.
  • 예산 초과 방지: 예산 한도 설정과 알림 기능으로 예기치 않은 비용 초과 방지.

IAM (Identity and Access Management)

📌 AWS IAM은 AWS 리소스에 대한 액세스를 안전하게 제어하는 웹 서비스입니다. IAM을 통해 사용자, 그룹, 역할을 생성하고 리소스 접근 권한을 관리할 수 있습니다. 주요 기능은 다음과 같습니다.

주요 기능

  1. 인증: 사용자의 사용자명과 암호를 통해 AWS 리소스 접근을 인증.
  2. 권한 부여: IAM 정책을 통해 사용자, 그룹, 역할에 적절한 권한을 할당.
  3. 권한 검증: 사용자가 AWS 리소스에 액세스하려 할 때 정책을 기준으로 요청 허용 여부를 판단.

IAM은 AWS 보안 강화와 규정 준수를 지원하며, 최소 권한 원칙(필요한 권한만 부여)을 통해 안전한 환경을 제공합니다.


2. Users, Groups, Policies

IAM에서 사용자는 AWS 리소스에 액세스하는 개체로, 그룹과 정책을 통해 효율적으로 권한을 관리할 수 있습니다.

구성 요소

  1. 사용자(User)
    • AWS 계정에 접근하는 개별 사용자 또는 서비스.
    • 각 사용자마다 별도의 보안 자격 증명을 생성 가능.
    • IAM 정책으로 각 사용자의 권한 관리.
  2. 그룹(Group)
    • 공통된 권한을 가진 사용자들을 묶는 단위.
    • 그룹 단위로 정책을 설정해, 여러 사용자에 대해 효율적으로 권한 관리.
    • 예: S3에 읽기 권한이 필요한 사용자들을 "S3 Readers" 그룹으로 관리.
  3. 정책(Policy)
    • JSON 형식으로 작성된 문서로, 리소스 접근 권한을 지정.
    • 구조:
      • 권한 허용 또는 거부(Effect)
      • 수행 가능한 작업(Action)
      • 영향을 받는 리소스(Resource)
      • 조건부 설정(Condition, 선택적)
    • 원칙: 최소 권한 원칙을 따라 필요한 권한만 부여.

3. Policy 구조

IAM 정책은 JSON 형식으로 작성되며, 다음과 같은 구조를 가집니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::example-bucket"],
      "Condition": {
        "IpAddress": {"aws:SourceIp": "192.0.2.0/24"}
      }
    }
  ]
}

정책 요소

  • Version: 정책의 버전(고정 값 "2012-10-17").
  • Statement: 정책의 규칙으로 여러 개 작성 가능.
  • Effect: 허용("Allow") 또는 거부("Deny")를 지정.
  • Action: 수행 가능한 작업(예: "s3:PutObject").
  • Resource: 규칙이 적용되는 AWS 리소스(예: S3 버킷의 ARN).
  • Condition: 요청에 적용되는 조건(예: 특정 IP 주소에서만 허용).

 

MFA (Multi-Factor Authentication)

📌 MFA는 다중 인증 요소를 활용하여 로그인 보안을 강화하는 방식입니다. 일반적인 비밀번호 인증 외에 추가적인 요소(예: OTP, 보안 토큰)를 요구합니다.

MFA의 필요성

  1. 비밀번호 유출 방지: 비밀번호가 유출되어도 추가 인증이 필요하므로 리소스를 보호 가능.
  2. AWS 보안 강화: 루트 사용자와 IAM 사용자에 대해 반드시 MFA 적용 권장.

구현 예시

  • 루트 사용자 및 IAM 사용자 계정에 MFA 설정.
  • 인증 방법: 스마트폰 애플리케이션(예: Google Authenticator) 또는 하드웨어 보안 키 사용.

추가로 알아야 할 정보

  • IAM은 AWS 보안의 핵심으로, 사용자, 그룹, 정책의 체계적 관리가 필수입니다.
  • 정책은 필요할 때만 추가 조건(Condition)을 설정하여 최소 권한 원칙을 준수해야 합니다.

장단점 요약 (표)

  장점 단점
IAM 정책 최소 권한 원칙 적용 가능 정책 작성이 복잡할 수 있음
IAM 그룹 여러 사용자의 권한을 일괄적으로 관리 가능 개별 사용자 권한 추가 시 별도 처리 필요
MFA 비밀번호 유출 시 추가 보안 제공 추가 인증 절차로 인해 로그인 시간이 늘어날 수 있음

 

AWS 클라우드 개요

📌 AWS란? AWS(Amazon Web Services)는 아마존이 제공하는 클라우드 컴퓨팅 플랫폼으로, 전 세계적으로 분산된 데이터 센터를 통해 고객에게 IT 인프라 서비스를 제공합니다. 사용자는 AWS를 통해 필요한 리소스를 유연하고 효율적으로 설정, 관리할 수 있습니다.

 

AWS 주요 서비스 카테고리

  • 컴퓨팅: EC2(Elastic Compute Cloud), Elastic Beanstalk 등
  • 데이터베이스: RDS(Relational Database Service) 등
  • 스토리지: S3(Simple Storage Service), EBS(Elastic Block Store) 등
  • 네트워킹: VPC(Virtual Private Cloud), CloudFront, Route 53 등
  • 보안: IAM(Identity and Access Management) 등

On-Premise

📌 On-premise는 조직 내부에 물리적으로 설치된 서버를 의미합니다. 이러한 서버는 해당 조직의 IT 팀이 직접 관리 및 유지보수하며, 주로 중요한 데이터와 애플리케이션을 호스팅하는 데 사용됩니다.

 

On-premise vs. 클라우드 서비스 비교

  • On-premise:
    • 서버가 조직 내에 위치
    • 자체 관리 및 유지보수 필요
    • 초기 설치 비용이 높음
  • 클라우드:
    • 외부 데이터 센터에서 호스팅
    • 클라우드 제공 업체가 관리
    • 유연한 비용 구조

추가로 알아야 할 정보

  • AWS의 장점:
    • 확장성: 필요에 따라 리소스를 쉽게 조정 가능
    • 비용 효율성: 사용한 만큼만 비용 지불
    • 글로벌 접근성: 다양한 지역에 배치된 데이터 센터 사용
  • On-premise의 장점:
    • 데이터 보안: 민감한 데이터를 조직 내에서 직접 관리
    • 맞춤형 인프라: 비즈니스 요구에 따라 시스템 설계 가능

사용 이유:
조직의 특성과 요구에 따라 클라우드(AWS)와 On-premise를 선택하거나, 두 가지를 혼합하여 하이브리드 환경을 구축하기도 합니다.

장단점 요약 (표):

  On-premise AWS (클라우드 서비스)
비용 초기 설치 비용 높음 사용량 기반 과금 (비용 효율적)
유연성 물리적 하드웨어로 확장 한계 리소스 확장/축소 용이
보안 직접 관리 가능 (높은 통제력) AWS 제공 보안 서비스 활용 가능
유지보수 IT 팀이 직접 유지보수 필요 AWS가 유지보수 제공

 

DB Lock 이란?

📌 DB Lock은 여러 트랜잭션이 동시에 같은 자원에 접근할 때 데이터 무결성(정합성)을 보장하기 위해 사용되는 메커니즘

  • 쉽게 말해, 어떤 사용자가 데이터를 사용하고 있는 동안에는 다른 사용자가 그 데이터를 동시에 수정하면 안 되기 때문에, ‘잠금’을 걸어서 충돌(Conflict)을 방지
  • 여러 사용자가 동시에 DB를 사용하는 경우 같은 데이터를 동시에 수정하려고 시도하는 경우 충돌 제어 및 데이터의 일관성을 보장하기 위해 사용한다.

 

언제 Lock을 사용하는가?

  • 동시에 읽기/쓰기가 빈번하게 일어나는 중요한 테이블에 대해, 데이터 무결성을 엄격히 보장해야 할 때.
  • 은행 이체, 재고 관리, 주문 처리와 같이 동시에 발생하면 안 되는 시나리오를 제어할 때.

  • 불필요한 락은 성능 저하를 유발할 수 있으므로, 적절한 수준에서 사용하는 것이 중요
  • DeadLock발생 여부를 확인해야함!

간단히 말해서 에러를 순환하는 상태가 지속된다.

 

Lock의 생명주기

1 트랜잭션 시작!

  • DB와의 트랜잭션을 시작
  • 아직 특정 자원에 대한 락이 획득된 상태는 🙅

2 Lock 획득!

  1. 쿼리 요청
  2. Lock 체크
  3. 대기 혹은 Lock 획득

3 트랜잭션 종료!

  1. 트랜잭션 Commit 혹은 RollBack
  2. 락 해제

 

Lock 종류

1. 낙관적 락 (충돌이 발생하지 않을 것이라고 가정)

  • 데이터베이스의 락을 사용하는 것이 아닌 application 레벨에서 버전 관리
  • 특정 작업을 수행하기 전에 별도의 락(lock)을 걸지 않고, 작업 완료 시점에서 데이터의 변경 여부를 확인하여 충돌 여부를 판단 (@Version 활용)
  • 데이터 충돌이 거의 없을것이라고 가정한 경우 사용
    • LockModeType.OPTIMISTIC로 적용
  • 충돌 시 ObjectOptimisticLockingFailureException 발생

 

2. 비관적 락 (충돌이 자주 발생할 것이라고 가정)

2.1 공유락(Shared Lock, S Lock)

  • 여러 트랜잭션이 동시에 데이터를 읽기할 수 있지만, 쓰기 하려면 공유락을 해제하고 배타락으로 변경
  • 다른 트랜잭션이 쓰기하려 하면 대기 상태
    • LockModeType.PESSIMISTIC_READ로 적용

2.2 배타락(Exclusive Lock, X Lock)

  • 오직 한 트랜잭션만 해당 데이터를 읽거나 쓸 수 있음
  • 다른 트랜잭션이 접근하려 하면 대기 상태
    • LockModeType.PESSIMISTIC_WRITE로 적용

 

3. 분산 락

  • 여러 인스턴스나 분산 환경에서 락을 설정
  • 데이터베이스에 직접 Lock을 걸지 않고, 외부에서 권한을 받아 처리
  • Redis, **Zookeeper 등... 을 활용하여 적용**

 

낙관적 락 (Optimistic Lock)

 

1. 낙관적 락이란?

  • 데이터의 충돌이 드물다고 가정하고, 충돌이 발생했을 때만 문제를 해결하는 방식.
  • 일반적으로 버전 번호(version)를 활용하여 데이터를 갱신할 때 충돌을 감지.

2. 특징

  1. 비교적 낮은 충돌 가능성 전제:
    • 동시에 데이터를 갱신하는 상황이 드물거나, 충돌 가능성이 낮은 환경에서 효과적.
  2. 병렬성 보장:
    • 별도의 잠금(lock) 없이 데이터를 읽고, 이후 업데이트 시점에서만 충돌 여부를 확인.
  3. 성능 우선:
    • 자원을 차단하지 않기 때문에, 읽기 작업과 병렬 처리에서 높은 성능을 보임.

3. 작동 방식

  1. 데이터 조회:
    • 데이터와 함께 버전 번호를 가져옴.
  2. 수정 및 업데이트 요청:
    • 데이터를 수정한 후, 저장 요청 시 버전 번호를 포함.
  3. 버전 검증:
    • 데이터베이스에서 현재 데이터의 버전 번호와 요청에 포함된 버전 번호를 비교.
  4. 성공/실패 여부:
    • 동일하면 업데이트 성공 → 버전 번호 증가.
    • 다르면 충돌 발생으로 간주하고 예외 처리.

4. 예제

4.1 데이터베이스 테이블 예제

CREATE TABLE example_table (
    id BIGINT PRIMARY KEY,
    data VARCHAR(255),
    version INT NOT NULL
);

4.2 JPA와 낙관적 락

import jakarta.persistence.*;

@Entity
public class ExampleEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String data;

    @Version // 버전 관리용 필드
    private Integer version;

    // getters and setters
}

4.3 낙관적 락 업데이트 코드

import org.springframework.stereotype.Service;

import jakarta.persistence.EntityManager;
import jakarta.persistence.OptimisticLockException;

@Service
public class ExampleService {

    private final EntityManager entityManager;

    public ExampleService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public void updateData(Long id, String newData) {
        try {
            ExampleEntity entity = entityManager.find(ExampleEntity.class, id);
            entity.setData(newData);
            entityManager.merge(entity);
        } catch (OptimisticLockException e) {
            System.out.println("낙관적 락 충돌 발생!");
            // 충돌 처리 로직 추가
        }
    }
}

5. 장단점

장점 단점
병렬성 보장: 별도의 잠금 없이 병렬 작업 가능. 충돌이 빈번하면 롤백 비용 증가.
성능 최적화: 리소스를 차단하지 않으므로 성능 향상. 충돌 발생 시 복구 로직 필요.
충돌이 적은 환경에서 매우 적합. 충돌 발생 시 사용자가 직접 재시도하거나 해결해야 함.
데이터 읽기와 병렬 처리 시 높은 효율성. 데이터 변경이 많은 환경에서는 비효율적일 수 있음.

6. 낙관적 락 vs 비관적 락

  낙관적 락 (Optimistic Lock)   비관적 락 (Pessimistic Lock)
충돌 가능성 낮은 환경에서 적합. 높은 환경에서 적합.
잠금 방식 잠금 사용 안 함 (버전 번호로 충돌 감지). 데이터 읽기 시점에서 데이터에 잠금 적용.
성능 충돌 가능성이 낮으면 성능 우수. 잠금으로 인해 동시 처리량 감소.
복구 비용 충돌 발생 시 롤백과 재시도 비용 발생. 잠금으로 인해 충돌 방지 가능하나 대기 시간 증가.
사용 예시 읽기 작업이 많고 쓰기 작업이 적은 환경. 동시에 여러 사용자가 쓰기 작업을 자주 수행하는 환경.

7. 사용 사례

  1. 읽기 작업이 많은 환경:
    • 예: 상품 상세 페이지의 재고 확인.
  2. 충돌 가능성이 낮은 환경:
    • 예: 사용자 개인 설정 업데이트.
  3. 트랜잭션이 짧은 작업:
    • 예: 간단한 상태 변경 작업.

8. 학습하면 좋은 추가 주제

  1. JPA의 @Version 어노테이션 활용:
    • 실무에서의 구체적 활용 방법과 사례.
  2. 비관적 락(Pessimistic Lock):
    • 낙관적 락과 비교되는 개념 학습.
  3. 분산 시스템에서의 락 구현:
    • Redis나 Zookeeper를 활용한 분산 락 구현.
  4. 데드락과 충돌 처리 전략:
    • 충돌 및 데드락 방지를 위한 설계 패턴.

 

 

비관적 락 (Pessimistic Lock)

 

1. 비관적 락이란?

  • 데이터 충돌이 자주 발생할 것으로 예상되는 환경에서, 데이터를 수정하거나 읽기 전에 잠금을 걸어 충돌을 방지하는 방법.
  • 트랜잭션 동안 다른 트랜잭션이 데이터에 접근하지 못하도록 차단.
  • 주로 데이터베이스에서 제공하는 락 메커니즘(예: SELECT ... FOR UPDATE)을 사용.

2. 특징

  1. 잠금을 통해 충돌 방지:
    • 데이터 수정 전 잠금을 걸어 다른 트랜잭션의 접근을 차단.
  2. 강력한 일관성 보장:
    • 동시에 같은 데이터를 수정하려는 작업 간 충돌을 완전히 방지.
  3. 성능 비용 증가:
    • 트랜잭션이 오래 지속되면 잠금으로 인해 다른 트랜잭션이 대기 상태가 됨.

3. 작동 방식

  1. 데이터 조회 시 잠금:
    • 데이터를 읽으면서 **배타적 잠금(Exclusive Lock)**을 설정.
  2. 잠금 해제:
    • 트랜잭션이 종료될 때 잠금 해제.
  3. 다른 트랜잭션 처리:
    • 잠금이 해제될 때까지 다른 트랜잭션은 대기 상태.

4. 비관적 락 구현 방법

4.1 데이터베이스에서 직접 사용

  • SQL 예제:
-- 데이터 수정 전 잠금 설정
SELECT * FROM example_table
WHERE id = 1
FOR UPDATE;

4.2 JPA에서 비관적 락

  • JPA 예제:
import jakarta.persistence.LockModeType;
import jakarta.persistence.EntityManager;

public ExampleEntity findByIdWithLock(Long id, EntityManager entityManager) {
    return entityManager.find(ExampleEntity.class, id, LockModeType.PESSIMISTIC_WRITE);
}
  • Spring Data JPA 사용:
@Repository
public interface ExampleRepository extends JpaRepository<ExampleEntity, Long> {

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("SELECT e FROM ExampleEntity e WHERE e.id = :id")
    ExampleEntity findByIdWithLock(@Param("id") Long id);
}

4.3 LockModeType 종류

LockModeType 설명
PESSIMISTIC_READ 데이터를 읽는 동안 다른 트랜잭션에서 수정하지 못하도록 잠금.
PESSIMISTIC_WRITE 데이터를 수정하거나 읽는 동안 다른 트랜잭션에서 수정/읽기 모두 차단.
PESSIMISTIC_FORCE_INCREMENT 데이터 수정 여부와 관계없이 버전 번호를 강제로 증가시키는 잠금.

5. 장단점

장점 단점
일관성 보장: 데이터 충돌을 확실히 방지. 성능 저하: 트랜잭션 대기 시간이 늘어나 성능 저하 가능.
단순한 구현: 잠금 메커니즘을 사용하여 충돌 방지 로직 간소화. 데드락 위험: 여러 트랜잭션이 서로 대기하면서 데드락 발생 가능.
변경이 빈번한 환경에 적합. 병렬 처리 저하: 동시 처리 성능 감소.

6. 낙관적 락 vs 비관적 락 비교

  낙관적 락 (Optimistic Lock)  비관적 락 (Pessimistic Lock)
충돌 가능성 충돌이 낮은 환경에 적합. 충돌이 잦은 환경에 적합.
잠금 방식 잠금을 사용하지 않음, 버전 번호로 충돌 감지. 데이터 접근 시점에 잠금을 사용해 다른 트랜잭션 차단.
성능 낮은 충돌 환경에서는 성능 우수. 잠금으로 인해 동시 처리 성능 저하.
충돌 처리 비용 충돌 발생 시 롤백 비용 발생. 충돌 발생이 없으므로 롤백 비용이 없음.
데드락 가능성 없음. 있음 (잠금으로 인해 데드락 발생 가능).
적용 사례 읽기 작업이 많고 쓰기 작업이 적은 환경. 쓰기 작업이 잦고 데이터 충돌 가능성이 높은 환경.

7. 사용 사례

  1. 은행 시스템:
    • 계좌 잔액 수정처럼 데이터의 정확성이 중요한 작업.
  2. 재고 관리:
    • 재고 수량을 줄이거나 늘릴 때 다른 트랜잭션이 동일 데이터를 수정하지 못하도록 차단.
  3. 예약 시스템:
    • 좌석 예약, 호텔 방 예약 등에서 동일 리소스를 중복 예약하지 않도록 잠금.

8. 학습하면 좋은 추가 주제

  1. 트랜잭션 격리 수준:
    • READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE의 차이.
  2. 데드락 방지 전략:
    • 트랜잭션 순서 지정, 타임아웃 설정 등.
  3. 낙관적 락과 비관적 락의 적절한 사용 전략:
    • 각 락의 장단점을 고려한 실무 적용 사례 분석.
  4. 분산 환경에서의 락 관리:
    • Redis, ZooKeeper 등 분산 락 시스템 학습.

 

분산 락 (Distributed Lock)

1. 분산 락이란?

  • 분산 시스템 환경에서 공유 자원에 대한 동시 접근을 제어하기 위해 사용하는 락 메커니즘.
  • 동시에 여러 노드(서버)가 공유 자원에 접근하려는 상황에서 데이터의 무결성과 일관성을 보장.

2. 특징

  1. 멀티 노드 환경:
    • 여러 노드가 동일한 자원에 접근 가능.
    • 분산 락을 통해 자원을 독점적으로 사용할 노드를 제어.
  2. 데이터 일관성 보장:
    • 데이터의 충돌 방지 및 무결성 유지.
  3. 중앙 관리:
    • 락 상태를 중앙에서 관리하거나 분산 환경에서 합의 프로토콜을 사용.

3. 동작 원리

  1. 락 생성:
    • 특정 자원에 대해 락 생성 요청.
    • 락이 성공하면 해당 노드는 자원을 독점적으로 사용 가능.
  2. 락 유지:
    • 락을 일정 시간 동안 유지.
    • 필요 시 갱신(Renewal) 가능.
  3. 락 해제:
    • 자원 사용이 끝나면 락을 해제.
    • 타임아웃으로 자동 해제될 수도 있음.

4. 분산 락 구현 방식

4.1 데이터베이스 기반

  • 방법: 데이터베이스 테이블에 락 상태를 저장.
  • SQL 예제:
-- 락 생성
INSERT INTO distributed_lock (resource, lock_time) VALUES ('RESOURCE_ID', NOW());

-- 락 확인
SELECT * FROM distributed_lock WHERE resource = 'RESOURCE_ID';

-- 락 해제
DELETE FROM distributed_lock WHERE resource = 'RESOURCE_ID';
  • 장점:
    • 별도 도구 없이 쉽게 구현 가능.
    • 트랜잭션과 연동하여 락 관리.
  • 단점:
    • 성능 저하(데이터베이스 부하 증가).
    • 대규모 시스템에서는 비효율적.

4.2 Redis 기반

  • 방법: Redis의 SETNX 명령어를 사용하여 락 생성.
  • 예제:
# 락 생성
SET resource:lock "LOCKED" NX PX 10000

# 락 확인
GET resource:lock

# 락 해제
DEL resource:lock
  • 장점:
    • 빠른 속도.
    • TTL(Time-To-Live) 설정으로 자동 해제 가능.
  • 단점:
    • 단일 노드 Redis 사용 시 SPOF(Single Point of Failure) 발생 가능.
    • 클러스터 환경에서는 Redlock 알고리즘 필요.

4.3 ZooKeeper 기반

  • 방법: 분산 락의 상태를 ZNode에 저장하여 관리.
  • 예제:
# ZNode 생성 (락 획득)
create /locks/resource

# 락 해제
delete /locks/resource
  • 장점:
    • 강력한 일관성 보장.
    • 분산 환경에 최적화.
  • 단점:
    • 설정 및 관리 복잡.
    • ZooKeeper 설치 필요.

5. Redlock 알고리즘 (Redis 기반 분산 락)

  • Redis 클러스터 환경에서 락의 일관성을 보장하는 알고리즘.
  1. 여러 Redis 노드에 동일한 키로 락 생성 요청.
  2. 과반수 이상의 노드에서 락 성공 시 락 획득.
  3. TTL을 설정하여 자동으로 락이 해제되도록 설정.
  4. 락 해제 시 모든 노드에서 락 해제.

6. 장단점

장점 단점
데이터 충돌 및 중복 작업 방지. 락 구현 및 관리 복잡도 증가.
고성능 분산 환경에서 데이터 무결성 보장. 락 생성/해제 시 네트워크 지연으로 인한 성능 저하 가능.
다양한 도구를 활용한 구현 가능(데이터베이스, Redis, ZooKeeper 등). 잘못된 락 설정 시 데드락 발생 가능.

7. 분산 락 사용 사례

  1. 동시에 한 번만 실행해야 하는 작업:
    • 예: 배치 처리, 데이터 마이그레이션.
  2. 중복 실행 방지:
    • 예: 주문 처리, 결제 처리.
  3. 리소스 공유:
    • 예: 파일 업로드/다운로드, 재고 관리.

8. 학습하면 좋은 추가 주제

  1. 락 컨텐츠 관리 전략:
    • TTL 설정, 자동 해제 로직 구현.
  2. ZooKeeper와 Redis의 비교:
    • 각 기술의 장단점 및 사용 사례 분석.
  3. 분산 시스템에서의 일관성 모델:
    • 강한 일관성, 최종적 일관성(Final Consistency) 개념 이해.
  4. Redlock 알고리즘 심화:
    • 클러스터 환경에서의 락 일관성 보장 방법.

 

 

격리 수준

 

트랜잭션 격리 수준 (Transaction Isolation Levels)


1. 트랜잭션 격리 수준이란?

  • 트랜잭션 간의 상호작용에서 발생할 수 있는 데이터 충돌 문제를 방지하기 위해 데이터베이스가 제공하는 동시성 제어 메커니즘.
  • 각 격리 수준은 데이터 일관성과 동시성 성능 간의 트레이드오프를 제공.

2. 주요 격리 수준과 특징

격리 수준 Dirty Read Non-Repeatable Read Phantom Read 특징
READ UNCOMMITTED 허용 허용 허용 - 커밋되지 않은 데이터를 읽을 수 있음(Dirty Read). - 가장 낮은 격리 수준으로 동시성 성능은 높지만 데이터 일관성이 낮음.
READ COMMITTED 방지 허용 허용 - 커밋된 데이터만 읽을 수 있음. - Oracle, SQL Server의 기본 격리 수준. - Non-Repeatable Read 가능.
REPEATABLE READ 방지 방지 허용 - 동일 트랜잭션 내에서 항상 같은 데이터 읽기 보장. - MySQL(InnoDB)의 기본 격리 수준.
SERIALIZABLE 방지 방지 방지 - 모든 트랜잭션을 순차적으로 실행하는 것처럼 동작. - 가장 높은 격리 수준으로, 동시성 성능이 낮지만 데이터 일관성 보장.

3. 주요 개념

  1. Dirty Read:
    • 다른 트랜잭션이 아직 커밋되지 않은 변경 사항을 읽는 것.
    • 예시: A 트랜잭션이 데이터를 수정하고 커밋하지 않은 상태에서 B 트랜잭션이 수정된 데이터를 읽음.
  2. Non-Repeatable Read:
    • 한 트랜잭션에서 같은 데이터를 두 번 읽었을 때, 값이 달라지는 현상.
    • 원인: 다른 트랜잭션에서 데이터를 수정하고 커밋한 경우.
  3. Phantom Read:
    • 한 트랜잭션에서 동일한 조건으로 데이터를 조회했을 때, 새로운 데이터가 추가되거나 삭제되는 현상.
    • 원인: 다른 트랜잭션에서 데이터를 추가/삭제한 경우.

4. 격리 수준별 예제

4.1 READ UNCOMMITTED

-- A 트랜잭션
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- B 트랜잭션
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1; -- Dirty Read 발생

4.2 READ COMMITTED

-- A 트랜잭션
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- B 트랜잭션
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1; -- 커밋되지 않았으므로 읽을 수 없음

4.3 REPEATABLE READ

-- A 트랜잭션
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1; -- 1000
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- B 트랜잭션
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1; -- A 트랜잭션의 변경 사항 보이지 않음

4.4 SERIALIZABLE

-- A 트랜잭션
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1;

-- B 트랜잭션
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1; -- 대기 상태 (A 트랜잭션 종료 후 실행)

5. 장단점 요약

격리 수준 장점  단점
READ UNCOMMITTED 높은 동시성, 성능 우수 데이터 무결성 저하, Dirty Read 발생 가능
READ COMMITTED Dirty Read 방지 Non-Repeatable Read 발생 가능
REPEATABLE READ Non-Repeatable Read 방지 Phantom Read 발생 가능
SERIALIZABLE 데이터 일관성 보장, Phantom Read 방지 성능 저하, 동시성 처리 어려움

6. 사용 사례

  1. READ UNCOMMITTED:
    • 로그 데이터 분석, 캐시 처리 등 데이터 일관성이 덜 중요한 경우.
  2. READ COMMITTED:
    • 일반적인 OLTP 시스템에서 기본 격리 수준으로 적합.
  3. REPEATABLE READ:
    • 은행 시스템, 재고 관리 등 데이터 수정이 빈번한 환경.
  4. SERIALIZABLE:
    • 강력한 일관성이 필요한 환경. 예: 금융 거래 시스템, 예약 시스템.

7. 학습하면 좋은 추가 주제

  1. 트랜잭션 관리:
    • Spring에서의 트랜잭션 관리 (@Transactional)와 격리 수준 설정.
  2. 트랜잭션과 락:
    • 비관적 락과 낙관적 락의 적용 방식.
  3. MVCC (Multi-Version Concurrency Control):
    • MySQL, PostgreSQL에서 사용되는 동시성 제어 방식.
  4. 데드락 방지 전략:
    • 순서 지정, 타임아웃 설정 등을 통한 데드락 방지.

 

소프트웨어 아키텍처

📌 시스템을 효율적이고 안정적으로 만들기 위해, 각 구성 요소를 큰 그림으로 설계하는 설계도이다.

  • 아래의 가치 중 구조적 가치를 제공한다.

 

왜 아키텍처를 고민을 해야할까?

  1. 확장성(Scalability) 확보
    • 사용자 수가 늘어날 때, 시스템이 문제 없이 확장 가능
  2. 유지보수(Maintainability) 용이
    • 아키텍처가 잘 정리되어 있으면, 버그 수정이나 새로운 기능 추가 시 어떤 부분을 건드려야 할지 명확
    • 모듈별 역할과 의존성을 분리하면, 유지보수 비용과 시간이 크게 감소

아키텍처 구현을 위한 주요 패턴

1. 레이어드 아키텍처 (Layered Architecture)

특징

  • 전통적인 계층 기반의 구조로, 애플리케이션을 역할별로 구분(예: 프레젠테이션, 비즈니스 로직, 데이터 접근 등).
  • 계층 간 호출 순서가 정해져 있어, 각 계층은 바로 아래 계층만 호출.

장점

  • 역할 분리: 각 계층의 역할이 명확하여 코드 가독성과 유지보수가 용이.
  • 구조화된 설계: 초기에 아키텍처를 설계하기 쉬움.
  • 범용성: 대부분의 애플리케이션에 적용 가능.

단점

  • 계층 간 의존성: 변화가 많은 프로젝트에서 수정 비용 증가.
  • 성능 문제: 계층이 많아질수록 호출 스택이 깊어져 성능 저하 가능.
  • 유연성 부족: 비즈니스 로직과 인프라 간 결합도가 높음.

https://mesh.dev/20210910-dev-notes-007-hexagonal-architecture/

2. 헥사고날 아키텍처 (Hexagonal Architecture)

특징

  • 코어 도메인 중심 설계: 핵심 비즈니스 로직을 중심에 두고, 외부 인터페이스(데이터베이스, UI, 외부 API 등)는 어댑터로 연결.
  • 포트와 어댑터: 도메인은 포트를 통해 어댑터와 상호작용하며, 어댑터는 실제 구현체.

장점

  • 의존성 분리: 도메인과 외부 시스템 간 결합도를 낮춤.
  • 테스트 용이: 외부 의존성을 Mock으로 대체해 테스트 가능.
  • 유연성 증가: 데이터베이스 교체나 외부 인터페이스 변경이 용이.

단점

  • 진입 장벽: 설계와 구현의 복잡성으로 인해 초기 이해가 어려울 수 있음.
  • 설계 비용: 소규모 프로젝트에서는 과도한 설계가 될 가능성.

3. 클린 아키텍처 (Clean Architecture)

특징

  • 의존성 역전 원칙(DIP)을 적용하여, 핵심 비즈니스 로직이 외부 프레임워크에 의존하지 않도록 설계.
  • 로버트 C.마틴(Robert C. Martin, Uncle Bob)의 제안
  • 계층 구분:
    • 가장 안쪽: 엔티티(핵심 비즈니스 로직).
    • 중간: Use Case(앱의 동작 정의).
    • 바깥쪽: 프레젠테이션, 프레임워크(UI, 데이터베이스 등).

장점

  • 변경 용이성: 외부 기술 스택에 구애받지 않음.
  • 유지보수성: 비즈니스 로직과 구현체를 분리.
  • 테스트 가능: 핵심 로직은 외부 종속 없이 독립적으로 테스트 가능.

단점

  • 복잡성: 계층 간 명확한 설계가 필요하며, 과도하게 적용 시 개발 속도 저하.
  • 학습 비용: 팀 내 이해와 합의 필요.

 

클린 아키텍처 필수 요건

  1. 의존성 규칙(Dependency Rule)
    • 의존성은 바깥 레이어에서 안쪽 레이어로만 흐릅니다.
    • 핵심 비즈니스 로직(도메인)은 프레임워크, UI, DB를 전혀 몰라야 합니다.
  2. 도메인 로직(핵심 비즈니스 로직)의 독립성
    • 도메인 모델(Entity 등)은 순수 자바 코드로 작성해, 프레임워크나 DB 관련 코드를 넣지 않습니다.
    • 도메인 정책(Validation, Calculation 등)은 도메인 레벨에서 처리하고, 바깥 레이어(프레임워크/인프라) 의존 로직을 섞지 않습니다.
  3. 인터페이스를 통한 의존 역전(DIP)
    • 도메인이나 Use Case 측에서 필요한 기능(DB 저장, 메시지 전송 등)은 인터페이스로 정의합니다.
    • 실제 구현은 Adapter(구현체) 가 담당하고, 도메인/Use Case는 구현체를 몰라야 합니다.
  4. 테스트 용이성
    • 도메인/Use Case가 외부 환경(DB, 네트워크 등)에 의존하지 않도록 설계합니다.
    • Mock/Stub을 이용해 유닛 테스트가 쉽도록 구조를 마련합니다.

 


https://learn.microsoft.com/ko-kr/azure/architecture/guide/architecture-styles/microservices

4. 마이크로서비스 아키텍처 (Microservices Architecture)

특징

  • 시스템을 독립된 작은 서비스로 분리하여, 각각의 서비스가 독립적으로 배포 및 확장 가능.
  • 각 서비스는 독립적인 데이터베이스를 가질 수 있음.

장점

  • 확장성: 서비스별로 독립적인 스케일링 가능.
  • 유연성: 각 서비스마다 적합한 기술 스택 선택 가능.
  • 장애 격리: 특정 서비스 장애가 전체 시스템에 영향을 덜 미침.

단점

  • 운영 복잡성: 서비스 간 통신, 배포 관리, 모니터링 등 관리 부담 증가.
  • 데이터 일관성: 트랜잭션 관리가 복잡해질 수 있음.
  • 개발 비용: 초기 설계와 개발 단계에서 시간과 리소스 투자 필요.

https://akasai.space/architecture/about_event_driven_architecture/

5. 이벤트 드리븐 아키텍처 (Event-Driven Architecture)

특징

  • 컴포넌트 간 통신을 이벤트로 처리하여, 비동기 메시징 기반으로 동작.
  • 프로듀서컨슈머가 느슨하게 결합.

장점

  • 확장성: 비동기 처리로 높은 트래픽 처리 가능.
  • 유연성: 각 컴포넌트가 독립적으로 동작하며, 쉽게 추가 및 제거 가능.
  • 실시간 처리: 이벤트 기반으로 즉각적인 응답 처리.

단점

  • 복잡성: 이벤트 흐름 관리 및 디버깅이 어려움.
  • 데이터 정합성: 이벤트 중복 처리 및 트랜잭션 관리 필요.

6. 주요 아키텍처 비교

아키텍처 주요 특징 장점  단점 적용 사례
레이어드 아키텍처 계층별 역할 분리 구조화 쉬움, 가독성 높음 계층 간 의존성, 성능 저하 가능 전통적 웹 애플리케이션
헥사고날 아키텍처 도메인 중심, 외부는 어댑터로 연결 도메인 독립성, 테스트 용이 초기 설계 복잡 대규모 엔터프라이즈 시스템
클린 아키텍처 의존성 역전 원칙 적용, 계층 간 분리 유지보수 용이, 테스트 가능 복잡한 설계, 높은 학습 비용 비즈니스 로직이 복잡한 시스템
마이크로서비스 작은 서비스로 독립 배포 장애 격리, 서비스별 스케일링, 다양한 기술 스택 운영 및 데이터 관리 복잡 대규모 분산 시스템, 클라우드 네이티브 앱
이벤트 드리븐 이벤트 기반 비동기 처리 확장성, 높은 성능 디버깅 어려움, 데이터 정합성 문제 실시간 데이터 처리, IoT, 메시징 시스템

학습하면 좋은 추가 주제

  1. 각 아키텍처의 실제 적용 사례
    • 각 패턴을 기반으로 설계된 오픈소스 프로젝트 분석.
  2. 아키텍처 설계와 테스트 전략
    • 아키텍처별 단위 테스트, 통합 테스트, E2E 테스트 적용 방법.
  3. 도메인 중심 설계(DDD)
    • 헥사고날 및 클린 아키텍처와 결합해 효과적으로 도메인 로직 설계.
  4. 아키텍처 선택 기준
    • 프로젝트 규모, 팀 역량, 요구사항에 따라 아키텍처를 선택하는 전략.

 

'기본기' 카테고리의 다른 글

테스트와 개발  (0) 2025.02.21
리팩토링  (0) 2025.02.15
백엔드 로드맵  (0) 2025.01.06
Clean Cord  (4) 2024.12.05
이름 짓기 규칙  (0) 2024.12.05

QueryDSL(Query Domain-Specific Language)

📌 SQL, JPQL 같은 쿼리를 Java 코드로 작성할 수 있게 해주는 타입 안전한 ORM 기반 쿼리 빌더

  • SQL을 Java 코드로 작성하면서, 가독성과 유지보수성을 대폭 개선할 수 있는 도구
  • SQL-like 문법을 활용하여 가독성과 유지보수성을 향상시킵니다.

2. QueryDSL의 필요성

  1. 문법 오류 방지:
    • QueryDSL은 컴파일 타임에 문법 오류를 검출하여, 런타임 오류를 예방합니다.
  2. 필드 이름 변경 문제 해결:
    • 엔티티 필드가 변경되더라도, 쿼리가 자동으로 동기화됩니다.
  3. 동적 쿼리 작성 용이성:
    • 여러 조건을 유연하게 조합할 수 있는 동적 쿼리를 간단히 작성할 수 있습니다.
  4. 복잡한 쿼리 지원:
    • 조인, 서브쿼리, 그룹핑, 집계 등 복잡한 SQL 쿼리도 쉽게 작성 가능합니다.

3. QueryDSL의 장단점

장점 단점
타입 안전성: 컴파일 타임에 오류 감지. 초기 설정이 복잡하고 의존성 관리 필요.
가독성 향상: 명확한 SQL-like 문법. Q 클래스 자동 생성 과정 필요.
유지보수성 향상: 엔티티 필드 변경 반영. 러닝 커브 존재.
동적 쿼리 작성 용이. 간단한 CRUD 프로젝트에서는 과잉 도구.

4. QueryDSL 사용 예시

4.1 기본 설정

  • build.gradle.kts
dependencies {
    implementation("com.querydsl:querydsl-jpa:5.0.0")
    kapt("com.querydsl:querydsl-apt:5.0.0:jpa")
}

kapt {
    arguments {
        arg("querydsl.entityAccessors", "true")
    }
}

4.2 기본 코드 예시

  • 동적 쿼리 작성 예
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.querydsl.core.BooleanBuilder;

public List<User> findUsers(JPAQueryFactory queryFactory, Integer age, String name) {
    QUser user = QUser.user;

    BooleanBuilder builder = new BooleanBuilder();
    if (age != null) {
        builder.and(user.age.gt(age));
    }
    if (name != null) {
        builder.and(user.name.eq(name));
    }

    return queryFactory.selectFrom(user)
            .where(builder)
            .fetch();
}

4.3 복잡한 쿼리 예

  • 조인과 그룹핑
QOrder order = QOrder.order;
QCustomer customer = QCustomer.customer;

List<Tuple> result = queryFactory
    .select(customer.name, order.totalAmount.sum())
    .from(order)
    .join(order.customer, customer)
    .groupBy(customer.name)
    .fetch();

5. QueryDSL 적용이 적합한 경우

  1. 동적 쿼리가 많은 프로젝트:
    • 사용자 필터링, 복잡한 검색 기능 등이 포함된 시스템.
  2. 대규모 애플리케이션:
    • 조인, 서브쿼리 등 복잡한 쿼리가 많은 환경.
  3. 가독성과 유지보수가 중요한 팀:
    • SQL을 명시적으로 작성하지 않고, 코드에서 명확히 관리.

6. QueryDSL 적용이 부적합한 경우

  1. 간단한 CRUD 중심 프로젝트:
    • 네이티브 SQL 또는 JPA 기본 기능으로 충분한 경우.
  2. 네이티브 SQL 중심 환경:
    • SQL 문법을 직접 작성해야 하는 시스템.

7. QueryDSL의 대안

기술 특징
JPA Criteria JPA 표준, QueryDSL과 비슷하지만 코드가 장황해짐.
Native SQL 데이터베이스 벤더에 특화된 SQL 작성 가능.
Spring Data JPA 메서드 이름으로 간단한 쿼리 작성 가능, 동적 쿼리는 다소 어려움.


8. 학습하면 좋은 추가 주제

  1. QueryDSL의 고급 기능:
    • 서브쿼리 작성, 복잡한 집계 함수 활용.
  2. QueryDSL과 Spring Data JPA 통합:
    • QueryDSL PredicateExecutor 활용.
  3. QueryDSL 성능 최적화:
    • 페이징 쿼리, 배치 처리 전략.
  4. Q 클래스 생성 관리:
    • Q 클래스 자동 생성 도구(Maven, Gradle) 설정.

 

 

JDBC, JPA, JPQL, QueryDSL 비교

  JDBC  JPA  JPQL  QueryDSL
정의 Java에서 DB와 직접 상호작용하기 위한 저수준 API. 객체와 데이터베이스 간 매핑을 자동화하는 ORM 프레임워크. JPA에서 사용되는 객체 지향 쿼리 언어. JPA 기반 타입 안전한 쿼리 빌더.
작성 방식 SQL을 직접 작성. 메서드 호출로 DB 작업. SQL과 유사한 문법으로 JPA 엔티티를 다룸. Java 코드로 SQL-like 문법 작성.
장점 - 직접 SQL 작성으로 세밀한 제어 가능. - 자동화로 개발 생산성 증가.- 데이터베이스 독립성 보장. - SQL 대신 객체 지향적으로 쿼리 작성 가능.- JPA와 자연스럽게 연동 가능. - 타입 안전성 보장.- 동적 쿼리 작성 용이.- 가독성과 유지보수성 향상.
단점 - 코드가 장황하고 반복적임.- 데이터베이스 종속적. - 초기 학습 곡선 존재.- 성능 최적화를 위해 추가 설정 필요. - 런타임 시 오류 검출.- 동적 쿼리 작성 어려움.- 가독성이 떨어짐. - 초기 설정 복잡.- Q 클래스 생성 필요.- 러닝 커브 존재.
사용 시기 - 고성능 작업이나 데이터베이스 벤더 특화 기능이 필요한 경우. - 일반적인 CRUD 작업과 객체 지향적 접근이 필요한 경우. - 단순하고 고정된 객체 지향 쿼리가 필요한 경우. - 복잡한 동적 쿼리나 타입 안전성을 중시하는 경우.
실행 시점 - SQL 문법이 컴파일 시점에 확인되지 않음(런타임 확인). - SQL은 자동 생성됨. JPA 설정에 따라 실행.- 런타임 시 SQL 확인 가능. - 런타임 시 JPQL 파싱 및 실행.- 실행 중 문법 오류 발견. - SQL 문법을 컴파일 시점에 확인 가능.
적용 환경 - 소규모 프로젝트.- SQL 최적화가 중요한 경우. - 대규모 시스템.- 비즈니스 로직이 복잡한 경우. - JPA를 사용하는 환경에서 정적 쿼리를 작성할 때. - 대규모 프로젝트에서 유지보수성 및 가독성이 중요한 경우.
학습 난이도 낮음 (SQL만 익숙하면 사용 가능). 중간 (ORM 개념 및 설정 학습 필요). 중간 (SQL과 유사하지만 JPA 개념 필요). 높음 (JPA와 QueryDSL 문법 학습 필요).

주요 선택 기준

  • JDBC: SQL에 익숙하며, 데이터베이스에 최적화된 세부 작업이 필요한 경우.
  • JPA: 객체 지향적으로 데이터를 처리하고, 데이터베이스 독립성을 중시하는 경우.
  • JPQL: 객체 지향적 쿼리가 필요하지만, 단순한 정적 쿼리 위주로 사용할 때.
  • QueryDSL: 동적 쿼리와 복잡한 조건 쿼리가 빈번히 요구되며, 가독성과 타입 안전성을 중시할 때.

 

+ Recent posts