JPA의 Entity
본문 바로가기
Spring/Spring Boot

JPA의 Entity

by IYK2h 2021. 8. 27.
728x90

정의

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처럼 사용

@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는 트랜잭션 범위에서 엔티티 객체의 상태가 변경되면 이를 트랜잭션 커밋 시점에 반영

엔티티 매니저 관리 도식화 그림

https://velog.io/@jayjay28/엔티티Entity

Reference

https://dev-troh.tistory.com/151

728x90

댓글