빠에야는 개발중
OSIV 무엇인가? OSIV란 Open Session In View의 약자로 JPA에서 영속성 컨텍스트와 hibernate session을 뷰가 렌더링 될 때까지 유지시키는 방법이다. 왜 사용하는가? 기존에 @Transactional 메소드까지 유지가 되던 영속성 컨텍스트의 영향 범위는 뷰 렌더링까지는 닿지 않는다. 따라서 controller 단에서 엔티티를 조회할 때 Lazy loading이 걸린다면, LazyInitializationException을 뱉으면서 실패한다. 이를 해결하기 위해서 영속성 컨텍스트가 뷰를 그릴때도 유지될 수 있도록 하여 Lazy loading을 성공시키는 것이다. 단점 전통적인 OSIV를 기준으로 요청이 들어왔을 때 controller단에서 부터 JDBC connection..
N+1 문제 무엇인가? N+1 문제는 JPA에서 하나의 부모 객체와 다수의 자식 객체 데이터를 얻기 위해 메소드를 호출했을때 부모를 조회하는 쿼리 1개와 하위의 N개의 자식들을 조회하는 쿼리 N개가 발생하는 문제이다. 이는 1:N 관계에서 fetch type이 eager loading일 때 findAll() 따위로 전체를 조회하는 메소드를 사용하거나, lazy loading일 때 자식 객체를 반복문 따위로 순환 조회하는 과정에서 발생한다. 한번의 쿼리로 join해서 가져올 것을 자식 객체 수만큼의 쿼리를 사용하니 당연히 성능적으로 좋지 않다. 어떻게 해결하는가? JPQL에서는 fetch join이라는 기능을 제공한다. 데이터를 한번에 가져올 수 있도록 해준다. 하지만 두 개 이상의 컬렉션을 가진 엔티티를..
무엇인가? CAS(Compare And Swap)은 동시성 처리를 위한 세가지 방법(volatile, synchronized, CAS) 중 하나로서 말 그대로 “비교한 후 바꿔주는 것”이다. 멀티 스레드, 멀티 코어 환경에서 각 변수는 스레드 내의 스택(캐시)에 저장된다. 이 변수에 대해서 스레드에 저장된 값과 메인 메모리에 저장된 값을 비교하여 값이 같다면 새로운 값으로 치환해준다. 값이 다르다면 계속 재시도를 한다. CAS는 lock을 걸지 않고 변수마다 동기화를 하기 때문에 값이 싸다. 물론 volatile 키워드도 변수마다 동기화를 해줄 수 있지만 읽기 연산에서만 사용할 수 있다는 단점이 있다. 실제로 CAS의 내부 구현에서 메인 메모리의 값을 가져오는 용도로 volatile을 사용한다. 어디에 ..