Back-End53 JPA) Spring OSIV 스프링 OSIV 스프링 에서 제공하는 OSIV 는 ‘비즈니스 계층에서 트랜잭션을 사용하는 OSIV’ 이다. 말 그대로 비즈니스 계층에서만 트랜잭션을 사용하는 것이다. 동작원리는 다음과 같다. 요청이 들어오면 서블릿필터 나 스프링 인터셉터 에서 영속성 컨텍스트를 생성한다. Service 계층에서 트랜잭션을 시작할 때 생성되어 있던 영속성 컨텍스트를 찾아서 트랜잭션을 실행한다. Service 계층 이 끝나면 트랜잭션을 커밋하고 Flush 한다. 이때 트랜잭션만 종료된다. Controller , View 까지 영속성 컨텍스트가 유지되므로 조회된 엔티티는 영속상태를 유지한다. 필터 나 인터셉터 로 요청이 돌아오면 영속성 컨텍스트를 종료한다, 이때 Flush 는 일어나지 않는다. 트랜잭션 없이 읽기 영속성 컨텍스.. 2022. 3. 14. JPA) 과거 방식의 OSIV OSIV란? 영속성 컨텍스트를 View 계층까지 열어 둔다는 뜻이다. 영속성 컨텍스트가 살아 있다는 것은 엔티티가 영속상태로 유지된다는 것이며, 따라서, View 계층에서도 지연 로딩을 쓸수 있다는 것이다. 과거의 OSIV : 요청 당 트랜잭션 핵심은 View 계층에서 지연 로딩이 가능하다는 점이다. 과거의 OSIV는 클라이언트 요청이 들어오면 서블릿 필터 또는 스프링 인터셉터에서 트랜잭션을 시작하고 요청이 끝날 때 트랜잭션을 종료하는 것이다. 영속성 컨텍스트와 트랜잭션의 범위가 같기 때문에 조회한 엔티티도 View에서 영속상태를 유지하고 지연 로딩 또한 가능하므로 Entity를 미리 초기화할 필요가 없다. 문제점. * Presentation 계층에서 Entity의 변경이 이루어질 수 있다. 특정 화면에.. 2022. 3. 13. JPA) 값 타입 컬렉션 vs @OneToMany 엔티티 는 식별자가 있어서 엔티티의 값을 변경해도 식별자로 DB에 저장된 원본 데이터를 쉽게 찾아서 변경 할 수 있다. 반면 값 타입은 식별자라는 개념이 없고 단순한 값들의 모음이므로 값을 변경해버리면 DB에 저장된 원본 데이터를 찾기어렵다. JPA 구현체들은 값 타입 컬렉션에 변경사항이 생기면 값 타입 컬렉션과 관련된 데이터를 모두 삭제하고, 다시 현재 값 타입 컬렉션에 있는 데이터를 저장한다. 실무에서는 값 타입 컬렉션에 매핑된 데이터가 많으면 값 타입 컬렉션 대신 일대다 관계를 고려해야 한다. 추가로 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키로 구성해야 한다. 따라서 DB 기본 키 제약조건으로 인해 컬럼에 null 을 입력할 수 없고 같은 값을 중복해서 넣을 수 없는 제약도 있다.. 2022. 3. 12. JPA) 객체지향 쿼리 객체지향 쿼리 find()를 사용해서 식별자로 엔티티 하나를 조회할 수 있다. 조회한 엔티티에 객체 그래프 탐색을 사용하면 연관된 엔티티를 찾을 수 있다. 다음이 가장 단순한 조회방법이다. 식별자로 조회 객체 그래프 탐색 이 기능만으로 애플리케이션 개발은 어렵다. 좀더 복잡한 검색 방법이 필요할 수 있는데 결국 데이터는 DB에 있어서 SQL로 필요한 내용을 조회해야 한다. 하지만 ORM은 DB가 아닌 객체를 활용하기 때문에 엔티티 객체를 대상으로 조회하는 방법을 필요로 한다. SQL이 DB테이블을 대상으로 하는 데이터 중심 쿼리라면 JPQL은 엔티티 객체를 대상으로 하는 객체지향 쿼리이다. JPQL을 사용하면 JPA가 이를 분석하여 적절한 SQL을 만들어 DB를 조회한다. JPA는 JPQL 뿐만 아니라 .. 2022. 3. 12. JPA) 영속성 전이 특정 엔티티를 영속상태로(Persist) 만들고 싶을 때 연관된 엔티티도 함께 영속상태로 만들고 싶다면 영속성 전이 기능을 사용하면 된다. Cascade 옵션으로 영속성 전이를 제공한다. 해당 기능을 이용하면 부모 엔티티를 저장할 때 자식의 엔티티도 같이 저장이 가능해진다. 위 코드로 부모와 자식 엔티티를 영속상태로 만들기 위해서는 3번의 persist 를 호출해야 한다. em.persist(parent); em.persist(child1); em.persist(child2); 하지만 만약 영속성 전이를 설정했을 경우에는 부모를 영속화 하는 것으로 자식엔티티 또한 같이 영속화 되어 저장된다. @OneToMany(cascade = CascadeType.PERSIST) private List children.. 2022. 3. 12. JPA) Eager, Lazy 로딩 즉시로딩 : 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다 ex) 회원과 팀 엔티티가 연관관계라고 가정 했을 때, em.find(Member.calss, "member1"); 를 호출 할 때 회원 엔티티와 팀 엔티티를 함께 조회한다. 예시 코드 @ManyToOne(fetch = FetchType.EAGER) 회원을 조회하는 순간 연관관계를 맺은 엔티티 또한 함께 조회한다. 이때 2번의 쿼리를 실행하는 것 같지만, JPA 구현체는 즉시로딩을 최적화 하기위해서 가능하면 조인 쿼리를 사용한다. 여기서는 한번의 쿼리로 두 엔티티를 모두 조회한다. 중요한 점 이떄 외부조인( outer join ) 을 사용하는 데 외부 조인을 사용할 경우 null을 허용하게 된다. 즉, 팀에 속하지 않는 회원까지 조회하게될 가.. 2022. 3. 12. 이전 1 2 3 4 5 6 ··· 9 다음