제육's 휘발성 코딩
Published 2021. 7. 23. 14:21
DAO, DTO, VO, Entity 란? 🔷 Java/web
반응형

    1) DAO (Data Access Object) 

    DB에 직접 접근하는 객체로 DB의 데이터를 삽입, 삭제, 조회 등을 조작하는 기능 수행 

    DB 접근 로직과 비즈니스 로직을 분리하기 위해 사용 

    DAO는 DB와 연결할 Connection 까지 설정 되어 있는 경우가 많으며 현재는 커넥션풀이 제공되고 있어서

    DAO를 별도로 만드는 경우는 드물다. 

     

    2) DTO (Data Transfer Object) 

    DTO는 계층간 (Controller, View, Business Layer) 데이터 교환을 위한 객체(자바 빈즈), 

    -> Service, Controller 등을 통해 전송되는 객체  , ※ 자바빈즈 : 비즈니스 로직 부분을 담당하는 자바 프로그램 단위   

    로직을 가지지 않는 데이터 객체이고 Getter , Setter 메서드를 가진 클래스를 의미한다. 

     

    데이터 전송 객체라는 의미를 가지고 있어 주로 비동기 처리를 할 때 사용한다. 

     

    DTO 예제 코드 

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public class GuestbookDTO {
    
        private Long gno;
        private String title;
        private String content;
        private String writer;
        private LocalDateTime regDate, modDate;
    
    }

     

    3) VO (Value Object) 

    DTO와 다르게 VO는 Read-Only 속성을 가진다.

    자바에서 단순히 값 타입을 표현하기 위해 불변 클래스(Read-Only)를 만들어 사용한다.
    예를 들면 빨강은 Color.RED, 초록은 Color.GREEN 이렇게 단순히 값만 표현하기 위해 getter기능만 존재한다.

    VO의 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것이다.

     

    DTO vs VO

    DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다.(getter/setter) 그에 반해 VO는 값 그 자체의 의미를 가진 불변 클래스(Read-Only)를 의미한다.(getter만 존재) DTO는 인스턴스 개념이라면 VO는 리터럴 개념.

     

     

    4) Entity 

    Entity 클래스는 실제 DataBase의 테이블과 1 : 1로 매핑 되는 객체로, DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다.

     

    Entity, DTO 분리 이유

    단순 테스트가 아닌 실제 프로젝트를 작성할 경우 Entity 객체를 영속 계층 바깥쪽에서 사용하는 방식 보다는 DTO를 

    이용하는 방식을 권장한다. 

    DTO(Data Transfer Object)는 Entity 객체와 달리 각 계층끼리 주고받는 우편물이나 상자의 개념이다. 

    순수하게 데이터를 담고 있다는 점에선 Entity 객체와 유사하지만, 목적 자체가 데이터의 전달이므로 읽고, 쓰는 것이 

    모두 허용되는 점이 가능하고 일회성으로 사용되는 성격이 강하다. 

    JPA를 이용하게 되면 Entity 객체는 단순히 데이터를 담는 객체가 아니라 실제 데이터베이스와 관련이 있고, 

    내부적으로 EM(EntityManager)이 관리하는 객체이다. 

    DTO가 일회성으로 데이터를 주고받는 용도로 사용되는 것과 달리 생명주기 (Life Cycle)도 전혀 다르기 때문에 

    분리하여 처리한다.

     

    Entity 예제 코드 

    @Entity
    @Getter
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public class Guestbook extends BaseEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long gno;
    
        @Column(length = 100, nullable = false)
        private String title;
    
        @Column(length = 1500, nullable = false)
        private String content;
    
        @Column(length = 50, nullable = false)
        private String writer;
    
        public void changeTitle(String title){
            this.title = title;
        }
    
        public void changeContent(String content){
            this.content = content;
        }
    }

    Note

    웹 애플리케이션을 제작할 때는 HttpServletRequest나 HttpServletResponse를 서비스 계층으로 전달하지 않는 것을

    원칙으로 하며, 유사하게 Entity 객체가 JPA를 사용하는 객체이므로 JPA 외에서 사용하지 않는 것을 권장한다.

     

    반응형
    profile

    제육's 휘발성 코딩

    @sasca37

    포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^