
DAO (Repository)
- 실제로 DB에 접근을 하는 객체이다.
- DAO는 서비스랑 DB를 연결하는 역할을 하며, 인강에서 Repository가 여기에 해당한다고 할 수 있다.
DTO
- 데이터를 DB에 전송하기 위한 객체이다. (순수 데이 전송을 위한 객체)
- DAO와는 다르게 getter/setter 이외의 메소드는 만들지 않는다. POJO이다.
Entity
- DB에 존재하는 column들을 필드로 가지는 객체를 의미한다.
- DB에 존재하는 테이블과 일대일 대응이며, 테이블에 없는 필드를 가져서는 안된다.
- Spring data JPA를 사용한다면 Entity class에 @Entity를 붙여서 표시할 수 있다.
view layer와 DB layer를 분리하기 위해서이다
Entity 객체의 변경을 피하기 위해서
view와 통신하는 DTO 클래스는 자주 변경된다.
도메인 모델링을 지키기 위해
DAO?
다음 예시 코드를 보자.
public class BookDTO {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class BookRequestDTO {
@NotBlank
@Size(min = 1, max = 50)
private String title;
@NotBlank
@Size(min = 2, max = 20)
private String author;
public Book toEntity() {
return Book.createBook(title, author);
}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class BookResponseDTO {
private Long id;
private String title;
private String author;
public static BookResponseDTO fromEntity(Book book) {
return BookResponseDTO.builder()
.id(book.getId())
.title(book.getTitle())
.author(book.getAuthor())
.build();
}
}
}
도메인 별로 내려줘야하는 데이터 포맷이 다른 경우가 많기 때문에 BookDTO 클래스 안에
inner static class로 요청용, 응답용 DTO로 분할해서 쓰는 경우가 있다.