목록스터디 (12)
제리의 배움 기록
16장 트랜젝션과 락, 2차 캐시 트랜젝션과 락 [트랜젝션 ACID] 트랜젝션은 ACID를 보장해야 한다. Atomicity(원자성) : 하나의 작업인 것처럼 모두 성공 or 모두 실패해야 한다 Consistency(일관성) : 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. Isolation(격리성) : 동시에 실행되는 트랜젝션들이 서로에게 영향을 미치지 않도록 격리한다. Durability(지송성) : 트랜젝션을 성공으로 끝내면 그 결과가 항상 기록되어야 한다.중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜젝션 내용을 복구해야 한다. [참고] MySQL 트랜젝션 격리 수준 [낙관적 락과 비관적 락] 낙..
15장 고급 주제와 성능 최적화 1. 예외처리 트랜젝션 롤백을 표시하는 예외 복구할 수 없는 예외 예외 처리를 해서 트랜젝션이 커밋되도록 시도하면 javax.persistence.RollbackException 예외가 발생한다. 예외 종류 // EntityManager.persist(..) 호출 시 이미 같은 엔티티가 존재할 경우 발생 javax.persistence.EntityExistsException // EntityManager.getReference(..) 호출 했는데 실제로 초기화할 시점에 엔티티가 존재하지 않으면 발생. refresh(..), lock(..)에서도 발생한다. javax.persistence.EntityNotFoundException // 낙관적 락 충돌 시 발생 javax.p..
13장 웹 애플리케이션과 영속성 관리 스프링 컨테이너의 기본 전략 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같음 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근 엔티티 매니저가 달라도 같은 영속성 컨텍스트를 사용하게 됨 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 달라진다. 스프링 프레임워크를 사용하면 @Transactional 어노테이션을 선언하여 트랜잭션을 시작함(AOP 방식) 대상 메서드를 호출하기 직전에 트랜잭션을 시작하고, 대상..
12장 스프링 데이터 JPA Spring Data JPA는 Spring Data 프로젝트의 하위 프로젝트 중 하나이다. Spring Data 프로젝트는 JPA, 몽고DB, NEO4j, REDIS, HADOOP, GEMFIRE 같은 다양한 데이터 저장소에 대한 접근을 추상화해서 개발자 편의를 제공하고 지루하게 반복하는 데이터 접근 코드를 줄여준다. 공통 인터페이스 기능 스프링 데이터 JPA는 간단한 CRUD 기능을 공통으로 처리하는 JpaRepository 인터페이스를 제공한다. interface SchoolRepository: JpaRepository { } 제네릭의 첫번째 인자로는 엔티티가 온다. 두번째 인자로는 엔티티의 식별자 타입이 온다. JpaRepository 인터페이스를 상속받으면 사용할 수 ..
10장 객체지향 쿼리 언어 객체지향 쿼리 특징 테이블이 아닌 객체를 대상으로 검색 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. 종류 JDBC 직접 사용 : MyBatis와 같은 SQL 매퍼 프레임워크. 필요하면 JDBC를 직접 사용 가능 JPQL 특징 엔티티 매니저를 통해 JPQL을 실행한다. sql과 유사하지만 문법의 차이가 있다. sql과 달리 엔티티에 대한 질의를 작성한다. JPA는 jpql을 sql로 변환하여 DB에 질의한다. 1. 쿼리 작성 select 구문 구조 select [결과로 리턴할 엔티티 혹은 엔티티의 특정 필드] from [조회 대상 엔티티] where [조건] -- 아래는 옵션 groupby [그룹화할 기준] having [각 그룹에 대한 조건] orderby ..
9장 값 타입 JPA의 데이터 타입은 크게 엔티티 타입과 값 타입으로 분류 엔티티 타입 @Entity으로 정의 영속성 컨텍스트 내에서 식별자를 통해 지속적으로 추적가능한 객체 값 타입 단순히 값으로 사용하는 자바의 primitive type 이나 object type 식별자가 없음 값 타입은 3가지로 나눌 수 있다. 기본값 타입 (basic value type) 자바 primitive type wrapper class String 임베디드 타입 (embedded type) 컬렉션 값 타입 (collection value type) 임베디드 타입(복합 값 타입) 직접 정의한 임베디드 타입도 int, String 처럼 값 타입이다. 회원 엔티티의 명세가 다음과 같을때 회원은 다음 정보를 가진다. 이름, 집주..
8장 프록시와 연관관계 관리 8.1 프록시 지연로딩 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법 프록시 실제 엔티티를 대신하는 가짜 객체 프록시는 엔티티를 상속하고 인스턴스 멤버 변수로 엔티티를 가진다. Entity를 참조하는 클라이언트는 엔티티 타입으로 객체를 다루기 때문에 실제 타입이 프록시인지 눈치채지 못한다. 프록시 초기화 과정 클라이언트는 A 타입 엔티티 객체를 호출한다. 이 호출은 실제로 프록시 객체로 전달된다. 프록시 객체는 영속성 컨텍스트에 A 엔티티 객체가 생성되어 있지 않으면 영속성 컨텍스트에 생성을 요청한다. => 이 과정을 초기화라고 한다. 영속성 컨텍스트는 데이터베이스를 조회하여 A 엔티티 객체를 생성한다. 생성한 객체는 영속성 컨텍스트에 의해 관리된다. 프록시는..
7장 고급 매핑 상속 관계 매핑 1. 각각의 테이블 전략 각각을 모두 테이블로 만들고 조회할 때 조인 사용 @Inheritance(strategy = InheritanceType.JOINED) 으로 전략을 설정한다. 상위 엔티티는 하위 엔티티들을 구분하는 컬럼을 가진다. @DiscriminatorColumn(name = "DTYPE") 어노테이션을 사용하며, 컬럼명을 name에 지정할 수 있다. 기본값 : DTYPE 하위 엔티티의 @DiscriminatorValue 에 설정된 값이 이 컬럼에 반영된다. 하위 엔티티는 부모의 기본키를 받아서 본인의 기본키로 쓰며, 동시에 부모의 식별자에 대해 외래키를 설정한다. [엔티티 정의] @Entity @Inheritance(strategy = InheritanceT..