๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[Spring]/Spring MVC

Spring์—์„œ HTTP ํ†ต์‹ ์„ ํ†ตํ•ด JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜์„ ์ •๋ฆฌํ•ด๋ณด์ž.

by ํŒกํŽ‘ํ 2023. 8. 14.
728x90
๐Ÿ’ก Java + Spring Boot์„ ์ด์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ http ํ†ต์‹ ์„ ํ•  ๋•Œ ์ „๋‹ฌ๋ฐ›๋Š” http ์š”์ฒญ ๋ฉ”์‹œ์ง€๋‚˜, ์ „๋‹ฌํ•˜๋Š” ์‘๋‹ต ๋ฉ”์‹œ์ง€๋Š” json ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ด๋•Œ ์ž๋ฐ” ๊ฐ์ฒด(dto)์—์„œ json ๋ฐ์ดํ„ฐ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜์ด ๋˜๋Š”์ง€๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

์šฐ์„  HTTP ํ†ต์‹ ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์„ ํ›‘๊ณ  ๋„˜์–ด๊ฐ€์ž.

 

  • HTTP ํ†ต์‹  ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” HTTP/1.1 ๊ธฐ๋ฐ˜์˜ ํ†ต์‹  ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ๋‹ค.
  • HTTP/1.1 ๊ธฐ๋ฐ˜์˜ ํ†ต์‹  ๋ฐฉ์‹์€ Request-Response ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์‘๋‹ตํ•œ๋‹ค.
  • ์ด๋•Œ, ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ)๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉฐ, ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ HTTP ์ƒํƒœ ์ฝ”๋“œ(200 OK, 404 Not Found ๋“ฑ)์™€ ํ•จ๊ป˜ ์‘๋‹ตํ•œ๋‹ค.

 

์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

[Request]
HTTP Method (GET, POST, PUT, DELETE ๋“ฑ)
URI (Uniform Resource Identifier)
HTTP Version

[Headers]
Key: Value
Key: Value
...

[Body]
(Optional)

---------------------------------------

[Response]
HTTP Version
Status Code
Status Message

[Headers]
Key: Value
Key: Value
...

[Body]
(Optional)

๋ฉ”์‹œ์ง€์—์„œ [Body] ์•ˆ์—๋Š” ์–ด๋–ค ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐˆ๊นŒ?

  • HTTP ํ”„๋กœํ† ์ฝœ์—์„œ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””(body)๋Š” ์š”์ฒญ(request)์ด๋‚˜ ์‘๋‹ต(response)์— ๋Œ€ํ•œ ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. 
  • ์ด ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์€ ์š”์ฒญ/์‘๋‹ต์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ๋Š” JSON, XML, HTML, ํ…์ŠคํŠธ ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ถ„์„ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ํŒŒ์‹ฑ ๋˜์–ด ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ POST ์š”์ฒญ์„ ํ•˜๋ฉด ์š”์ฒญ ๋ฐ”๋””์—๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.
  • ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ผ ๋•Œ๋„ ์‘๋‹ต ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.
  • ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์ฃผ๊ณ ๋ฐ›๊ณ  ์›ํ•˜๋Š” ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Request ๊ด€๋ จ ์• ๋„ˆํ…Œ์ด์…˜

@ModelAttribute

  • HTTP ์š”์ฒญ์˜ ๋‹ค์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(์ฟผ๋ฆฌ ์ŠคํŠธ๋ง, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ)๋“ค์„ ์ผ๋Œ€์ผ๋กœ ์ž๋ฐ” ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•œ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋‚˜ DTO(Data Transfer Object)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ€ํ™˜์ด ์•„๋‹Œ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—  Setter ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์Šคํ”„๋ง MVC์—์„œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ณตํ•ฉ ํƒ€์ž…(์˜ˆ: DTO ํด๋ž˜์Šค)์ธ ๊ฒฝ์šฐ ์•”๋ฌต์ ์œผ๋กœ @ModelAttribute๋ฅผ ์ ์šฉํ•œ๋‹ค.
    • @ModelAttribute ์• ๋„ˆํ…Œ์ด์…˜์„ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค๋Š” ๋ง์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ์™€ ๊ฐ™์ด @ModelAttribute ์• ๋„ˆํ…Œ์ด์…˜์„ ์ƒ๋žตํ•ด๋„ ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ DTO ๊ฐ์ฒด์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

 

์˜ˆ์‹œ ์ฝ”๋“œ

@GetMapping("/sample")
public ResponseEntity<SampleDto> getSampleData(@ModelAttribute SampleDto sampleDto) {
    // ๋กœ์ง ๊ตฌํ˜„
    return ResponseEntity.ok(sampleDto);
}

 

 

@RequestParam

  • HTTP ์š”์ฒญ์—์„œ ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • RequestParam ์—ญ์‹œ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.
  • URL ๊ฒฝ๋กœ ์˜ˆ์‹œ : /members?id=1

 

์˜ˆ์‹œ ์ฝ”๋“œ

@RestController
@RequestMapping("/members")
@RequiredArgsConstructor
public class MemberController {
    private final MemberRepository memberRepository;

    ...

    @GetMapping
    public ResponseEntity getMemberByParam(@RequestParam("id") Long id) {
        Optional<Member> optionalMember = memberRepository.findById(id);

        MemberDto.Response response = MemberDto.Response.builder()
                .id(optionalMember.get().getId())
                .name(optionalMember.get().getName())
                .age(optionalMember.get().getAge())
                .build();

        return new ResponseEntity<>(response, HttpStatus.OK);
    }
}

 

  • URL ๊ฒฝ๋กœ์—์„œ ? ๋’ค์— key-value ์Œ์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

@PathVariable

  • URL ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
  • {}(์ค‘๊ด„ํ˜ธ) ์•ˆ์— ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ž‘์„ฑํ•˜๋ฉฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ž๋™ ์ง€์ •๋œ๋‹ค.
  • URL ๊ฒฝ๋กœ ์˜ˆ์‹œ : /members/{id}์ด๋‹ค.

 

์˜ˆ์‹œ ์ฝ”๋“œ

@RestController
@RequestMapping("/members")
@RequiredArgsConstructor
public class MemberController {
	
    private final MemberRepository memberRepository;
    
    ...
    
    @GetMapping("/{id}")
    public ResponseEntity getMemberByPathVariable(@PathVariable Long id) {

    Optional<Member> optionalMember = memberRepository.findById(id);

    MemberDto.Response response = MemberDto.Response.builder()
            .id(optionalMember.get().getId())
            .name(optionalMember.get().getName())
            .age(optionalMember.get().getAge())
            .build();

    return new ResponseEntity<>(response, HttpStatus.OK);
    }
}

 

 

  • URL์— member์˜ id๋ฅผ ์ž…๋ ฅํ•˜๊ณ  get ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด db์— id=1์ธ member์˜ id, age, name์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋‚ ์•„๊ฐ„๋‹ค.

 

 

@PathVarialble VS @RequestParam

  • @PathVariable๋Š” ๊ฒฝ๋กœ ์ƒ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ ,
  • @RequestParam์€ HTTP Request URL์˜ Query Parameter์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

 

 

@RequestBody

  • HTTP Request Body์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋งคํ•‘ํ•œ๋‹ค.
  • ๋ณดํ†ต JSON์ด๋‚˜ XML ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๊ฐ€ HTTP ์š”์ฒญ ๋ฐ”๋””์— ์‹ค๋ ค ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์— ์˜ค๊ฒŒ ๋˜๋ฉด ์ด๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ž๋ฐ” ์–ธ์–ด๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋•๋Š”๋‹ค.
  • HttpMessageConverter ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค.

 

@RequestBody๋ฅผ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ถ™์ด์ง€ ์•Š์„ ๊ฒฝ์šฐ

@RestController
@RequestMapping("/members")
@RequiredArgsConstructor
public class MemberController {
    private final MemberRepository memberRepository;

    @PostMapping("/dtos")
    public MemberDto.Response createMemberToDto(MemberDto.Post post) {

        Member member = Member.builder()
                .name(post.getName())
                .age(post.getAge())
                .build();

        Member savedMember = memberRepository.save(member);

        MemberDto.Response response = MemberDto.Response.builder()
                .id(savedMember.getId())
                .name(savedMember.getName())
                .age(savedMember.getAge())
                .build();


        return response;
    }
}

 

  • @RequestBody๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„ HTTP ์š”์ฒญ ๋ฐ”๋””์— ๋“ค์–ด์žˆ๋Š” JSON ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์•„ dto ํ•„๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’์ธ null๊ณผ 0์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜์—ˆ๋‹ค.

 

@RequestBody๋ฅผ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ถ™์ธ ๊ฒฝ์šฐ

@RestController
@RequestMapping("/members")
@RequiredArgsConstructor
public class MemberController {
    private final MemberRepository memberRepository;

    @PostMapping("/dtos")
    public MemberDto.Response createMemberToDto(@RequestBody MemberDto.Post post) {

        ...
}

 

  • @RequestBody๋ฅผ ๋ถ™์ด๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ JSON ๋ฐ์ดํ„ฐ -> ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜์ด ๋˜์–ด HTTP ์š”์ฒญ ๋ฐ”๋””์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ž๋ฐ” ์–ธ์–ด๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

Response ๊ด€๋ จ ์• ๋„ˆํ…Œ์ด์…˜

@ResponseBody

  • HTTP ์‘๋‹ต์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง„ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ JSON ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ํด๋ž˜์Šค ๋‹จ, ๋ฉ”์„œ๋“œ ๋‹จ์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.
  • HttpMessageConverter ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค.

 

@RestController

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 * @since 4.0.1
	 */
	@AliasFor(annotation = Controller.class)
	String value() default "";

}
  • @Controller + @ResponseBody๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ์Šคํ”„๋ง์—๊ฒŒ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค์ž„์„ ์•Œ๋ฆผ(๋นˆ์œผ๋กœ ๋“ฑ๋ก)๊ณผ ๋™์‹œ์— ํด๋ž˜์Šค๋‹จ์— @ResponseBody ์• ๋„ˆํ…Œ์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ๋”ฐ๋กœ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ JSON ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ํ•  ํ•„์š” ์—†๊ฒŒ ๋„์™€์ค€๋‹ค.

 

ResponseEntity ํด๋ž˜์Šค

  • HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‹ค ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํด๋ž˜์Šค์ด๋‹ค.
  • ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ JSON ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • HttpMessageConverter ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค.
  • ์ด์— ๋”ํ•ด ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ์ƒํƒœ ์ฝ”๋“œ, ํ—ค๋” ๋“ฑ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ ์ฝ”๋“œ

@Controller // ์ปจํŠธ๋กค๋Ÿฌ ์• ๋„ˆํ…Œ์ด์…˜
@RequestMapping("/members")
@RequiredArgsConstructor
public class MemberController {
    private final MemberRepository memberRepository;

    @PostMapping("/dtos")
    @ResponseBody // ResponseBody ์• ๋„ˆํ…Œ์ด์…˜
    public MemberDto.Response createMemberToDto(@RequestBody MemberDto.Post post) {

        Member member = Member.builder()
                .name(post.getName())
                .age(post.getAge())
                .build();

        Member savedMember = memberRepository.save(member);

        MemberDto.Response response = MemberDto.Response.builder()
                .id(savedMember.getId())
                .name(savedMember.getName())
                .age(savedMember.getAge())
                .build();


        return response;
    }

    @PostMapping("/entities")
    public Member createMemberToEntity(@RequestBody MemberDto.Post post) {

        Member member = Member.builder()
                              .name(post.getName())
                              .age(post.getAge())
                              .build();

        Member savedMember = memberRepository.save(member);

        MemberDto.Response response = MemberDto.Response.builder()
                                                        .id(savedMember.getId())
                                                        .name(savedMember.getName())
                                                        .age(savedMember.getAge())
                                                        .build();

        return savedMember;
    }

    @PostMapping("/responseentities")
    public ResponseEntity createMemberToResponseEntity(@RequestBody MemberDto.Post post) {

        Member member = Member.builder()
                              .name(post.getName())
                              .age(post.getAge())
                              .build();

        Member savedMember = memberRepository.save(member);

        MemberDto.Response response = MemberDto.Response.builder()
                                                        .id(savedMember.getId())
                                                        .name(savedMember.getName())
                                                        .age(savedMember.getAge())
                                                        .build();

        return new ResponseEntity<>(response, HttpStatus.CREATED);
    }
}

 

  • createMemberToDto ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ @ResponseBody ์• ๋„ˆํ…Œ์ด์…˜์ด ์žˆ์–ด HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ JSON ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ณ€ํ™˜๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • @ResponseBody๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์žฌ์‹คํ–‰ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • 404 Not Found๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

  • createMemberToEntity ์—ญ์‹œ @ResponseBody๊ฐ€ ์—†์œผ๋ฉด ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

  • createMemberToResponseEntity์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ResponseEntity๋กœ ํ•˜์—ฌ JSON ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ƒํƒœ์ฝ”๋“œ๊นŒ์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•œ  201 Created๋กœ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ฒฐ๋ก 

  • Spring MVC Restful ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์ž๋ฐ” ๊ฐ์ฒด์™€ JSON ๋ฐ์ดํ„ฐ ๊ฐ„ ๋ณ€ํ™˜์„ ๋„์™€์ฃผ๋Š” ์—ฌ๋Ÿฌ ์• ๋„ˆํ…Œ์ด์…˜์ด ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ HTTP ์š”์ฒญ์€ ๊ฒฝ๋กœ(@PathVariable), ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง(@RequestParam), ์š”์ฒญ ๋ฐ”๋””(@RequestBody) ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ์• ๋„ˆํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • HTTP ์‘๋‹ต์˜ ๊ฒฝ์šฐ์—๋Š” ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•  ํ•„์š” ์—†์ด @RestController๋ฅผ ์‚ฌ์šฉํ•˜์ž.
  • ๊ทธ๋Ÿผ ๋ฉ”์„œ๋“œ ๋‹จ์— ๋”ฐ๋กœ @ResponseBody๋ฅผ ์ ์šฉํ•  ํ•„์š”์—†์ด ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ ์ž๋ฐ” ๊ฐ์ฒด -> JSON ๋ฐ์ดํ„ฐ๋กœ HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ ๋ณ€ํ™˜ํ•ด ์ค€๋‹ค.
  • ๋งŒ์•ฝ ์ข€ ๋” ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ResponseEntity๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์ฝ”๋“œ ๋ฐ ํ—ค๋” ๋“ฑ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐœ๋ฐœํŒ€์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ทœ์•ฝ์„ ๋งŒ๋“ค์–ด ํ†ต์ผํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ResponseEntity๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ƒˆ๋กœ์šด ์‘๋‹ต ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ปค์Šคํ…€ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

์ฐธ๊ณ 

๋คผํŠผ

 

728x90