ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] DAO, DTO, VO, Entity 개념 및 차이점
    Spring 2024. 4. 19. 20:31

    DAO, DTO, VO, Entity

     

    DAO(Data Access Object)

    • DB의 data에 접근하기 위한 객체로 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.
    • DataBase 접근을 하기 위한 로직과 비지니스 로직을 분리하기 위해 사용한다
    • DAO는 Database와 연결할 Connection까지 설정되어 있는 경우가 많으며 현재는 커넥션풀이 제공되고 있어서 DAO를 별도로 만드는 경우는 드물다.
    • repository와 DAO는 비슷한 개념이다.
      repository는 Entity 객체를 보관하고 관리하는 저장소, DAO는 데이터에 접근하도록 DB접근 관련 로직을 모아둔 객체이다.

    사용이유

    • 효율적인 커넥션 관리와 보안성.
    • DAO는 비지니스 로직을 분리하여 도메인 로직으로부터 DB와 관련한 매커니즘을 숨기기 위해 사용.

    UserDao 인터페이스

    public interface UserDao {
    	void save(User user);
        List<User> findAll();
        void update(User user);
        void delete(int id);
    }
    @Repository
    public class UserDaoJdbc implements UserDao {
    	
        @Override
        public void save(User user){
        	...
        }
        
        @Override
        public List<User> findAll() {
        	...
        }
        
        @Override
        public void update(User user) {
        	...
        }
        
        @Override
        public void delete(int id) {
        	...
        }
    }

     

    DTO(Data Transfer Object)

    • DTO는 계층 간(Controller, View, Business Layer) 데이터 교환을 위한 자바 빈즈(Java Beans)를 의미한다.
    • DB에서 가져온 데이터를 다른 계층에서 사용하기 적합한 형식으로 변환하여 전송하는 데 사용한다.
    • response / request에서 사용할 수 있다.
    • DTO(Data Transfer Object)는 데이터 전송(이동) 객체라는 의미를 가지고 있어 주로 비동기 처리를 할 때 사용한다.

    특징

    • DTO는 로직을 가지지 않는 데이터 객체이고 getter/setter 메서드만 가진 클래스를 의미한다.

    사용이유

    • 다른 계층 또는 시스템으로 쉽게 전송할 수 있어 효율적으로 전송하고 관리할 수 있다.
    • 관련된 데이터를 하나의 객체로 묶어 캡슐화하기 때문에 데이터의 구조를 단순화하고 관리하기 쉽게 만든다.
    • 필요한 데이터만 포함하고 있기 때문에 불필요한 데이터 전송을 방지할 수 있다.

    예시

       모든 회원 정보를 불러와야 한다고 가정하자. User Table에는 회원의 이름, 성별, 나이, 핸드폰번호, 아이디, 비밀번호 등 많은 정보들이     존재한다. 하지만, 나는 이름, 성별, 나이만 필요하다. User Table에 모든 데이터가 필요하지 않은 지금, Entity로 만들어 둔 class를 사용하기에는 보안상의 문제, 필요 없는 값을 가지고 있다는 점에서 좋지 않다. 이런 경우, 이름, 성별, 나이만 담는 DTO를 만들어 사용하자.

     

    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    public class CreateBoardRequest {
    	
        @NoBlank
        private String titlel
        @NoBlank
        private String content;
        @NoBlank
        private String createdBy;
        
    }

     

    VO(Value Object)

    • DTO와 동일한 개념이지만, Read Only의 속성을 지니고 있다.
    • 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스를 만들어 사용한다.
    • VO의 핵심 역할은 equals()와 hashcode()를 오버라이딩 하는 것.

    DTO vs VO

    • DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다.
    • 그의 반해 VO는 값 그 자체의 의미를 가진 불변 클래스를 의미한다.
    • DTO는 인스턴스 개념이고, VO는 리터럴 값 개념이다.
    • 두 객체의 모든 필드 값들이 동일하면 두 객체는 같다.
      완전히 값 자체 표현 용도로만 사용하는 목적이기 때문이다.
    public class Address {
    	private String street;
        private String city;
        private String state;
        private Stirng postalCode;
        
        public Address(String street, String city, Stiring state, String postalCode) {
        	this.street = street;
            this.city = city;
            this.state = state;
            this.postalCode = postalCode;
        }
    }

     

    Entity

    • 실제 DB 테이블과 매핑되는 클래스이며 Entity를 기준으로 테이블이 생성된다.
    • 데이터를 전달하는 클래스로 사용하면 안 된다.
    • Entity는 비지니스 로직을 포함할 수 있다.
    • @Table, @ID, @Column 등의 어노테이션에 쓰인다.

    Entity, DTO 분리 이유

    • 단순 테스트가 아닌 실제 프로젝트를 작성할 경우 Entity 객체를 영속 계층 바깥쪽에서 사용하는 방식보다는 DTO를 이용하는 방식을 권장
    • DTO는 Entity 객체와 달리 각 계층끼리 주고받는 우편물이나 상자의 개념
    • 순수하게 데이터를 담고 있다는 점에선 Entity 객체와 유사하지만, 목적 자체가 데이터의 전달이므로 읽고, 쓰는 것이 모두 허용되는 점이 가능하고 일회성으로 사용되는 성격이 강하다.
    • JPA를 이용하게 되면 Entity 객체는 단순히 데이터를 담는 객체가 아니라 실제 데이터베이스와 관련이 있고, 내부적으로 EM이 관리하는 객체

    예시

    @Entity
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @AllArgsConstructor
    @Getter
    @Builder
    public class Board {
    	@ID
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        
        @Column(nullable = faluse)
        private String title;
        @Column(nullable = false)
        private String content;
        @Column(nullable = false)
        private String createdBy;
        
        pulic void updateBoard(String title, String content) {
        	this.title = title;
            this.content = content;
        }
    }

     

    record

    • 불변 데이터를 표현하는 데 사용한다.
    • 클래스이므로 interface 구현, extends 가능하다.
    • constructor / getter 메서드를 컴파일러가 자동생성 해준다.
    public record ReadBoardsResponse(Long id, String title, String createBy){}

     


    Summary

    DAO : Database에 접근하는 역할을 하는 객체.

    DTO : 데이터를 전달하기 위한 객체.

    VO : 값 자체를 표현하는객체.

    Entity : 실제 DB 테이블과 매핑이 되는 클래스

kimjihoon