Entity
DB의 테이블에 존재하는 컬럼들을 필드로 가지는 객체이다. DB의 테이블과 1:1로 대응되며, 때문에 테이블이 가지지 않는 컬럼들을 필드로 가져서는 안 된다. Entity는 외부에서 최대한 Entity의 Getter를 사용하지 않도록 내부에 로직을 구현하는데, 이때는 Domain 로직만 구현하고 Presentation 로직은 구현하지 않는다.
Getter는 쓰되 Setter를 만드는 것은 피하는 것이 좋다. Setter의 사용이 Entity의 일관성을 해칠 수 있기 때문이다.
Builder 패턴을 사용하는 것이 좋다. 멤버 변수가 많아지더라도 어떤 값을 어떤 필드에 넣는지 코드를 통해 확인할 수 있고, 필요한 값만 집어넣는 것이 가능하기 때문이다.
DAO(Data Access Object)
실제로 DB에 접근하는 객체이다. 프로젝트의 서비스 모델과 실제 DB를 연결하는 역할을 하며, JPA에서는 DB에 데이터를 CRUD하는 Repository 객체들이 DAO라고 볼 수 있다.
DTO(Data Transfer Object)
계층 간 데이터를 교환하는 역할을 한다. Entity를 Controller와 같은 클라이언트단과 직접 마주하는 계층에 직접 전달하는 대신 DTO를 사용해 데이터를 교환한다.
DTO는 그저 계층 간 데이터 교환이 이루어질 수 있도록 하는 객체이기 때문에 특별한 로직을 가지지 않는 순수한 데이터 객체여야 한다. 또한 DB에서 꺼낸 값을 DTO에서 임의로 조작할 필요가 없기 때문에 DTO에서는 Setter를 만들 필요가 없고, 생성자에서 값을 할당한다.
Entity와 DTO를 분리하는 이유
Entity의 값이 변하면 Repository 클래스의 Entity Manager의 flush가 호출될 때 DB에 값이 반영되고, 이는 다른 로직에도 영향을 미친다. 때문에 view와 통신하면서 필연적으로 데이터의 변경이 많은 DTO 클래스를 분리해주어야 한다.
'ETC' 카테고리의 다른 글
이클립스 자바스크립트 에디터 설정 (0) | 2023.05.15 |
---|---|
MySQL 워크벤치에서 ERD 생성하기 (0) | 2022.04.14 |
양방향 의존 관계 오류 (0) | 2022.02.28 |
DTO의 위치에 대해 (0) | 2022.02.20 |
경로에 관하여 (0) | 2022.02.11 |