DTO(데이터 전송 객체) 란?
- 레이어 간에 데이터를 교환하는 데 사용되는 개체
- 논리가 없다
- 일반적으로 DTO는 순수한 데이터 객체이며, 이러한 속성에 액세스하기 위한 속성과 getter 및 setter 메서드만 있는 클래스입니다.
이전 코드
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonIgnore
private Long id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
@JsonIgnore
private String password;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String contents;
}
게시판 프로젝트를 진행하면서 Entity의 각 필드에 @JsonIgnore를 추가하여 전체 게시물 검색 시 사용자가 확인하지 않아도 되는 게시물의 ID와 확인하지 않아도 되는 게시물의 비밀번호를 반환하지 않도록 했습니다.
그런 다음 질문이 생겼습니다. 지금은 Id와 Password를 반환할 필요가 없어서 @JsonIgnore 어노테이션을 통해 Json에 포함되지 않게 막았는데 Id와 Password를 반환해야 한다면?
이 상황에서 사용할 수 있는 적절한 주석을 찾기 위해 구글링을 해보았지만 찾지 못했습니다. 이미 아래의 DTO를 사용하여 글을 작성하고 있었는데도 @JsonIgnore 어노테이션에 낚여서 이미 작성된 DTO 코드를 적용했습니다. 나는 그것에 대해 생각하지 않고 새로운 기능을 찾고있었습니다.
@Getter
public class BoardRequestDto {
private String username;
private String password;
private String title;
private String contents;
}
이 DTO는 게시물을 작성하고 업데이트할 때 사용되는 DTO였습니다. 좀 더 고민해보겠습니다.. 비밀번호만 빼서 DTO코드를 하나 더 만들면 해결될 문제였습니다!!
그런 다음 멘토에게 이 상황에 대해 물어보고 문제를 해결하기 위해 DTO를 사용하기로 결정했습니다.
코드 추가
@Getter
public class BoardResponseDto {
private String username;
private String title;
private String contents;
public BoardResponseDto(Board board) {
this.username = board.getUsername();
this.title = board.getTitle();
this.contents = board.getContents();
}
}
게시물을 반환할 때 사용할 수 있는 DTO를 새로 만들었고, 코드 가독성과 엔터티 확장으로 인한 추가 반환이 있을 때 생성자에 엔터티인 Board를 받기로 했습니다.
BoardResponseDto를 사용하여 Controller와 Service 코드를 개선했는데 모든 기능이 정상적으로 작동했습니다.
애플리케이션 버전
엔터티가 여러 개인 경우에도 여전히 위의 방법이 적합하지만 코드 파일 수를 줄이기 위해 아래와 같이 DTO 코드를 작성할 수 있습니다.
public class BoardDto {
@Getter
static class Response {
private String username;
private String title;
private String contents;
public Response(Board board) {
this.username = board.getUsername();
this.title = board.getTitle();
this.contents = board.getContents();
}
}
@Getter
static class Request {
private String username;
private String password;
private String title;
private String contents;
}
}
위와 같이 DTO 코드를 작성했다면 코드 파일 수를 줄이면서 각 DTO를 사용할 때
BoardDto.Response()
BoardDto.Request()
위와 같이 가독성을 살리는 방향으로 쓸 수 있을 것 같습니다.