회원 조회 API
@RestController
@RequiredArgsConstructor
public class MemberApiController {
    private final MemberService memberService;
    @GetMapping("/api/v1/members")
    public List<Member> membersV1() {
        return memberService.findMembers();
    }
}- Entity를 그대로 반환하면 Entity 내용이 외부에 다 노출된다. 
- 화면에 뿌리기 위한 프레젠테이션 로직이 Entity에 추가되면 안된다. 
- 특정 필드에 - @JsonIgnore를 넣을 수도 있지만 다양한 api가 Entity를 사용하기 때문에 사용하면 안된다.
- Entity가 변경되면 API 스펙이 바뀌어버린다. 
Entity 외부 노출
- Entity 대신에 API 스펙에 맞는 별도의 DTO를 노출해야 한다. - 어떤 API는 name 필드가 필요하지만, 어떤 API는 name 필드가 필요 없을 수 있다. 
 
@RestController
@RequiredArgsConstructor
public class MemberApiController {
    private final MemberService memberService;
    @GetMapping("/api/v2/members")
    public Result memberV2() {
        List<Member> members = memberService.findMembers();
        List<MemberDto> collect = members.stream()
                .map(member -> new MemberDto(member.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;
    }
}- 내가 노출할 데이터만 별도의 DTO로 만든다. 
- Result로 한 번 감싸줘서 향후 필요한 필드를 추가할 수 있게 한다. - 감싸주지 않으면 바로 json 배열 타입으로 나가면서 수정에 대한 유연성이 떨어진다. 
 
@Data
@AllArgsConstructor
static class Result<T> {
    private T data;
    private Integer count;
}- 수정 사항이 생기면 이렇게 추가할 수 있다. 
Last updated
Was this helpful?