1. API 개발 기본
🥨 @RestController: responsebody + controller 어노테이션 합쳐놓은 것
🥨 @Requestbody: json으로 받아온 것을 매개변수로 자동으로 바꿔줌
🥨 엔티티와 api 스펙이 동일해서 api 스펙이 바뀌도록 하면 안된다!
- dto를 만들거나 해야 함
- api 만들때 외부에 엔티티를 노출해서도 안된다!
- 되도록 api 스펙이 영향받지 않도록!
2. API 개발 고급 - 준비
🍯 허니팁
- opt + cmd + m: 메소드 추출
- opt + cmd + p: 매개변수화
3. API 개발 고급 - 지연 로딩과 조회 성능 최적화
🥨 JsonIgnore
- 양방향 연결에서는 한 쪽을 jsonignore 어노테이션을 달아줘야 무한루프가 발생하지 않는다!
🥨 Lazy 로딩
- lazy로 연결되어 있을 때 proxy 객체가 생성됨(byteBuddy)
- 지연 로딩을 해결하기 위해 즉시 로딩으로 바꾸면 안됨! fetch join으로 해결해라!
🥨 API에는 엔티티를 직접 노출하지 말아라!
🥨 list로 반환하지 않고 result로 감싸라..?
- 이게 그거네! DTO 같은거네 나중에 list만이 아니라 다른 걸 같이 !
반환해야 할 수도 있는 것처럼, 반환 대상은 달라질 수 있으니까 반환값들을 멤버변수로 가진 객체를 만들어서 언제든 반환값들을 바꿀 수 있도록 하는거네. 올. 참 아주 많은 객체가 생기네.
🥨 jpa로 즉시 dto 가져올 수 있음
- 리포지터리 재사용성이 떨어짐
- 코드 상으론 페치 조인이 더 좋은데 성능은 요게 조금 더 나음
- 다만 성능 차가 웬만하면 그리 크지 않다 데이터가 아주 크지 않은 경우엔,,
- 쿼리검색용 클래스를 따로 뺴는 것이 좋다
🍯 허니팁
- 엔티티 -> DTO 변환 먼저 (v2)
- 필요하면 페치 조인으로 성능 최적화 -> 대부분의 성능 이슈가 해결 (v3)
- 그래도 안되면 DTO 직접 조회 (v4)
- 최후, JPA가 제공하는 네이티브 SQL이나 스프링 JDBC template을 사용해서 SQL을 직접 사용
오늘의 미결사항
- 지연 로딩 뭐였더라,, 왜 즉시 로딩을 하면 안되는 거였더라,,