엔티티에 setter를 사용하면 안되는 이유와 대체방안

2021. 1. 29. 14:45JPA/JPA

엔티티에 setter를 열어두면 어떻게 될까?

  • 보통 스프링은 여러가지 클래스 종류로 나눌수 있지만 대표적으로 Controller, Service, Repository, Domain 등 으로 분류할 수 있다. 엔티티는 도메인에 해당하며 여기서 만약 setter를 열어뒀다고 가정해보자.
  • 엔티티에 setter로 필드 상태를 변경하고 트랜잭션이 종료되면 변경감지에 의해 update문이 나가게 된다.
  • 그런데 Controller에서도 Entity를 생성하여 setter를 호출하고,,, Service에서도 호출하고,,
  • 시스템이 복잡하다면 운영시 해당 Update문이 어디서 누구에 의해 발생했는지 추적하기가 굉장히 어려워진다.

 

그럼 setter를 열어두지 않고 어떻게 필드 상태를 업데이트 할 수 있을까?

  • setter를 열어두지 않고 의미있는 메서드를 만들어 사용해야한다.
  • 예를 들어 사용자 엔티티의 setName, setAge 등의 뜻은 말그대로 필드의 상태를 목적없이 set하는 것이다.
  • 이것을 changeUserInfo(String name, int age) 메소드로 변경하는 것이다.
  • 도메인 모델 패턴에서는 이런 메서드를 도메인에 구현하여 응집도 있게 개발한다.
  • 서비스에서는 이런 도메인의 비즈니스 메서드를 조립하고 트랜잭션 단위로 잘 묶는 것이 포인트이다.