엔티티에 setter를 사용하면 안되는 이유와 대체방안
2021. 1. 29. 14:45ㆍJPA/JPA
엔티티에 setter를 열어두면 어떻게 될까?
- 보통 스프링은 여러가지 클래스 종류로 나눌수 있지만 대표적으로 Controller, Service, Repository, Domain 등 으로 분류할 수 있다. 엔티티는 도메인에 해당하며 여기서 만약 setter를 열어뒀다고 가정해보자.
- 엔티티에 setter로 필드 상태를 변경하고 트랜잭션이 종료되면 변경감지에 의해 update문이 나가게 된다.
- 그런데 Controller에서도 Entity를 생성하여 setter를 호출하고,,, Service에서도 호출하고,,
- 시스템이 복잡하다면 운영시 해당 Update문이 어디서 누구에 의해 발생했는지 추적하기가 굉장히 어려워진다.
그럼 setter를 열어두지 않고 어떻게 필드 상태를 업데이트 할 수 있을까?
- setter를 열어두지 않고 의미있는 메서드를 만들어 사용해야한다.
- 예를 들어 사용자 엔티티의 setName, setAge 등의 뜻은 말그대로 필드의 상태를 목적없이 set하는 것이다.
- 이것을 changeUserInfo(String name, int age) 메소드로 변경하는 것이다.
- 도메인 모델 패턴에서는 이런 메서드를 도메인에 구현하여 응집도 있게 개발한다.
- 서비스에서는 이런 도메인의 비즈니스 메서드를 조립하고 트랜잭션 단위로 잘 묶는 것이 포인트이다.
'JPA > JPA' 카테고리의 다른 글
OSIV(OPEN SESSTION IN VIEW)란? (0) | 2021.02.04 |
---|---|
컬렌션(일대다) SELECT 시, 주의점과 성능 최적화 (0) | 2021.02.04 |
준영속상태의 엔티티를 변경할 때 변경감지와 merge() (0) | 2021.01.29 |
임베디드 타입, @Embeddable, @Embedded (0) | 2021.01.21 |
cascade, orphanRemoval (0) | 2021.01.20 |