최근 프로젝트 세팅을 하며, 아키텍처를 어떻게 구성하고 계층간의 역할을 분리하여 진행해볼까 고민을 하면서
Entity, DTO, VO 등의 개념들에 대해서 확실하게 이해를 해놔야겠다 싶어서 이번 포스팅을 작성하게 되었습니다.
이것들은 무엇이고 차이점은 무엇인지 알아봅시다.
Entity
Entity는 실제 DB 테이블과 1:1로 매핑되는 클래스이며 테이블내에 존재하는 컬럼만을 필드로 지정해야한다.
객체의 불변성을 보장해야 하므로 setter 메서드를 지양하고 생성자 또는 Builder 패턴을 사용하는 것이 일반적이다.
Entity는 조심히 다뤄야하며, 요청 그리고 응답 값을 전달하는 역할을 수행해서는 안된다.
그 이유는 Entity는 실제 DB 테이블과 매핑 되어 중요한 정보가 응답 값으로 유출된다면 보안상 치명적이고 SRP 원칙을 위반하게 되므로 요청이나 응답값을 자유롭게 변경 가능한 DTO를 사용하는것을 추천한다.
아래는 아주 단순한 Entity의 예제코드이다.
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
}
DTO(Data Transfer Object)
DTO는 Data Transfer Object의 약자로 데이터 전달 전용 객체를 의미한다.
주로 Getter/Setter 메서드를 통해 자유롭게 값을 변경 가능하며, Controller와 Service 간의 API 응답 요청에 사용된다.
DTO는 비즈니스 로직을 갖지 않으며, 순수하게 데이터 전달의 역할만 수행한다.
최종적으로 클라이언트측에게 반환할 때에는 DTO클래스로 변경 후 반환을 해야 보안과 안정성있는 시스템을 구축 할 수 있을 것이다.
아래는 아주 단순한 DTO의 예제코드이다.
public class UserDTO {
private Long id;
private String name;
private String email;
// Getters and setters
}
VO(Value Object)
VO(Value Object)는 값 자체로 의미를 가지는 불변 객체이다.
VO는 불변하기 때문에 Setter처럼 값을 변경하는 메서드가 존재해서는 안된다.(Read Only)
Spring에서의 MyBatis(VO) vs JPA(Entity)
Spring의 MyBatis에서는 VO클래스를 그리고 JPA에서는 Entity클래스를 활용한다.
그 이유는 MyBatis의 SQL-Mapper는 SQL문으로 DB 테이블에 접근하고 데이터를 객체로 매핑하고
JPA의 ORM은 SQL문이 아닌 @Entity, @Id, @OneToMany 등으로 자바 객체로 매핑하며 객체간 관계나 식별자를 가진다.
아래는 아주 단순한 VO의 예제코드이다.
public class UserVO {
private Long id;
private String name;
}
최근 계획한 프로젝트에서 앞으로 MyBatis로 개발을 진행 할 예정이며 VO를 DB 조회용 객체, DTO를 요청/응답 값을 받고 반환하는 객체로 사용 할 계획입니다.
VO객체로 DB에서 값을 받아와 DTO 객체로 변환 후 반환 할 예정인데, 이에 활용 할 MapStruct를 다음 포스팅에 정리해보겠습니다.
'Java' 카테고리의 다른 글
[Java] 싱글톤 패턴(Singleton Pattern) 개념 및 사용 방법 (0) | 2025.04.06 |
---|---|
[Java] 멀티쓰레드 Callable, Executor, ExecutorService 알아보기 (0) | 2024.11.30 |
[Java] Thread와 Runnable의 개념 및 사용법 (1) | 2024.11.28 |
[Java] 람다식(Lambda) 개념 및 사용 예제 (0) | 2024.10.16 |
[Java] 스트림(Stream) 특징, 사용 예제 (0) | 2024.10.11 |