Study

[Spring MVC] ์„œ๋น„์Šค ๊ณ„์ธต

jeonniu 2023. 6. 24. 01:36

๐Ÿƒ ์„œ๋น„์Šค ๊ณ„์ธต 

API ๊ณ„์ธต์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์งˆ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต

 

 

 

๋ชฉํ‘œ

์Šคํ”„๋ง์˜ DI(Dependency Injection)๋ฅผ ์ด์šฉํ•˜์—ฌ API ๊ณ„์ธต๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์„ ์—ฐ๋™ํ•˜๊ณ ,

API ๊ณ„์ธต์—์„œ ์ „๋‹ฌ๋ฐ›์€ DTO ๊ฐ์ฒด๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์˜ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ(Entity) ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ „๋‹ฌํ•ด๋ณด์ž.

 

 

 

"API ๊ณ„์ธต๊ณผ ์„œ๋น„์Šค ๊ณ„์ธต์„ ์—ฐ๋™ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ?"

API ๊ณ„์ธต์—์„œ ๊ตฌํ˜„ํ•œ Controller ํด๋ž˜์Šค๊ฐ€ ์„œ๋น„์Šค ๊ณ„์ธต์˜ Service ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

 

 

๐Ÿƒ Service์˜ ์˜๋ฏธ

- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ด€์ ์œผ๋กœ ๋ณด๋ฉด ๋„๋ฉ”์ธ ์—…๋ฌด ์˜์—ญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค.

- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋น„์Šค ๊ณ„์ธต์€ ๋Œ€๋ถ€๋ถ„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

- ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ๋นˆ์•ฝํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ/ํ’๋ถ€ํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋กœ ๊ตฌ๋ถ„, DDD(๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„, Domain Driven Design)์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค.

 

 

 

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” Service ํด๋ž˜์Šค

 

โœ… MemberController ํด๋ž˜์Šค ์‚ดํŽด๋ณด๊ธฐ

@RestController
@RequestMapping("/v1/members")
@Validated
public class MemberController {
    @PostMapping
    public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberDto) {
        return new ResponseEntity<>(memberDto, HttpStatus.CREATED);
    }

    @PatchMapping("/{member-id}")
    public ResponseEntity patchMember(
            @PathVariable("member-id") @Positive long memberId,
            @Valid @RequestBody MemberPatchDto memberPatchDto) {
        memberPatchDto.setMemberId(memberId);

        // No need Business logic

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

    @GetMapping("/{member-id}")
    public ResponseEntity getMember(
            @PathVariable("member-id") @Positive long memberId) {
        System.out.println("# memberId: " + memberId);

        // not implementation
        return new ResponseEntity<>(HttpStatus.OK);
    }

    @GetMapping
    public ResponseEntity getMembers() {
        System.out.println("# get Members");

        // not implementation

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

    @DeleteMapping("/{member-id}")
    public ResponseEntity deleteMember(
            @PathVariable("member-id") @Positive long memberId) {
        System.out.println("# memberId: " + memberId);
        // No need business logic

        return new ResponseEntity(HttpStatus.NO_CONTENT);
    }
}

 

์—ฌ๊ธฐ์„œ ๋‹ค์„ฏ ๊ฐœ์˜ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฝ‘์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

  • postMember() : 1๋ช…์˜ ํšŒ์› ๋“ฑ๋ก์„ ์œ„ํ•œ ์š”์ฒญ์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. <->  createMember()
  • patchMember() : 1๋ช…์˜ ํšŒ์› ์ˆ˜์ •์„ ์œ„ํ•œ ์š”์ฒญ์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. <-> updateMember()
  • getMember() : 1๋ช…์˜ ํšŒ์› ์ •๋ณด ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์š”์ฒญ์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. <-> findMember()
  • getMembers() : N๋ช…์˜ ํšŒ์› ์ •๋ณด ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์š”์ฒญ์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. <-> findMembers()
  • deleteMember() : 1๋ช…์˜ ํšŒ์› ์ •๋ณด ์‚ญ์ œ๋ฅผ ์œ„ํ•œ ์š”์ฒญ์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. <-> deleteMember()

 

 

 

 

โœ… MemberService ๊ธฐ๋ณธ ๊ตฌ์กฐ

public class MemberService {
    public Member createMember(Member member) {
        // TODO should business logic

        // TODO member ๊ฐ์ฒด๋Š” ๋‚˜์ค‘์— DB์— ์ €์žฅ ํ›„, ๋˜๋Œ๋ ค ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ ํ•„์š”.
        Member createdMember = member;
        return createdMember;
    }

    public Member updateMember(Member member) {
        // TODO should business logic

        // member ๊ฐ์ฒด๋Š” ๋‚˜์ค‘์— DB์— ์—…๋ฐ์ดํŠธ ํ›„, ๋˜๋Œ๋ ค ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ ํ•„์š”.
        Member updatedMember = member;
        return updatedMember;
    }

    public Member findMember(long memberId) {
        // TODO should business logic

        // TODO member ๊ฐ์ฒด๋Š” ๋‚˜์ค‘์— DB์—์„œ ์กฐํšŒ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ ํ•„์š”.
        Member member = 
                new Member(memberId, "hgd@gmail.com", "ํ™๊ธธ๋™", "010-1234-5678");
        return member;
    }

    public List<Member> findMembers() {
        // TODO should business logic

        // TODO member ๊ฐ์ฒด๋Š” ๋‚˜์ค‘์— DB์—์„œ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ ํ•„์š”.
        List<Member> members = List.of(
                new Member(1, "hgd@gmail.com", "ํ™๊ธธ๋™", "010-1234-5678"),
                new Member(2, "lml@gmail.com", "์ด๋ชฝ๋ฃก", "010-1111-2222")
        );
        return members;
    }

    public void deleteMember(long memberId) {
        // TODO should business logic
    }
}

 

  • createMember(), updateMember():  ๋‹จ์ˆœํžˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ Member ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋‹ค.
  • findMember(), findMembers(): Stub ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

 

๐Ÿคท‍โ™€๏ธ Stub ๋ฐ์ดํ„ฐ๋ž€?

- ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€๋ฒผ์šด ๋ฐ์ดํ„ฐ๋กœ, ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ์‹ค์ œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š์Œ

- ์ฃผ๋กœ ๊ฐœ๋ฐœ ์ดˆ๊ธฐ๋‹จ๊ณ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

 

 

โœ… Member ํด๋ž˜์Šค

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    private long memberId;
    private String email;
    private String name;
    private String phone;
}

 

  • @AllArgsConstructor: ํ˜„์žฌ Member ํด๋ž˜์Šค์— ์ถ”๊ฐ€๋œ ๋ชจ๋“  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ–๋Š” Member ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.
  • @NoArgsConstructor: ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.

 

 

DI(Dependency Injecion) ์—†์ด ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต๊ณผ API ๊ณ„์ธต ์—ฐ๋™

@RestController
@RequestMapping("/v2/members")
@Validated
public class MemberController {
    private final MemberService memberService;

    public MemberController() {
        this.memberService = new MemberService(); // (1)
    }

    @PostMapping
    public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberDto) {
        // (2)
        Member member = new Member();
        member.setEmail(memberDto.getEmail());
        member.setName(memberDto.getName());
        member.setPhone(memberDto.getPhone());

        // (3)
        Member response = memberService.createMember(member);

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

    @PatchMapping("/{member-id}")
    public ResponseEntity patchMember(
            @PathVariable("member-id") @Positive long memberId,
            @Valid @RequestBody MemberPatchDto memberPatchDto) {
        memberPatchDto.setMemberId(memberId);

        // (4)
        Member member = new Member();
        member.setMemberId(memberPatchDto.getMemberId());
        member.setName(memberPatchDto.getName());
        member.setPhone(memberPatchDto.getPhone());

        // (5)
        Member response = memberService.updateMember(member);

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

    @GetMapping("/{member-id}")
    public ResponseEntity getMember(
            @PathVariable("member-id") @Positive long memberId) {
        // (6)
        Member response = memberService.findMember(memberId);
        return new ResponseEntity<>(response, HttpStatus.OK);
    }

    @GetMapping
    public ResponseEntity getMembers() {
        // (7)
        List<Member> response = memberService.findMembers();
        return new ResponseEntity<>(response, HttpStatus.OK);
    }

    @DeleteMapping("/{member-id}")
    public ResponseEntity deleteMember(
            @PathVariable("member-id") @Positive long memberId) {
        System.out.println("# delete member");

        // (8)
        memberService.deleteMember(memberId);

        return new ResponseEntity(HttpStatus.NO_CONTENT);
    }
}

 

(1) MemberService ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด new ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ MemberService ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

(2) ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ DTO ํด๋ž˜์Šค์˜ ์ •๋ณด => MemberService์˜ createMember() ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ

- MemberPostDto ํด๋ž˜์Šค์˜ ์ •๋ณด => Member ํด๋ž˜์Šค์— ์ฑ„์›Œ ๋„ฃ์Œ

 

โญ ์„œ๋น„์Šค ๊ณ„์ธต๊ณผ์˜ ์—ฐ๊ฒฐ ์ง€์ 
(3) ํšŒ์› ์ •๋ณด ๋“ฑ๋ก์„ ์œ„ํ•ด MemberService ํด๋ž˜์Šค์˜ createMember() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

(4) ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ DTO ํด๋ž˜์Šค์˜ ์ •๋ณด => MemberService์˜ updateMember() ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ

- MemberPatchDto ํด๋ž˜์Šค์˜ ์ •๋ณด => Member ํด๋ž˜์Šค์— ์ฑ„์›Œ ๋„ฃ์Œ

 

โญ ์„œ๋น„์Šค ๊ณ„์ธต๊ณผ์˜ ์—ฐ๊ฒฐ ์ง€์ 
(5) ํšŒ์› ์ •๋ณด ์ˆ˜์ •์„ ์œ„ํ•ด MemberService ํด๋ž˜์Šค์˜ updateMember() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

 

โญ ์„œ๋น„์Šค ๊ณ„์ธต๊ณผ์˜ ์—ฐ๊ฒฐ ์ง€์ 
(6) ํ•œ ๋ช…์˜ ํšŒ์› ์ •๋ณด ์กฐํšŒ๋ฅผ ์œ„ํ•ด MemberService ํด๋ž˜์Šค์˜ findMember() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

- ํŠน์ • ํšŒ์›์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ์ค€์ธ memberId๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์คŒ

(7) ๋ชจ๋“  ํšŒ์›์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด MemberService ํด๋ž˜์Šค์˜ findMembers() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

 

(8) ํ•œ ๋ช…์˜ ํšŒ์› ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด MemberService ํด๋ž˜์Šค์˜ deleteMember() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

- ํŠน์ • ํšŒ์›์˜ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ธฐ์ค€์ธ memberId๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์คŒ

 

 

 

ํด๋ž˜์Šค ๊ฐ„์˜  ๋А์Šจํ•œ ๊ฒฐํ•ฉ(Loose Couping)์„ ์œ„ํ•ด Spring์˜ DI๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

 

 

 

 

โœ… DI ์ ์šฉํ•œ MemberController ํด๋ž˜์Šค

@RestController
@RequestMapping("/v3/members")
@Validated
public class MemberController {
    private final MemberService memberService;

		// (1) MemberController์˜ ๋ณ€๊ฒฝ ํฌ์ธํŠธ
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
		
		...
		...
}

 

๐Ÿคท‍โ™€๏ธ MemberService ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ, ๋ˆ„๊ฐ€ ์ฃผ์ž…ํ–ˆ๋‚˜? 

 

์–ด๋–ป๊ฒŒ ?   MemberController์˜ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ MemberService์˜ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž… ๋ฐ›์•˜๋‹ค.

๋ˆ„๊ฐ€?    Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋“œ ์‹œ, ApplicationContext์˜ MemberService ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜์˜€๋‹ค.

 

 

 

 

 

โœ… Spring Bean์ด ๋˜๊ธฐ ์œ„ํ•ด @Service ์• ๋„ˆํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ MemberService 

@Service
public class MemberService {
		// ๋‚ด๋ถ€ ์ฝ”๋“œ๋Š” [์ฝ”๋“œ 3-45]์™€ ๋™์ผ.
    ...
		...
}

 

 

 

๐Ÿ’ฌ ์œ„์˜ ์ฝ”๋“œ์—์„œ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ์ 

1. MemberController์˜ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ DTO ํด๋ž˜์Šค๋ฅผ ์—”ํ‹ฐํ‹ฐ(Entity) ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…๊นŒ์ง€ ๋„๋งก์•„ ํ•˜๊ณ  ์žˆ์Œ

2. ์—”ํ‹ฐํ‹ฐ(Entity) ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ์˜ ์‘๋‹ต์œผ๋กœ ์ „์†กํ•จ์œผ๋กœ์จ ๊ณ„์ธต ๊ฐ„์˜ ์—ญํ•  ๋ถ„๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Œ

 

 

 

๐Ÿ“ฃ ํ•ด๊ฒฐ์ฑ…์€?

1. DTO ํด๋ž˜์Šค๋ฅผ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜์ง€ ์•Š๊ณ  => ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„ธ ๋ณ€ํ™˜ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•œ๋‹ค.

2. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ DTO ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ๋‹ค์‹œ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

 

 

 ๋งคํผ(Mapper)๋ฅผ ์ด์šฉํ•œ DTO ํด๋ž˜์Šค <-> ์—”ํ‹ฐํ‹ฐ(Entity) ํด๋ž˜์Šค ๋งคํ•‘

@Component  // (1)
public class MemberMapper {
		// (2) MemberPostDto๋ฅผ Member๋กœ ๋ณ€ํ™˜
    public Member memberPostDtoToMember(MemberPostDto memberPostDto) {
        return new Member(0L,
                memberPostDto.getEmail(), 
                memberPostDto.getName(), 
                memberPostDto.getPhone());
    }

		// (3) MemberPatchDto๋ฅผ Member๋กœ ๋ณ€ํ™˜
    public Member memberPatchDtoToMember(MemberPatchDto memberPatchDto) {
        return new Member(memberPatchDto.getMemberId(),
                null, 
                memberPatchDto.getName(), 
                memberPatchDto.getPhone());
    }

    // (4) Member๋ฅผ MemberResponseDto๋กœ ๋ณ€ํ™˜
    public MemberResponseDto memberToMemberResponseDto(Member member) {
        return new MemberResponseDto(member.getMemberId(),
                member.getEmail(), 
                member.getName(), 
                member.getPhone());
    }
}

 

โœ… ๋งคํผ(Mapper) ํด๋ž˜์Šค๊ฐ€ ํ•˜๋Š” ์ผ

- DTO ํด๋ž˜์Šค์™€ ์—”ํ‹ฐํ‹ฐ(Entity) ํด๋ž˜์Šค๋ฅผ ์„œ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค

 

โœ… MemberMapper ์ฝ”๋“œ ์„ค๋ช…

(1) MemberMapper๋ฅผ Spring์˜ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด  @Component ์• ๋„ˆํ…Œ์ด์…˜ ์ถ”๊ฐ€

=> ๋“ฑ๋ก๋œ Bean์€ MemberController์—์„œ ์‚ฌ์šฉ

(2) MemberPostDto ํด๋ž˜์Šค => Member ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜

(3) MemberPatchDto ํด๋ž˜์Šค => Member ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜

(4) Member ํด๋ž˜์Šค => MemberResponseDto ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜