본문 바로가기

전체 글

(35)
xToOne 관계 조회 API 성능 최적화 추가, 수정 API 보다도 조회 API가 성능에 가장 민감한 만큼 JPA를 사용할 때 조회 API의 성능을 최적화하는 방법을 단계별로 정리하려 합니다. 주문과 배송정보 그리고 회원을 조회하는 API를 만들고 지연 로딩에 의해 발생하는 성능 문제를 해결해보려 합니다. 이번 글에서는 ManyToOne, OneToOne 과 같은 xToOne 관계를 조회하는 경우를 살펴보겠습니다. 아래 그림과 같이 주문, 배송정보, 회원은 모두 엔티티로 존재하고 주문과 회원이 다대일 양방향 연관관계 그리고 주문과 배송정보가 일대일 양방향 연관관계로 되어 있습니다. 주문 조회 V1: 엔티티를 직접 노출@RestController@RequiredArgsConstructorpublic class OrderSimpleApiContro..
자동 컴포넌트 스캔 vs 수동 컴포넌트 스캔 자동 컴포넌트 스캔과 수동 컴포넌트 스캔 모두 스프링 빈을 등록하고 의존관계를 주입할 때 사용됩니다. 자동 컴포넌트 스캔은 @ComponentScan, @Component, @Autowired 애노테이션을 사용하고수동 컴포넌트 스캔은 @Bean 애노테이션을 사용해 스프링 빈을 등록하고 의존관계를 주입합니다. 자동 컴포넌트 스캔 vs 수동 컴포넌트 스캔두 방법은 서로 다른 장점을 가집니다. 먼저 자동 컴포넌트 스캔은 추가적인 AppConfig 성격의 설정 자바 클래스가 필요하지 않습니다. @Configuration 설정 정보에서 @Bean을 적고, 객체를 생성하고, 주입할 대상을 일일이 적어주는 번거로운 과정이 필요 없습니다. 하지만 수동 컴포넌트 스캔과 달리 의존관계를 특정 클래스에서 설정하는 것이 아니..
유연함을 위해 Custom Result 타입을 사용하자 API 스펙 변경에 유연하게 대응해야 합니다.컬렉션 그 자체로 반환하지 말고 커스텀 타입으로 한 번 감싸서 반환합시다. 아래 코드로 살펴봅시다. @GetMapping()public ResponseEntity> getAllRooms() { List rooms = roomService.getAllRooms(); List collect = rooms.stream() .filter(m -> !m.isDeleted()) .map(m-> RoomResponseDTO.from(m)) .toList(); return ResponseEntity.ok().body(collect);} 엔티티 자체를 API Response에 노출하지 않고, Room ..