Spring - N+1 (DB 성능 이슈)
·
❌ Error Handling
❌ Spring - N+1 (DB 성능 이슈) 원인 이 문제는 데이터베이스에서 정보를 조회할 때 발생합니다. 연관된 엔티티를 로딩할 때, 한 번의 쿼리로 충분한 데이터를 가져올 수 있음에도 불구하고 N번의 추가 쿼리를 실행하여 성능 저하를 일으키는 문제를 의미합니다. 주로 Eager Fetching 전략이나, Lazy Fetching을 사용하면서 적절한 최적화를 하지 않았을 때 발생합니다. 예시 Fetch 전략을 Eager(즉시 로딩)으로 한 경우 발생 Fetch 전략을 Lazy(지연 로딩)으로 한 경우, 객체 그래프 탐색 시 발생 예시 1의 경우 findAll()을 하면 JPQL구문이 생성되고 그 구문을 북석한 SQL이 생성 & 실행됨 DB의 결과를 받아 엔티티의 인스턴스를 생성 영속성 컨텍스트에 검색..
Spring - Lazy Initialization Exception
·
❌ Error Handling
❌ Spring - Lazy Initialization Exception 원인 Hibernate가 제공하는 Lazy Loading 전략을 사용할 때 발생할 수 있습니다. Lazy Loading은 연관된 엔티티를 실제로 사용하는 시점에 로딩하는 전략입니다. 그러나, 트랜잭션이 끝나고 세션이 닫힌 후에 Lazy Loading을 시도하면, Hibernate는 연관된 엔티티를 로딩할 수 없으므로 'Lazy Initialization Exception'을 발생시킵니다. Proxy 객체로 채워진 Entity의 타입캐스팅을 시도할 때 트랜잭션 내부에서 연관관계가 설정된 엔티티의 프로퍼티 접근이 안됬을때 영속성 컨텍스트가 Transaction 범위 밖인 Controller에서 Lazy Loading을 시..
Spring - Redis System Exception
·
❌ Error Handling
❌ Spring - Redis System Exception 원인 RedisConfig 내의 Cluster Connect Timeout 시간의 잘못된 설정으로 인한 에러 해결 ResdisProperties내에 세션 타임아웃필드 지정 connectTimeout()내부 로직에 시간값을 가져오는곳에 올바른 시간값 기입 수정 @Component @Getter @Setter @ConfigurationProperties("spring.redis") public class RedisProperties { private String host; private int port; @Getter @Value("${jwt.refresh-token-expiration-minutes}") private int refreshToke..
Spring - Circular Dependency Error
·
❌ Error Handling
❌ Spring - Circular Dependency Error (순환참조) 원인 A Class B Class 가 서로의 클래스에서 의존성을 주입받는 상황에서 순환 참조 에러가 발생 해결 A B 두 클래스에서 서로 DI를 받던 코드에서 한쪽의 의존성을 완전히 제거 로직을 한쪽으로 이동 순환참조 에러가 해결가 더이상 출력이 되지 않고, 어플리케이션이 정상 실행 의문점 회원1 : 질문N, 질문1 : 답변N 의 연관관계에서 의존성 제거 / 로직이동을 순환 참조가 발생한 두 클래스에서 중 어느 클래스에서 할지에 대한 기준 N쪽에서 1을 끌어서 쓰는 방식으로 일단 해결함 내용 추가 보통 양방향 관계에서 서로 같은 의존성을 공유하는 경우 발생한다. 양방향 연관관계를 적절하게 대부분 단방향으로 바꾸고 A..
Spring - Data Integrity Violation Exception
·
❌ Error Handling
❌ Spring - Data Integrity Violation Exception Data Integrity Violation Exception 발생 가능성 SQL 쿼리가 잘못되거나 Data가 잘못되었을 경우 RuntimeException으로 잘못된 데이터가 바인딩 될 경우 영속성 컨텍스트에 이미 등록된 객체에, 동일ID의 다른 참조값을 가진 객체가 접근할 경우 해결 Entity의 필드명에 오타가 들어간 경우로 인해 잘못된 SQL Insert Query를 던짐 MapStruct의 필드 매핑이 잘못된 경우 @Mapping Annotation을 사용하여 올바른 필드매핑 연관관계가 매핑된 객체의 Cascade 전이 범위를 Merge로 변경하면 동일 ID값의 다른 주소값을 참조하는 객체가 들어와도 객체 병합과정..