
오늘부터 내일배움캠프 단기 심화 7기 과정이 시작되었다."기록은 기억을 지배한다."블로그를 개설한지는 오래되었지만 꾸준하게 작성하지 못했었다. 내일배움캠프에서 TIL을 주5일은 꾸준하게 작성하는 것을 첫번째 목표로 설정했다.Gradle은 빌드 자동화 시스템이다.Grad

MVC 패턴은 소프트웨어를 구성하는 요소들을 Model, View, Controller로 구분하여 각각의 역할을 분리한다.데이터와 비즈니스 로직을 담당한다데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행한다.사용자 인터페이스를 담당한다.사용자가 보는

이전 글에서 Spring이 DispatcherServlet으로 반복되고 귀찮은 일을 처리해주기 때문에 Controller만 잘 만들면 된다고 했다.하지만 Controller클래스 하나로 비즈니스로직과 DB연결된 작업 모두 처리하면 기능이 추가될수록 코드가 복잡해지고 유

JPA는 자바 객체와 DB 테이블을 매핑하는 ORM 기술 표준이다. 그 중심에는 영속성 컨텍스트라는 논리적 영역이 존재한다.영속성 컨텍스트의 주요 기능1차 캐시: DB 조회 전 컨텍스트 내부에 객체가 있는지 확인하여 성능을 최적화한다.쓰기 지연 (Write-Behind

@Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록해준다. 그래서 일반적으로는 @Component를 사용하여 Bean을 자동으로 등록하여 관리하는 것이 좋다.하지만 기술적인 문제나 공통적인 관심사를 처리할

인증(Authentication)인증은 해당 유저가 실제 유저인지 인증하는 것이다.로그인을 생각하면 된다.인가(Authorization)인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가하는 개념이다.등급별로 접근 가능한 기능에 차이가 있다던지, 회원/비회원 여부에

Spring Cloud는 마이크로서비스 개발을 위해 다양한 도구와 서비스를 제공하는 스프링 프레임워크의 확장이다. MSA를 쉽게 구현하고 운영할 수 있도록하는 도구들이 많이 있다.주요 기능서비스 등록 및 디스커버리: Eureka, Consul, Zookeeper로드 밸

로드 밸런싱이란? 로드 밸런싱은 네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술 서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지 종류: 클라이언트 사이드 로드 밸런싱, 서버 사이드 로드 밸런싱

서킷 브레이커는 마이크로서비스 간의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지하는 패턴외부 서비스 호출 실패 시 빠른 실패를 통해 장애를 격리하고, 시스템의 다른 부분에 영향을 주지 않도록 한다.상태 변화: 클로즈드 -> 오픈 -> 하프-오픈Resilienc

API 게이트웨이란? API 게이트웨이는 클라이언트의 요청을 받아 백엔드 서비스로 라우팅하고 다양한 부가 기능을 제고하는 중간 서버이다. 클라이언트와 서비스 간의 단일 진입점 역할을 하며 보안, 로깅, 모니터링, 요청 필터링 등을 처리한다.

MSA(Microservices Architecture) MSA는 하나의 애플리케이션을 여러 개의 독립적인 서비스로 분리하여 개발, 배포, 유지보수를 용이하게 하는 소프트웨어 아키텍처 스타일이다. 각 서비스는 특정 비즈니스 기능을 수행하며, 서로 독립적으로 배포되고 확

마이크로서비스 아키텍처에서는 각 서비스가 독립적으로 배포되고 통신하기 때문에 보안이 매우 중요하다.데이터 보호, 인증 및 권한 부여, 통신 암호화 등을 통해 시스템의 보안성을 확보해야 한다.OAuth2는 토큰 기반의 인증 및 권한 부여 프로토콜이다.클라이언트 애플리케이

Spring Cloud Config는 분산 시스템 환경에서 중앙 집중식 구성 관리를 제공하는 프레임워크이다.애플리케이션의 설정을 중앙에서 관리하고, 변경 사항을 실시간으로 반영할 수 있다.Git, 파일 시스템, JDBC 등 다양한 저장소를 지원한다.중앙 집중식 구성 관

분산 추적이란? 분산 추적은 분산 시스템에서 서비스 간의 요청 흐름을 추적하고 모니터링하는 방법이다. 각 서비스의 호출 관계와 성능을 시각화하여 문제를 진단하고 해결할 수 있도록 돕는다. 분산 추적이 왜 필요할까? MSA에서는 하나의 요청을 처리할 때 여러 서비스를

이벤트 드리븐 아키텍처는 시스템에서 발생하는 이벤트(상태 변화나 행동)를 기반으로 동작하는 소프트웨어 설계 스타일이다. 이벤트는 비동기적으로 처리되며, 서비스 간의 느슨한 결합을 통해 독립적으로 동작할 수 있게 한다.이벤트: 시스템 내에서 발생하는 상태 변화나 행동을

자바를 처음 배우며 객체를 생성하는 방법으로 new를 사용한다고 배웠었다.하지만 스프링 프레임워크를 사용하여 개발을 할 때는 new를 거의 사용하지 않는다.이런 식으로 Controller, Service, Repository 객체를 직접 생성하는 코드를 작성하지 않았다

회원가입/로그인 기능 구현하고 보니 현재 진행 중인 주문 플랫폼 서비스에서는 모든 도메인에서 인증된 사용자를 체크해야 했습니다. 하지만 모든 도메인의 컨트롤러에서 토큰을 파싱하여 권한 체크를 하면 반복되기도 하고 비즈니스 로직보다 권한 체크 로직이 더 커질 수도 있다고
입문 프로젝트 배달 주문 플랫폼을 약 2주간 진행하여 드디어 마무리되었다. 아쉬운 점이 많기에 그냥 흘려보내지 않기 위해 회고록을 작성해보고자 한다.이번 프로젝트에서 인증/인가 시스템, 회원 및 배송지 도메인 구현, 공통 응답및 전역 처리기 구축, CI/CD 파이프라인

Docker는 애플리케이션을 쉽게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. 애플리케이션을 컨테이너라는 가볍고 이식성 있는 패키지로 실행할 수 있습니다. 이 안에는 라이브러리, 시스템 도구, 코드 등 실행에 필요한 모든 것이 포함됩니다.컨테이너화: 애플

Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구입니다. 여러 개의 컨테이너 설정을 YAML파일 하나에 적어두고, 명령어 한 줄로 모든 서비스를 동시에 올리거나 내릴 수 있습니다.간편한 관리: 복잡한 실행 옵션을 매번 입력할 필요 없

두 개의 스프링 부트 서비스가 서로 데이터를 주고받는 구조입니다.Service-B: /hello 호출 시 "hello"라는 문자열을 반환하는 서버.Service-A: OpenFeign을 이용해 Service-B를 호출. 자신의 메시지와 B의 응답을 합쳐서 반환. (\`

데이터를 저장할 때 우리는 보통 MySQL 같은 관계형 데이터베이스(RDBMS)를 떠올립니다. 하지만 서비스의 규모가 커지고 속도가 중요해지면, '영속성'보다 '속도'가 더 중요한 순간이 옵니다. 이때 등장하는 구세주가 바로 Redis입니다.우리가 흔히 쓰는 DB는 데

Redis는 단순한 Key-Value 저장소를 넘어, 다양한 자료구조(Data Types)를 지원합니다. 각 자료형의 특징과 핵심 명령어를 정리해 보았습니다.Java의 Map<String, String>과 유사하며, 문자열뿐만 아니라 숫자, 이미지(바이트) 등도

Redis의 기본 자료형을 익혔다면, 이제 실제 백엔드 서비스(Spring Boot)에 Redis를 연동해 볼 차례입니다. Spring에서 Redis를 사용하는 두 가지 주요 방법인 RedisRepository와 RedisTemplate을 알아보겠습니다.Spring I

단순한 이론 공부를 넘어, 실제 서비스(블로그 조회수, 랭킹)에서 Redis 명령어가 어떻게 활용되는지 실습해 보겠습니다.시나리오: 블로그 글(/articles/{id})에 접속할 때마다 로그인 여부와 관계없이 조회수가 1씩 증가합니다.선정 데이터 타입: String이

서비스 규모가 커지면 서버를 여러 대 두는 Scale-Out이 필수적입니다. 하지만 Scale-Out 시 발생하는 문제가 세션 불일치입니다. 이 문제와 해결 방안에 대해 알아보겠습니다.HTTP는 상태가 없는(Stateless) 프로토콜입니다. 따라서 서버는 사용자를 식

쇼핑몰의 '인기 상품 TOP 10'이나 게임의 '실시간 랭킹'처럼 순위를 매겨 보여주는 기능은 사용자 경험에 매우 중요합니다. 하지만 이를 RDB(관계형 데이터베이스)만으로 구현하려면 성능 고민이 깊어질 수밖에 없습니다. 왜 리더보드에서 Redis의 Sorted Set

Redis를 활용하는 가장 대표적인 사례 중 하나가 바로 \*\*캐싱(Caching)입니다. 캐싱이란 무엇이며, 왜 현대 웹 서비스에서 필수적인지 알아보겠습니다.캐싱은 자주 사용되는 데이터를 원본 저장소(DB 등)보다 훨씬 빠른 임시 저장소(Cache)에 보관하여, 시

데이터베이스의 부하를 줄이고 성능을 높이기 위해 Spring 환경에서 Redis를 캐시 저장소로 활용하는 방법을 알아보겠습니다.Spring은 어노테이션 기반의 캐싱을 지원합니다. 먼저 설정을 위해 @EnableCaching을 추가하고 RedisCacheManager를

Redis의 속도는 단순히 소프트웨어의 최적화 때문만이 아니라 물리적인 매체의 차이에서 기인합니다.RAM(메모리): 순수 논리 회로를 통해 전자의 이동만으로 데이터를 읽고 씁니다. 접근 속도는 약 120ns(나노초) 수준입니다.디스크(SSD/HDD): 아무리 빠른 SS

## 분산 환경의 최대 적, 동시성 문제와 분산 락 ### ⚔️ SETNX의 동작 원리와 원자적(Atomic) 처리 분산 락은 공용 자원에 대해 "오직 한 명만 열쇠를 가질 수 있게" 만드는 메커니즘입니다. **SETNX(SET if Not eXists)**: "키

금요일 오후 5시, 운영 서버에 무심코 던진 KEYS \* 한 줄. 3초 후 서비스 전체가 마비되고 CS가 폭주한다면? 상상만 해도 끔찍한 이 시나리오는 Redis의 동작 원리를 모를 때 언제든 일어날 수 있습니다. 이러한 사고를 치지 않기 위해 Redis를 안전하게

Redis는 메모리 효율을 위해 같은 자료구조라도 데이터 크기에 따라 내부 저장 방식(Encoding)을 자동으로 전환합니다.Sorted Set(ZSET)이 수백만 개의 데이터 중에서도 특정 순위를 $O(\\log N)$으로 찾아낼 수 있는 이유는 지하철 급행 노선 같

대규모 시스템은 단순히 수백만 명의 사용자가 접속하는 시스템을 넘어, 안정성과 신뢰성을 유지하며 고성능을 제공하는 시스템을 의미합니다.큐(Queue)를 통한 스트림 처리: 어떤 상황에서 큐를 사용해야 하는지 큐를 효과적으로 관리하는 방법에 대해서 알아보려고 합니다.성능

데이터 고도화 설계: 이벤트 소싱 & CQRS 복잡한 비즈니스 로직과 대규모 트래픽 환경에서는 단순한 DB 저장 방식만으로는 한계가 있습니다. 이벤트 소싱 (Event Sourcing) 데이터의 최종 상태가 아닌 '상태 변화(이벤트)' 자체를 순차적으로 기록하는 방

RabbitMQ는 메시지를 안전하고 유연하게 전달하는 데 최적화된 메시지 브로커입니다. RabbitMQ는 메시지를 큐(queue)에 저장하고, 필요할 때 적절한 수신자에게 전달합니다.비동기 처리: 데이터를 비동기적으로 처리하여 시스템의 응답성을 높입니다.부하 분산: 여

대규모 트래픽이 몰리는 서비스에서는 단순히 기능을 구현하는 것보다 "동시에 수많은 요청이 들어왔을 때 시스템이 어떻게 동작하는가"가 훨씬 중요해집니다.대규모 스트림 처리 강의 중간에 언급한 선착순 쿠폰 이벤트같은 짧은 시간 동안 폭발적인 요청이 몰리는 시스템을 어떻게

개발 환경에서 완벽하게 동작하던 API가 운영 환경에서 무너지는 이유는 단순합니다. 개발 중에는 동시 사용자가 1명이지만, 실제 서비스는 수천 명의 사용자가 스레드, DB 커넥션, 메모리를 두고 치열하게 경쟁하기 때문입니다. 시스템이 어디까지 버티는지 확인하는 부하 테