우주먼지
💡 JPA N+1 문제 발생 이유 & 해결법
Error Handling/Java & Spring 2023. 1. 25. 05:36

💡 발생이유 JPA가 JPQL을 분석해서 SQL을 생성할 때 글로벌 Fetch 전략을 참고하지 않고 JPQL 자체만 사용한다. findAll()이 수행되면 해당 엔티티만을 기준으로 조회 쿼리가 생성되고, FetchType으로 지정한 객체를 불러오는 시점에 별도외 조회 메서드를 호출하게 됨으로써 발생한다. 예시 1. Fetch 전략을 Eager(즉시 로딩)으로 한 경우 발생 2. Fetch 전략을 Lazy(지연 로딩)으로 한 경우, 객체 그래프 탐색 시 발생 예시 1의 경우 1. findAll()을 하면 JPQL구문이 생성되고 그 구문을 북석한 SQL이 생성 & 실행됨 2. DB의 결과를 받아 엔티티의 인스턴스를 생성 3. 영속성 컨텍스트에 검색하려는 엔티티와 연관된 엔티티가 있는지 확인 4. 없다면 2번..

article thumbnail
💡 OSIV 옵션 & 프록시 객체 초기화
Error Handling/Java & Spring 2023. 1. 14. 23:10

💡 LazyInitializationException 발생 발생이유 1. Proxy 객체로 채워진 Entity의 타입캐스팅을 시도할 때 2. 트랜잭션 내부에서 연관관계가 설정된 엔티티의 프로퍼티 접근이 안됬을때 3. 영속성 컨텍스트가 Transaction 범위 밖인 Controller에서 Lazy Loading을 시도할 때 N:1 관계를 예시로, 1쪽에서의 Fetch 전략은 Lazy & N쪽에서의 Cascade 전이 범위는 Persist,Remove 설정 N의 엔티티를 단건 조회했을때 Lazy Loading으로 연관된 1은 바로 초기화가 되지않고, 필요할때 정보가 채워지는 Proxy 객체로 채워진다. 그럼 N의 Request가 Entity로 변환되고 Entity -> Response로 변환이 될때 정상적..

article thumbnail
❌ RedisConnectionFailurException
Error Handling/Java & Spring 2023. 1. 10. 16:41

💡 RedisConnectionFailurException 발생이유 개인 로컬 centos 서버 내에 docker container와의 연동 실패 해결 RedisConfig와 application.yml에서 cluster & node 설정

❌ RedisSystemException
Error Handling/Java & Spring 2023. 1. 10. 15:19

💡 RedisSystemException 발생이유 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 refreshTokenExpirati..

article thumbnail
❌ Circular Dependency

💡 Circular Dependency In Spring 스프링 의존성 순환 참조 에러 발생 이유 A Class B Class 가 서로의 클래스에서 의존성을 주입받아 순환참조 발생 해결 기록 A B 두 클래스에서 서로 DI를 받던 코드에서 한쪽의 의존성을 완전히 제거하고 로직을 한쪽으로 이동시키자 순환참조 에러가 해결되고 어플리케이션이 정상 실행되었음 의문점 예를 들어 회원1 : 질문N, 질문1 : 답변N 의 연관관계에서 순환 참조가 발생한 두 클래스에서 어느쪽의 의존성을 제거하고 어느쪽으로 로직을 이동해야 할지에 대한 기준을 모르겠어서 N쪽에서 1을 끌어서 쓰는 방식으로 일단 해결함 추후 알아보고 기록할 것

❌ DataIntegrityViolation Exception

💡 DataIntegrityViolation Exception Exception 발생 가능성 1. SQL 쿼리가 잘못되거나 Data가 잘못되었을 경우 2. RuntimeException으로 잘못된 데이터가 바인딩 될 경우 3. 영속성 컨텍스트에 이미 등록된 객체에, 동일ID의 다른 참조값을 가진 객체가 접근할 경우 해결 기록 1. Entity의 필드명에 오타가 들어간 경우로 인해 잘못된 SQL Insert Query를 던짐 2. MapStruct의 필드 매핑이 잘못된 경우 @Mapping Annotation을 사용하여 올바른 필드매핑 3. 연관관계가 매핑된 객체의 Cascade 전이 범위를 Merge로 변경하면 동일 ID값의 다른 주소값을 참조하는 객체가 들어와도 객체 병합과정을 통해 충돌이 발생하지 않는다

article thumbnail
❌ UnexpectedTypeException
Error Handling/Java & Spring 2022. 12. 9. 20:11

💡 UnexpectedTypeException 자바 타입에 따라 Validate Annotation을 적절하게 써야 함 Null, "", " " 3개중 허용 범위 @NotBlank - 셋 다 비허용 @NotEmpty - " "만 허용 @NotNull - " ", "" 만 하용

검색 태그