본문 바로가기
반응형

Kotlin Spring45

[부록] Consumer Retry vs Command Replay 처리 1. Consumer Retry vs Command Replay 처리 : 만약 결제는 성공했는데, 배송 생성이 실패했다면? 환불하는게 적합한 의사결정일까? 배송생성을 재시도 하는게 적합한 의사결정일까? 그럼 환불하면 안 된다면, 시스템은 어떻게 복구되어야 할까? 2. 비동기 이벤트 기반처리 시 실패유형정리순번실패 유형예시처리방안1이벤트 전송실패Kafka publish 실패Transactional Outbox Pattern2Consumer 처리실패DB timeout or 외부 api 장애 등으로 일시적 장애의 경우Kafka Retry / Backoff → 초과 시 DLT3Consumer 이후 비지니스 로직 실패 유형1의도된 예외로 인한 실패(잔액 부족 등)Saga Pattern .. 2026. 2. 3.
[부록] JPA(Java Persistence API) 1. JPA(Java Persistence API) 란? - 자바 진영에서 사용하는 ORM(Object-Relational Mapping) 기술 표준 - 관계형 데이터베이스(RDB)를 자바 객체로 다루기 위한 인터페이스의 집합 2. ORM(Object-Relational Mapping) 이란? - 객체(Object)와 관계형 데이터베이스(RDB)의 테이블을 매핑하는 기술 - 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화(persistence) 해주는 기술 - 개발자는 객체만 다루고, 실제 SQL 생성과 실행은 ORM 프레임워크가 담당 3. ORM 장점 1) SQL이 아닌 객체 중심 개발 - SQL 대신 메서드 호출로 DB 조작 .. 2026. 1. 27.
[부록] Docker for Mysql, Redis, Kafka 1. Docker 란? : VM(Viture Machine)의 경량화 버전으로, 응용프로그램실행에 꼭 필요한 경량화된 OS 및 서버를 설치하여 컨테이너 기반으로 실행, 관리하는 오픈 소스(하나의 격리된 작은 PC 개념) (추가설명 링크: https://www.ibm.com/kr-ko/topics/docker ) 2. Docker 설치 1) 다운로드 : https://www.docker.com/ Docker: Accelerated Container Application DevelopmentDocker is a platform designed to help developers build, share, and run container applications. We handle t.. 2026. 1. 26.
[부록] REST 기반 마이크로 서비스 간 통신 - OpenFeign 1. 모든 내부 통신을 Kafka 기반 비동기 이벤트로 처리하면? 1) 주문하기와 같은 로직 처리 시 동기로 장바구니 data를 가지고 와야 하는데 kafka 이용 시 성능 감소 및 복잡성 증대 (return 받기 까지 처리시, consumer 제어에서 db 로 부터 data 를 가지고 와서 호출자에게 전달 할 때 - 폴링, 웹소켓등을 사용하여 전달 하여야 함!) 2) 소스레벨의 복잡성 증대로 인해, 개발 비용 증가 3) Kafka 이슈 발생 시 조회도 막힘(서킷 브레이커 fallback 지점 증가) 2. OpenFeign 이란? 1) netflix 에 의해 개발 됨(선언적 http client 도구) 2) HTTP API 호출을 인터페이스 선언만으로.. 2026. 1. 20.
Graceful Shutdown (처리중인 로직이 완료되지 않은 상태에서 종료할 것인가?) 1. K8S 기반 소스 배포 시 기존 POD 내 실행중인 프로세스가 있는 상화에도 불구하고 종료할 것인가? : No, 처리중인 내역이 모두 정상처리 후에 기존 Pod 를 정리해야 한다. 2. Graceful Shotdown 설정(spring boot 2.3이상 지원)server: port: 8080 shutdown: graceful # SIGTERM 수신 시 graceful shutdown 모드 활성화 #생략 spring: profiles: active: "local" lifecycle: timeout-per-shutdown-phase: 20s #종료대기 시간 설정(최대 허용 시간) 3. 처리 순서 1) K8S SIGTERM 을 보냄 2) spring boo.. 2026. 1. 15.
10) Kafka 기반 도메인 분리(3) - Saga 패턴이란? 1. Saga 패턴이란? : Saga 패턴은 분산 트랜잭션을 여러 개의 로컬 트랜잭션(Local Transaction) 시퀀스로 나누어 처리하고, 만약 실패 시 보상(Compensation) 작업을 통해 전체 일관성을 맞추는 패턴.2. 사용사례 1) 결제 중 쿠폰 사용 시 쿠폰 사용가능여부를 확인해서 사용으로 변경 했으나, 결제 시 잔액부족으로 결제를 할 수 있는 상황이 아니라면? → 쿠폰을 다시 사용가능한 형태로 롤백해야 함. (잔액 부족인 상태에서 시스템에서 재시도 해도 잔액부족은 바뀌지 않기때문) 2) 마찮가지로 주문 결제 시 재고차감에 성공하고 결제 시도 시 잔액부족으로 결제를 할 수 없는 상황이라면? .. 2026. 1. 14.
10) Kafka 기반 도메인 분리 (4) Transactional Outbox 패턴이란? 1. CAP 이론 이란? 1) 정의 - 분산 시스템에서 동시에 만족할 수 없는 세 가지 특성을 설명하는 이론 - 2000년 Eric Brewer가 제안 → "Brewer’s theorem" 2) 세 가지 요소 - C (Consistency, 일관성) : 모든 노드가 동시에 같은 데이터를 보며, 어떤 노드에서 읽든 항상 최신 데이터가 보장됨 - A (Availability, 가용성) : 모든 요청에 대해 항상 응답을 돌려줌, 다만 최신 데이터일 필요는 없음 - P (Partition Tolerance, 파티션 허용성) : 네트워크 장애나 노드 분리 상황(P.. 2026. 1. 13.
10) Kafka 기반 도메인 분리 (2) 결제 시 쿠폰도메인을 완전하게 분리하기 1. 도메인 분리를 왜 해야할까?(feat. 트랜젝션 분리) 1) 트랜잭션 범위가 커질수록 장애 전파가 기하급수적으로 증가 - 배송 DB 장애 → 결제 실패 - 결제 PG 지연 → 주문 생성 실패 - 하나의 느린 컴포넌트가 전체를 멈춤"하나만 죽어도 다 같이 죽는 구조” 2) 긴 트랜젝션으로 인해 락 경쟁과 성능 저하 - 오랜 락 유지(대기 시간 발생) - 동시성 감소 - TPS 처리량 하락"특히 결제·재고·배송 같은 핵심 도메인이 하나의 트랜잭션에 묶이면 성능상 병목지점 발생" 2. Kafka 를 이용한 도메인 분리방법은? 1) 각 도메인은 각 도메인에서 처리해야할 것만 책임.. 2026. 1. 13.
10) Kafka 기반 도메인 분리 (1) Kafka 란? 1. Kafka 란? : Apache 재단에 등록된 오픈소스로써, 분산형 스트리밍, 대규모 트래픽처리, 대용량 데이터 처리를 원활하게 처리하기 Message Queue https://kafka.apache.org/ Apache KafkaApache Kafka: A Distributed Streaming Platform.kafka.apache.org 2. Kafka 최근 근황 및 구조 - kafka 의 구성은 main 의 역할인 kafka와 헬스체크 등 보조적인 역할인 zookeeper 가 있음.- Apache Kafka 3.3 버전부터는 KRaft 를 합의 프로토콜로 공식 지정 함.(자체 메타 관리 가능)- 4.0 버전부터는 Zookeeper 를 완전히 제거 함.- 하지만, 대규모 기업 고객 대부.. 2026. 1. 13.
WebClient vs OpenFeign vs RestTemplate 비교 1. 라이브러리 별 권장 선택Case권장 라이브러리신규서비스 또는 MSA 용Feign or WebClient조직 생산성 및 표준화 측면OpenFeign이벤트 기반, 비동기 스트리밍, 리엑티브 스택WebClient레거시 내 Rest Template 사용 중이고 변경이 어려운 경우RestTemplate 2. 라이브 러리별 추가 설명 1) RestTemplate - 이미 끝난 기술(Spring 5부터 Deprecated), 주니어 개발자에게 RestTemplate뿐 아니라 OpenFeign에 대한 이해도 필요 함. - 이해가 쉬우며, 디버깅이 단순 - 동기 블로킹 I/O - MSA 환경에서 사용 시 logging, auth, retry 다량 증복 발생 .. 2026. 1. 1.
왜 많은 팀은 결국 Webflux와 같은 "Reactive Programming"를 포기하는가? 이 글은 1) 리액티브가 왜 실패하는지를 구조적 측면에서 설명하고, 2) 어떤 조건에서는 여전히 강력한지를 정의하며, 3) Kafka / 메시징이 이 문제를 어떻게 분리하는지를 아키텍처 관점에서 정리해본 것이다. 리액티브를 충분히 써 본 팀은 비슷한 지점에 도달한다.도입 초기의 성과를 지나, 운영 복잡성과 성능 병목을 동시에 마주하는 시점이다. 1. 리액티브의 전제는 명확하다“느린 I/O를 숨긴다”즉, 1) 스레드를 오래 점유하지 않는다. 2) 대기 시간 동안 다른 일을 처리한다. 3)높은 동시성을 적은 리소스로 처리한다 이 모든 것은 하나의 전제 위에서만 성립한다. I/O가 비동기·논블로킹일 것 CPU 작업, 네트워크 I/O, 이벤트 처리 파이프라인, 이 영역에서 리액티브는 압도적으로 효율적이다. 문.. 2025. 12. 22.
9) Spring 캐시 (4) Redis 로 캐싱 관리 1. 구현체만 Caffeine 에서 Redis 로 변경 Spring 캐시로 인해 추상체는 그대로 둔채 구현체만 변경가능! 2025. 9. 20.
9) Spring 캐시 (3)redis란? 1. Redis 란? : C언어로 구현된 Key value 기반의 data 저장소(nosql) 이자, pub sub 이 지원 되는 Message Queue 2. Redis 는 어떻게 동작할까? : Redis 핵심 서버 엔진은 단일 쓰레드, 논블로킹 이벤트 루프로 동작 ( 클라이언트 요청 → 이벤트 루프 → 명령 실행 → 응답 하는 구조임) - 이벤트 루프란? 1) 클라이언트가 요청을 보냄 → 소켓 이벤트 감지 2) 이벤트 루프가 해당 명령을 싱글 스레드에서 바로 실행 (대부분의 명령은 메모리 연산이므로 바로 처리 가능) 3) 처리 결과를 바로 클라이언트 소켓에 기록 (별도 스레드 없이도 논블로킹 소켓 사용 가능) .. 2025. 9. 20.
9) Spring 캐시 (2)분산 캐시란? 1. 로컬 캐시의 한계 1) 데이터 불일치(Inconsistency) - 서버 A, B, C가 각각 로컬 캐시를 들고 있을 경우, A에서 데이터가 갱신되더라도 B, C 캐시는 여전히 옛 데이터를 유지 - 분산 환경에서는 캐시 갱신 전파 불가능 2) 메모리 한계 - 캐시 데이터가 많아질수록 JVM Heap / 애플리케이션 메모리 부족(OutOfMemoryError 위험) - GC 부하 증가(애플리케이션 성능 저하로 까지 이어질 수 있음) 3) 확장성(Scalability) 부족 - 서버가 늘어날수록 각 서버가 동일한 데이터를 중복 캐싱(메모리 낭비) - 서버 수평 확장(Scale-out) 환.. 2025. 9. 20.
9) Spring 캐시 (1) HomeBody 상품 리스트 구현 내 "로컬 캐싱" 추가 1. 로컬 캐시란? - 서버 내부 메모리(Heap) 에 데이터를 캐싱하는 방식. - 대표적으로 Caffeine, Guava, EhCache 같은 라이브러리를 사용. - 장점 1) 낮은 지연 시간: DB나 Redis까지 가지 않고 바로 응답 2) 구현 단순: 라이브러리 import 후 간단하게 적용 가능 3) 추가 비용 없음: 별도 캐시 서버 필요 없음 2. 스프링 캐시는? 1) 추상화된 공통 API 제공 - @Cacheable, @CachePut, @CacheEvict, @Caching 같은 어노테이션을 제공 - 개발자는 캐시 라이브러리(Caffeine, Redis, Ehcache 등)를 몰라도 동일한 방식으로 .. 2025. 9. 20.
8) 테스트 코드 작성 (1)테스트 코드란? 1. 테스트 코드란? - 개발한 코드가 요구사항에 명시한 대로 동작하는지 검증하는 코드 - 테스트 자동화로 회귀 오류를 방지하고 안정적인 리팩토링을 지원! 2. 테스트 코드의 작성 이유 - 기능 요구사항의 검증 - 코드 변경 이후 기능 보호 - 문서화 효과 및 설계 개선 "테스트 코드 작성에 무한정 리소스를 투입할 순 없다."(테스크 커버리지 100%목적이 아니며, 중복테스트, 자주 변경되는 테스크 코드는 일단 보류하자)"테스트 케이스는 성공케이스에 대한 집중이 아닌 실패케이스 집중을 통해 시스템의 안정성을 검증하는데 있다."(의도한대로 실패하는가 > 실패상황에서도 장애없이 잘 동작하는가?) 3. Spring Boot에 Kotlin 조합의 테스트 코드 기본 : .. 2025. 9. 20.
7) 주요 기능 개발(Back-end) 주요 기능 개발(Back-end)1. 로그인 로그아웃 2. Home body - 최초 진입 시 표시 되는 화면을 위한 기능 - 고객의 유치를 위해 판매가 잘되는 상품들 노출 - 사용가능한 쿠폰 노출 - 추가고려사항 1) 사용자의 접근이 가장 많은 곳 2) 빈번하게 변경되는지 유무 3) 조회되는 data 량 4) 랭킹 로직을 어떻게 구현할 것인가? : 주문량 집계로 간단하게 구현해보자(주문시마다 상품 정보 update) 3. 상품(product) - 간단한 api 개발, 사용자가 상품조회(상품정보, 가격정보, 재고수량) 4. 장바구니(cart) - redis 를 활용한 장바구니 기능 개발 - 상.. 2025. 9. 2.
6) 개발 architecture (5) 강의용 Architecture 1. 강의에서 사용하는 아키텍처는? : 레이어드 아키텍처와 DDD, EDA, 클린아키텍처(일부)를 종합하여 설계2. 새로운 Architecture 를 적용한 배경 - 로직의 중심인 Domain 을 보호하고, 외부 시스템도 쉽게 변경할 수 있는 구조로 설계 - Facade 패턴을 이용, 프로젝트 초기 usecase 로 역할 수행하며, 도메인 레이어의 순환참조를 방지 - EDA 를 적절히 활용하여 Fat service 화를 방지 (도메인 별 트랜젝션 관리필요)프로젝트 초기에는 facade 로 usecase 의 흐름을 관리하다 커지면 EDA 기반으로 흐름을 관리하여 도메인의 느슨한 결합 추구 3. 패키지 아키텍처 구조 및 Layer 설명presentation ├── ap.. 2025. 9. 1.
Spring Boot warm up 순서 1. JVM & SpringApplication 시작 - main() → SpringApplication.run() 호출 - Spring Boot 내부에서 ApplicationContext, Environment 준비 2. Environment 준비 - application.yml / application.properties / OS env / JVM args 로드 - 이때 Redis, Kafka, DB의 연결 정보(URL, username, password, cluster info 등) 도 Environment에 로드됨 - 어떤 profile(local, dev, prod)을 쓸지도 결정됨 3. ApplicationContext 생성 & BeanDefinition 등록 .. 2025. 8. 31.
6) 개발 architecture (4) EDA(Event-Driven Architecture) 패턴 1. EDA 정의 (Event-Driven Architecture) : 이벤트 기반 아키텍처는 시스템 내 컴포넌트들이 이벤트를 중심으로 상호작용하도록 설계된 아키텍처 패턴 1) 한 서비스가 상태 변화나 특정 행동을 이벤트로 발행(publish) 2) 다른 서비스는 그 이벤트를 구독(subscribe) 하여 필요한 작업 수행 3) 전체 패키지 구조를 정하는 다른 아키텍처와는 달리, EDA는 타 아키텍처 기반에서 강결합과 비동기 등의부족한 부분을 보완할 수 있는 개발 패턴 중 하나 임 목표: "서비스 간 결합도를 낮추고, 확장성과 비동기 처리를 쉽게 만드는 것" 2. 핵심 구성 요소구성 요소역할Event시스템에서 발생한 사건 또는 메시지 (ex: O.. 2025. 8. 31.
6) 개발 architecture (3) 클린 아키텍처(Clean Architecture) 1. 클린 아키텍처 정의 : 클린 아키텍처는 도메인 중심 아키텍처로, 1) 비즈니스 규칙(Entity, Use Case)을 가장 안쪽에 두고, 2) 외부 의존성(웹, DB, 메시지 브로커, 프레임워크)을 바깥쪽에 둠 3) 의존성은 항상 안쪽으로만 향한다 (DIP: Dependency Inversion Principle)즉, 외부 기술은 교체 가능하고, 핵심 도메인은 독립적이라는 것이 핵심! 2. 계층 구조 설명 1) Entities - 순수한 비즈니스 규칙 (ex. Concert, User, Order 등) - 프레임워크에 전혀 의존하지 않는 (POJO, Kotlin Data Class)"비지니스 규칙 예시"fun cha.. 2025. 8. 31.
6) 개발 architecture (2) 헥사고날 아키텍처(Hexagonal Architecture) 1. 헥사고날 아키텍처 개념 : 애플리케이션의 비즈니스 로직(도메인)과 외부 시스템을 철저히 분리2. 계층(Layer) 구조 1) 포트(Port) - 외부와 통신하기 위한 인터페이스 - Inbound Port 는 usecase 의 interface 역할 - Outbound Port 는 repository interface 역할 2) 어댑터(Adapter) - 포트의 구현체 역할 - Inbound Adapter는 Controller, Kafka Listener 역할 수행 - Outbound Adapter는 외부 통신, DB, Kafka Producer 구현 등의 기.. 2025. 8. 31.
6) 개발 architecture (1) 레이어드 아키텍처(Layered Architecture) 1. 레이어드 아키텍처 개념 : 레이어드 아키텍처는 전통적인 애플리케이션 구조로, 관심사의 분리 (Separation of Concerns)에 기반해 계층을 나누는 패턴. 2. 계층(Layer) 구조 1) Presentation Layer (Controller, UI) - 사용자의 요청을 받아서 응용 계층(비지니스 계층)에 전달 - DTO 변환, HTTP 응답 처리 2) Business Layer (Service) - 비즈니스 로직 처리 - 유스케이스 실행 - 트랜젝션 경계설정 - repository 호출 3) Infrastructure Layer (R.. 2025. 8. 31.
5) 요구사항 분석 및 ERD 설계 1. 요구사항 분석현업에서 개발을 진행할 때 요구사항 분석 과정 없이 바로 개발부터 진행하는 주니어 개발자들이 눈에 많이 보입니다. 개발 이후 막히거나, 기획쪽 수정될 내용을 뒤늦게 찾게되면, 기존 개발했던 로직들을 전반적으로 수정해야해서 개발 시간을 더 달라는 개발자들이 있습니다. 그럴때 저는 반대로 질문합니다.요구사항 분석을 제대로 하셨나요?개발 전 요구사항에 명시되어 있는데요? 개발자 중 어떤 개발자는 질적으로도 속도적으로도 잘하는 개발자가 있는 방면, 어떤개발자는 코드 리뷰에도 수정될 부분이 많이 발생하고 개발시간도 느리게 개발하는 사람들이 있어요.그런데 그 중 원인을 분석해보면, 요구사항분석을 개발전에 진행했냐? 안했냐로 구분되기도 합니다.val 개발자에게_좋지_않은_습관 = "요구사항을 제대로.. 2025. 8. 31.
4) Spring @controller, @service, @repository 스프링은 기본적으로 레이어드 아키텍처(Layered Architecture)를 따르는데, 보통 다음 3단계로 나뉨 1. Controller(라우팅 역할) : “문 앞에서 손님을 맞이하는 안내원” 1) 클라이언트(웹/앱) 요청을 받고, 어떤 서비스가 필요할지 결정 2) 비즈니스 로직은 직접 하지 않고, Service로 위임import org.springframework.web.bind.annotation.*@RestController@RequestMapping("/users")class UserController( private val userService: UserService) { @PostMapping fun createUser(@RequestBody .. 2025. 8. 29.
3) Spring 컨테이너, Bean 1. "Spring 컨테이너"란?“Spring 컨테이너는 커피숍의 바리스타와 같다” 1) 커피숍에선 손님이 주문하면, 바리스타가 재료를 조합해서 커피를 만들어 줌 2) 바리스타는 커피를 만들기 위해서 커피 원두, 우유, 시럽 등 필요한 재료들을 잘 보관, 관리함 3) 바리스타가 모든 걸 직접 만들고, 관리하니 손님은 그냥 주문만 하면 됨 4) 즉, Spring 컨테이너는 객체(Bean)를 생성하고, 관리하며, 필요할 때 꺼내주는 "바리스타" 같은 존재2. Bean 이란?Bean은 커피숍에서 만드는 ‘커피’ 한 잔' 1) Bean은 "Spring 컨테이너"가 관리하는 "객체" 2) 직접 new 해서 만드는 게 아니라, Spring이 대신 만들.. 2025. 8. 26.
2) Spring Boot란? (맛보기) 1. Spring 이란? : Spring Framework는 자바 기반의 엔터프라이즈 애플리케이션 개발을 위한 핵심 프레임워크로, IoC(제어의 역전)와 DI(의존성 주입), AOP 등을 통해 유연하고 확장성 있는 애플리케이션 개발을 지원하는 기술 2. Spring Boot 란? - Spring Boot는 Spring Framework를 더 쉽게 사용할 수 있도록 만든 도구. - 설정을 최소화하고, 빠르게 실행 가능한 애플리케이션을 만들 수 있음. - 핵심 특징 1) 자동 설정(Auto Configuration): 의존성 기반 자동 Bean 등록 2) 내장 서버(Embedded Server): Tomcat/Jetty 등을 내장 → 별도.. 2025. 8. 25.
1. (2) Kotlin 주요 문법 1. 변수 선언 fun main() { var name: String = "Bill" // 값 변경 가능 val age: Int = 25 // 값 변경 불가능 (final) var nickname: String? = null} - var: 가변 변수 - val: 불변 변수 (초기화 후 값 변경 불가 - ? = null: nullable 변수 선언 2. 형변환 val number: Int = 10val text: String = number.toString() - Kotlin은 명시적 형변환만 지원 (toInt(), toString() 등) 3. 함수 선언//일반함수fun sum(a: Int, b: Int): Int { return a + b}//단일 표.. 2025. 8. 25.
1. Kotlin 이란? & (1) 주요 자료구조 1. Kotlin 이란? : Kotlin은 JetBrains에서 개발한 정적 타입 프로그래밍 언어로, JVM 위에서 실행되며 Java와 100% 상호 운용이 가능. 간결하고 안전하며 현대적인 프로그래밍 패러다임을 지원하도록 설계 1) 주요 특징 간결성Kotlin은 불필요한 코드를 줄이고, 표현력을 높여 개발자의 생산성을 향상시킴안전성Kotlin은 널(null) 안전성을 내장하여 런타임 오류를 방지함수형 프로그래밍 지원람다 식, 고차 함수, 불변 컬렉션 등 함수형 프로그래밍 개념을 포함상호 운용성Kotlin은 기존 Java 코드, 라이브러리, 프레임워크와 원활하게 통합 가능 2) 활용분야Android 애플리케이션 개발서버 사이드 애플리케이션데스크톱 및 웹 애플리케이션 자세한 내용은 .. 2025. 8. 24.
0. [과정을 들어가면서] 과정소개 1. 강의제작 배경 및 학습목표 "이 강의는 Kotlin/Spring 문법 입문 강의가 아닙니다. 실제 서비스 요구사항을 기반으로 설계부터 구현까지를 압축적으로 경험합니다." 화려한 디자인 기반의 강의를 위한 강의가 아닙니다! 정말 대규모트래픽을 경험하고 싶은데 redis, kafka 를 잘 써보고 싶은데, 실무에서 경험하지 못하는 수강생들 or 경험했지만 더 잘하고 싶은 수강생을 위한 강의입니다! 1) AI tool(Claude Code, Cursor CLI) 사용이 대세가 된 지금, 구현은 AI 가 빠르게 대체하고 있는 상황, 코드를 어떻게 빠르고 잘짜냐?의 역량보다 아키텍처 관점에서 비지니스 요구사항을 명확히 이해하고 이에 적합한 개.. 2025. 8. 24.
반응형