엽기토끼이요
402
2020-09-27 17:50:37
5
324

DAO, DTO, VO 개념이 정확히 뭔가요?


검색을 해도 도통 정석으로 아는 분이 없네요.(정석은 없겠지만...)

일딴 디비와 자바의 데이터 형식 패러다임 문제가 있다는 것을 압니다.


객체 지향의 상속 구조를 디비는 구현할 수 없다.

그러기 위해서 많은 노력이 있어왔고 현재 스프링은 객체형식으로 데이터를 사용하여 두 진영의 패러다임 차이를 극복했다.

정도가 되겠네요.


Domain, 모든 디비 관련 클래스를 통틀어 부르는 말인가요?

DAO, Entity가 맞습니까? 디비와 1:1 대응 되는 모델

DTO, Entity의 특정 값만 갖게 하거나, 조인한 테이블을 담을때 사용하나요? 

VO, DB View의 해당하는 개념 같은데 디비에 뷰가 있는데 굳이 이것을 사용하는 이유는 한 언어로 모든것을 컨트롤 하기 위함인가요? 규모가 커지면 DBA가 따로 있을 테니 소규묘에서나 적합한 개념인가요?... VO를 왜 자바에서 정의해서 사용하는지 이해가 안 갑니다.


이런 개념을 정확히 알고싶은데 좋은 강좌 없을 까요? 

0
  • 답변 5

  • 팩트폭행범
    1k
    2020-09-27 17:55:26


    Data Access Object  데이터 접근객체


    Data Transfer Obejct 데이터 전송객체


     


    VO와 DTO는 똑같습니다 다만  해당 시스템상에서 사용하는 이름이 다르다고만 생각하셔도 충분합니다

    어느곳에서는 DTO로, 어느곳에서는 VO로 사용될 수 있습니다.


    MVC 모델에서


    Model(DB)  ,  View , Controller


    model과 controller 사이에 데이터객체를 주고받게 해주는역할이 DTO, DAO 입니다

  • ISA
    3k
    2020-09-27 20:05:38

    사람마다 패턴마다 조금씩 달라지는거 같아요.

    Dao = dbms mapping 엔티티는 이거에 관련된 데이터 스키마

    Dto = model  t controller 

    느낌인데 vo가 dto랑 다른게 불변인걸로 알고 있고 

    엔티티랑 dao dto vo같이 쓸때 많이 꼬이는 듯

    굳이 다 같이 쓴다면 이런 모양이 나오겠죠

    Db => (엔티티, dao) => model => (dto) => controller => (vo) => view 전 이렇게 이해하고 알고 있습니다. 이게 정석이라고

    그러나, 대부분은 다 다르더군요.

    걍 무난하게 해당 개념이 가진 특징 정도만 기억해두시고 관용적으로 커뮤니케이션 하시는게 나을듯

  • devcrema
    1k
    2020-09-28 03:09:42

    대부분 JPA와 Spring에서 많이 사용하는 DDD를 참고하시면 궁금한점은 모두 명확하게 해결되실 겁니다.

    Domain, 모든 디비 관련 클래스를 통틀어 부르는 말인가요?

    -> 소프트웨어로 해결하고자 하는 문제 영역, 요구사항 모든걸 통틀어서 부르는 말입니다. 소프트웨어로 개발하려는 혹은 개발한 특정 개념들을 묶은 것이라고 이해하시면 됩니다. (예를들어 크게는 쇼핑몰 도메인, 작게는 주문 도메인 등등)

    DAO, Entity가 맞습니까? 디비와 1:1 대응 되는 모델

    -> DB와 1:1로 대응되지 않습니다. 왜냐하면 DB는 객체지향스럽게 표현하는 것에 한계가 있기 때문입니다.

    다만 처음 시작하실때에는 1:1이라고 이해하는게 쉽습니다.

    참고로 정의하자면 DAO는 데이터에 접근하고 다루는 것을 담당하는 객체이고 Entity는 영속화될 수 있고 식별가능한 (예를들어 ID혹은 유니크한 복합키가 존재하는) 객체를 의미합니다.

    DTO, Entity의 특정 값만 갖게 하거나, 조인한 테이블을 담을때 사용하나요? 

    -> DTO는 모든 레이어에서 사용됩니다. controller에서도 사용되고 db와 repository 사이에서도 사용됩니다.

    중요한 것은 DTO는 데이터를 전송하는 책임을 가진 객체로서 각 계층을 명확히 구분해주는 역할 또한 하는 것입니다.

    질문해주신 Entity의 특정 개념을 나타내는 것은 DTO가 아닌 Value Object (VO)입니다. 설계에 따라 특정 테이블을 담고 있기도 합니다. (JPA @Embedded 참고)

    DTO와 VO의 차이는 역할로 나눌 수 있는데, DTO의 역할은 데이터의 전송과 계층의 분리, VO는 entity나 도메인의 특정 개념을 표현하는 것과 식별성이 존재하지 않음 (ID가 존재하지 않고 특정 개념만 담는 경우)입니다.

    VO, DB View의 해당하는 개념 같은데 디비에 뷰가 있는데 굳이 이것을 사용하는 이유는 한 언어로 모든것을 컨트롤 하기 위함인가요? 규모가 커지면 DBA가 따로 있을 테니 소규묘에서나 적합한 개념인가요?... VO를 왜 자바에서 정의해서 사용하는지 이해가 안 갑니다.

    -> VO는 DB view에 해당하는 개념이 아닙니다.

    VO는 특정 개념을 나타내기 위함입니다. 예를들자면 상품 entity안에 할인률, 판매가, 할인가격 등등 price에 대한 필드들이 있고 그 안에 고유한 개념이 담겨져 있다면 그것을 Price VO로 분리함으로써 좀더 명확하게 도메인에 대한 개념을 표현하고 다른 코드에서도 Price라는 개념을 통해 객체를 캡슐화하여 사용할 수 있습니다. price.할인가계산() 같은 용도로 사용할 수 있겠네요. 이렇게 되면 계산할때마다 상품 외부의 객체가 상품 내부의 필드를 가져와서 계산하지 않아도 되어 캡슐화를 높이고 다른 곳에서 price라는 개념을 사용할때에도 정해진 price VO를 사용함으로서 로직이 흩어지는 일없이 한곳으로 모아 응집도를 높일 수 있습니다.

  • 엽기토끼이요
    402
    2020-09-29 17:13:29

    답변해주신 세분 모두 감사합니다.

    devcrema님에게는 더욱 감사드립니다.

  • 지붕뚫고높이차
    951
    2020-10-18 11:59:13

    .

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