-
[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 테이블과 매핑이 되는 클래스
'Spring' 카테고리의 다른 글
[Spring] Lombok 개념 및 사용법 (1) 2024.04.22 [Spring] Spring Data JPA(Java Persistence API)란? (1) 2024.04.21 [Spring] Controller, Service, Repository 가 무엇일까? (0) 2024.04.20 [Spring] JdbcTemplate의 기본 (0) 2024.04.19 [Spring] 스프링 MVC란 무엇인가? (1) 2024.04.18