정의
JPA에서 사용되는 엔티티 클래스는 테이블과 매핑되는 클래스이다. 테이블에 대응하는 하나의 클래스
선언
***엔티티 클래스의 선언***은 XML 파일에 작성하는 방법과 Java 파일에 직접 애노테이션으로 작성하는 방법이 있다. 어노테이션이 읽기 편하다.
Entity Manager
엔티티를 관리하는 객체 매니저의 책임이 전부 영속성 엔티티의 CRUD에 관련
- 엔티티의 저장
- 엔티티의 수정
- 엔티티의 삭제
- 엔티티의 조회
특징
- 엔티티 매니저는 영속성 상태의 엔티티 관리를 위해 DB 세션과 밀접한 연관을 가지기 때문에,
- 여러 스레드에서 공유하여 사용하면 위험하다.
- 엔티티 매니저 팩토리로부터 엔티티 매니저 생성
- 각 스레드마다 엔티티 매니저를 생성하는 방식이 권장된다.
- 획득한 커넥션을 통해 엔티티 CRUD 관리
- 데이터베이스 연결이 필요한 시점까지 커넥션을 얻지 않는다.
- 엔티티 매니저는 DB의 커넥션 풀로부터 커넥션 획득
엔티티 어노테이션
@Entity
JPA의 클래스 이름을 테이블 이름으로 사용(JPA에서 Entity는 쿼리를 자동으로 맵핑)
@Entity public class TableName { ... }
@Table
클래스 이름과 테이블 이름이 다른경우 @Table 어노테이션을 사용해 테이블 이름을 지정
@Entity @Table(name="NewTableName") public class TableName { ... }
@Id
엔티티의 기본 키를 지정
@Entity @Table(name="NewTableName") public class TableName { @Id private String id; // 기본키 }
@GeneratedValue
기본 키 값에 대한 생성 전략 사양을 제공
@Entity @Table(name="NewTableName") public class TableName { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; // 기본키 }
IDENTITY 외에서 AUTO, SEQUENCE, TABLE 이 존재한다.
- Type 종류
- AUTO : DB 종류에 따라 JPA가 알맞은 것을 선택
- Oracle은 SEQUENCE , MySQL은 IDENTITY를 선택
- IDENTITY : 기본 키 생성을 데이터베이스에 위임
- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당
- TABLE : 키 생성 전용 테이블을 만들어서 sequence처럼 사용
- AUTO : DB 종류에 따라 JPA가 알맞은 것을 선택
@Basic
@Id 어노테이션을 제외한 나머지 대상에 사용, 생략된것으로 표기
@Entity @Table(name="NewTableName") public class TableName { @Id private String id; // 기본키 private String name; //@Basic 생략 }
@Enumerated
어노테이션으로 선언한 열거형을 DB로 저장할 때 어떤 값으로 저장할지 결정한다. ex)EnumType.STRING
public enum Level { Level1, Level2, Level3, Level4 } @Entity @Table(name="NewTableName") public class TableName { @Id private String id; @Enumerated(EnumType.STRING) private Level level; }
- 두 가지 EnumType이 존재하는데
- STRING은 level 필드에 "Level1, Level2, Level3, Level4"란 문자열이 저장될 것이다.
- ORDINAL은 인덱스가 저장된다.
Enumerated 어노테이션으로 데이터를 저장하는 방법은 추천하지 않는다. converter을 사용하는 것이 좋다.
@Column
프로퍼티의 이름과 테이블의 칼럼 이름이 다를경우 어노테이션을 지정 해줘야 한다. 같을 경우 생략 가능
@Entity @Table(name="NewTableName") public class TableName { @Id private String id; @Column(name="realName") private String name; }
@Access
@Transient
위 두 어노테이션은 https://dev-troh.tistory.com/151 참고
엔티티 매니저
find() method
- 영속 컨텍스트에서 엔티티를 검색하고 없을 경우 DB에서 데이터를 찾아 영속 컨텍스트에 저장
- 식별자는 Entity 클래스에서 @Id 애노테이션으로 지정한 값을 사용해야 합니다.
public find(Class entityClass, Object primaryKey)
persist() method
- 엔티티를 영속 컨텍스트에 저장 후 INSERT 쿼리를 실행한다
- 트랜잭션 범위 내에서 실행해야 합니다
- 실행시점에 영속 컨텍스트에 엔티티를 저장
- 트랜잭션을 commit() 하는 시점에 insert 쿼리가 실행
- 트랜잭션 범위에서 실행하지 않는다면 실제로 DB에 반영되지 않는다
- 트랜잭션 범위 내에서 실행해야 합니다
public void persist(Object entity)
remove() method
- 엔티티 클래스를 영속 컨텍스트에서 삭제 후 DELETE 쿼리를 실행
- 트랜잭션 범위 내에서 실행해야 합니다
- 트랜잭션이 commit() 하는 시점에 delete 쿼리가 실행
public void remove(Object entity)
엔티티 수정
- 별도의 update 메서드를 제공하지 않는다.
- JPA는 트랜잭션 범위에서 엔티티 객체의 상태가 변경되면 이를 트랜잭션 커밋 시점에 반영
엔티티 매니저 관리 도식화 그림
Reference
'Spring > Spring Boot' 카테고리의 다른 글
Spring boot Rebuild없이 정적소스(HTML,CSS,js) 적용방법 (0) | 2022.02.25 |
---|---|
JPA & PostgreSQL 연동 (0) | 2021.09.03 |
JPA의 Entity와 DTO를 구분하여 사용해야하는 이유 (0) | 2021.08.20 |
JPA(Java Persistence API)란 (0) | 2021.08.06 |
REST API (0) | 2021.07.23 |
댓글