BackEnd(Java)(85)
-
옵저버 패턴
✅ 아래 내용들에 대해서 알아보자- 옵저버 패턴이란?- 코드를 보면서 옵저버 패턴을 이해해보자- 정리 옵저버 패턴 옵저버 패턴은 행위패턴 중 하나로써 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다. 예시로 신문을 구독하는 상황으로 신문사는 신문을 제공하는 주체(Subject) 사이고 구독자는 신문을 받는 옵저버(Observers)이다. 옵저버 패턴을 실제로 적용해 볼까요?옵저버를 구성하는 Observer 인터페이스와 주체를 구성하는 Subject 인터페이스가 구성이 됩니다.Subject에서 데이터가 변경되면 update 메서드를 호출하여 모든 Observer들에게 데이터를 일괄 전송하는 방식을 PUSH 방식이라고 합니다..
2024.09.23 -
slack webhook을 통한 운영 이슈 모니터링
서비스를 운영하다 보면 운영 이슈들을 실시간으로 확인할 필요가 있다. 사용하는 협업 툴과 연동하여 보통 알림을 받는데 나는 slack을 사용하고 있기 때문에 slack webhook을 사용하여 이슈 알림 모니터링을 해보자! 1. slack에 앱 추가를 클릭하여 incoming-webhooks를 추가한다. 2. 웹 훅을 추가 후 포스트할 채널은 선택한다. 3. 웹 훅 URL, 라벨 지정 등 옵션들을 설정 후 저장 하면 끝! 4. 테스트 curl 테스트 실제 코드에 적용해 보자! api 전송 부분은 POST로 통신하면 되고, payload를 만드는 메서드는 아래를 참고하면 좋을 것 같다.(c#) (참고로, slack webhook doc를 보면 보내고 싶은 메시지를 text 필드에 담아서 보내라고 한다.) ..
2023.07.25 -
조회 API 성능 최적화
✅ 아래 내용들에 대해서 알아보자 - 조회 API 성능 최적화 방법 - 최적화 VS 코드 복잡도 조회 API 성능 최적화 방법 1. 엔티티 조회 방식으로 우선 접근 패치조인으로 쿼리 수 최적화 컬렉션 최적화 -> 페이징 필요시 default_batch_fetch_size, @BatchSize로 최적화, 불필요시 패치조인 사용 2. 엔티티 조회 방식으로 해결 안 되면 DTO 조회 방식 사용 3. DTO 조회 방식으로 해결이 안 되면 Native SQL or 스프링 Jdbc Template or Mybatis 등.. 이 방식으로도 해결이 안 된다면 트래픽이 많은 경우이므로 캐싱 처리(redis, 로컬 캐시)등을 통해 해결해야 한다. 만약 캐싱 처리한다면 엔티티를 캐싱 처리하면 안 됨(라이플 사이클이 안 맞으..
2023.06.13 -
org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 에러 해결
현상 JQPL 사용 중 아래 쿼리처럼 작업했는데 "query specified join fetching...." 오류가 발생하였다. 원인 fetch join을 사용하는 이유는 엔티티 상태에서 엔티티 그래프 탐색을 하기 위해 사용하는 것인데, select 부분에 엔티티가 아닌 DTO가 있으므로 fetch join 사용이 불가능해진다! 해결법 따라서 DTO 매핑하여 반환하고 싶을때는 fetch join - join으로 변경하여 사용하도록 해야 한다. 참고자료 https://www.inflearn.com/questions/23847/queryprojection%EA%B3%BC-fetch-join
2023.06.13 -
컬렉션 패치 조인
✅ 아래 내용들에 대해서 알아보자 - 컬렉션 패치 조인 - 컬렉션 패치조인 문제점 - 컬렉션 패치조인 한계 - 컬렉션 패치조인 최적화 컬렉션 패치 조인 아래 코드를 보면 Order 엔티티와 OrderItem 엔티티가 N:1인 관계 OnetoMany로 구성되어 있고, Order와 orderItems를 join fetch로 컬렉션 패치 조인 하고 있는 것을 확인할 수 있다. public List findAllWithItem() { return em.createQuery("select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi", Order.class) ..
2023.06.12 -
OSIV
✅ 아래 내용들에 대해서 알아보자- OSIV- OSIV 설정에 따른 차이점 OSIVOpen Session In View(OSIV)는 Hibernate가 영속성 컨텍스트와 DB 트랜잭션의 생명 주기를 관리하는 전략이다. JPA에서 트랜잭션이 시작될떄 영속성 컨텍스트가 DBCP에 있는 커넥션을 얻어와서 DB와 연결을 한다.그리고 트랜잭션 종료 후 커넥션을 반환하여 DB와 연결을 종료하게 된다. (OSIV 옵션에 따라 다름) OSIV 옵션을 설정하는 방법은 아래와 같다. 기본값은 TRUE이다.spring.jpa.open-in-view=false OSIV 설정 안하면 다음과 같은 로그가 뜨게 된다.(기본값이 TRUE) OSIV ON OSIV를 on일 경우(spring.jpa.open-in-view=true)..
2023.06.11