no image
[JPA] 엔티티 매핑
테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리하고, 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수이다. 엔티티 클래스에는 기본 생성자가 필수이다. final 클래스 enum,interface,inner클래스는 사용할 수 없다. 저장할 필드에 final을 사용하면 안됀다. @Entity 속성 -> name :JPA에서 사용할 엔티티 이름을 지정한다. 그러나 가급적이면 기본값을 사용한다. @Table은 엔티티와 매핑할 테이블을 지정한다. name : 매핑할 테이블 이름을 지정한다. catalog : 데이터베이스 catalog 매핑 schema : 데이터베이스 schema 매핑 uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약..
2021.09.10
no image
Querydsl 오류 (querydsl error cannot find symbol)
프로젝트를 진행하는 중 빌드 과정에서 querydsl error cannot find symbol라는 에러가 발생했다. 다른 블로그 등을 참고하면서 해결하는 방법을 찾았다. build/generated파일을 프로젝트 설정에 들어가서 Sources로 변경해주면 IDE가 해당 파일을 source로 인식해서 더 이상 오류를 반환하지 않습니다. ++가끔 밑에 사진처럼 build and run using이 gradle로 되어 있으면 오류를 뱉는 경우가 있다. ++만약 이 오류를 뱉는다면 build and run using와 run tests using을 인텔리제이로 변경해주면 해결될것이다.
2021.09.02
no image
[JPA]영속성 관리,영속성 컨텍스트
➡️Entity Manager Factory & Entity Manager Entity Manager Factory를 이용해서 Entity Manager 생성이 가능하다. Entity Manager Factory 는 비용이 많이 소요되기 때문에 하나의 애플리케이션에서 공유해서 사용이 가능하고, 멀티스레드에서도 동기화 처리를 통해 안전하게 사용이 가능하다. 하지만 Entity Manager는 여러 스레드에서 공유해서 사용되서는 안되기 때문에 스레드마다 Entity Manager를 생성할 필요가 있다. JPA Database 설정 properties 1 2 3 4 5 cs ➡️영속성 컨텍스트 JPA에서 가장 중요한 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻이다. 엔티티 매니저를 생성하면 영속성 ..
2021.07.19
no image
JPA(Java Persistence API)란?
💻JPA란? 자바 퍼시스턴스 API또는 자바 지속성 API(Java Persistence API, JPA)는 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다. 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다. 실제로 동작하는 것은 아니다 JPA인터페이스를 구현한 대표적인 오픈소스가 Hibernate이다. 과거의 자바 표준은 EJB였다.그러나 EJB를 사용하면 코드가 매우 지저분하고 속도가 느리다는 단점을 가지고 있었다. 👉ORM ( Object-relational mapping (객체 관계 매핑))은객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다. ORM 프레임워크가 중간에서 매핑해주고 대..
2021.06.23

[JPA] 엔티티 매핑

ryudjae
|2021. 9. 10. 00:36
728x90

테이블 매핑

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하고, 엔티티라고 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수이다.
  • 엔티티 클래스에는 기본 생성자가 필수이다.
  • final 클래스 enum,interface,inner클래스는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안됀다.

@Entity 속성

-> name :JPA에서 사용할 엔티티 이름을 지정한다. 그러나 가급적이면 기본값을 사용한다.

 

@Table은 엔티티와 매핑할 테이블을 지정한다.

  • name : 매핑할 테이블 이름을 지정한다.
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성 

데이터 베이스 스키마 자동생성 

DDL을 애플리케이션 실행 시점에 자동 생성

데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL생성

이렇게 생성된 DDL은 개발 장비에서만 사용한다.

 

데이터베이스 스키마 자동 생성 속성

hibernate.hbm2ddl.auto

  • create -> 기존 테이블 삭제 후 다시 생성 (DROP+ CREATE)
  • create-drop -> create와 같으나 종료시점에 테이블을 DROP한다.
  • update ->변경 부분만 반영
  • validate ->엔티티와 테이블이 정상 매핑되었는지만 확인 
  • none -> 사용하지 않음

자동생성 속성 crate ,create-drop,update는 운영쪽에서는 절대 사용하면 안된다.

개발초기 단계에만 create 또는 Update를 사용한다.

테스트 서버는 update 또는 Validate를 사용한다.

스테이징과 운영 서버는 Validate 또는 none을 사용한다.

 


DDL생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실제 로직에는 영향을 주지 않는다.

제약조건 추가

회원이름 필수,10자 초과 X

EX: @Collumn((nullable = false),length = 10)

 

728x90
728x90

프로젝트를 진행하는 중 빌드 과정에서 querydsl error cannot find symbol라는 에러가 발생했다. 다른 블로그 등을 참고하면서 해결하는 방법을 찾았다.

build/generated파일을 프로젝트 설정에 들어가서 Sources로 변경해주면 IDE가 해당 파일을 source로 인식해서 더 이상 오류를 반환하지 않습니다.

 

 

++가끔 밑에 사진처럼 build and run using이 gradle로 되어 있으면 오류를 뱉는 경우가 있다.

++만약 이 오류를 뱉는다면 build and run using와 run tests using을 인텔리제이로 변경해주면 해결될것이다.

728x90
728x90

➡️Entity Manager Factory & Entity Manager

 

 Entity Manager Factory를 이용해서 Entity Manager 생성이 가능하다. Entity Manager Factory 는 비용이 많이 소요되기 때문에 하나의 애플리케이션에서 공유해서 사용이 가능하고, 멀티스레드에서도 동기화 처리를 통해 안전하게 사용이 가능하다. 하지만 Entity Manager는 여러 스레드에서 공유해서 사용되서는 안되기 때문에 스레드마다 Entity Manager를 생성할 필요가 있다.

 

JPA Database 설정 properties

1
2
3
4
5
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test1"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
cs

➡️영속성 컨텍스트 

JPA에서 가장 중요한 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻이다. 엔티티 매니저를 생성하면 영속성 컨텍스트가 자동으로 생성되고, Entity Manager를 이용해서 영속성 컨텍스트에 엔티티를 보관/관리한다.

 

 

영속성 컨텍스트의 특징

  • 엔티티 매니저를 생성할 때 하나 만들어진다.
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다.

엔티티는 4가지 속성을 가지고 있다.

 

비영속(new/transient): 엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태를 비영속이라고 한다.

1
Member member = new Member();
cs

 

영속(managed): 영속성 컨텍스트에 관리되는 상태

1
em.persist(member);
cs


=> EntityManager.persist(entity);
    ->영속 상태가 된다고 바로 DB에 쿼리가 날라가지 않는다. (즉, DB 저장 X)
=> transaction.commit();
    ->트랜잭션의 commit 시점에 영속성 컨텍스트에 있는 정보들이 DB에 쿼리로 날라간다.

 

준영속(detached) : 영속성 컨텍스트 저장되었다가 분리된 상태

  • 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.식별자 값을 가지고 있다.

 

1
2
3
4
5
6
// 엔티티를 영속성 컨텍스트에서 분리해 준영속 상태로 만든다.
em.detach(member);
// 영속성 콘텍스트를 비워도 관리되던 엔티티는 준영속 상태가 된다.
em.claer();
// 영속성 콘텍스트를 종료해도 관리되던 엔티티는 준영속 상태가 된다.
em.close();
cs

삭제(removed):삭제된 상태

1
em.remove(member);
cs

 

➡️영속성 컨텍스트 특징

영속성 컨텍스트의 식별자 값

 => 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다.

영속성 컨텍스트와 데이터베이스 저장 

 =>JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터 베이스에 반영하는데 이를 flush라 한다.

 

1. 1차 캐시

 

영속성 컨텍스트 내부에는 캐시가 있는데 이를 1차 캐시라고 한다. 영속 상태의 엔티티를 이곳에 저장한다. 1차 캐시의 키는 식별자 값(데이터베이스의 기본 키)이고 값은 엔티티 인스턴스이다.

 

조회 

1
2
Member member = em.find(Member.class"member1");
 
cs

2. 동일성 보장

1
2
3
4
Member a = em.find(Member.class"member1");
Member b = em.find(Member.class"member1");
System.out.print(a==b) // true
 
cs

 

3. 트랜잭션을 지원하는 쓰기지연 

 

em.find(member)를 사용해 member를 저장해도 바로 INSERT SQL이 DB에 보내지는 것이 아니다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다. 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 DB에 보낸다. 이것을 트랜잭션을 지원하는 쓰기 지연이라 한다. 

 

4. 변경감지

 

JPA로 엔티티를 수정할 때는 단순히 엔티티를 조회해서 데이터를 변경하면 된다.

 

 

728x90
728x90

💻JPA란?

  • 자바 퍼시스턴스 API또는 자바 지속성 API(Java Persistence API, JPA)는 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
  • 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다.
  • 실제로 동작하는 것은 아니다
  • JPA인터페이스를 구현한 대표적인 오픈소스가 Hibernate이다.

  • 과거의 자바 표준은 EJB였다.그러나 EJB를 사용하면 코드가 매우 지저분하고 속도가 느리다는 단점을 가지고 있었다.

 

👉ORM

  • ( Object-relational mapping (객체 관계 매핑))은객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
  • ORM 프레임워크가 중간에서 매핑해주고 대중적인 언어에는 대부분 ORM 기술이 존재한다.
  • ORM은 객체와 RDB 두 기둥 위에 있는 기술 이다.


 

💻JPA 특징

  • 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성합니다. 보통 JDBC를 사용하여 개발을 하다보면 코드가 비슷한 형태로 반복되게 됩니다.
    DB커넥션을 구하고, 쿼리를 작성하고, 파라미터를 설정하고 실행한 결과를 자바 객체에 설정합니다. 
     여기서 문제점은 테이블의 컬럼명이 추가, 삭제, 변경이 된다면 관련되어 있는 모든 쿼리를 수정해야 할 것인데 JPA는 매핑 설정만 변경하면 됩니다. 
    또한 실행한 쿼리를 자바 객체에 설정해줘야하는데 JPA는 자바 객체로 매핑하여 검색할 수 있습니다. 즉 유지보수가 쉽습니다.

  • 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원합니다.

  • JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있습니다. 하지만 잘못이해하고 사용하는 JPA는 성능을 크게 감소시킬 수 있습니다.

📖JPA를 왜 사용해야 하는가?

1. SQL 중심적인 개발에서 객체 중심으로 개발

2. 생산성

  • JPA를 사용하는 것은 마치 Java Collection에 데이터를 넣었다 빼는 것처럼 사용할 수 있게 만든 것이다.
  • 간단한 CRUD
  • 저장: em.persist(member)
  • 조회: Member member = em.find(memberId)
  • 수정: member.setName("변경할 이름")
  • 삭제: em.remove(member)
  • 특히, 수정이 굉장히 간단하다.객체를 변경하면 그냥 알아서 DB에 UPDATE Query가 나간다
           

3. 유지보수

  • 기존: 필드 변경 시 모든 SQL을 수정해야 한다.
  • JPA: 필드만 추가하면 된다. SQL은 JPA가 처리하기 때문에 손댈 것이 없다.


🙉REFERENCE

 

 

 

 

 

728x90