2026/07 20

대규모 시스템 설계와 RabbitMQ

💡 오늘 학습 키워드대규모 시스템 설계RabbitMQ 🎯 학습 내용 정리웹 서비스를 운영하다 보면 사용자가 증가하면서 동시에 수많은 요청이 발생한다.초기에는 하나의 서버와 하나의 데이터베이스만으로도 충분하지만, 서비스 규모가 커질수록 단순한 구조만으로는 성능과 안정성을 보장하기 어렵다.대규모 시스템에서는 많은 요청을 안정적으로 처리하면서도 장애에 강하고, 확장 가능한 구조를 설계하는 것이 중요하다.RabbitMQ는 이러한 환경에서 비동기 처리와 서비스 간 결합도를 낮추기 위해 가장 많이 사용하는 메시지 브로커 중 하나이다. 1. 대규모 시스템 설계대규모 시스템이라고 해서 단순히 사용자가 많은 시스템만 의미하는 것은 아니다.많은 사용자가 동시에 접속하더라도 안정적으로 서비스를 제공할 수 있도록 ..

Redis를 활용한 Session Clustering, Leaderboard 그리고 Cache

💡 오늘 학습 키워드Session ClusteringLeaderboardCache 🎯 학습 내용 정리웹 서비스를 운영하다 보면 단순히 데이터를 저장하는 것보다 빠르게 조회하고, 여러 서버가 동일한 데이터를 공유하며, 반복되는 조회를 줄이는 것이 더 중요한 순간이 많다.Redis는 이러한 문제를 해결하기 위해 가장 많이 사용하는 인메모리 데이터베이스이다. 1. SessionHTTP는 Stateless Protocol이다.즉, 하나의 요청이 끝나면 서버는 이전 요청에 대한 상태를 기억하지 않는다. 예를 들어 사용자가 로그인했다고 가정해 보자.로그인 요청 ↓로그인 성공 ↓상품 조회 요청상품 조회 요청만 봤을 때 서버는 다음과 같은 사실을 알 수 없다.누가 요청했는지로그인한 사용자인지이전 요청이 무..

Redis

💡 오늘 학습 키워드Redis 🎯 학습 내용 정리서비스를 개발하다 보면 모든 데이터를 관계형 데이터베이스(RDB)에 저장하는 것이 항상 최선은 아니다. 로그인 세션, 장바구니, 인증번호, 조회수처럼 빠르게 변경되고 일정 시간이 지나면 사라져도 되는 데이터는 오히려 RDB보다 메모리에 저장하는 것이 훨씬 효율적이다. Spring Boot 프로젝트에서는 일반적으로 MySQL, PostgreSQL과 같은 관계형 데이터베이스를 사용한다.RDB는 데이터를 디스크(SSD/HDD)에 저장하기 때문에 서비스가 종료되어도 데이터가 유지되는 영속성(Persistence)을 제공한다.하지만 다음과 같은 데이터는 특성이 다르다.로그인 세션인증번호(OTP)Refresh Token장바구니조회수캐시 데이터이러한 데이터는..

CI/CD와 GitLab CI + AWS ECS 자동배포

💡 오늘 학습 키워드CI/CDGitLab CI + AWS ECS 🎯 학습 내용 정리1. CI/CD소프트웨어를 개발하다 보면 새로운 기능을 추가하거나 버그를 수정할 때마다 다음과 같은 과정을 반복하게 된다.코드 작성빌드테스트배포이 과정을 모두 사람이 직접 수행한다면 시간이 오래 걸리고, 실수할 가능성도 높아진다.CI/CD는 이러한 과정을 자동화하여 개발 생산성과 서비스 안정성을 높이는 방법이다. CI는 Continuous Integration의 약자로 지속적인 통합을 의미한다.여러 개발자가 작업한 코드를 자주 메인 브랜치에 병합하고, 코드가 변경될 때마다 자동으로 빌드와 테스트를 수행하는 과정이다. 예를 들어 GitHub이나 GitLab에 코드를 Push하면 다음과 같은 작업이 자동으로 실행된다..

Docker와 Docker Compose

💡 오늘 학습 키워드DockerDocker Compose 🎯 학습 내용 정리1. Docker개발을 하다 보면 가장 자주 발생하는 문제 중 하나가 환경 차이(Environment Difference) 이다.개발자의 PC에서는 정상적으로 실행되던 애플리케이션이 테스트 서버나 운영 서버에서는 실행되지 않는 경우가 자주 발생한다. 운영체제, 라이브러리 버전, 런타임 환경 등이 서로 다르기 때문이다. Docker는 이러한 문제를 해결하기 위해 등장한 컨테이너 기반 가상화 플랫폼이다.애플리케이션과 실행에 필요한 모든 요소를 하나의 이미지(Image)로 만들고, 이를 컨테이너(Container) 형태로 실행하여 어느 환경에서든 동일한 실행 결과를 보장한다. 기존의 가상 머신(VM)처럼 운영체제를 통째로 올리..

Spring Security에서 흔히 발생하는 문제와 해결 사례

💡 오늘 학습 키워드Spring Security에서 흔히 발생하는 문제 & 해결 사례 🎯 학습 내용 정리Spring Security를 처음 적용하면 기능 구현보다 오류를 해결하는 데 더 많은 시간을 보내는 경우가 많다.JWT를 정상적으로 발급했는데도 401 Unauthorized가 반환되거나, 인증이 완료되었는데 403 Forbidden이 발생하기도 한다. 또한 SecurityContextHolder에서 Authentication이 null로 조회되거나 hasRole()이 정상적으로 동작하지 않는 문제도 자주 발생한다.이러한 문제들은 대부분 Spring Security의 동작 원리를 충분히 이해하지 못한 상태에서 발생한다. 따라서 단순히 오류를 해결하는 것보다 왜 이런 현상이 발생하는지를 이해하..

Spring Security 전체 과정 흐름 추적

💡 오늘 학습 키워드Spring Security 전체 과정 흐름 추적 🎯 학습 내용 정리Spring Security를 처음 학습하면 SecurityFilterChain, JwtAuthenticationFilter, Authentication, SecurityContextHolder, AuthorizationFilter 등 다양한 구성 요소를 개별적으로 배우게 된다. 하지만 실제 요청이 들어왔을 때 이들이 어떤 순서로 동작하는지 한 번에 이해하기는 쉽지 않다. 예를 들어 다음과 같은 의문이 생길 수 있다.JWT는 언제 검증될까?Authentication은 언제 생성될까?SecurityContextHolder에는 누가 저장할까?@PreAuthorize는 언제 실행될까?Controller에서는 어떻게..

Refresh Token

💡 오늘 학습 키워드Refresh Token 🎯 학습 내용 정리JWT 기반 인증을 처음 구현하면 Access Token 하나만으로 인증을 처리해도 충분해 보인다. 하지만 Access Token의 유효 시간을 길게 설정하면 토큰이 탈취되었을 때 장기간 악용될 수 있고, 반대로 유효 시간을 너무 짧게 설정하면 사용자는 자주 로그인을 다시 해야 하는 불편함을 겪게 된다.이러한 문제를 해결하기 위해 등장한 방식이 Access Token과 Refresh Token을 함께 사용하는 구조이다.Access Token은 짧은 수명을 가지며 API 인증에 사용되고, Refresh Token은 긴 수명을 가지며 새로운 Access Token을 발급받는 용도로만 사용된다. 왜 Refresh Token이 필요할까?A..

CORS와 CSRF

💡 오늘 학습 키워드CORSCSRF 🎯 학습 내용 정리Spring Security를 처음 적용하면 가장 먼저 작성하는 설정 중 하나가 다음 코드이다.http .csrf(AbstractHttpConfigurer::disable) .cors(Customizer.withDefaults());많은 개발자가 이 설정을 관례처럼 복사하여 사용하지만, 왜 필요한지 정확히 이해하지 못하는 경우가 많다.특히 JWT 기반 인증에서는 대부분 CSRF를 비활성화하는데, 이를 "JWT를 사용하니까 무조건 CSRF를 끄면 된다."라고 이해하는 것은 정확하지 않다. CSRF는 인증 정보를 브라우저가 자동으로 전송하는 방식과 관련된 공격이고, CORS는 브라우저의 동일 출처 정책(Same-Origin Policy..

AuthenticationEntryPoint와 AccessDeniedHandler 예외 처리

💡 오늘 학습 키워드AuthenticationEntryPointAccessDeniedHandler 🎯 학습 내용 정리Spring Security를 적용하면 인증 또는 권한과 관련된 문제가 발생했을 때 자동으로 HTTP 상태 코드를 반환한다.인증되지 않은 사용자가 보호된 API에 접근하면 401 Unauthorized가 반환되고, 인증은 되었지만 권한이 부족한 사용자가 접근하면 403 Forbidden이 반환된다.많은 개발자는 이 두 응답을 단순히 상태 코드의 차이로만 이해하지만, Spring Security 내부에서는 서로 다른 예외가 발생하며, 각각을 처리하는 컴포넌트도 다르다. 예외 처리 방식을 이해하기 위해서는 먼저 인증과 인가를 구분해야 한다.인증(Authentication)은 사용자가..