회원등록
API를 만들때 controller에서 entity를 파라미터로 받아서 사용하지 말자.
entity는 굉장히 여기저기서 사용되므로 이름이 바뀌거나 하기 쉽다.
근데 이때 이름이 바뀌면 API 스펙이 바뀌므로 API가 작동이 안될수 있다.
따라서 API 를 개발할 때는 controller 에서 DTO를 사용하자!
@RestController // Controller + ResponseBody -> 데이터를 바로 json이나 xml로 보내자!
@RequiredArgsConstructor
public class MemberApiController {
private final MemberService memberService;
@PostMapping("/api/v1/members")
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
// entity가 바뀌어도 어차피 코드 자체에서 실행 전 에러를 뿌려주기 때문에 수정만 해주면 api 스펙이 바뀌지 않음
// 유지보수 할때 큰 장점 CreateMemberRequest만 보면 어떤 데이터를 받는지도 알수 있다.
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV2 (@RequestBody @Valid CreateMemberRequest request){
Member member = new Member();
member.setName(request.getName());
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@Data
static class CreateMemberRequest{
@NotEmpty
private String name;
}
@Data
static class CreateMemberResponse {
private Long id;
public CreateMemberResponse(Long id) {
this.id = id;
}
}
}
위에 v1은 entity를 사용하여 회원가입을 진행한다. v2 보다 코드는 간략하지만 entity에서 수정이 일어나면 실행 전에 에러를 받을 수 없기 때문에 실무에서 장애가 터지기 쉽상이다.
따라서 v2 처럼 class만드는게 귀찮아도
DTO class(CreateMemberRequest class) 만들어 주고 사용하는게 코드상으론 좀 더 복잡해 보여도 더 안전하다.
회원수정
// 무언가 수정할때는 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());
}
회원조회
@GetMapping("/api/v1/members")
public List<Member> membersV1(){
return memberService.findMembers();
}
@GetMapping("/api/v2/members")
public Result membersV2(){
List<Member> findMembers = memberService.findMembers();
List<MemberDto> collect = findMembers.stream()
.map(m -> new MemberDto(m.getName()))
.collect(Collectors.toList());
return new Result(collect);
}
위에 v1 처럼 회원을 조회 하면 entity를 바로 받아오기 때문에 entity를 수정 했을 시 장애를 일으키기 쉽다.
따라서 v2 처럼 Dto를 이용하여서 api 응답 값으로 전달해줘야 api 스펙을 수정 하지 않아도 된다.
위에 코드 실행 시 아래와 같은 결과값이 나온다.
이때 클라이언트가 count 값을 추가해 달라고 한다면??
Result에 추가해주고 return new Result(collect.size(), collect) 로 수정해 주기만 하면 된다.
다음엔 API 개발의 고급 단계를 공부해보겠다.
'JAVA' 카테고리의 다른 글
[JAVA] API 구현 시 테스트 개발 (0) | 2022.06.02 |
---|---|
[JAVA] 지연로딩과 조회 성능 최적화 (0) | 2022.05.19 |
[JAVA] boolean @Getter (0) | 2022.03.24 |
[TEST] Memory DB 사용 (0) | 2022.03.16 |
[JAVA] 결과조회(fetch) (0) | 2022.03.14 |