[JPA] 엔티티(entity) 개념
엔티티
- DB에서 영속적으로 저장된 데이터를 자바 객체로 매핑해 '인스턴스 형태'로 존재하는 데이터를 말함.
- 테이블에 대응하는 하나의 클래스
- 엔티티로 만들고 싶은 클래스에 @Entity 어노테이션을 붙혀주면 된다.
만약 Database에 다음과 같은 테이블이 있다고 가정하자
Table
username | password |
jieun | 1234 |
jin | 1111 |
spring-boot-starter-data-jpa 의존성을 추가하고
자바 클래스에 @Entity 어노테이션을 붙히면
테이블 - 자바 클래스가 매핑이 된다.
@Entity
public class Account{
String username;
String password;
}
즉 JPA에서 하나의 엔티티 타입을 생성한다는 것은 하나의 클래스를 작성한다는 의미가 됨
* 주의할점 *
1) 기본 생성자를 필수로 작성해야함 (public or protected)
▶ JPA를 구현해 쓰는 라이브러리들이 Reflection을 사용하는 경우가 있기 때문에
2) @Entity 어노테이션을 final, enum, interface, inner 클래스에 사용할 수 없다.
3) Db에 저장할 필드에는 final 키워드를 작성하면 안된다.
엔티티 매니저
- 엔티티 객체들을 관리(life cycle)하는 역할
- 엔티티 매니저는 관리하는 엔티티 객체를 영속 컨텍스트(Persistence Context)에 넣어두고, 객체의 생사를 관리 함.
영속 컨텍스트
- JPA가 엔티티 객체들을 모아두는 공간
이름 | 의미 | 설명 |
New | 비영속 | - Java 영역에만 존재 - DB와 연동된적 없는 상태 - 순수한 Java 객체, 엔티티 매니저가 관리 x |
Managed | 영속 | - DB에 저장되고 메모리상에서도 같은 상태로 존재함. - PK값을 통해 필요한 엔티티 객체를 꺼내 사용할 수 있음 |
Removed | 삭제 | - DB상에서 삭제된 상태 - 삭제된 객체는 영속 콘텍스트에 존재하지 않음. |
Detached | 준영속 | - 영속 컨텍스트에서 엔티티 객체를 꺼내서 사용하는 상태 - 아직 DB와 동기화가 이루어지지 않은 상태 |
엔티티 클래스 설계
JPA는 자동으로 테이블을 생성하는 기능을 갖고 있어서 다음과 같은 방식을 사용할 수 있다.
1) SQL을 이용해 테이블을 먼저 생성 후 엔티티 클래스를 만드는 방식
2) JPA를 이용해 클래스만 설계하고 자동으로 테이블 생성하는 방식
설계 과정
1) 객체지향의 설계대로 클래스들을 설계함
2) @Id, @Column을 이용해 각종 제약 조건을 추가, 설정
3) 엔티티간 연관관계를 설정함.
관련 어노테이션
https://www.techferry.com/articles/hibernate-jpa-annotations.html
@Id
- 해당 컬럼이 식별키(PK)라는 것을 의미함
- 모든 엔티티에 반드시 @Id를 지정해야함
@Column
- 인스턴스 변수가 컬럼이 되기 때문에, 컬럼명을 별도로 지정하거나 컬럼의 사이즈/제약조건들을 추가하기 위해 사용
@Table
- 클래스가 테이블이 되기 떄문에 클래스 선언부에 작성
- 테이블명 결정
- 지정 안할 경우, 클래스명으로 테이블이 생성 됨
@Entity
- 해당 클래스의 인스턴스들이 엔티티임을 명시함
출처
https://seongwon.dev/Spring/20220823-JPA-%EC%97%94%ED%8B%B0%ED%8B%B0%EB%A7%A4%ED%95%91/
https://velog.io/@jayjay28/%EC%97%94%ED%8B%B0%ED%8B%B0Entity
나중에 엔티티 매핑 코드 관련해서도 글을써야겠다.