์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
Tags
- ์ธํ ๋ฆฌ์ ์ด
- Publishing
- ์๋ฃ๊ตฌ์กฐ
- CSS
- ๊นํ๋ธ
- ์ปฌ๋ ์ ํ๋ ์์ํฌ
- ๊ณ์ฐ๊ธฐ๋ง๋ค๊ธฐ
- ์ฒซ๊ธ์๋๋ฌธ์
- spring data jpa
- ํ๊ณ
- ๋ฐ์ผ๋ฆฌ์ฝ๋ฉ
- ์ ๋ค๋ฆญ์ค
- Spring Data JDBC
- ๋ถํธ์บ ํ
- ๊ฑฐ๋ญ์ ๊ณฑ
- java
- FilterChain
- ๋ฌธ์์ด๋ค์ง๊ธฐ
- ๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ
- ๊ทธ๋ฆฌ๋
- fibonacci
- ๋ฐฑ์๋
- CLI๋ช ๋ น์ด
- ์คํ๋ง
- ์๊ณ ๋ฆฌ์ฆ
- ํ์ดํ๋ก๊ทธ๋๋ฐ
- HTML
- ์๋ฐ
- Spring Security
- testing
Archives
- Today
- Total
๋์ ๋ชจ์
042 | DTO with HTTP Request & Response ๋ณธ๋ฌธ
๐ DTO(Data Trasfer Object)
- ๋งํด ํ์ธ๋ฌ(Martin Fowler)๊ฐ ‘Patterns of Enterprise Application Architecture’ ๋ผ๋ ์ฑ ์์ ์ฒ์ ์๊ฐํ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ ํจํด์ ํ๋์ด๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ํ ๊ฐ์ฒด
์ฃผ๋ก ํด๋ผ์ด์ธํธ์์ ์๋ฒ ์ชฝ์ผ๋ก ์ ์กํ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์ ๋, ์๋ฒ์์ ํด๋ผ์ด์ธํธ ์ชฝ์ผ๋ก ์ ์กํ๋ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. - ๋ฐ์ดํฐ ์ ์ก์ด ์ด๋ฃจ์ด์ง๋ ๊ตฌ๊ฐ
- ํด๋ผ์ด์ธํธ → ์๋ฒ: ์์ฒญ(request) ๋ฐ์ดํฐ
- ์๋ฒ → ํด๋ผ์ด์ธํธ: ์๋ต(response) ๋ฐ์ดํฐ
- DTO ํด๋์ค: ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ์ ๋ฌ ๋ฐ๋ ์ญํ
๐ DTO๊ฐ ํ์ํ ์ด์
- ํด๋ผ์ด์ธํธ์ Request Body๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๋ชจ๋ ์ ๋ฌ ๋ฐ์ ์ ์์ → ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค.
//ํ์ ์ ๋ณด ์ ์ฅ์ ์ํด postMember์ @RequestParam ์ฌ์ฉ
@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);
}
...
}
// DTO ์ ์ฉ
// - @RequestParam์ ํตํด ์ ๋ฌ ๋ฐ์ ์์ฒญ ๋ฐ์ดํฐ๋ค์ Map์ ์ถ๊ฐํ๋ ๋ก์ง์ด ์ฌ๋ผ์ง
// - MemberDto ๊ฐ์ฒด๋ฅผ ResponseEntity ํด๋์ค์ ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋๋ก ๋ณ๊ฒฝ
@RestController
@RequestMapping("/v1/members")
public class MemberController {
@PostMapping
public ResponseEntity postMember(MemberDto memberDto) {
return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
}
...
}
๐ ๋ฐ์ดํฐ ์ ํจ์ฑ(Validation) ๊ฒ์ฆ์ ๋จ์ํ
- ์ ํจ์ฑ(Validation) ๊ฒ์ฆ: ์๋ฒ์์ ์ ํจํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ
- HTTP ์์ฒญ์ ์ ๋ฌ ๋ฐ๋ ํธ๋ค๋ฌ ๋ฉ์๋์ ์ฃผ ๋ชฉ์
- ํธ๋ค๋ฌ ๋ฉ์๋ ๋ด๋ถ์ ์๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง์ ์ธ๋ถ์ ์์ฑ → ์ฝ๋๊ฐ ๊ฐ๊ฒฐ
- ์์ฒญ์ ์ ๋ฌ๋ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ต๋ํ ๊ฐ๊ฒฐํ๊ฒ ์์ฑ
// ๋ ๊ฑฐ์ ์ฝ๋์์ ์ด๋ฉ์ผ ๊ฒ์ฆํ๊ธฐ
if (!email.matches("^[a-zA-Z0-9_!#$%&'\\*+/=?{|}~^.-]+@[a-zA-Z0-9.-]+$")) {
throw new InvalidParameterException();
}
// Using DTO Class
public class MemberDto {
@Email
private String email;
private String name;
private String phone;
// + getter / setter
}
// Handler Method with DTO
@RestController
@RequestMapping("/v1/members")
public class MemberController {
@PostMapping
public ResponseEntity postMember(@Valid MemberDto memberDto) {
return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
}
...
}
๐ HTTP ์์ฒญ/์๋ต ๋ฐ์ดํฐ์ DTO ์ ์ฉํ๊ธฐ
HTTP Request Body != JSON
- ์ด์ ๊น์ง ์ฌ์ฉํ ํด๋ผ์ด์ธํธ์์ ์ ๋ฌํ๋ ์์ฒญ ๋ฐ์ดํฐ: x-www-form-urlencoded
- ์์ฒญ ๋ฐ์ดํฐ ์ค ๋ฐ๋์ ํด๋น๋๋ ๋ฐ์ดํฐ: Request Body
HTTP Request Body == JSON
DTO ํด๋์ค ์ ์ฉ์ ์ํ ์ฝ๋ ๋ฆฌํฉํ ๋ง ์ ์ฐจ
- ์ ๋ณด๋ฅผ ์ ๋ฌ ๋ฐ์ DTO ํด๋์ค ์์ฑ
- ํด๋ผ์ด์ธํธ ์ชฝ์์ ์ ๋ฌํ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ @RequestParam ์ ๋ํ ์ด์ ์ผ๋ก ์ ๋ฌ ๋ฐ๋ ํธ๋ค๋ฌ ๋ฉ์๋ ์ฐพ๊ธฐ
- @RequestParam ์ชฝ ์ฝ๋๋ฅผ DTO ํด๋์ค์ ๊ฐ์ฒด๋ก ์์
- Map ๊ฐ์ฒด๋ก ์์ฑ๋์ด ์๋ Response Body๋ฅผ DTO ํด๋์ค์ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝ
๐ more
- Response Body๋ฅผ JSON ํ์์ผ๋ก ์ ๋ฌํ๊ธฐ ์ํด์๋ @ResponseBody ์ ๋ํ ์ด์ ์ ๋ฉ์๋ ์์ ๋ถ์ฌ ์ฃผ์ด์ผํ์ง๋ง ResponseEntity ๊ฐ์ฒด๋ฅผ ๋ฆฌํด ๊ฐ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ @ResponseBody๋ฅผ ์๋ตํ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ ์ชฝ์์ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ ์ชฝ์ผ๋ก ์ ์กํ๋ฉด ์๋ฒ ์ชฝ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๋ฌ ๋ฐ์ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ DTO ๊ฐ์ Java์ ๊ฐ์ฒด๋ก ๋ณํํ๋๋ฐ ์ด๋ฅผ ์ญ์ง๋ ฌํ(Deserialization)์ด๋ผ๊ณ ํ๋ค.
- JSON → DTO: ์ญ์ง๋ ฌํ(Deserialization)
- ์๋ฒ ์ชฝ์์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ํด์ DTO ๊ฐ์ Java์ ๊ฐ์ฒด๋ฅผ JSON ํ์์ผ๋ก ๋ณํํ๋ ๊ฒ์ ์ง๋ ฌํ(Serialization)๋ผ๊ณ ํ๋ค.
- DTO → JSON: ์ง๋ ฌํ(Serialization)
'SEB > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
043 | Layer interconnect & Class Mapping (0) | 2022.08.23 |
---|---|
042 | DTO ์ ํจ์ฑ ๊ฒ์ฆ (0) | 2022.08.23 |
031 | RDBMS, SQL, ACID (0) | 2022.08.04 |
030 | REST API (0) | 2022.08.03 |
029 | ๋คํธ์ํฌ - HTTP (0) | 2022.08.02 |
Comments