스프링을 공부 하다 보면, 항상 헷갈리는 개념이 있다.
우선적으로 DAO, DTO, VO 이 세가지의 기능이 확실히 구분이 되지 않는데, 이들을 한 번 정리해보고자 한다.
또한, 정리하던 중 Entity에 대한 개념도 설명하시는 포스팅을 많이 확인하여서 이에 대해서도 정리해보겠다.
DAO
DAO는 Data Access Object로 DB에 접근하기 위한 객체이다.
직접 DB에 접근하여 데이터를 CRUD하기 위한 기능을 수행한다.
DB 접근을 위한 로직과 비즈니스 로직을 분리하기 위해 사용되며 요즘은 MyBatis 등의 DB 접근 라이브러리가 존재하기에 별도로 잘 사용을 안한다.
ex.
public interface UserDao {
User findById(int id);
void save(User user);
void update(User user);
void delete(int id);
}
public class UserDaoImpl implements UserDao {
// Implementation of the methods using JDBC or an ORM framework
}
DTO
DTO는 Data Transfer Object로 다른 계층이나 서비스 간에 데이터를 전달하기 위해 사용되며 주로 통신 목적으로 사용되는 객체이다.
DTO는 로직을 가지지 않는 데이터 객체이기에 getter/setter 메소드만 가진다.
ex.
public class UserDto {
private int id;
private String username;
private String email;
// Getters and setters
}
// Usage
UserDto userDto = new UserDto();
userDto.setId(1);
userDto.setUsername("john_doe");
userDto.setEmail("john@example.com");
VO
VO는 Value Object로 식별자 없는 간단한 값을 나타내는 데 사용되며 불변성을 강제한다.
그렇기에 VO 객체는 반드시 Read-Only이다.
ex.
public class Temperature {
private final double value;
private final String unit;
public Temperature(double value, String unit) {
this.value = value;
this.unit = unit;
}
// Getters for value and unit (no setters to enforce immutability)
}
// Usage
Temperature temperature = new Temperature(25.5, "Celsius");
Entitiy
Entity는 실제 DB의 테이블에 1:1로 매핑 되는 클래스로, DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다.
보통 관계형 데이터베이스를 사용하는 응용 프로그램에서 데이터베이스 테이블에 매핑되며 종종 행동 및 비즈니스 규칙을 캡슐화한다.
Entity 클래스는 상속을 받거나 구현체여서는 안된다.
그렇다면 Entity를 DTO로 사용해서는 안될까? 결론부터 말하면 DB Layer(Entity)와 View Layer(DTO) 사이의 역할을 분리 하기 위해서 분리하여 사용해야 한다.
Entity 클래스는 실제 테이블과 매핑되기 때문에 변경되게 되면 여러 다른 클래스에 영향을 끼치게 되는데, 이를 방지하기 위해 DTO 클래스를 사용한다. DTO는 View와 통신하며 자주 변경된다.
ex.
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String email;
// Getters and setters
}
// Usage (with JPA)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();
User user = new User();
user.setUsername("jane_doe");
user.setEmail("jane@example.com");
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
참고
ChatGPT
'개발 > 스프링 개념' 카테고리의 다른 글
[Spring] Spring JPA FindByFK (외래키로 조회) (0) | 2023.02.15 |
---|---|
[Spring] Spring JPA 복합키 (0) | 2023.02.10 |
[Spring] Session이란? (0) | 2023.01.25 |
[Spring] Select에 @Transaction을 사용하는 이유 (0) | 2023.01.20 |
[Spring] Spring 웹 계층 구조 (0) | 2023.01.20 |