๐Ÿ”™๋’ค๋กœ๊ฐ€๊ธฐ

MemberApiController์— PUT ๋งคํ•‘ ์ถ”

@PutMapping("/api/v2/members/{id}")
public UpdateMemberResponse updateMemberV2(
        @PathVariable("id") Long id,
        @RequestBody @Valid UpdateMemberRequest request) {

    memberService.update(id, request.getName());
    Member findMember = memberService.findOne(id);
    return new UpdateMemberResponse(findMember.getId(), findMember.getName());

}

@Data
@AllArgsConstructor
static class UpdateMemberResponse {
    private Long id;
    private String name;
}

@Data
static class UpdateMemberRequest {
    private String name;
}

ํšŒ์› ์ˆ˜์ •๋„ DTO๋ฅผ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ œํ•œ์‹œ์ผฐ๋‹ค.

MemberService์— update ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

@Transactional
public void update(Long id, String name) {
    Member member = memberRepository.findOne(id);
    member.setName(name);
}

findOne()๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด member๊ฐ์ฒด๋ฅผ ์˜์†ํ™”ํ•œ ์ฑ„๋กœ ๋ถˆ๋Ÿฌ์˜จ ํ›„ setter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ˆ˜์ •๋œ๋‹ค.

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

@Data
@AllArgsConstructor
private class UpdateMemberResponse {
// ^ ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ private์œผ๋กœ ํ•จ
    private Long id;
    private String name;
}

@Data
private class UpdateMemberRequest {
// ^ ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ private์œผ๋กœ ํ•จ
    private String name;
}

๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ •์ (static)์ด์–ด์•ผ ํ•œ๋‹ค. @PutMapping("/api/v2/members/{id}") ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” updateMemberV2 ๋ฉ”์„œ๋“œ์—์„œ **UpdateMemberRequest**์™€ **UpdateMemberResponse**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๋‚ด๋ถ€ ํด๋ž˜์Šค๋“ค์— private ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

static์ด์–ด์•ผ ํ•˜๋Š” ์ด์œ 

  1. ์„ฑ๋Šฅ์— ์œ ๋ฆฌ ๋ฐ์•„ํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ, ์ธ์Šคํ„ด์Šคํ™”ํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ํ•„์š”๋„ ๋”ฑํžˆ ์—†๋‹ค. ์ •์  ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ํšจ์œจ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  2. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ดํ™” ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.
  3. ๊ตฌ์กฐ์  ๋ช…ํ™•์„ฑ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์™ธ๋ถ€/๋‚ด๋ถ€์˜ ์—ฐ๊ฒฐ์ด ์•ฝํ•ด์ง„๋‹ค. ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

<aside> โš ๏ธ ๋ณธ ์˜ˆ์ œ์—์„œ๋Š” ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋ฉฐ PUT๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, PUT์€ ์ „์ฒด ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค. ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ์—๋Š” PATCH๋‚˜ POST๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด RESTfulํ•œ ๋ฐฉ์‹์ด๋‹ค.

</aside>