728x90
DTO란?
- DTO(Data Transfer Object)는 계층 간 데이터를 전달하는 데 사용되는 객체
- 주로 컨트롤러 ↔ 서비스 ↔ 리포지토리 간 데이터를 주고받을 때 사용된다.
- 엔티티(Entity)와 분리하여 데이터 구조를 명확하게 정의하는 데 유용하다.
DTO 생성 방법
1. 단일 파일로 만들기
DTO를 별도의 파일로 정의하면 가독성이 좋고 재사용성이 높아지며 유지보수가 용이하다.
단점은 파일이 많아질 수 있다.
-> 여러 컨트롤러/서비스에서 DTO를 사용할 때 적합하다.
ARegister
@Getter
public class ARegister{
@Schema(description = "A의 값", example = "a 01")
private String value;
private List<BRegister> bs;
public A toEntity() {
return A.builder()
.value(value)
.build();
}
}
AResponse
@Getter @NoArgsConstructor @AllArgsConstructor @Builder
public class AResponse {
private Long idx;
private String value;
private List<BResponse> bs;
public static AResponse from(A a) {
return AResponse.builder()
.idx(a.getIdx())
.value(a.getValue())
.bs(a.getB().stream().map(BResponse::from).toList())
.build();
}
}
AController
@PostMapping("/register")
public void register(@RequestBody ARegister dto) {
aService.register(dto);
}
@GetMapping("/list")
public ResponseEntity getList() {
List<AResponse> response = aService.list();
return ResponseEntity.ok().body(response);
}
2. Inner class로 만들기 ⭐
이너 클래스로 DTO를 정의하면 컨트롤러 내부에서만 사용할 때 유용하다.
단점은 DTO가 커지거나 여러 곳에서 재사용해야 한다면 유지보수가 어렵다.
ADto
public class ADto {
// A 등록 요청
@Getter
public static class ARegister{
private String value;
private List<BRegister> bs;
public A toEntity() {
return A.builder()
.value(value)
.build();
}
}
// A 응답
@Getter @NoArgsConstructor @AllArgsConstructor @Builder
public static class AResponse {
private Long idx;
private String value;
private List<BResponse> bs;
public static AResponse from(A a) {
return AResponse.builder()
.idx(a.getIdx())
.value(a.getValue())
.bs(a.getB().stream().map(BResponse::from).toList())
.build();
}
}
public static class BRegister { // 생략 }
public static class BResponse { // 생략 }
}
AController
@PostMapping("/register")
public void register(@RequestBody ADto.ARegister dto) {
aService.register(dto);
}
@GetMapping("/list")
public ResponseEntity getList() {
List<ADto.AResponse> response = aService.list();
return ResponseEntity.ok().body(response);
}
DTO 생성 시 주의사항
Setter 사용 지양, 불변 객체로 만들기
DTO는 단순히 데이터를 전달하는 역할이므로, 불변 객체로 만들어 변경되지 않도록 하는 것이 좋다.
-> setter를 사용하면 DTO의 상태를 쉽게 변경할 수 있기 때문에 예상하지 못한 버그가 발생할 가능성이 있다.
728x90
'BE > Spring Boot' 카테고리의 다른 글
[Spring Boot] 연관관계 매핑 (0) | 2025.02.10 |
---|---|
[Java] Lombok이란? / 주요 어노테이션 정리 (0) | 2025.02.10 |
[Spring Boot] Repository 메서드 생성 규칙 (findAll, findBy) (0) | 2025.02.07 |
[Spring Boot] JPA란? / JPA 구성 요소(Entity, Repository) / JPA로 DB 다루기 (1) | 2025.02.06 |
[Spring Boot] 서버 -> 클라이언트로 데이터 전달 (ResponseEntity) (0) | 2025.02.05 |