데이터를 컨트롤러에서 서비스로 전달할 때 데이터를 그 원형으로 전달할 수도 있지만, 보통 객체 형태로 둘러싸서 전달한다. 그 기법을 DTO(Data Transfer Object)라고 한다.
DTO는 아래와 같은 역할을 한다.
1. 데이터 전달
2. 엔티티와의 분리 - 테이블에 직접적으로 매핑되는 엔티티와는 다르게 필요한 데이터만 전달
3. 데이터의 가공 - 데이터를 전달하는 과정에서 필요한 연산을 수행할 수 있음
예시로 다음과 같이 DTO를 구현해보자.
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class BoardDto {
private Long id;
private String boardWriter;
private String boardTitle;
private String boardContents;
private int boardHits;
private LocalDateTime boardCreateTime;
private LocalDateTime boardUpdateTime;
}
서비스에서 엔티티를 DTO로 변환하는 과정은 다음과 같다.
import java.util.List;
import java.util.stream.Collectors;
@Service
public class BoardService {
@Autowired
private BoardRepository boardRepository;
public List<BoardDto> findAll() {
// Entity → DTO 변환
return boardRepository.findAll()
.stream()
.map(boardEntity -> new BoardDto(
boardEntity.getId(),
boardEntity.getBoardWriter(),
boardEntity.getBoardTitle(),
boardEntity.getBoardContents(),
boardEntity.getBoardHits(),
boardEntity.getCreatedTime(),
boardEntity.getUpdatedTime()
))
.collect(Collectors.toList());
}
}
boardRepository라는 데이터베이스에서 findAll하여 모든 데이터를 찾은 뒤 이걸 BoardDto로 변환하고, 최종적으로 collect메서드를 통해 List로 변환하는 과정이다.