7장. IO 병목, 어떻게 해결하지네트워크 IO와 자원 효율서버는 클라이언트, DB, 레디스, 외부 API 등과 네트워크로 데이터를 주고받는다.네트워크 통신은 데이터를 보내는 write()와 받는 read()로 정리할 수 있다.DB에 SELECT 쿼리를 실행할 때도 서버가 쿼리를 전송하고 DB의 응답을 읽는다.입출력이 끝날 때까지 스레드가 기다리는 것을 블로킹이라고 한다.네트워크 연동이 많은 프로그램은 코드 실행보다 IO 대기에 더 많은 시간을 사용할 수 있다.요청마다 스레드를 할당하면 한 스레드가 IO를 기다리는 동안 다른 요청을 처리할 수 있다. 하지만 트래픽과 함께 스레드 수가 늘어나면 자원 효율이 떨어진다.스레드마다 사용하는 메모리가 증가한다.실행할 스레드를 바꾸는 컨텍스트 스위칭이 늘어난다.컨텍..
짠팟 프로젝트 — AWS 서버 구축부터 CI/CD 자동 배포까지Spring Boot 프로젝트를 AWS EC2에 배포하고, GitHub Actions로 자동 배포 파이프라인을 구축한 과정을 정리합니다.전체 아키텍처 한눈에 보기사용자 (인터넷) ↓jjanpot.shop (카페24 DNS) ↓AWS EC2 (퍼블릭 IP) ├── Nginx (리버스 프록시, 80/443) │ ↓ │ Docker 컨테이너 (Spring Boot, 8080) │ ├── AWS RDS MySQL (EC2 전용 접근) │ └── AWS S3 (파일 저장소) └── Let's Encrypt (HTTPS 인증서)GitHub Actions (main push 시 자동 배포..
HTTP vs HTTPS 환경에서의 쿠키 보안 설정 Spring Boot로 인증 시스템을 구현하다 보면, 로컬 개발 환경과 배포 환경에서 쿠키 설정을 다르게 해야 하는 상황을 마주하게 됩니다.이번 글에서는 왜 그래야 하는지, 그리고 쿠키 보안의 전반적인 개념을 정리해보겠습니다.1. 문제 상황: 왜 환경마다 쿠키 설정이 다를까?Spring Boot에서 Refresh Token을 쿠키로 관리할 때, 보통 이런 식으로 환경별 설정을 분리합니다.# application-local.yml (로컬 개발)security: cookie: refresh: secure: false same-site: Lax# application-prod.yml (배포)security: cookie: re..
짠팟 인프라 개선 방향 — 보안과 확장성현재 단일 EC2 구조에서 발생할 수 있는 위험 요소를 분석하고, 트래픽 증가와 보안 위협에 대응하기 위한 AWS 인프라 개선 방향을 정리합니다.1. 현재 아키텍처 구조현재 짠팟의 전체 서버 흐름은 아래와 같습니다. 현재 짠팟은 VPC 내 Public/Private Subnet이 분리된 구조입니다. EC2(Nginx, Spring Boot Blue/Green, Prometheus+Grafana)는 Public Subnet에, RDS는 Private Subnet에 위치하여 외부 직접 접근이 차단되어 있습니다. 단, EC2는 단일 인스턴스로 운영 중이며 단일 AZ(ap-northeast-2a)에 집중되어 있습니다.2. 현재 구조의 위험 요소현재 짠팟은 모든 것이 EC2..
Spring Boot Logback 설정과 로그 레벨 가이드1. Logback을 별도 설정하는 이유Spring Boot는 기본적으로 Logback이 내장되어 있어 별도 의존성 추가 없이 바로 콘솔 출력이 가능합니다. 그러나 기본 설정만으로는 운영 환경에서 필요한 요구사항을 충족하기 어렵습니다. 파일로 저장되지 않고, 환경별 로그 레벨 분리가 안 되며, 포맷도 단순하기 때문입니다.별도 설정이 필요한 핵심 이유는 다음과 같습니다.환경별 로그 레벨 분리. 개발 시에는 상세한 로그가, 운영 시에는 중요한 로그만 출력되도록 구분해야 합니다.파일 로그 저장 및 롤링 정책. 운영 서버에서는 콘솔 로그를 직접 확인하기 어렵기 때문에 파일로 저장해야 합니다. 또한 로그가 무한정 쌓이면 디스크가 꽉 찰 수 있으므로 날짜별..