Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 격파르타합격후기
- 프로그래머스
- java map 출력
- 노베이스부트캠프
- 코딩부트캠프후기
- java list 출력
- 인터프린터언어
- sqld자격증합격
- java set 저장
- 항해15기
- java map 저장
- java알고리즘
- java최솟값구하기
- 격파르타후기
- java list 저장
- java알고리즘문제풀이
- java참조자료형
- 격파르타장점
- java기본자료형
- java set 출력
- 프로그래머스제일작은수
- javaJRE
- java 자료구조 활용
- 격파르타비전공자
- javaJVM
- java map
- 비전공자sqld
- 컴파일
- 항해99후기
- 작은수제거하기
Archives
- Today
- Total
코딩과 결혼합니다
[JPA] API 설계 시 주의할 점(DTO 사용하기) 본문
728x90
엔티티를 외부에 노출하거나 파라미터로 그대로 받는 것 ❌
@PostMapping("/api/v1/members")
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) {
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
엔티티를 파라미터로 받게 되면 딱 봤을 때 간단하긴 하다.
하지만 이대로 사용하면 문제가 생기는데
- API 스펙 문서를 까보지 않으면 엔티티에서 어느 값이 파라미터로 넘어오는지 모른다.
- 엔티티의 내용이 변경되면 ( 엔티티명 변경, 필드 추가 및 삭제 등) API 스펙 자체가 변경되는 문제가 발생할 수 있다.
- 필요로 하는 정보 외에도 엔티티에 있는 정보들이 모두 외부에 노출이 됨.
- 클라이언트의 다양한 API 스타일 요구에 대응할 수 없다.
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
@NotEmpty
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
이렇게 Entity에 name의 값을 필수로 받도록 설정을 해놓았는데, 어떤 API 스펙에서는 name을 null 값으로 받아도 되는 경우가 생길 수도 있다.
@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);
}
v1 보다는 코드가 조금 더 복잡하나, Entity를 직접적으로 받지 않고 새로운 클래스를 만들어 파라미터로 받는다.
이럴 때에는 멤버 객체를 생성하고 setName을 해줄 때에, name의 필드명이 userName으로 바뀌었다고 해도 컴파일 오류를 통해 바로 잡을 수 있다. API는 전혀 영향을 받지 않는다.
@Data
static class CreateMemberRequest {
@NotEmpty
private String name;
}
다음으로 어느 값이 파라미터로 넘어오게 되는지를 명확히 알 수 있다.
여기에 validation을 추가해 주면 API 스펙마다 fit 하게 맞출 수 있어 유지보수할 때에도 큰 장점이 된다.
'2세 > JPA' 카테고리의 다른 글
[JPA] 지연 로딩과 조회 성능 최적화(2) (0) | 2024.02.20 |
---|---|
[JPA] 지연 로딩과 조회 성능 최적화(1) (0) | 2024.02.19 |
[JPA] 아키텍처 패턴(+ 디자인 패턴) (0) | 2024.02.15 |
[JPA] 상속관계 매핑 - 테이블 전략 (0) | 2024.02.14 |
[JPA] 엔티티 설계시 주의점 (0) | 2024.02.13 |