본 포스팅은
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의를 듣고 정리한 내용입니다.
문제점
@NotEmpty
등등)결론 - 엔티티 대신에 DTO를 RequestBody에 매핑
API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 받는다.
실무에서는 절대 엔티티를 API 스펙에 노출하면 안된다!
참고
문제점
@JsonIgnore
, 별도의 뷰 로직 등등)Result<T>
클래스 생성으로 해결)결론
예시
@GetMapping("/api/v2/members")
public Result membersV2() {
List<Member> findMembers = memberService.findMembers();
// 엔티티 -> DTO 변환
List<MemberDto> collect = findMembers.stream()
.map(m -> new MemberDto(m.getName()))
.collect(Collectors.toList());
return new Result(collect);
}
@Data
@AllArgsConstructor
static class Result<T> {
private T data;
}
@Data
@AllArgsConstructor
static class MemberDto {
private String name;
}
@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());
}
public class MemberService {
private final MemberRepository memberRepository;
@Transactional
public void update(Long id, String name) {
Member member = memberRepository.findOne(id);
member.setName(name);
}
}
update 메소드에서 엔티티를 반환해도 되지만, 변경 메소드에서 엔티티를 반환하면 조회하는 것이나 마찬가지다.
-> 개발 스타일에 따라 다르겠지만, 유지보수성 증대를 위해 커맨드와 쿼리를 분리하도록 한다.