• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Jpa 프로젝트 구성 패키지 질문 드립니다!

19.07.01 23:05 작성 조회수 258

0

안녕하세요! 유익한 강의 감사드립니다!

현재 JPA 프로젝트 셋팅중에 있는데요

사내에서 패키지 구성을 DTO, VO, Entity모두 사용하고 있는데

[질문] 궁금한것은

- DTO(Controller), VO(Service), Entity(Repository)

- DTO, Entity 

위 2가지 방안중 어느것이 맞을까요?? 현재 DTO, VO, Entity 로 가려고 하는데 굳이 DTO, VO는 같이 써도 될것 같아서요 검색을 해봐도 3가지를 같이 쓰는데는 없는거 같은데 

 

선장님은 어떻게 구조를 잡고 계신 생각이 궁금하여 문의드립니다!

답변 4

·

답변을 작성해보세요.

1

개발자 마다 DTO, VO, Entity의 의미를 너무 다양하게 생각하고 있어서 뭐라고 말해드리기 어려울거 같습니다.

제가 생각하는 Value Object는 Immutable한 객체를 만들 때 쓰는 패턴이고 도메인 객체와 클래스를 설계할 때 엔티티와 대비되는 개념으로 이해하고 있습니다. 그래서 서비스 계층에서만 쓴다고 암시하듯이 적어두신게 무슨 뜻인지 ㅈ잘 와닿지가 않습니다.

Data Tranfer Object는 요청에 들어온느 데이터를 받거나 내보내거나, 또는 저장소에서 데이터를 가져오거나 넣어나 계층을 넘나드는 객체가 해당 영역으로의 변환이 필요한 상황에서 쓰는 객체로 이해하고 쓰고 있습니다. 따라서 컨트롤러 계층에만 국한되진 않지만 주로 거기서 쓰고 있긴하죠.

마지막으로 Entity도 도메인 객체와 클래스를 설계할 때 쓰는 개념으로 식별자가 있고 고유한 라이프사이클이 필요한 객체로 이해하고 있습니다. 앞서 언급한 Value Object와 다소 대비되는 개념으로요. 물론 이 타입을 스프링 데이터 JPA가 제공하는 Repository를 구현할 때 주로 쓰긴 하지만 그 용도에만 국한된 개념이 아니라 모든 계층에서 두루 사용되는 객체입니다.

이 모든 걸 다 보여드리는 프로젝트는 없지만 스프링 기반 REST API 개발이라는 강좌에서 조금이나마 제 코딩 패턴을 엿볼 수 있지 않을까 싶습니다.

0

biggwang님의 프로필

biggwang

질문자

2019.07.04

답변 감사합니다~!

고민해보고 싶었던 주제 였는데 링크 참고하며 정리해 보도록 하겠습니다.

 

0

저는 VO에 대한 자세한 내용은 다음 링크를 참고하세요.

https://martinfowler.com/bliki/ValueObject.html
http://wiki.c2.com/?ValueObject

네 필요한 상황에 쓰려고 노력하긴 하는데 제대로 따르고 있진 않는거 같네요. 그리고 REST API에선 객체지향적인 설계 보다는 REST API 구현체 초점이 맞춰져 있어서 DTO와 Entity는 등장하지만 VO는 안쓴거 같네요. 굳이 따지먄 enum을 VO로 생각할 수 있지 않을까 싶긴 하지만요.

0

biggwang님의 프로필

biggwang

질문자

2019.07.03

답변 감사드립니다!

특정 레이어에 국한된것은 아니군요...

Controller -> Service 로 넘어갈때 DTO가 가면 안되고 VO로 변환해야 한다는 (ModelMapper 사용) 암묵적 규칙을 인지해서 위와과 같이 레이어별로 질문을 드린거 같습니다.

 

바쁘시겠지만 마지막으로 2가지만 질문 드리고 싶습니다.

[질문 1]

Immnutable 한 객체 VO를 사용한다면 어떤 상황일까요?

예를 들어 등록폼에 대한 저장 이벤트가 발생 했을때,
Controller에서 DTO객체로 받아 그 객체가 그데로 Service 그리고 Reopository 로 넘어가서 DB Insert가 이루어지는 로직이있습니다.

이때 VO 객체를 사용해야 하는 부분이 있을까요? @Entity 선언된 Entity 객체에서 받아서 Insert 하면 위 상황에서는 VO가 필요한부분은 없어 보여서 질문드립니다.

 

[질문2]

그러면 선장님은 Spring Project 하실 때 DTO, VO, Entity 객체 모두 활용하고 계시는거죠?

 

REST API 강의도 듣고 있는데 다시 한번 확인도 해보겠습니다.

답변주시면 감사하겠습니다~!