spring/JPA(19)
-
JPQL(1) - 기본 문법
엔티티를 쿼리하는 방법은 다양하다. JPQL, Criteria, QueryDSL, 네이티브 SQL 등등이 있다. 어떤 방법을 사용하든 JPQL에서 모든 것이 시작한다. JPQL 특징 1. JPQL은 객체지향 쿼리 언어다. 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. 2. JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. 3. JPQL은 결국 SQL로 변환된다. *예제로 사용할 도메인 모델 1. 기본 문법과 쿼리 API SELECT SELECT 문은 다음과 같이 사용한다. select m from Member as m where m.name = 'kim' - 대소문자 구분 엔티티와 속성은 대소문자를 구분한다. 엔티티 : Member 속성 : name 반..
2024.01.24 -
JPA - 값 타입
JPA 데이터 타입을 가장 크게 분류하면 엔티티 타입과 값 타입으로 나눌 수 있다. 엔티티 타입은 @Enity로 정의하는 객체이고 값 타입은 원시 타입이나 참조 타입 객체를 말한다. 값 타입은 3가지로 나눌 수 있다. 1. 기본값 타입 - 자바 기본 타입 - 래퍼 ㅡㄹ래스 - String 2. 임베디드 타입 3. 컬렉션 값 타입 기본값 타입 가장 단순한 기본값 타입 public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; } String, Long, int가 값 타입이다. 임베디드 ..
2024.01.20 -
JPA - 즉시 로딩과 지연 로딩, 영속성 전이, 고아 객체
프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용한다. 회원 엔티티를 조회할 때 팀 엔티티가 필요하지 않다면 팀 엔티티는 지연 로딩 하는 것이다. 1)즉시 로딩 : 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다. - 예 : em.find(Member.class, "3L") 를 호출할 때 회원 엔티티와 연관된 팀 엔티티도 함께 조회한다. - 설정 방법 : @ManyToOne(fetch = FetchType.EAGER) 2) 지연 로딩 : 연관된 엔티티를 실제 사용할 때 조회한다. - 예 : member.getTeam().getName() 처럼 조회한 팀 엔티티를 실제 사용하는 시점에 JPA가 SQL을 호출해서 팀 엔티티를 조회한다. - 설정 방법 : @ManyToOne(fetch = FetchT..
2024.01.19 -
JPA - 프록시
엔티티를 조회할 때 연관된 엔티티들이 사용되지 않을 때도 있다. @Entity public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; //Getter, Setter } @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneT..
2024.01.19 -
고급매핑 - 상속 관계 매핑
관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 유사하다. ORM에서의 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 슈퍼타입 서브타입 논리 모델을 실제 물리 테이블로 구현할 때는 3가지 방법이 있다. 1. 각각의 테이블로 변환 : 객체 상속 모델처럼 각각 테이블을 만들고 조회할 때 조인을 사용한다.(조인 전략 테이블) 2. 통합 테이블로 변환 : 테이블을 하나만 사용해서 통합한다. (단일 테이블 전략) 3. 서브타입 테이블로 변환 : 서브 타입마다 하나의 테이블을 만든다.(테이블 전략) 1. 조인 전략 객체 상속 모델처럼 테이블을 각각 만들고 자식 테이블이 부모 테..
2024.01.15 -
연관관계 매핑(2) - 단방향, 양방향
객체는 참조를 사용해서 관계를 맺고 테이블은 외래 키를 사용해서 관계를 맺는다. 객체의 참조와 테이블의 외래 키를 매핑하는 것이 이 장의 목표다. 1. 단방향 연관관계 요구조건 1) 회원과 팀이 있다. 2) 회원은 하나의 팀에만 소속될 수 있다. 3) 회원과 팀은 다대일 관계다. 객체 연관관계 - 회원 객체는 Member.team 필드로 팀 객체와 연관 관계를 맺는다. - 회원 객체와 팀 객체는 단방향 관계다. 테이블 연관관계 - 회원 테이블은 TEAM_ID 외래 키로 팀 테이블과 연관관계를 맺는다. - 회원 테이블과 팀 테이블은 양방향 관계다. 객체 연관관계와 테이블 연관관계의 가장 큰 차이 참조를 통한 연관관계는 언제나 단방향이다. 객체간에 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해..
2024.01.04 -
엔티티 매핑(2) - 컬럼 매핑
필드와 컬럼 매핑 분류 분류 매핑 어노테이션 설명 필드와 컬럼 매핑 @Column 컬럼 매핑 @Enumerated enum 타입 매핑 @Temporol 날짜 타입 매핑 @Lob BLOB, CLOB 타입 매핑 @Transient 특정 필드 매핑 제외 기타 @Access JPA가 엔티티에 접근하는 방식을 지정 @Column @Column은 객체 필드를 테이블 컬럼에 매핑한다. 가장 많이 사용되고 기능도 많다. 속성 중에 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않는다. - name : 필드와 매핑할 테이블의 컬럼 이름 - insertable : 엔티티 저장 시 이 필드는 데이터베이스에 저장하지 않는다.(읽기 전용) - updatable : 엔티티 수정 시 이 필드는 데이터베이스에 수정..
2024.01.03 -
엔티티 매핑(1) - 엔티티, 기본 키 매핑
JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있다. - 객체와 테이블 : @Entity, @Table - 기본 키 : @Id - 필드와 컬럼 : @Column - 연관관계 매핑 : @ManyToOne, @JoinColumn 먼저 객체와 테이블 매핑을 살펴보자 1.@Entity 테이블과 매핑할 클래스에 @Entity 어노테이션을 필수로 붙여야 한다. JPA가 관리하는 클래스로 엔티티라 부른다. - name 속성 : 엔티티 이름 지정. 보통 클래스 이름을 사용한다. @Entity(name = "member2") public class Member { } => member2 테이블과 Member 클래스를..
2023.12.29 -
영속성 관리(2)
4. 영속성 컨텍스트의 특징 * 영속성 컨텍스트와 식별자 값 - 영속성 컨텍스트는 엔티티 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. * 영속성 컨텍스트와 데이터베이스 저장 - 영속성 컨텍스트에 엔티티를 저장하면 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이것을 플러시라 한다. * 영속성 컨텍스트가 엔티티를 관리하면 장점 - 1차 캐시 - 동일성 보장 - 트랜잭션을 지원하는 쓰기 지연 - 변경 감지 - 지연 로딩 지금부터 영속성 컨텍스트가 왜 필요하고, 어떤 이점이 있는지 알아보자 4.1 엔티티 조회 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시라 한다. 영속 ..
2023.12.28