본문 바로가기

프로젝트/스터디타임

dto와 entity를 구분해서 구현한 이유

본 카테고리의 포스팅은 스터디 프로젝트를 진행하며 생각한 내용을 정리한 것입니다.

스터디 프로젝트이며, 제가 나름대로 이해한 바를 적은 것이라 옳지 않은 정보가 있을 수 있습니다.



본 프로젝트에서는 dto객체와 entity(domain)객체를 구분하고 있다.


dto 객체는 View layer와 데이터를 주고받을 때 사용된다.

entity객체는 db layer와 데이터를 주고받을 때 사용된다. 

이렇게 구분한 이유는 아래 글의 내용을 반영하고자 했기 때문이다.

절대로 테이블과 매핑되는 Entity 클래스를 Request/ Response 클래스로 사용해서는 안됩니다
Entity 클래스는 가장 Core한 클래스라고 보시면 되는데요. 
수많은 서비스 클래스나 비지니스 로직들이 Entity 클래스를 기준으로 동작합니다. 
Entity 클래스가 변경되면 여러 클래스에 영향을 끼치게 되는 반면 Request와 Response용 DTO는 View를 위한 클래스라 정말 자주 변경이 필요합니다. 
View Layer와 DB Layer를 철저하게 역할 분리를 하는게 좋습니다.
실제로 Controller에서 결과값으로 여러 테이블을 조인해서 줘야할 경우가 빈번하기 때문에 Entity 클래스만으로 표현하기가 어려운 경우가 많습니다. 
꼭꼭 Entity 클래스와 Controller에서 쓸 DTO는 분리해서 사용하시길 바랍니다.

[출처] https://jojoldu.tistory.com/251




entity 클래스에는 setter를 최소한으로 사용한다.

명확한 의미를 가진 함수를 정의할 수 있다면 setter를 정의하지 않고 함수를 정의해 값을 세팅한다.

ex) setValue() 보다는 increaseValue(), decreaseValue()를 정의해 사용한다.


이는 아래 내용을 참조했다.

Entity 클래스를 생성하실때, 주의하실것은 무분별한 setter 메소드 생성입니다. 
자바빈 규약을 생각하시면서 getter/setter를 무작정 생성하시는 분들이 계시는데요. 
이렇게 되면 해당 클래스의 인스턴스 값들이 언제 어디서 변해야하는지 코드상으로 명확히 구분할수가 없어, 차후 기능변경시 정말 복잡해집니다. 
해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가하셔야만 합니다.


[출처] https://jojoldu.tistory.com/251



한편, entity 클래스는 setter가 없다는 점에서 VO와 유사하지만, 동일하지는 않다. ReadOnly가 아니기 때문이다.

ReadOnly로 구현하면 Insert, update를 수행하지 못한다. 따라서 반드시 값을 세팅하는 함수를 정의해 주어야 한다.


'프로젝트 > 스터디타임' 카테고리의 다른 글

mock을 활용한 테스트  (0) 2019.03.26