JPA를 사용하면 엔티티라는 개념이 있기 떄문에 API를 개발할 때 주의해야할 부분들이 많다.
공통으로 예외처리를 하거나 할때 패키지나 구성 단위로 공통처리를 하는 경우가 많다 .
예외 처리의 경우 API같은 경우에는 에러 API 스팩을 반환하고
서버사이드 랜더링은 에러 페이지를 반환한다 .
위의 차이점들과 같이 API 와 서버사이드랜더링 사이에 차이점들이 있기 떄문에
API 컨트롤러와 서버사이드 랜더링 컨트롤러를 나눠 주는 것이 좋다
1. 엔티티를 직접 Dto의 역할로 쓰지 말자 .
엔티티를 요청 데이터를 바인딩 받는 용도로 사용하거나 , 응답 데이터를 반환하는 용도로 사용할 경우
엔티티의 수정이 생길 경우 API 스펙이 바뀌어 버린다.
또 엔티티는 여러 곳에서 함께 사용하기 떄문에 presentation 계층에 대한 검증 로직이 엔티티에 들어가 있으면 어떤 곳에서는 검증이 필요하고 어떤 곳은 검증이 필요하지 않을때 문제가 발생한다.
엔티티를 외부에 노출할 경우 DB에 대한 정보가 노출되는 것과 마찬가지이다.
* API 스펙을 위한 요청 , 응답 데이터를 담을 DTO를 만들어서 사용하는 것이 좋다.
2.기본적으로 API 스펙은 오브젝트로 감싸져 있어야 스펙 확장에 유연하다.
{
"requestBy":"member",
"data":[
{
"id":1
},
{
"id":2
},
{
"id":3
},
]
}
//오브젝트로 감싸있어야 스펙확장이 가능
3. 재사용을 위해 제네릭 클래스를 활용하자
2번에서 스팩 확장을 위해선 Object를 감싸야 한다고 했는데 Map<>을 사용해서 감쌀 수도있지만.
재사용을 위해선 자바 제네릭 클래스를 활용하는 것이 좋다 .
@Data
@AllArgsConstructor
static class Result<T>{
private T data;
}
Result 클래스는 제네릭타입의 data를 갖는 껍데기 클래스이다 .
@GetMapping("/api/v2/members")
public Result getMemberList2(){
List<Member> members = memberService.findMembers();
List<MemberDto> memberDtoList = members.stream()
.map(member -> new MemberDto(member.getName()))
.collect(Collectors.toList());
return new Result(memberDtoList);
}
Result 같은 API용 껍데기 클래스를 만들어 반환하면 Result에 원하는 필드를 추가하여 쉽게 API를 확장할 수 있다.
응답 데이터
{
"data":[
{
"name": "황경욱"
},
{
"name": "황선욱"
}
]
}
'JPA' 카테고리의 다른 글
API 개발을 위한 JPA 3 - 1:N N:N 관계 컬렉션 조회 최적화 (0) | 2021.06.12 |
---|---|
API 개발을 위한 JPA 2 - 1:1 ,N:1 성능 최적화 (0) | 2021.06.12 |
JPA 공부 20 - JPQL . 9 벌크 연산 (0) | 2021.06.08 |
JPA 공부 19 - JPQL . 8 Named 쿼리 (0) | 2021.06.08 |
JPA 공부 18 - JPQL . 7 페치조인 (0) | 2021.06.07 |