Spring/Spring Data JPA 34

[자바 ORM 표준 JPA 프로그래밍] 16. 트랜잭션과 락, 2차 캐시

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.1. 트랜잭션과 락NON-REPEATABLE READ사용자 A, B가 동시에 같은 데이터를 수정 → 나중에 저장한 B의 값만 반영되어 A의 수정사항이 유실됨.트랜잭션만으로는 해결 불가능 (트랜잭션 범위를 넘어선 문제)해결 방법설명구현 방식마지막 커밋만 인정마지막에 커밋한 트랜잭션의 값이 저장됨(이전 변경 내용이 덮어씌워짐)버전 관리 없이 단순히 UPDATE 수행최초 커밋만 인정먼저 커밋한 트랜잭션만 인정이후 커밋은 버전 불일치로 예외 발생JPA 낙관적 락 적용 (@Version)충돌 내용 병합동시에 수정된 데이터를 병합하여 둘 다 반영OptimisticLockException 발생 시 직접 예외 처리 낙관적 락과 비관적 락구분..

[자바 ORM 표준 JPA 프로그래밍] 15. 고급 주제와 성능 최적화

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.1. 예외 처리JPA 예외 변환서비스 계층이 JPA 구현 기술에 의존하지 않게 하기 위해 예외를 추상화항목설명기능 제공 클래스PersistenceExceptionTranslationPostProcessor적용 방식@Repository가 붙은 클래스를 대상으로 AOP 적용JPA 예외를 스프링 예외로 변환 (DataAccessException 등) JPA 표준 예외PersistenceException (RuntimeException 하위 클래스)구분설명롤백 필수(심각한 예외)예외 복구 시, 커밋 ❌- EntityExistsException: 엔티티 영속화 시도 중, 이미 같은 엔티티가 있음- EntityNotFoundExcepti..

[자바 ORM 표준 JPA 프로그래밍] 13. 웹 애플리케이션과 영속성 관리

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.1. 트랜잭션 범위의 영속성 컨텍스트기본 전략구분내용생명 주기트랜잭션과 영속성 컨텍스트는 같은 생존 범위를 가짐- 트랜잭션이 시작될 때 영속성 컨텍스트 생성 (초기화 상태)- 트랜잭션이 종료될 때 영속성 컨텍스트 종료공유- 같은 트랜잭션 간 같은 영속성 컨텍스트를 공유함- 다른 트랜잭션 간 다른 영속성 컨텍스트를 가짐 예시) 공유더보기같은 트랜잭션@Test@Transactionalvoid same_transaction() { User user1 = entityManager.find(User.class, 1); user1.setName("test"); searchName();}private void search..

[자바 ORM 표준 JPA 프로그래밍] 12. 스프링 데이터 JPA

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다. 0. Spring Data 프로젝트모든 종류의 데이터 저장소에 대해 추상화 계층을 제공하는 Spring 프로젝트 모음 (RDB, NoSQL, 검색엔진 등)일관된 방식의 데이터 접근을 제공하여 코드 구조를 일관되게 유지할 수 있도록 도와줌인터페이스만 작성해도 DAO 구현체를 자동 생성 및 등록함 공통 구조Repository 인터페이스 정의Spring Data가 자동으로 구현체(프록시) 생성복잡한 쿼리는 @Query 또는 명시적 정의로 구현 1. Spring Data JPA 프로젝트JPA를 기반으로 RDBMS에 접근하는 기능을 제공하는 Spring Data의 하위 프로젝트Hibernate와 같은 JPA 구현체 위에 얹어서 사용함..

[자바 ORM 표준 JPA 프로그래밍] 10-5. 객체지향 쿼리 언어: 객체지향 쿼리 심화

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다. 1. 벌크 연산수백개의 엔티티 수정을 하기 위해 각각 상태를 변경할 경우 너무 오래걸림이를 위해 여러 건을 한번에 처리하는 벌크 연산을 지원함 예제)더보기@Test@Transactionalvoid bulk_operation() { String selectJpql = "select u from User as u"; List result = entityManager.createQuery(selectJpql, User.class).getResultList(); long start1 = System.currentTimeMillis(); for (User user : result) user.setName("upd..

[자바 ORM 표준 JPA 프로그래밍] 10-4. 객체지향 쿼리 언어: Native SQL

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다. 1. Native SQLJPA는 JPQL이 아닌 DB 고유의 SQL 문법을 직접 사용하는 방법을 지원합니다.결과 매핑 어노테이션을 사용하여 응답을 정의할 수 있습니다. 사용 상황상황이유복잡한 조인 / 서브쿼리JPQL로 표현하기 어려운 경우DB 특화 기능 사용예: 윈도우 함수, 특정 DB 함수 등성능 최적화JPQL보다 효율적인 쿼리 필요 시기존 SQL 자산 재사용DB에 이미 작성된 쿼리를 그대로 쓰고 싶을 때 예제) Native SQL더보기@Test@Transactionalvoid native_query_entity() { String sql = "SELECT ID, NAME, NICKNAME, AGE, TEAM_ID ..

[자바 ORM 표준 JPA 프로그래밍] 10-2. 객체지향 쿼리 언어: Criteria

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다. 1. CriteriaJPQL을 편하게 작성하도록 도와주는 빌더 클래스 모음컴파일 시점에 오류를 발견할 수 있음동적 쿼리를 작성하기 편함 2. 기초항목설명CriteriaBuilderCriteria 쿼리 생성을 위한 시작점CriteriaQuery쿼리 전체 구조를 담는 객체Root조회의 시작점 (FROM 절)PredicateWHERE 조건 표현OrderORDER BY 정렬 표현 예제더보기CriteriaBuilder cb = entityManager.getCriteriaBuilder();CriteriaQuery query = cb.createQuery(User.class);Root u = query.from(User.class);q..

[자바 ORM 표준 JPA 프로그래밍] 10-1. 객체지향 쿼리 언어: JPQL

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다. 1. JPQL객체 지향 쿼리SQL 추상화실행 시점에 SQL 문을 생성하여 요청함 예제) JPQL ➡️ SQL더보기// 쿼리 생성String jpql = "select m from Member as m where m.username = 'kim'";List resultList = em.createQuery(jpql, Member.class).getResultList(); 특징구분설명기본 문법SQL과 유사한 문법 사용 (SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 등)- 엔티티명과 필드 사용, 별칭 필수쿼리 객체 API- TypedQuery: 반환 타입 명확할 때- Query: 반환 타입..

[Spring Data JPA] 3-4. Specifications

1. Specification도메인 객체에 대한 조건을 정의public interface Specification { Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder);}  Predicate각 조건을 표현하는 객체 (where 절) CriteriaBuilder다양한 조건을 빌드할 수 있는 객체 Definitionpublic class CustomerSpecs { // 특정 날짜 이전에 생성된 고객을 찾는 Specification public static Specification isLongTermCustomer() { return (root, query, builder) -> { ..