-
Controller APIProject/Blog Project 2022. 9. 10. 22:56
한 눈에 알아보고 읽을 수 있어야 한다.
@RestController @RequiredArgsConstructor @RequestMapping("/api/v1/members") public class MemberController { private final MemberService memberService; // create @PostMapping public ResponseEntity<JoinResponseDto> join(@Valid @RequestBody JoinRequestDto dto) { . . . return ResponseEntity.status(HttpStatus.CREATED).body( . . . ); // http api status 201 } // read @GetMapping("/{memberId}") public ResponseEntity<MemberResponseDto> getMember(@Valid @PathVariable Long memberId) { . . . return ResponseEntity.ok().body( . . . ); // http api status 200 } // update @PatchMapping public ResponseEntity<Void> edit(@Valid @RequestBody MemberUpdateRequestDto dto) { . . . return ResponseEntity.ok().build(); // http api status 200 } // delete @DeleteMapping("/{memberId}") public ResponseEntity<Void> delete(@Valid @PathVariable Long memberId) { . . . return ResponseEntity.noContent().build(); // http api status 204 } // findAll @GetMapping public ResponseEntity<Page<MemberResponseDto>> getMembers( . . . ) { . . . return ResponseEntity.ok().body( . . . ); // http api status 200 } }
API 순서대로 읽었을 때 의미가 직관적이어야 한다.
@RequestMapping("/api/v1/members")
@GetMapping
: /api/v1/members 요청명에 따라 매핑(Get)하는 작업을 한다.
@PostMapping
: 생성(Post)하는 작업을 한다.
@PatchMapping
: 수정(Patch)하는 작업을 한다.
@DeleteMapping
: 삭제(Delete)하는 작업을 한다.메소드명 역시 무슨 기능을 담고 있는 지 한 번에 파악할 수 있어야 한다.
join : member create (가입)
edit : member update (정보 수정)
delete : member delete (탈퇴)
getMember : member read (특정 회원 조회)
getMembers : member all read (모든 회원 조회)Controller 에서 return 받을 때에는 http api status 를 따라야 한다.
create : http api status 201
ResponseEntity.status(HttpStatus.CREATED).body( . . . );
read : http api status 200
ResponseEntity.ok().body( . . . );
update : http api status 200
ResponseEntity.ok().build();
delete : http api status 204 (데이터를 삭제하고 나면 보여줄 것이 없기 때문)
ResponseEntity.noContent().build();
findAll : http api status 200
ResponseEntity.ok().body( . . . );또한, Entity 객체 자체를 return 하지 않도록 하자.
보안 문제가 생길 수 있으므로 중요한 정보를 제외한 ResponseDto 객체를 만들어서 넘겨주어야 한다.
그리고 타입 안정성을 위해 ResponseEntity<ResponseDto> 제네릭을 꼭 사용해주자.
넘겨 받을 게 없을 시엔, Void 로 해주어도 된다.
// create @PostMapping public ResponseEntity<JoinResponseDto> join(@Valid @RequestBody JoinRequestDto dto) { ... } // read @GetMapping("/{memberId}") public ResponseEntity<MemberResponseDto> getMember(@Valid @PathVariable Long memberId) { ... } // update @PatchMapping public ResponseEntity<Void> edit(@Valid @RequestBody MemberUpdateRequestDto dto) { ... } // delete @DeleteMapping("/{memberId}") public ResponseEntity<Void> delete(@Valid @PathVariable Long memberId) { ... } // findAll @GetMapping public ResponseEntity<Page<MemberResponseDto>> getMembers( . . . ) { ... }