Domain POJO와 JPA Entity 분리
비즈니스 로직을 수행하는 순수 자바 객체와 영속성을 담당하는 JPA Entity를 분리함
→ 비즈니스 로직과 영속화 영역을 분리
- Why
- JPA Entity(
@Entity)는 데이터베이스 테이블과 강하게 결합함 → 제약이 생김
- JPA 스펙상 반드시
protected/public 기본 생성자가 있어야함
- 프록시 생성을 위해 클래스가
final이면 안됨
- 도메인 모델이 기술에 종속되지 않고 표현의 자유가 생김
- Trade-off
- JPA의 Dirty Checking 활용이 상대적으로 어려워짐 → 도메인 객체에서는 사용 불가능함
- 해결책
- Service에서 로직 수행 후 명시적으로
repository.updateStock()을 호출
- 명시적이라 흐름 파악이 더 용이하다고 생각
- 다만, 코드의 양이 늘어나게됨
⇒ 프레임워크에 종속되지 않는 순수한 비즈니스 로직을 위해 분리, 이로 인한 번거로움은 코드로 명시하여 상쇄
ID 생성 전략
DB의 Auto Increment(Identity) 전략을 사용함에 따라 발생하는 식별자 문제를 다음과 같이 처리함.
- 문제
- 새로운 주문 객체를 생성했을 때, 아직 DB에 들어가지 않았으므로
id 필드는 null 이 들어감
- 이 상태로 로직을 계속 수행하면, 시스템 곳곳에서
id가 필요한 경우 문제가 발생함
- 해결
- Repository 저장 후 ID가 채워진 새로운 도메인 객체를 반환받아 사용
- Question : 걍 JPA Entity에 비즈니스 로직 넣고 쓰면 개발 속도도 빠르고 편하지 않나? 굳이 나누면 매핑 비용만 드는데?
- 그 편의성보다, 규모가 커지고 로직이 복잡해질수록 Entity의 생명주기와 비즈니스 로직이 뒤섞여 발생하는 사이드 이펙트를 예측하기 어려워지는게 더 문제라고 생각함
- 항상 이를 염두해두고 개발해야하는 스트레스 << JPA 기술을 완벽하게 몰라서 그런거일수도