JPA 18

[JPA] 단방향 연관관계, 양방향 연관관계

1. 방향의 의미 1) 단방향 회원과 팀이 관계가 있을 때 회원 -> 팀, 팀 -> 회원 둘 중 한 쪽만 참조하는 것 2) 양방향 회원과 팀이 관계가 있을 때 회원 -> 팀, 팀 -> 회원 모두 서로 참조하는 것 3) 특징 객체 관계에만 존재하고 테이블 관계는 항상 양방향 2. 객체의 연관관계와 테이블의 연관관계 차이 1) 객체의 연관관계 특징 참조로 연관관계를 맺는다 연관된 데이터를 조회할 때 참조를 사용한다 참조를 통한 연관관계는 언제나 단방향이다 객체간에 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해서 참조를 보관해야 한다. 이렇게 양쪽에서 서로 참조하는 것을 양방향 연관관계라고 하지만 이것은 양방향 관계가 아니라 서로 다른 단방향 관계 2개다. 예시 Member Team id id ..

Spring/jpa 2023.02.13

[JPA] 기본 키 매핑

1. 기본 키 직접 할당 전략 1) 개념 기본 키를 애플리케이션에서 직접 할당하는 것 2) 방법 @Id로 매핑 3) 특징 em.persist() 하기 전에 애플리케이션에서 기본 키를 직접 할당, 만약 식별자 값 없으면 예외 발생 2. IDENTITY 전략 1) 개념 기본 키를 자동 생성하는데, 생성을 데이터베이스에게 위임 2) 방법 @ID와 @GeneratedValue의 GenerationType.IDENTITY 사용 3) 특징 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용 JPA는 기본 키 값을 얻어오기 위해 데이터베이스를 추가로 조회 JDBC3에 추가된 Statement.getGeneratedKeys()를 사용하면 데이터를 저장하면서 동시에 생성된 기본 키 값도 얻어 올 수..

Spring/jpa 2023.02.10

[JPA] 영속성 관리

1.영속성 컨텍스트 1) 개념 엔티티를 영구 저장하는 환경 2) 특징 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다 엔티티를 식별자 값으로 구분해서 식별자 값이 반드시 있어야 한다 여기서 식별자란 @Id로 테이블의 기본 키와 매핑한 값을 의미한다 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영한다 => 플러시 3) 장점 1차 캐시 개념 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시라고 한다. 영속 상태의 엔티티는 모두 이곳에 저장되는데, 저장될 때 @Id와 엔티티 인스턴스가 함께 저장된다. 작동 em.persist(member)를 하면 1차 캐시에 회원 엔티티가 저장되고, 데이터베이스에는 저장..

Spring/jpa 2023.02.09

[JPA] 엔티티 매니저 팩토리, 엔티티 매니저, 트랜잭션

1. 엔티티 매니저 팩토리 1) 개념 엔티티 매니저를 만드는 공장 2) 특징 JPA를 시작하려면 persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야 함 이때 Persistence 클래스를 사용함. 이 클래스는 persistence.xml에서 이름이 ""인 영속성 유닛을 찾아서 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비함 엔티티 매니저 팩토리 생성 비용이 큼. persistence.xml에서 설정정보를 읽어서 jpa동작시키기 위한 객체를 만들고, jpa 구현체에 따라서는 데이터베이스 커넥션 풀도 생성하기 때문. 따라서, 엔티티 매니저 팩토리는 애프리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 함. 여러 스레드가 동시에 접근해도 안전하므로 서로 ..

Spring/jpa 2023.02.09

[JPA] persistence.xml

1. 개념 jpa는 persistence.xml을 사용해서 필요한 설정 정보를 관리한다. 2. 위치 resources - META-INF - persistence.xml 3. 내용 4. 데이터베이스 방언 JPA는 특정 데이터베이스에 종속적이지 않은 기술이다. 특정 데이터베이스만의 고유한 기능이나 SQL 표준을 지키지 않는 것을 JPA에서는 방언이라고 하는데, 하이버네이트를 포함한 대부분의 JPA 구현체들은 이런 문제를 해결하려고 다양한 데이터베이스 방언을 제공하기 때문이다. 따라서, 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요가 없이 데이터베이스 방언만 교체하면 된다. 5. hibernate.hbm2ddl.auto 1) 개념 테이블 자동생성 기능 2) 속성 create 기존 테이블을 삭제하고..

Spring/jpa 2023.02.09

[JPA] 엔티티 설계 어노테이션

JPA는 매핑 어노테이션을 분석해서 어떤 객체가 어떤 테이블과 관계가 있는지 알아낸다 1. @Entity 1) 개념 데이터베이스에 있는 테이블과 매칭되는 클래스임을 알려주는 어노테이션 2) 속성 name jpa에서 사용할 엔티티 이름 지정 보통 기본값인 클래스 이름을 사용. 기본값: 클래스 이름 그대로 3) 특징 기본 생성자 필수 final 클래스, enum, interface, inner 클래스에는 사용할 수 없음 저장할 필드(컬럼명과 매칭되는 클래스 속성들)에 final 사용하면 안 됨 2. @Table 1) 개념 엔티티와 매핑할 데이터베이스에 있는 테이블을 지정 2) 속성 name 매핑할 테이블 이름 기본값: 엔티티 이름(클래스 명)을 사용 uniqueConstraints DDL생성 시에 유니크 제..

Spring/jpa 2023.02.08

[JPA] 초기 세팅

자바 ORM 표준 JPA 프로그래밍이라는 책으로 공부를 하고 있는데 이 책에서는 h2 db에 maven을 사용하지만 나는 my sql과 gradle을 사용하려고 한다. 일단, 추후에 다른 프로젝트를 진행할 때 my sql로 진행할 확률이 높을 것 같아서 이 기회에 이걸로 익숙해지는 것이 좋을 것 같다는 생각이 들었고, 예전에 프로젝트 할 때도 my sql로 했어서 익숙하다. 또한, gradle을 사용하는 이유도 역시 익숙함이 크고.. 약간 구글링을 해보니 gradle이 더 최신이라고 해서 나쁘지 않다고 생각했다. 1. 인텔리제이에서 스프링 이니셜라이즈를 이용해 기본 세팅을 한다 1) 자바, gradle, jar 선택 2) 의존성에서는 spring data jpa, lombok, mysql driver, ..

Spring/jpa 2023.02.08

[JPA] 왜 JPA를 사용해야 하나?

1. 자바와 데이터베이스를 연결시키는 방법들 자바로 애플리케이션을 개발하고 관계형 데이터베이스를 데이터 저장소로 사용할 경우에 자바에서 사용되는 객체를 어떻게 잘 처리해서 관계형 데이터베이스에 집어넣어야 한다. 이 과정을 가능하게 하는 방법에는 다음과 같은 것들이 있다. 1) JDBC(Java Database Connectivity) 개념 자바에서(아래의 응용프로그램) 데이터베이스(아래의 DBMS)에 접속할 수 있도록 하는 자바 API(아래의 JDBC Interface) 특징 자바 애플리케이션에서 DBMS의 종류에 상관없이, 하나의 JDBC API를 이용해 DB 작업을 처리 각각의 DBMS는 이를 구현한 JDBC 드라이버를 제공한다 단점 간단한 SQL을 실행하는 데도 중복된 코드를 반복적으로 사용 Con..

Spring/jpa 2023.02.07