본문 바로가기

JPA18

[JPA] JPQL JPQL객체 지향적인 방식으로 데이터베이스에 접근할 수 있도록 도와주는 쿼리 언어로 테이블이 아니라 엔티티를 대상으로 한다.JPQL은 SQL을 추상화하여 만들었기 때문에 데이터베이스 벤더에 독립적SQL과 문법이 유사하다. (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원)엔티티 객체를 중심으로 개발 가능JPQL 문법select m from Member as m where m.age > 18엔티티와 속성은 대소문자 구분 필요JPQL 키워드는 대소문자 구분 X별칭이 필수 (as 생략 가능)테이블 이름이 아닌 엔티티 이름을 사용select COUNT(m), // 회원수 SUM(m.age), // 나이 합 AVG(m.age), // 평균 나이 MAX(m.age), // .. 2024. 12. 29.
[JPA] 데이터 타입 JPA의 데이터 타입은 크게 두 종류로 볼 수 있다.엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능생명주기를 가지고 있으며, 공유 가능회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능값 타입int, Integer, String 같이 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경 시 추적 불가공유하지 않는 것이 안전, 불변으로 만들어야 함값 타입의 종류기본 값 타입자바 기본 타입(int, double …)래퍼 클래스(Integer, Long …)String기본 값 타입은 생명 주기를 엔티티에 의존한다. (엔티티가 삭제되면 엔티티의 name, age 필드도 삭제)임베디드 타입(복합 값 타입)새로운 값 타입을 직접 정의 (주로 기본.. 2024. 12. 29.
[JPA] 영속성 전이, 고아 객체 영속성 전이란?특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용하는 기능이다.// ALL: 모두 적용// PERSIST: 영속// REMOVE: 삭제@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)이렇게 하면 부모 엔티티를 persist 시 자식 엔티티도 함께 저장되며, REMOVE 옵션을 적용 시 부모 엔티티를 삭제하면 자식 엔티티도 삭제된다.즉 부모 위주로 프로그래밍을 하거나, 부모 엔티티가 자식 엔티티의 생명 주기를 관리하고 싶은 경우 사용한다.고아 객체 제거고아 객체란 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미하며 orphanRemoval 기능은 해당 고아 객체를 자동으로 삭제한다.orphan.. 2024. 12. 29.
[JPA] 프록시, 로딩 전략 객체의 경우 연관된 객체들을 자유롭게 탐색할 수 있다. 하지만 데이터베이스의 경우 연관된 테이블을 조회하려면 JOIN을 해야하기 때문이다.이는 비용이 발생하며, 만약 연관된 테이블의 데이터를 사용하지 않는다면 더욱 더 낭비가 된다.따라서 해당 문제를 해결하기 위해 프록시가 등장하였다.프록시는 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아닌, 실제 사용하는 시점에 조회할 수 있도록 한다.프록시란위임, 대리라는 의미로 JPA에선 데이터베이스를 통해서 조회한 실제 엔티티 객체말고 데이터베이스 조회를 미루는 역할을 수행하는 가짜 엔티티 객체를 의미한다.실제 클래스를 상속해서 만들어지므로 실제 클래스와 겉모습이 유사프록시 객체는 실제 객체의 참조(target)를 보관함.따라서 프록시 객체를 호출하면 해.. 2024. 12. 29.
[JPA] N + 1 문제 N + 1 문제N + 1 문제란 연관관계에서 발생하는 문제로 연관 관계가 설정된 엔티티를 조회할 때 조회된 데이터 갯수(n 개) 만큼 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 것을 의미한다.예를 들어 1개의 게시물에 10개의 댓글이 존재하고, 게시글과 댓글의 관계가 1 : N 관계일 때 해당 게시글을 조회하면 10개의 댓글에 대한 쿼리가 나가는 경우를 의미한다. N+1이 발생하는 이유?JPA는 메서드 이름을 분석한 뒤 JPQL을 생성하여 실행하게 된다. JPQL은 특정 SQL에 종속되지 않고 엔티티 객체와 필드 이름을 가지고 쿼리를 날리기 때문에 findAll()이란 메소드를 수행하였을 때 해당 엔티티를 조회하는 select * from board 쿼리만 실행하게 된다. 이후 결과를 받아 엔티티의 .. 2024. 12. 29.
[JPA] 상속 관계 매핑, @MappedSuperclass 상속 관계 매핑관계형 데이터베이스는 상속 관계가 존재하지 않고 슈퍼 타입, 서브 타입 관계라는 모델링 기법이 존재한다.상속 관계 매핑이란 객체의 상속 구조와 DB의 슈퍼, 서브 타입 관계를 매핑하는 것을 의미한다. 데이터베이스는 다음과 같은 방법으로 슈퍼, 서브 타입 관계를 구현한다.각각 테이블로 변환 → 조인 전략 (상위 타입이 공통 속성을 가지고 있고 하위 타입이 부가 속성을 가짐)장점외래 키 참조 무결성 제약조건 활용 가능저장 공간 효율화테이블 정규화 가능단점데이터 저장 시 INSERT 2번 호출조회 시 조인을 사용하므로 성능 저하, 쿼리가 복잡통합 테이블로 변환 → 단일 테이블 안에 모든 속성을 넣음하나의 테이블 안에 값을 전부 넣으므로 Dtype을 이용하여 어떤 타입인지 구분해주어야 함.장점조인.. 2024. 12. 29.
[JPA] 연관관계 매핑 객체와 테이블은 연관관계를 맺을 때 큰 차이가 있다.객체의 경우 참조를 이용하지만, 테이블은 외래키를 사용하여 연관관계를 매핑한다.그렇다면 JPA는 객체지향 프로그래밍과, 데이터베이스 사이의 패러다임 불일치를 어떻게 해결하였을까?연관관계를 매핑할 때 크게 3가지를 고려해야 한다.방향 (단방향 - 두 객체 중 한 객체만 참조를 가짐, 양방향 - 두 객체 모두가 서로에 대한 참조를 가짐)다중성 ( 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) )연관관계의 주인 : 연관관계가 양방향으로 맺어져 있을 때 관리 주체단방향, 양방향 매핑데이터베이스의 경우데이터베이스는 외래키를 가지고 연관관계를 알 수 있다. (두 테이블을 조인하는 방식)즉 외래키 하나만 가지고 양쪽 테이블의 원하는 값을 조회.. 2024. 12. 29.
[JPA] 기본 키 매핑 JPA는 기본 키 매핑 시에 크게 2가지 방식을 제공한다.1. 직접 할당 방식@Id만 애노테이션만 사용하면 엔티티를 저장하기 전 애플리케이션에서 직접 기본 키를 직접 할당해야 한다.@Idprivate Long id;2. 자동 생성 방식@Id와 @GeneratedValue 애노테이션을 같이 사용하게 되면 기본 키 생성을 사용하는 DB에 위임한다.주로 AutoIncrement가 가능한 DB(MySQL, PostgreSQL, SQL Server …)에서 사용한다.@Id@GeneratedValue=strategy = GenerationType.IDENTITY)private Long id; GeneratedValue 전략 4가지IdentityAutoIncrement 기능을 이용해서 기본 키를 생성하는 데이터베이스.. 2024. 12. 29.
[JPA] 영속성 컨텍스트 영속성 컨텍스트엔티티 매니저를 통해서 접근 가능한 논리적인 개념을 의미한다.→ 엔티티 매니저를 생성하면 내부적으로 PersistenceContext(영속성 컨텍스트) 생성, 스프링 프레임워크 같은 컨테이너 환경에서는 엔티티 매니저와 영속성 컨텍스트가 N:1 관계외부에서 EntityManager를 주입받는 경우 주입된 EntityManager는 싱글톤→ 스프링 프레임워크는 프록시 EntityManager를 주입 → 해당 엔티티 매니저를 호출하면 데이터베이스 트랜잭션과 관련된 진짜 EntityManager 호출함으로써 동시성 문제를 해결엔티티의 생명 주기 비영속(new) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태Member member = new Member();영속(managed) : 영속성 컨텍.. 2024. 12. 29.