1. DAO
DAO는 DB의 data에 접근하기 위한 객체로 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.
DataBase 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용하는데 DAO의 경우 DB와 연결할 Connection까지 설정되어 있는 경우가 많다. 현재 많이 쓰이는 Mybatis 등을 사용할 경우 커넥션풀까지 제공되고 있기 때문에 DAO를 별도로 만드는 경우는 드물다.
2. DTO
DTO는 계층간(Controller, View, Business Layer) 데이터 교환을 위한 자바 빈즈(Java Beans)를 의미한다. DTO는 로직을 가지지 않는 데이터 객체이고, getter/setter메소드만 가진 클래스를 의미한다.
DTO(Data Transter Object)는 데이터 전송(이동) 객체라는 의미를 가지고 있는데 DTO는 주로 비동기 처리를 할 때 사용한다.
@Getter @Setter
class ArticleDTO{
private String title;
private String content;
private String writer;
}
Java Beans란?
Java로 작성된 소프트웨어 컴포넌트를 지칭하는 단어로 비즈니스 로직 부분을 담당하는 Java 프로그램 단위
3. VO(Value Object)
DTO와 달리 VO는 Read-Only속성을 값 오브젝트이다. 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스(Read-only)를 만들어 사용한다. 예를 들면 빨강은 Color.RED, 초록은 Color.GREEN 이렇게 단순히 값만 표현하기 위해 getter 기능만 존재한다.
VO의 핵심 역할은 equals()와 hashcode()를 오버라이딩 하는 것이다. VO 내부에 선언된 속성(필드)의 모든 값들의 VO 객체마다 값이 같아야 똑같은 객체라고 판별한다.
VO는 Getter, Setter를 가질 수 있으며, VO는 테이블 내에 있는 속성 외에 추가적인 속성을 가질 수 있으며, 여러 테이블(A, B, C)에 대한 공통 속성을 모아서 만든 BaseVO 클래스를 상속받아서 사용할 수도 있습니다.
@Getter @Setter
@Alias("article")
class ArticleVo {
private Long id;
private String title;
private String contents;
}
DTO vs VO
DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다.(getter/setter)
그에 반해 VO는 값 그 자체의 의미를 가진 불변 클래스(Read-Only)를 의미한다.(getter만 존재)
DTO는 인스턴스 개념이라면 VO는 리터럴 개념.
즉, VO는 특정한 비즈니스 값을 담는 객체이고, DTO는 Layer간의 통신 용도로 오고가는 객체를 말한다.
4. Entity
Entity클래스는 실제 DataBase의 테이블과 1:1로 매핑되는 클래스로, DB의 테이블내에 존재하는 컬럼만들 속성(필드)로 가져야 한다. Entity 클래스는 상속을 받거나 구현체여서는 안되며, 테이블내에 존재하지 않는 컬럼을 가져서도 안된다.
Entity 클래스 또는 가장 Core한 클래스라고 부른다.
최대한 외부에서 Entity 클래스의 getter method를 사용하지 않도록 해당 클래스 안에서 필요한 로직 method을 구현 해야하고, Domain Logic만 가지며 Presentation Logic을 가지고 있어서는 안된다.
구현 method는 주로 Service Layer에서 사용한다.
https://velog.io/@ha0kim/DAO-DTO-VO-%EC%B0%A8%EC%9D%B4
DAO, DTO, VO,Entity 차이
완전 기본
velog.io
'program > Java, Spring' 카테고리의 다른 글
[Spring] @Configuration 안에 @Bean을 사용해야 하는 이유, proxyBeanMethods - (2/2) (0) | 2022.04.26 |
---|---|
[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2) (0) | 2022.04.26 |
[스프링 부트] 1. Gradle 프로젝트 생성 및 build.gradle 작성 (0) | 2022.04.15 |
SqlSessionTemplate란? (MyBatis) (0) | 2022.04.14 |
MyBatis란? (0) | 2022.04.14 |