Jih0on의 블로그

[order] 재고 차감에서 갱신 손실을 해결하며 이해한 트랜잭션 락

왜 동시성 문제에 관심을 가졌는가? 기존 프로젝트에서는 트랜잭션이 내부적으로 어떻게 동작하는지 깊이 이해하지 못한 채, 하나의 작업을 원자적으로 처리하기 위한 용도로만 @Transactional을 사용해 왔다. 그래서 여러 트랜잭션이 동시에 동일한 데이터를 수정할 때도 의도한 대로 데이터 무결성이 지켜지는지 확신할 수 없었다. 그래서 이번 주문 프...

[order] 결제와 배송을 분리하며 이해한 트랜잭션 셀프 인보케이션

주문 시스템을 구현하면서 결제 완료 후 배송 정보를 생성하는 기능을 추가하고 있었다. 처음에는 같은 서비스 내부에서 배송 생성 메서드를 호출하는 단순한 구조를 생각했다. 기능적으로는 문제가 없었지만, 트랜잭션 학습 과정에서 객체가 자기 자신의 메서드를 직접 호출하는 셀프 인보케이션 개념을 알게 되었다. payment.complete(); create...

[order] 엔티티는 왜 데이터만 들고 있으면 안 될까?

나는 코드를 잘 짜고 있는 줄 알았다 과거 프로젝트를 진행할 때, 나의 1순위 목표는 가독성이었다. 그래서 서비스 로직을 메인 메서드와 여러 개의 private 서브 메서드로 쪼갰다. 그리고 메인 메서드에서 private 메서드를 호출하여 로직을 처리하도록 만들었다. 이렇게 했더니 자잘한 기능별로 분리되어 코드가 한눈에 들어왔고, 관련된 로직이 하나...

[order] 주문 시스템 (2)

5. ERD 설계 처음에는 주문과 결제를 식별관계로 설정하려고 하였다. 주문과 결제는 1:1 관계이며 결제는 주문이 존재해야만 생성될 수 있기 때문에 식별관계로 모델링하는 것이 자연스럽다고 생각하였다. 하지만 실무에서는 유지보수성과 확장성을 고려하여 비식별관계를 사용하는 경우가 많다. 그리고 식별관계로 설정하면 주문 ID가 결제 테이블에서 PK와...

[order] 주문 시스템 (1)

1. 왜 주문 시스템을 선택했는가 트랜잭션, 이벤트, 동시성과 같은 백엔드 핵심 주제를 학습할 수 있는 프로젝트를 고민하였다. CRUD 프로젝트에서도 이러한 문제는 발생할 수 있지만, 주문 시스템은 주문 생성부터 결제, 배송, 취소까지 상태 변화가 명확하게 존재하고 여러 도메인 객체의 데이터 일관성을 유지해야 하는 상황이 발생하기 때문에 해당 주제들...

[Spring] Test 어노테이션

1. 학습 계기 김영한님의 스프링 입문 강의를 통해 학습을 하는 중에 테스트 케이스를 작성하는 과정을 진행했다. 김영한님이 테스트 어노테이션을 사용하시면서 실무 개발에서 대량의 코드가 있을때 유용하게 사용된다고 하셨다. 그러나 나는 기존에 사용했던 테스트 사용은 API 메서드를 사용하기 전에 데이터가 제대로 요청되고 응답 받는지를 미리 확인하기 위해...