처음엔 ResponseEntity까지 적용한 MemberController코드있는데
@RestController
@RequestMapping("/v1/members")
public class MemberController {
@PostMapping
public ResponseEntity postMember(@RequestParam("email") String email,
@RequestParam("name") String name,
@RequestParam("phone") String phone) {
Map<String, String> map = new HashMap<>();
map.put("email", email);
map.put("name", name);
map.put("phone", phone);
return new ResponseEntity<Map>(map, HttpStatus.CREATED);
}
...
...
}
불편한 점은 postMember()
에 파라미터로 추가되는 @RequestParam
의 개수는 계속 늘어날 수 밖에 없습니다.
여기서 DTO 클래스가 바로 요청 데이터를 하나의 객체로 전달 받는 역할을 해준다.
이걸 코드를 간결하게 만들기 위해 DTO 클래스를 만들어서 한번에 보낸다
@RestController
@RequestMapping("/v1/members")
public class MemberController {
@PostMapping
public ResponseEntity postMember(MemberDto memberDto) {
return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
}
...
...
}
코드 3-26을 보면 postMember()에서 @RequestParam
을 사용하는 부분이 사라지고 MemberDto memberDto
가 추가되었습니다.
그리고 아직 비즈니스 로직이 없긴하지만 어쨌든 @RequestParam
을 통해 전달 받은 요청 데이터들을 Map
에 추가하는 로직이 사라지고, MemberDto
객체를 ResponseEntity
클래스의 생성자 파라미터로 전달하도록 변경되었습니다.
결과적으로 DTO 클래스를 사용하니 코드 자체가 매우 간결해진 것을 알 수 있습니다.
DTO 클래스
public class MemberDto {
@Email
private String email;
private String name;
private String phone;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
MemberDto 클래스에서 이메일에 대한 유효성 검증을 진행
@RestController
@RequestMapping("/v1/members")
public class MemberController {
@PostMapping
public ResponseEntity postMember(@Valid MemberDto memberDto) {
return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
}
...
...
}
출처 : https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html