🤦♀️의문점
- 서블릿으로 구현하면서 DAO, VO, DTO에 대해 궁금점이 생겼다. 코드를 작성하면서 어렴풋이 느낀건, DAO는 데이터베이스에 직접 접근하여 처리하는 로직을 작성하고, VO는 getter만 가지는 읽기 전용, DTO는 getter/setter를 가지고, 데이터 전달?용 데이터 주거나 받을 때 사용하는 것 같은데. VO랑 DTO의 차이를 명확히 모르겠다. DTO와 VO를 꼭 따로 작성해야 할까?
- 스프링 부트에서는 Entity라는 개념을 사용했는데 무엇이 다르지? DTO와는 왜 분리해?
- slf4j랑 Log4j2가 뭐가 다르지?
💡알게 된 점
DAO, DTO, VO 그리고 Entity
DAO(Data Access Object)
- 데이터베이스의 데이터에 접근하기 위한 객체
- 데이터베이스에 접근하는 로직(삽입/조회/삭제/변경)을 가진다.
- DB 접근 로직과 비즈니스 로직을 분리하기 위해 사용
public class TodoDAO {
public void insert(TodoVO vo) throws Exception {
String sql = "insert into tbl_todo (title, dueDate, finished) values (?, ?, ?)";
@Cleanup Connection connection = ConnectionUtil.INSTANCE.getConnection();
@Cleanup PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, vo.getTitle());
preparedStatement.setDate(2, Date.valueOf(vo.getDueDate()));
preparedStatement.setBoolean(3, vo.isFinished());
preparedStatement.executeUpdate();
}
}
DTO(Data Transfer Object)
- 데이터 교환을 위해 사용하는 객체 (ex. controller ↔ service)
- getter/setter를 가질 수 있다.
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodoDTO {
private Long tno;
private String title;
private LocalDate dueDate;
private boolean finished;
}
VO(Value Object)
- Read-Only 속성을 가지는 읽기 전용 오브젝트
- DTO는 단순히 데이터 교환을 위해 데이터를 담아두는 그릇 역할, 값 자체에 의미가 있는 VO와 개념이 다르다.
- equals()와 hashCode()를 오버라이딩 하여, 속성 값이 모두 같으면 같은 객체로 본다.
- 로직이 포함된 메서드를 가질 수 있다.
@Getter
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class TodoVO {
private Long tno;
private String title;
private LocalDate dueDate;
private boolean finished;
}
Entity
- 실제 DB의 테이블과 매핑되는 객체
- 테이블 내에 존재하는 컬럼만을 필드값으로 가져야 한다.
- 로직이 포함된 메서드를 가질 수 있다.
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
DTO와 Entity의 분리
Entity에서 실제 테이블과 매핑되기 때문에 다른 클래스에 영향을 끼치고, DTO는 View와 통신하며 자주 변경되므로 분리해주어야 한다.
slf4j
java.util.logging, logback, log4j와 같은 다양한 로깅 프레임워크에 대한 인터페이스 역할을 하는 라이브러리
728x90
'TIL' 카테고리의 다른 글
[TIL - 20230413] 세션 (0) | 2023.04.13 |
---|---|
[TIL - 20230411] yml의 DB 정보 .gitignore 등록 (0) | 2023.04.11 |
[WIL - 20230409] (0) | 2023.04.09 |
[TIL - 20230407] (0) | 2023.04.07 |
[TIL - 20230403] (0) | 2023.04.04 |