Project/Blog Project
Controller API
haema_dev
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( . . . ) { ... }