목록Backend/JPA 프로그래밍 (17)
elevne's Study Note
트랜잭션은 ACID 라고 하는 원자성, 일관성, 격리성, 지속성을 보장해야 한다. 여기에서 격리성을 완벽하게 보장하려면, 트랜잭션을 거의 차례대로 실행시켜야 한다는 문제가 있다. 이렇게 하면 동시성 처리 성능이 매우 나빠진다. 이러한 문제로 ANSI 표준은 트랜잭션의 격리 수준을 4 단계로 나누어 정의한다. 순서대로 READ UNCOMMITTED 의 격리수준이 가장 낮고 SERIALIZABLE 의 격리수준이 가장 높다. READ UNCOMMITTED (커밋되지 않은 읽기) READ COMMITTED (커밋된 읽기) REPEATABLE READ (반복 가능한 읽기) SERIALIZABLE (직렬화 가능) 격리수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ READ UNC..

1. 예외 처리 JPA 표준예외는 크게 트랜잭션 롤백을 표시하는 예외와, 그렇지 않은 예외 두 가지로 분류할 수 있다고 한다. 이 중 트랜잭션 롤백을 표시하는 예외는 심각한 예외로, 복구해서는 안된다고 한다. (이 예외가 발생하면 트랜잭션을 강제로 커밋해도 트랜잭션이 커밋되지 않고 RollbackException 이 발생한다) 트랜잭션 롤백을 표시하지 않는 예외는 심각한 예외가 아니므로 개발자가 트랜잭션을 커밋할지 롤백할지를 판단하면 된다. 서비스 계층에서 데이터 접근 계층의 구현 기술에 직접 의존하는 것은 좋은 설계라고 할 수 없다. 이는 예외에 있어서도 마찬가지이다. 서비스 계층에서 JPA 의 예외를 직접 사용하면 JPA 에 의존하게 된다. 스프링에서는 이를 해결하기 위해 데이터 접근 계층에 대한 예..

하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드를 하이버네이트에서 준비한 컬렉션으로 감싸서 사용한다. 예를 들어, ArrayList 타입으로 Member 리스트를 가지고 있는 Team 엔티티를 em.persist() 메소드를 통해 영속 상태로 만들고 나서 다시 Member 리스트를 확인해보면 org.hibernate.collection.internal.PersistentBag 타입으로 바뀌어있는 것을 확인할 수 있다. 하이버네이트는 컬렉션을 효율적으로 관리하기 위해 엔티티를 영속 상태로 만들 때 원본 컬렉션을 감싸고 있는 내장 컬렉션을 생성해서 이 컬렉션을 사용하도록 참조를 변경한다. 하이버네이트는 이런 특징 때문에 컬렉션을 사용할 때 아래와 같이 즉시 초기화해서 사용하는 것을 권장한다. @En..

스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 이는 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻이다. (트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다) 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르다. (스프링 컨테이너는 스레드마다 각각 다른 트랜잭션을 할당한다) 스프링이나 J2EE 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 트랜잭션은 보통 서비스 계층에서 시작하므로 서비스 계층이 끝나는 시점에 트랜잭션이 종료되면서 영속성 컨텍스트도 함께 종료된다. 따라서 조..

Spring Data JPA 는 스프링에서 JPA 를 편리하게 사용할 수 있도록 지원하는 프로젝트다. 이는 데이터 접근 계층을 개발할 때 지루하게 반복되는 CRUD 문제를 해결해준다. CRUD 를 처리하기 위한 공통 인터페이스를 제공하며, 리포지토리를 개발할 때 인터페이스만 작성하면 실행 시점에 Spring Data JPA 가 구현 객체를 동적으로 생성해서 주입해준다. 데이터 접근 계층 개발 시 구현 클래스 없이 인터페이스만 작성해도 개발을 할 수 있는 것이다. 아래 Dependency 를 추가해 사용한다. org.springframework.data spring-data-jpa 1.8.0.RELEASE 그 다음 Spring 설정에 를 사용하여 base-packages 를 지정한다. (만약 Java Co..

JPA 프로그래밍 예제 애플리케이션은 다음과 같은 구조로 구성된다. 먼저 pom.xml 파일을 작성한다. pom.xml 은 아래와 같은 형식으로 작성된다. 4.0.0 jpastudy jpaapplication 1.0-SNAPSHOT war ... ... 은 POM 모델 버전, 는 프로젝트 그룹명, 는 프로젝트 식별 아이디, 은 프로젝트 버전, 은 빌드 패키징 방법(웹앱은 war, 자바라이브러리는 jar)을 말한다. 는 사용할 라이브러리, 는 빌드 관련 정보를 설정한다. 를 작성할 때는 라이브러린 간 충돌을 피하기 위해 항상 각각의 의 + 는 유일해야 한다. org.springframework spring-webmvc 4.1.6.RELEASE org.springframework spring-orm 4.1...
JPQL 은 표준 SQL 이 지원하는 대부분의 문법과 SQL 함수들을 지원하기는 하지만, 특정 데이터베이스에 종속적인 기능들은 지원하지 않는다. 예를 들어 UNION, INTERSECT, 스토어드 프로시저 등이 있다. 때로는 이러한 기능들이 사용될 때가 있다. JPA 는 특정 데이터베이스에 종속적인 기능을 사용할 수 있는 다양한 방법을 열어두었다. 다양한 이유들로 JPQL 을 사용할 수 없을 때, Native SQL 을 사용할 수 있다. 우선 가장 기본적으로 엔티티를 조회하는 코드를 작성해본다. String sql = "SELECT ID, AGE, NAME, TEAM_ID " + "FROM MEMBER WHERE AGE > ?"; Query nativeQuery = em.createNativeQuery(..

JPA Criteria 는 코드로 JPQL 을 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있고 IDE 의 지원을 받을 수 있는 등의 장점이 있지만, 너무 복잡하고 사용하기 어렵다. 동일하게 쿼리를 문자가 아닌 코드롤 작성해도 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발할 수 있는 것이 QueryDSL 이다. QueryDSL 은 Criteria 를 대체할 수 있다. QueryDSL 은 오픈소스 프로젝트로, 처음에는 HQL(하이버네이트 쿼리언어)을 코드로 작성할 수 있도록 해주는 프로젝트로 시작하여 지금은 JPA, JDO, JDBC, Lucene, Hibernate Search, Mongo DB, 자바 컬렉션 등을 다양하게 지원한다. 우선 필요한 라이브러리를 pom.xml 에 추가해준다. com.my..