본문 바로가기

스프링23

JPA_N+1 문제 EAGER VS LAZY Eager(즉시 로딩) 방식 Eager(즉시 로딩) 방식을 사용하면 연관된 모든 값들을 가져온다. 따라서, 불필요한 정보, 중복 자료 등이 조회될 수 있으며, 어떤 쿼리가 추가적으로 발생하게 될지 예측하기 힘들다. Lazy(지연 로딩) 방식 Lazy(지연 로딩) 방식을 사용하면 연관 엔티티가 사용될 때 해당 엔티티를 호출하게 되므로, 불필요한 조회를 막을 수 있다. 어떤 쿼리가 발생할지 비교적 예측이 쉬운 lazy 방식을 사용하자. (EAGER 방식이 필요할 때가 있을지도 모른다. 그럼 그 때 또 알아 보자.) N+1 이란? 1개의 쿼리로 조회한 엔티티와 연관관계를 맺고 있는 엔티티의 개수(N) 개 만큼 쿼리가 발생하는 문제이다. 언제 발생하는가? jpa를 통해 DB에 쿼리를 날.. 2023. 8. 8.
Log를 (기본만) 알아보자 다양한 예제를 실습하면서 System.out.println . 줄여서 sout을 굉장히 많이 사용 해왔다. IDE의 콘솔창에 작성한 코드가 작동되는지 확인할 때 몹시 유용하게 사용해 왔지만, sout이 사용된 곳의 위치, 사용된 시간 등 주변 정보를 얻기 어렵다. 또한, 많은 자원을 요한다. 그리고 기록을 콘솔창에만 남기기 때문에 관련 정보를 처리할 수 없다는 단점을 가지고 있다고 한다. 그렇다면, 정보도 얻기 쉽고, 처리할 수 있는 것은 뭐가 있을까 이.름.하.야. Log!! (로그 파일을 남기거나, 네트워크로 전송도 가능하다고 한다) 다양한 라이브러리가 있다고 하는데 Sl4j 를 사용 해보기로 했다. 타 블로그 글을 보니 아래와 같다고 한다. slf4j slf4j와 다른 라이브러리의 가장 큰 차이점은.. 2023. 5. 16.
request 스코프 작성 /* request 스코프의 생명 주기는 클라이언트의 요청이 발생하고 완료될 때까지 이다. 그런데 지금은, 요청이 없는 상태에서 어플리케이션을 실행했고, 다른 곳에서 DI를 요청하고 있다. Scope("request")가 활성화 되지 않았다. 즉, MyLogger 라는 bean이 존재하지 않는 상태에서 요청을 해버리니, 찾을 수 없다는 에러가 발생하는 것이다. */ @Scope(value = "request") @Component public class MyLogger { } @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final .. 2023. 4. 7.
@Qualifier 단점 - 컴파일 단계에서 오류가 안 잡힘. @Qualifier("지정명") 어노테이션의 단점 - 지정이 필요한 모든 곳에 일일이 작성해야 한다(빈, 메서드 등 등) - 지정명이 문자열이므로 컴파일 단계에서 에러가 발생하지 않는다. -> 런타임 시에만 발견됨. 오타 등에 취약함 사용상의 불편함은 그렇다 치고, 오타 등으로 런타임 에러 뜨면 여러모로 불편하니 이걸 극복해보자. 이를 극복하기 위한 것이 어노테이션을 활용하는 방법이다. 아래와 같이 애노테이션을 작성하면, 1. 일반적인 작성법과 동일하게 작동하며, 2. 컴파일 단계에서 에러를 잡을 수 있게 된다. @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTAT.. 2023. 4. 6.
728x90