본문 바로가기

전체 글

(128)
[Spring Async]2. 동시성 공유자원 문제 / 뮤택스, CAS Topic = 동시성 공유 자원 문제와 Synchronized, AQS 간단하게 개념 정리 공유 자원 문제 1. 메모리 가시성 문제멀티 쓰레드 환경에서 공유하는 자원에 대한 변경이 다른 쓰레드에게 언제 반영이 되는지 보장할 수 없게되는 문제.→ 일반적인 변수는 CPU 코어 별로 캐시 메모리로 인해 관리되므로, 공유 자원의 값 변경이 즉각적으로 모든 캐시메모리에 전파되지 않는다. 💡해결 방법Volatile 키워드를 통해 모든 쓰레드에서 사용하는 값을 모두 메인 메모리에 접근해서 사용하도록 하여 공유 자원에 대한 캐시 메모리의 CPU 처리 성능 향상을 포기하는 대신 공유자원의 일관성을 보장할 수 있다.공유 자원 문제 2. 동시성 문제 - Race Condition[ Thread-0 검증 시작 ] --.. 2026. 3. 4. 20:06
[Spring Async] 1. Blocking & Non-Blocking Topic = Blocking & Non-Blocking 개념 Blocking과 Non-blocking을 가르는 가장 정확한 기준은 호출 이후 쓰레드가 응답을 대기하는 상태로 멈추어 있는지 여부이다.BlockingBlocking 방식의 흐름에서는 A 함수가 B 함수(I/O 작업 등)를 호출하면, 제어권이 B에게 넘어간다. B가 작업을 끝내고 결과를 돌려줄 때까지 A가 대기하게 되는데, 대기하는 동안에 쓰레드는 멈춰있게 된다.⭐ 어떤 작업이 Blocking 이다. 라는 하나의 단일 개념이 아니라 어떤 작업이 완료될 때 까지 현재 실행 흐름이 진행되지 못하는 상태를 뜻한다.Non-blocking A 함수가 B 함수를 호출해도, B는 할 일을 시작만 하고 제어권을 즉시 A에게 돌려준다. A는 B가 일을 다.. 2026. 2. 22. 21:58
[EDA] 저수준 단일 애플리케이션 Pull - subscribe 방식 구현 흐름 Topic = Outbox 이벤트 Puslish -> Subscribe -> Handle 구현 흐름 학습해보기. Outbox → Consumer 이벤트 전달 방식 ( Push / Pull )Push단일 애플리케이션의 경우 Push 방식은 Polling worker 에서 소비자를 직접적으로 주입 받아 소비자의 매서드를 호출하는 방식으로도 사용할 수 있다. 하지만 분산 시스템의 경우 직접적으로 호출이 불가능하므로, HTTP 요청을 통해 이벤트를 소비자에게 Push 하는 방식을 사용한다.✔️ Outbox Polling worker 의 이벤트 전달 완료의 책임 단일 애플리케이션 환경이 아닌, HTTP 방식의 Push 를 사용하는 경우에는 네트워크 이슈, 타임아웃 상태 200 OK 응답을 통해 전달을 완료했.. 2026. 2. 11. 23:49
[Event Driven Architecture] 3. Outbox Pattern 흐름 및 테이블 스키마 Topic = 이벤트를 메모리 저장 방식에서 DB 저장 방식으로 전환했을 때, Transactional Outbox Pattern 적용하는 이유와, 저장 이후 이벤트 소비까지 흐름 Outbox 패턴 Outbox 패턴은 트랜잭션 경계에서 이벤트 저장의 원자성을 보장해 이벤트 전달의 유실을 방지하기 위한 전달 보장 패턴이다Outbox 패턴은 다음과 같은 핵심 스팩을 갖는다원자적 트랜잭션 보장이벤트를 발생 시키는 비즈니스 데이터 변경 트랜잭션 내부에 이벤트를 DB에 저장하는 이벤트 저장을 포함시켜 비즈니스 데이터 변경 작업과 이벤트 저장 중 어떤 작업이 실패해도 롤백이 되도록 한다.이벤트 발행의 독립성 - 결과적 일관성Outbox 테이블에 저장된 이벤트를 읽고, 실제로 발행하는 주체는 메인 비즈니스 로직과.. 2026. 2. 5. 16:00
[Event Driven Architecture] 2. 비동기 Event 생명주기 & 흐름 Topic = 비동기 Event 처리 전략에 따른 Event 생명주기 이벤트 동기 처리 시 문제점 이벤트를 동기로 처리할 경우 발생할 수 있는 문제점분산의 이점을 활용하지 못한다.성능적 문제시간적 결합이벤트의 주요 목적인 결합도 감소는, 단순히 코드 레벨의 호출 스택을 줄이는 것 외에도 특정 유스케이스가 실행되는 전체적인 흐름의 결합도를 감소하는 것을 목적으로 하는데, 동기적으로 처리할 경우에는 Request - Response 까지의 흐름이 하나로 결합되어 있는 문제가 발생.동기 Event같은 호출 스택Event 의 생명주기 = 요청 생명주기와 동일비동기 Event다른 스레드 or 다른 실행 컨텍스트Event가 요청과는 독립적인 생명주기를 가짐➡️Event 가 메인 요청 트랜잭션과 분리되어 독립적.. 2026. 1. 29. 00:03
[Event Driven Architecture] 1. Event 개념 및 Spring Event Publisher 흐름 Topic = 서비스 비대화 문제를 EDA 를 통해서 해결해보기 With Spring Publisher - Listener EDA 키워드는 Event 핸들링 과정을 점진적으로 고도화 해보기.1. Event 개념 및 동기 Spring Event Publisher - Listener 구현 Why & Event 개념 프로젝트 진행 도중 MemoWriteService 에서 UserHistoryService, AuditLogService 등 여러 서비스를 주입 받아서 사용하고 있어 서비스가 비대해지며, 서비스들이 강한 결합도를 갖는 문제가 발생했다. 강한 결합도로 인한 대표적인 문제알림 정책 바뀜 → 메모 작성 로직 수정로깅 정책 바뀜 → 메모 작성 로직 수정문제 코드 - saveLog, sendMail 에.. 2026. 1. 21. 22:33
[VO] Kotlin - Value Object 사용하는 이유 & 사용 방법 VO ( Value Object ) VO는 DDD ( Domain - Driven - Design ) 에서 제시된 핵심 개념 중 하나로, 도메인 규칙과 의미를 타입 시스템에 고정하기 위한 설계 개념이다.VO 타입 필드를 사용하는 이유⭐ VO 타입 필드는 단일 값의 도메인 규칙을 타입 시스템에 고정하기 위한 설계 선택이다.도메인 의미를 타입으로 명시한다. ( 컴파일 타임 신뢰성 )Long 타입의 Price 필드의 값이 과연 음수가 안들었을까 의문이 생김 → Price 필드의 타입이 Money면 Money.of() 팩토리 메서드를 통해서 생성되었으니 무조건 양수임을 명시같은 원시 타입이더라도 의미가 다르지만, 컴파일 시에는 오류를 확인할 수 없다.VO 를 사용하지 않고 ( memoId = memoId, au.. 2026. 1. 14. 17:41
[HTTP] Error Response 표준 Problem Detail ( RFC7807 / RFC9457 ) Topic = Error Reponse 표준에 대해 학습하고 Spring 에서 표준에 따라 Error 를 반환하는 방법 ReponseEntity 형식의 커스텀 에러 응답 형태로 작성하고 있는 도중 다음과 같은 문제가 발생했다.혼자서 진행하는 프로젝트임에도 불구하고 에러 응답 바디에 error_code , status_code 처럼 정해진 컨벤션 없이 같은 값에 대해 표현하는 방식이 달라지는 문제가 발생어떤 값이 오류 응답 객체에 들어가면 안되고, 어떤 값이 들어가는 게 좋을지에 대해 경계가 뚜렷하지 않아 보안상 문제가 되는 값이 오류 응답 객체에 포함된 문제가 발생 Error Response 표준 - RFC 9457 RFC 7807은 클라이언트 단에서 오류를 핸들링 할 때 HTTP 상태코드만으로는 .. 2026. 1. 8. 10:33