본문 바로가기

Spring16

외부 API 호출 비동기적으로 처리하기 (WebClient, WebFlux에 대한 개 문제 상황 프로젝트에서 다수의 외부 API(데이터 파이프라인 시스템)에 순차적으로 데이터셋 아이디를 넘기고, 반환되는 결과값(전송ID와 데이터셋ID)을 DB에 적재하는 로직이 있었다 Rest template을 통해서 다수의 외부 API에 요청 후, 응답을 받으면 결과값 DB적재 그외 부차적인 DB 레코드 update 데이터 파이프라인 서비스의 데이터 처리가 느려서 외부 API의 응답이 느린경우, 클라이언트는 Timeout까지 대기 해결방법 WebClient를 사용한 비동기 / Non-Blocking 외부 API request API로 들어온 요청은 외부 API request를 다른 쓰레드에서 처리 → Non-blocking으로 클라이언트에 200 응답 비동기로 응답받은 후, DB 업데이트 → 해당 데이터.. 2024. 2. 18.
[JPA] OSIV (Open Session In View)를 사용하여 JPA 성능 최적화 JPA에서의 Entity manager == Hibernate에서의 Session 즉, 사실상 JPA에서는 Open Entity Manager In View라고 생각하면 된다 JPA가 언제 DB Connection을 얻는가? DB Transaction을 시작할 때 JPA persistence context가 connection 가져온다 JPA가 언제 DB Connection을 돌려주는가? open-session-in-view가 켜져있는 경우 Service @Transactional 걸린 메소드를 벗어나도, client에게 값이 반환될 때까지 돌려주지 않는다 view template의 경우 html과 data 모두 랜더링 후 API의 경우 json으로 값이 client에게 tansfer된 후 지연 로딩 때.. 2022. 3. 11.
[JPA] Entity가 아닌 DTO로 DB에서 data 가져오기 n:1 관계에 있는 entity의 요소 DTO로 가져오기 JPQL 일반 join을 통해 DTO 객체를 생성해주면서 가져온다 order Repository public List findAllByDto(){ List em.createQuery("select new app.repository.order.dto.OrderDto(o.id, o.order_date, o.status, u.name, u.email)" + " from Order o" + " join o.user u", OrderDto.class).getResultList(); } 처음에 왜 fetch join을 쓰지 않고도 DTO로 가져올 때는 지연로딩 없이 가져올 수 있을까? 에 대해 생각했었는데 JPQL 안에 new 생성자를 통해 하나씩 값을 찍어.. 2022. 3. 10.
[JPA] 1:N / N:1 상황에서의 N+1 문제 해결 (Fetch Join ~ 지연로딩/Batch Size) DB의 테이블이 아래와 같은 관계를 가지고 있는 경우 N+1 문제 고려하지 않은 코드 ( DB n:1의 관계 ) data 가정 Order가 2개 존재 각각의 order와 연결된 member는 모두 다른 사람 모든 entity fetchType 은 LAZY -> 지연 로딩 controller @GetMapping("/orders") public List getOrder(){ List result = orderRepository.findAll().stream().map(OrderDto::new).collect(toList()); return result } @Data @RequiredArgsConstructor static class OrderDto{ private Long orderId; private S.. 2022. 3. 9.