DTO?
DTO๋?
DTO(Data Transfer Object)์ ์ฝ์๋ก ๋งํดํ์ธ๋ฌ๊ฐ ์๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ ํจํด์ค์ ํ๋์ด๋ค. DTO๋ ํ๋ก์ธ์ค๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฉ๋์ ๊ฐ์ฒด์ด๋ค.
DTO๊ฐ ํ์ํ ์ด์
์ฝ๋์ ๊ฐ๊ฒฐ์ฑ
DTO๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค. ์๋ฅผ ๋ค์ด ํ์์ ๋ณด๋ฅผ @RequestParam์ ํตํด ์ด๋ฉ์ผ, ์ด๋ฆ, ์ฃผ์ ๋ฑ์ ์ ๋ณด๋ฅผ ๋ฐ๋๋ค๊ณ ์๊ฐํด๋ณด์. ๊ทธ๋ผ ์ปจํธ๋กค๋ฌ์ ํด๋น ๋ฉ์๋์ ๋ฐ์ผ๋ ค๋ ์ ๋ณด์ ์ซ์๋งํผ @RequestParam์ด ํ์ํ ๊ฒ์ด๋ค. ํ์ง๋ง Dto๋ฅผ ์ ์ฉํ๊ฒ๋๋ค๋ฉด?
//DTO ์ ์ฉ์
@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);
//DTO์ ์ฉํ
@PostMapping
public ResponseEntity postMember(MemberDto memberDto) {
return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
}
Dtoํด๋์ค๋ฅผ ํตํด ์์ฒญ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ์ ๋ฌ๋ฐ์ ์ปจํธ๋กค๋ฌ์ ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ก๋ค.
์ ํจ์ฑ(Validation) ๊ฒ์ฆ
์๋จ์ DTO๊ฐ ์ ์ฉ๋์ง ์์ ์ฝ๋์ ์ ํจ์ฑ ๊ฒ์ฆ์ด ์ ์ฉ๋๋ ค๋ฉด if๋ฌธ๋ฑ์ ์ฌ์ฉํ์ฌ ์ปจํธ๋กค๋ฌ ๋ด๋ถ์์ ๊ฒ์ฆ์ด ์งํ๋์ผํ๋ค. ์ ๊ทํํ์์ ์ฌ์ฉํ์ฌ ๊ฒ์ฆ์ ์งํํ๋ค๊ณ ํด๋ ๋ก์ง์ด ํธ๋ค๋ฌ ๋ฉ์๋ ๋ด๋ถ์์ ์ง์ ์ ์ผ๋ก ํฌํจ๋์ด ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค. ํธ๋ค๋ฌ ๋ฉ์๋๋ HTTP์์ฒญ์ ์ ๋ฌ๋ฐ๋ ๊ฒ์ด ์ฃผ๋ชฉ์ ์ด๋ฏ๋ก ์ด๋ฌํ ๋ก์ง์ ๋ค๋ฅธ๊ณณ์ ๊ตฌ์ฑ๋๋๊ฒ์ด ๊น๋ํ ์ฝ๋์ด๋ค. ์ด๋ฌํ ์ ํจ์ฑ ๊ฒ์ฆ์ ๋ํ ๋ก์ง์ DTO์๊ฒ ๋งก๊ธฐ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์์๋ค.
- @NotBlank : ์ ๋ณด๊ฐ ๋น์ด์๋์ง๋ฅผ ๊ฒ์ฆ , null, ๊ณต๋ฐฑ, ์คํ์ด์ค ๊ฐ์ ํ์ฉํ์ง์์
- @Email : ์ ํจํ ์ด๋ฉ์ผ ์ฃผ์์ธ์ง๋ฅผ ๊ฒ์ฆ
- @Pattern(regexp = "") : ์ ๊ทํํ์(Regular Expression)์ ๋งค์น์์ผ ์ ํจํ์ง ๊ฒ์ฆ
//์ปจํธ๋กค๋ฌ
@RestController
@RequestMapping("/v1/members")
@Validated
public class MemberController {
...
@PatchMapping("/{member-id}")
public ResponseEntity patchMember(@PathVariable("member-id") @Min(1) long memberId,
@Valid @RequestBody MemberPatchDto memberPatchDto) {
...
}
}
//DTO
@Getter
@Setter
public class MemberPostDto {
@NotBlank
@Email
private String email;
@NotBlank(message = "๊ณต๋ฐฑ์ด ์๋์ฌ์ผํฉ๋๋ค.")
private String name;
@Pattern(regexp = "^010-\\d{3,4}-\\d{4}$")
private String phone;
}
์์์ ๋ณด๋ค์ํผ ์ปจํธ๋กค๋ฌ์ @Valid ์ ๋ํ ์ด์ ๋ง ์ถ๊ฐํด์ฃผ๋ฉด ์ ํจ์ฑ๊ฒ์ฆ์ ๋ํ ๋ถ๋ถ์ DTO์์ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ๋๋ค. ๋ง์ฝ ์ปจํธ๋กค๋ฌ์์ @Min() ๋ฑ์ ์ ํจ์ฑ๊ฒ์ฆ ์ ๋ํ ์ด์ ์ด ํ์ํ๊ฒฝ์ฐ ํด๋์ค์ @Validated๋ฅผ ๋ถ์ฌ์ค์ผํ๋ค.
[ref. Jakarta Bean Validation]
์ํ๋ ์ ๋ณด๋ง ์ ๋ฌ
์๋ฅผ๋ค์ด Member๋ผ๋ ๊ฐ์ฒด๊ฐ id, name, password์ ๊ฐ์ ๊ฐ์ง๊ณ ์์๋ password์ ๊ฒฝ์ฐ์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๊ทธ๋๋ก ์ ๋ฌ๋๋ฉด ์๋๋ค. ์ด๋ฐ๊ฒฝ์ฐ Client์๊ฒ ๋ ธ์ถํด๋ ๋๋ ์ ๋ณด๋ง ๋ชจ์ DTO๋ก ๊ตฌ์ฑํ๋ฉด ํด๊ฒฐํ ์์๋ค.
public class Member {
private String id;
private String name;
private String password;
...
}
public class MemberDTO {
private String name;
...
}
์๋น์ค๊ณ์ธต๊ณผ ๋ฐ์ดํฐ์์ธ์ค ๊ณ์ธต์์๋ Member ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ , ์ด๋ฅผ ์ปจํธ๋กค๋ฌ์์ DTO๊ฐ์ฒด๋ก ๋งคํํ์ฌ Client์๊ฒ ๋ฆฌํดํ๋ฉด Client์์ ์ ๊ทผํ ์์๋๊ฐ์ Name๋ฟ์ด๋ค.