살구잼의 여정
article thumbnail
16장. 트랜잭션과 락, 2차 캐시

트랜잭션과 락 트랜잭션은 ACID (원자성, 일관성, 격리성, 지속성을 보장해야 함) 원자성 : 트랜잭션 내에서 실행한 작업들은 하나의 작업인 것처럼 모두 성공 또는 모두 실패여야 한다. 일관성 : 모든 트랜잭션은 일관성있는 데이터베이스르 상태를 유지해야 한다. 예) DB에서의 무결성 제약 조건 항상 만족 격리성 : 동시에 실행되는 트랜잭션은 서로에게 영향이 미치치 않도록 격리해야한다. 동시에 같은 데이터를 수정하지 못하게 해야한다. 지속성 : 트랜잭션이 성공적으로 끝나면 항상 결과가 기록되어야 하고, 문제가 생겨 중간에 실패하면 로그 등을 통해 복구해야 한다. 문제는 격리성으로, 격리성을 완전히 보장하려면 트랜잭션을 순서대로 실행해야 하고, 그러면 동시성 처리 성능이 너무 나빠진다. 따라서 ANSI 표..

article thumbnail
15장. 고급주제와 성능최적화

15.1 예외 처리 (JPA를 사용할 때 발생하는 다양한 예외와 예외에 따른 주의점) JPA 표준 예외들은 javax.persistence.PersistenceExpection의 자식 클래스이며, 이 예외 클래스는 RuntimeException의 자식이다. 따라서 JPA예외는 모두 언체크 예외이다. JPA 표준 예외는 크게 "트랜잭션 롤백을 표시하는 예외"와 "트랜잭션 롤백을 표시하지 않는 예외"로 나뉜다. "트랜잭션 롤백을 표시하는 예외"는 심각한 예외이므로 복구해서는 안되며, 강제로 커밋해도 대신에 예외가 발생한다. 반면 "트랜잭션 롤백을 표시하지 않는 예외"는 심각한 예외가 아니므로 개발자가 트랜잭션을 커밋할지 롤백할지를 판단하면 된다. 트랜잭션 롤백 시 주의사항 - 트랜잭션 롤백은 데이터베이스의 ..

article thumbnail
14장. 컬렉션과 부가기능

컬렉션 JPA는 자바에서 기본으로 제공하는 Collection, List, Set, Map 컬렉션을 지원한다. 자바 컬렉션 인터페이스의 특징 - Collection : 자바가 제공하는 최상위 컬렉션. 하이버네이트는 순서를 보장하지 않고 중복을 허용한다고 가정한다. - Set : 순서를 보장하지 않고 중복을 허용하지 않는 컬렉션. - List : 순서를 보장하고 중복을 허용한다. - Map : Key, Value 구조로 되어있는 특수한 컬렉션. * 순서가 있는 컬렉션은 데이터베이스에 순서 값도 함께 관리한다. JPA와 컬렉션 하이버네이트는 엔티티를 영속 상태로 만들때 컬렉션 필드를 하이버네이트에서 준비한 컬렉션으로 감싸서 사용한다. (원본 컬렉션을 감싸고 있는 내장 컬렉션을 생성해서 이 내장 컬렉션을 사용..

article thumbnail
13장. 스프링 데이터 JPA

[Section3 - Spring MVC] 트랜잭션(Transaction) - 트랜잭션이 뭐였는지 기억이 안난다면? 트랜잭션 범위의 영속성 컨텍스트 스프링이나 J2EE 컨테이너 환경에서 JPA를 사용하면 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 이 전략은 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다(트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다는 의미). 그리고 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다. 이 전략은 트랜잭션이라는 단위로 영속성 컨텍스트를 관리하므로 트랜잭션을 커밋하거나 롤백할 때 문제가 없다. 유일한 단점은 프리젠테이션 계층에서 엔티티가 준영속 상태가 되므로 지연 로딩을 할 수 없다는 점이다. ..

article thumbnail
10장. 객체지향 쿼리 언어

9주~10주차 통합 (아직 무슨 내용인지 잘 몰라 나중에 다시 공부하기) 10.1 객체지향 쿼리 소개 JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리기술을 지원한다. 쿼리기술에는 JPQL(가장 중요한 객체지향 쿼리 언어), Criteria, QueryDSL 등이 있다. Criteria, QueryDSL은 결국 JPQL을 편리하게 사용하도록 도와주는 기술이다. 10.2 JPQL (Java Persistence Query Language) 테이블이 아닌 엔티티 객체를 조회하는 객체지향 쿼리이다. SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. SQL보다 코드가 간결하다. JPQL은 결국 SQL로 변환된다. 데이터베이스 방언(Dialect)만 변경하면 JPQL을..

article thumbnail
9장. 값 타입

JPA의 데이터 타입 2가지 1) 엔티티 타입 2) 값 타입 - 기본값 타입(basic value type) : 자바기본타입(예:int, double), 래퍼클래스(예:Integer), String - 임베디드 타입(embeddedtype, 복합 값 타입) : JPA에서 사용자가 직접 정의한 값 타입. 자바의 기본타입이 아닌 객체 타입이다. - 컬렉션값 타입(colection value type) : 하나 이상의 값 타입을 저장할 때 사용. 엔티티 타입 특징 식별자(@id)가 있다. 엔티티 타입은 식별자가 있고 식별자로 구별 할 수 있다. 생명 주기가 있다. 생성, 영속화, 소멸하는 생명 주기가 있다. em.persist (entity)로 영속화한다. em. remove(entity)로 제거한다. 공유할..

article thumbnail
8장. 프록시와 연관관계 관리

프록시 (Proxy) 요약 : 지연로딩을 위해 사용되는 대리 객체 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 프록시는 실제 객체에 대한 대리자나 대리 객체 역할을 수행하며, 클라이언트가 실제 객체에 직접 접근하는 것 대신에 프록시를 통해 접근할 수 있도록 한다. 프록시 클래스는 실제 클래스를 상속 받아 만들어지므로 실제 클래스와 겉모양이 같다. 프록시 객체는 실제 객체에 대한 참조(target)을 보관한다. 프록시 객체의 메소드를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. 프록시객체의 특징 처음 사용할 때 한 번만 초기화된다. 프록시객체를 초기화한다고 프록시객체가 실제 엔티티로 바뀌는 것은 아니다. ..

article thumbnail
7장. 고급 매핑

상속 관계 매핑 객체의 상속 관계를 데이터베이스에 어떻게 매핑하는지? 관계형 데이터베이스에는 객체지향언어에서 다루는 상속의 개념이 없다. 조인 전략 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략. JPA 표준 명세는 구분 컬럼을 사용하도록 하지만 하이버네이트를 포함한 몇몇 구현체는 구분컬럼(@DiscriminatorColumn) 없이도 동작함. 장점 - 테이블의 정규화 - 외래 키 참조 무결성 제약조건을 활용할 수 있다 - 저장공간을 효율적으로 사용가능 단점 - 조회할 때 조인이 많이 사용되므로 성능저하 가능성 있음 - 조회 쿼리가 복잡함 - 데이터를 등록할 INSERT SQL을 두 번 실행함 단일 테이블 전략 테이블을 하나만 사용..

article thumbnail
6장. 다양한 연관관계 매핑

엔티티(Entity) 데이터베이스의 테이블에 매핑되는 자바 클래스를 의미. 엔티티 클래스는 데이터베이스의 레코드에 대응되는 객체이다. 엔티티 클래스는 @Entity 어노테이션을 사용하여 JPA에서 엔티티임을 명시한다. 엔티티의 연관관계를 매핑할 때 고려할 점 3가지 - 다중성 (일대일 관계인지, 일대다 관계인지) - 단방향, 양방향 (한쪽만 참조하는지, 서로 참조하는지) - 연관관계의 주인 (양방향 관계면 주인 정해야 함) *연관관계의 주인 : JPA는 두 객체 연관관계 중 하나를 정해서 데이터베이스 외래 키를 관리함. 주인이 아닌 방향은 외래 키를 변경할 수 없고 읽기만 가능함. 다대일 [N : 1] @ManyToOne 가능한 연관관계 : 단방향, 양방향 객체 양방향 관계에서 연관관계의 주인은 항상 다..