일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Array
- 비링크
- do...while
- jvm
- 비즈니스 로직
- Controller 테스트
- OOP
- springDataJpa
- 마이크로서비스 아키텍처
- 스네이크 케이스
- @Version
- 스프링 부트
- @Query
- 트랜잭션 락
- 파스칼 케이스
- 자료구조
- 디자인 패턴
- 자바
- 배열
- 공유락
- 배타락
- Java
- Repository 테스트
- 테스트 코드
- DTO
- Entity
- 원시 자료형
- 낙관락
- Service 테스트
- 스터디
- Today
- Total
menuhwang
여러 개의 DTO, 여러 개의 @RequestBody 본문
여러 개의 DTO, 여러 개의 @RequestBody를 사용할 수 없을까?
프로젝트 진행 중 한 번의 클라이언트 요청으로 유저 정보와 프로필 정보를 받아와 유저 서비스, 프로필 서비스 각각 DTO를 넘겨 처리하고 싶었다.
그래서 단순하게 @RequestBody DTO를 컨트롤러 파라미터에 추가해보았고 역시 생각대로 되지 않았다.
이 질문은 스택오버플로우에도 이미 올라와 있었다. 결론부터 말하자면 두 개 이상의 @RequestBody를 사용하여 값을 받아올 수 없다.
Multiple @RequestBody values in one controller method
I'm receiving error 400 when I send PATCH request to my endpoint that looks like this @RequestMapping(value = "...", method = RequestMethod.PATCH, consumes = "application/json", produc...
stackoverflow.com
방법
그럼 어떻게 하면 유저 정보, 프로필 정보 두 개의 DTO를 각각의 서비스로 전달해줄 수 있을까?
방법 1
두 DTO의 필드를 하나로 통합한 DTO를 새로 만들어 사용하는 방법.
기타 어노테이션은 생략하였습니다.
MemberRequestDTO.java
public class MemberRequestDTO {
private String email;
private String password;
}
ProfileRequestDTO.java
public class ProfileRequestDTO {
private String name;
private int age;
}
SignInDTO.java
public class SignInDTO {
private String email;
private String password;
private String name;
private int age;
}
이 방법을 사용하면 단순히 필요한 필드를 넣어주면 된다. 하지만 필드가 많아지거나 Member, Profile DTO에 변동이 생겼을 때 따로 수정해줘야 하는 유지보수 측면에서의 문제가 있다.
또한 SignInDTO에서 Member, Profile 정보를 각각의 DTO로 나눠주는 과정이 필요하다.
방법 2
하나의 DTO안에 두 개의 DTO를 필드로 받는 방법.
MemberRequestDTO.java
public class MemberRequestDTO {
private String email;
private String password;
}
ProfileRequestDTO.java
public class ProfileRequestDTO {
private String name;
private int age;
}
SignInDTO.java
public class SignInDTO {
private MemberRequestDTO member;
private ProfileRequestDTO profile;
}
방법 1과 다르게 각각의 DTO를 수정했을 때 따로 SignInDTO를 수정해 줄 필요가 없다. 큰 문제는 아니지만 json(body, form) 작성에 주의할 필요가 있다.
방법 1 Request Body
{
"email" : "email@email.com",
"password" : "passw0rd",
"name" : "menu",
"age" : 5
}
방법 2 Request Body
{
"member" : {
"email" : "email@email.com",
"password" : "passw0rd",
},
"profile" : {
"name" : "menu",
"age" : 5
}
}
나는 유지보수의 장점이 있는 방법 2를 적용하기로 했다.
'프로젝트 > 개인' 카테고리의 다른 글
[PUBG Analyzer] 몽고db 인덱스 설정을 통한 성능 개선 (2) | 2024.02.07 |
---|---|
[PUBG Analyzer] MySQL에서 MongoDB와 File System으로 변경 (0) | 2023.08.03 |
[PUBG Analyzer] 배그 Telemetry 분석 기능 구현 문제 해결 (1) | 2023.05.11 |