흰띄1그랄
223
2021-04-08 14:32:20 작성 2021-04-08 14:35:40 수정됨
0
338

Tech에 올라온 Pojo, Entity, Domain, Dto 에 관한 고촬...


링크!


잘 해석을 했는지 모르겠습니다. 해당 글을 참조하여 저희는 서비스에 사용되는 객체들을 구분지었습니다.


1. Dto 를 작성하건, Domain을 작성하건, Entity를 작성하건 이것은 디자인 패턴일 뿐이다. 너무 강박관념을 가지지 말아라. 구분이 필요하다면 본인들이 개발하는 서비스에 맞게 구성을 하면 된다. 


2. What is a DTO 글에 나온 도식표가 도움이 많이 되었습니다.

서버 단에서 처리해야 하는 데이터베이스에 관련된 값 객체들을 Domain Layer

서버에서 프론트로 내보낸 데이터들을 처리할 Presentation Layer 계층으로 구분한다.


3. Jpa 를 사용하면 기본적인 구분이 잘 되어있습니다.

Table Mapping 할 시엔 @Entity 를 선언한 도메인 객체를 사용하게 되죠

ex) testRepository.getOne(id), testRepository.findById(id)

이후 받아온 값을 처리하는 방법은

Test test = testRepository.getOne(id);

test.setA(a);

test.setB(b);

//물론 안해줘도 됩니다. Jpa에서 값이 변경되면 자동 저장을 해주니까요!

testRepository.save(test);


또한 getOne, findById 는 Jpa Spec에 Projection을 사용하여 직접적으로 DTO 를 바로 호출 할 수 있게 도와주는 모듈을 지원합니다.

Admin 페이지 같은경우 Entity, Pojo 같은 데이터베이스 테이블에 모든 컬럼이 1:1로 매핑이 된 상태도 큰 문제가 없다고 판단되어 그냥 내보내 줘도 괜찮지만, 실 사용자 들에게 운영되는 서비스는 테이블 형식을 그대로 내보내주는 것에 대한 부담이 있기 때문에 Jpa 환경에선 Projection 을 사용 하여 값을 내보내 줬습니다.

해당 기능들을 사용하면 생각보다 편리하게 Presentaion, Domain 계층을 구분지어 사용이 가능하게 될 것 같습니다.


4. 이제 문제는 Mybatis 사용시 였습니다.

Mybatis 는 공식 문서에 들어가 보면 첫줄에

"해당 라이브러리는 개발자가 쿼리에 좀더 집중하여 사용할 수 있도록 도와줘, 비즈니스 로직 처리에 도움을 주기 위한 라이브러리" 라고 명시가 되어있던거 같습니다.(정확하진 않아요! 요점은 쿼리에 집중해!)


Mybaits는 사용할 때

DataSource 클래스에 TypAliasesPackge 에

쿼리에 리턴받을 클래스들을 설정을 해줍니다 (Dto 건 , Domain 이건, Entity 건, 그냥 내가 받을 클래스 일 뿐이야 디자인 패턴에 구속당하지 않을꺼야!) 


여기는 Projection 기능이 따로 존재하질 않아서 조회해온 값을 보통 그대로 넘기는 형식을 많이 사용했었습니다.

즉 그냥 Dto 를 작성을 한것이죠.


저희 서비스 에서의 요구사항 중 10개 테이블 가량의 조회를 피버팅 하고, 일자별로 정렬을 한 후, 빈 일자가 있을 경우 null값을 생성하여 박아줘야 하는 기능이 필요했습니다. 즉 Dto 가 필요한게 아니라 서비스단에서 다시 한번 가공할 Domain, Entity 객체가 필요 했었습니다.


그래서 Mybatis 에서 지원하는 의도에 따라 저희는 쿼리는 쿼리에만 집중하기로 하였습니다.

쿼리는 쿼리일 뿐이고 내가 데이터를 가공해서 다시 내보내 줘야하는 쿼리는 aaaaDomain.java 로 클래스 명을 지정하여 디비 값을 전달받고. Domain 클래스에서 연산이 완료된 후,  MapStructer 라이브러리를 사용하건, DTO 클래스에 컨버팅을 하는 컨버팅 클래스를 만들어 준 후 DTO를 내보내 주는 방법을 사용하기로 정하였습니다.

연산 없이 나갈 데이터들은 aaaaDto.java 라는 클래스 네이밍을 적용하여 mybatis resultType에 지정을 하여 그대로 내보내 줬습니다.


즉 Dto 패턴을 따르겠지만, 서버단에서 가져온 후 특별 연산이 필요한 경우에는 Domain 으로 받아서 값을 처리한 후 Dto 로 내보내 주겠다. 로 방향을 잡고 개발을 하고 있습니다.


너무 디자인 패턴에 목을 매는 것 보다 여유롭게 요구사항 및 개발환경에 맞춰서 다양하게 섞어서 사용하시면 

행복한 개발 라이프가 될 것 같습니다. 

0
  • 댓글 0

  • 로그인을 하시면 댓글을 등록할 수 있습니다.