DAO(Data Access Object) : DB의 데이터에 접근을 위한 객체를 말합니다. (보통 Repository, Mapper에 해당)
BO(Business Object) : 여러 DAO를 활용해 비즈니스 로직을 처리하는 객체를 말합니다. (Service에 해당)
DTO(Data Transfer Object) : 각 계층 간의 데이터 교환을 위한 객체를 말합니다. (여기서 말하는 계층은 Controller, View, Business Layer, Persistent Layer))
VO(Value Object) : 실제 데이터만을 저장하는 객체를 말합니다.
Entity란 ?
Entity 클래스는 실제 DB의 테이블과 1:1로 매핑되는 클래스로, DB의 테이블 내에 존재하는 칼럼만을 속성(필드)으로
가져야 합니다. Entity클래스는 상속을 받거나 구현체여서는 안 되며, 테이블 내에 존재하지 않는 칼럼을 가져서도 안됩니다.
Entity와 DTO 클래스는 분리해야 하는 이유?
Entity와 DTO를 분리해서 관리해야 하는 이유는 DB와 View사이의 역할을 철저히 분리하기 위해서입니다.
Entity클래스는 실제 테이블과 매핑되어 있기 때문에 만약 변경하게 된다면 다른 클래스에 영향을 끼치고 DTO클래스는 View와 통신하며 자주 변경되므로 분리해주어야 합니다.
DTO(Data Transfer Object)
DTO는 데이터 전송 객체라는 의미로 주로 비동기 처리를 할 때 사용합니다.
DTO는 각 계층(Layer) 간 데이터 교환을 위한 객체(Java Beans)입니다.
(ex_ View <- DTO -> Controller <- DTO -> Service)
로직을 갖고 있지 않는 순수한 데이터 객체이며 Getter/Setter 메서드 만을 갖습니다.
public class IdDTO {
private String nickname;
private int phoneNumber;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(int phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
클래스 중에 Getter/Setter가 존재하는 걸 볼 수 있습니다.
여기서 중요한 건 Property(프로퍼티)라는 개념인데, 자바는 Property가 문법적으로 제공되지 않습니다.
자바에서 프로퍼티라는 개념을 사용하기 위해서는
setter/getter 에서 set과 get 이후에 나오는 단어가 property라고 생각하는 것입니다.
그래서 위 클래스에서 프로퍼티는 nickname과 phonenumber입니다.
중요한 것은 프로퍼티가 멤버변수 nickname, phonenumber로 결정되는 것이 아닌 getter/setter에서의 nickname과 phonenumber임을 기억해야 합니다.
즉 멤버변수는 아무렇게 지어도 영향이 없고 getter/setter로 프로퍼티(데이터)를 표현한다는 것입니다.
자바는 다양한 프레임워크에서 Data 자동화 처리를 위해 리플렉션 기법을 사용하는데,
데이터 자동화 처리에서 제일 중요한 것은 표준규격이기에
Layer 간 (특히 DB -> View로 이동 등)에 데이터를 넘길 때에는 DTO를 쓰면 편하다는 것이 이런 이유이다.
View에 있는 form에서 nickname필드 값을 프로퍼티에 맞춰 넘겼을 때, 받아야 하는 곳에서는 일일이 처리하는 것이 아니라
nickname속성의 이름이랑 매칭되는 프로퍼티에 자동적으로 DTO가 인스턴스화되어 PersonDTO를 자료형으로 값을 받을 수 있습니다.
그래서 key-value로 존재하는 데이터는 자동화 처리된 DTO로 변환되어 쉽게 데이터가 세팅된 오브젝트를 받을 수 있습니다.
VO(Value Object)
VO(Value Object)는 말 그래도 값 오브젝트로써 값을 위해 쓰입니다.
VO는 변하지 않는 데이터 객체를 의미합니다.
오직 Read만 가능하며 Getter만 가능해야 합니다.
VO이 DTO (Data Transfer Object)와 차별되는 점은 VO(Value Object)는 말 그대로 값 오브젝트로써 값을 위해쓰입니다.
하나는 객체의 불변성(객체의 정보가 변경되지 않음)을 보장합니다. 즉, 값을 설정한 뒤에는 수정할 수 없습니다. (Setter X)
다른 하나는 Equals()와 hashCode()를 재 정의(Override)해서 각 객체의 동일성을 판별할 수 있습니다.
VO는 그럼 어떤 경우에 사용해야 할까?
데이터가 불변이어야 하고, 단순히 저장된 값을 불러와야 하는 경우
ex. 서울의 지역번호는 누구나 다 아는 02이다. 핸드폰 번호처럼 변한느 값이 아닌 고정된 값이다.
그렇기에 위와 같이 고정된 값은 VO로 저장 후 Getter를 호출합니다.
DTO와 VO의 차이점
DTO는 데이터의 전송만을 위한 객체이고 VO는 특정한 비즈니스 로직을 가질 수 있습니다.
DTO는 데이터의 전달만을 목적으로 하고, VO는 객체 자체를 어떠한 값(Value)으로써 사용합니다.
(외부 시스템과 데이터 통신을 할 경우 DTO, DB에서 가져오는 Data는 VO로 정의)
특징으로는
DTO는 목적 자체가 전달이므로 읽고 쓰는 것이 모두 가능해 가변성을 갖고
VO는 불변성 및 read_only의 속성을 갖습니다. 변하면 안 된다는 의미
'프로그래밍 상식' 카테고리의 다른 글
[Jeus] Jeus에 대하여 (0) | 2023.04.04 |
---|---|
[자바 상식] Spring MVC에 대하여 (0) | 2023.03.23 |
[웹 크롤링] Selenium과 BS4 (2) | 2023.03.22 |
@RequestBody, @RequestParam,@ModelAttribute의 차이 (0) | 2023.03.21 |
컴파일 VS 인터프리터에 대해 알아보자 (0) | 2023.03.20 |