요약:
@Entity:이 어노테이션이 붙은 클래스는 영속객체로 관리되는 클래스임을 나타냄(구체적으로 클래스에 @Entity가 붙는것이 영속객체와 어떤 상관관계가 있는 것인가? 예를들어 em.find(Customer.class, "Id001")이라는 EntityManager의 함수find가 있을경우 이 함수는 주워진 매개변수를 이용하여 Entity객체를 생성, 반환해야 한다. 당연히 매개변수와 관계된 데이터는 DB에 있었다는 말이고 특정 레코드에 있는 데이터를 이용해서 객체를 만드는 것이니 객체의 클래스는 그 데이터에 대응하는 생성자가 필요한 것이다. 따라서 클래스 자체에 @Entity라는 어노테이션을 붙여서 모든 필드정보와 생성자 정보를 제공하게 하여 생성된 객체가 영속성 컨텍스트에 의해 관리받는 영속객체가 되게 한다. 이러한 용도로 @Entity어노테이션이 필요한 것이다.
@Table: 영속객체와 테이블의 관계를 좀더 명확히 해주는데 쓰이는 어노테이션(@Entity와 같은 기능)
@Table어노테이션의 옵션인 uniqueConstraints: unique제약 조건 생성시 사용하는 속성. 다만 스키마 자동 생성 기능을 사용하고 있을 경우에만 이 속성을 적용할 수 있음.
출처: https://www.youtube.com/watch?v=MdcTHctpy5E
1.@Entity
@Entity어노테이션이 붙은 클래스는 영속객체로 관리되는 클래스임을 나타냄.
어떠한 클래스를 영속객체로 지정할 때 주의할 사항
1. Default 생성자가 있어야 함. 이유는 매우 단순하고 당연함. JPA(Hibernate)가 @Entity로 지정된 객체를 new하는 상황이 빈번하게 발생함.
좀더 구체적으로, JPA가 DB의 특정데이터를 가져옴 => 영속객체를new로 생성함 => DB에서 가져온 특정데이터를 new로 생성자를 호출하여 맵핑하여(set을 통해 데이터를 객체의 변수에 맵핑하는것) 객체를 만들어서 반환 되어야함. 즉, JPA가 @Entity어노테이션이 붙은 객체를 생성할 수 있는 방법이 마련되어 있어야 하므로 default생성자가 반드시 필요한 것임.
Final Class, Inner Class, 열거형, Interface는 영속객체가 될수 없습니다. 또한 영속객체의 필드에는 final키워드를 사용하지 않습니다. 그 이유는 해당 필드에 데이터를 set해야 하는데 해당 필드가 final인 경우 set할 수가 없기 때문.
이 사항들이 지켜지지 않았을 경우 프로그램이 돌아가는데는 문제가 없지만 JPA에서 영속객체가 만들어지고 데이터를 set하는 과정에서 오류가 발생할 수 있습니다.
2.@Table
영속객체와 테이블의 관계를 명확히 해주는데 쓰이는 어노테이션@Table
기본적으로 클래스이름과 그와 맵핑되는 테이블의 이름은 대소문자가 다르더라도 이름만 같으면 @Entity어노테이션으로 자동 맵핑됨. 하지만 맵핑시키고자 하는 테이블과 클래스의 이름이 다를 경우 @Table어노테이션의 속성name에 맵핑시키고자 하는 테이블이름을 주면됨.
데이터베이스가 다중 schema환경일때 schema 속성을 통해 특정 스키마를 지정해 줄수 있음.
@Table어노테이션의 옵션으로 uniqueConstraints라는 것이 있지만 스키마 자동생성기능을 사용하기 위해서는 persistence.xml(Gradle일 경우 application.yml)파일에 따로 설정을 추가해 주어야 하는 것같음(확실치 않음)
<property name="hibernate.hbm2ddl.auto" value="create"/>
jpa.hibernate.ddl-auto: create
uniqueConstraints: unique제약 조건 생성시 사용하는 속성. 여기서 제약 조건이라는 것이 스키마 자동생성을 의미하는 것임.
(다만 스키마 자동 생성 기능을 사용하고 있을 경우(=persistence.xml파일에 관련 설정을 추가한 경우)에만 이 속성(uniqueConstraints)을 적용할 수 있습니다.)
스키마 자동생성 기능이란? 영속객체 정보를 이용하여 프로그램 시작할때 DDL을 생성하고 테이블을 생성해주는 기능
DB에서 테이블을 만들거나, 변경하거나, 삭제하는 기능(DDL)을 영속객체의 정보를 가지고 JPA위에서 실행을 시켜주는 것입니다. 그렇다는 것은 곧 테이블을 자동 생성, 변경, 삭제가 가능하다는 의미입니다. 즉 기존에 내가 테이블을 직접 생성하여 프로젝트를 시작하는 것이 아닌 JPA만 있으면 DDL명령을 실행하여 자동으로 테이블을 생성할 수 있다는 의미입니다.
이와같은 스키마 자동생성 기능은 운영환경이 아닌 로컬환경에서만 사용하는 것이 맞습니다. 왜? 운영환경에서 스키마가 자동생성이 된다면 운영중 큰 문제가 생길 수 있기 때문입니다. 따라서 로컬환경, 테스트 환경에서만 스키마 자동 생성 기능을 사용할 수 있습니다.
'Spring&IntelliJ' 카테고리의 다른 글
JPA (ORM매핑에 관해서)객체의 세상과 테이블의 세상(Feat. Persistence Framework) (0) | 2024.01.01 |
---|---|
JPA 객체와 테이블 매핑할때 사용되는 어노테이션2 @Id, @Access (0) | 2024.01.01 |
CQS(Command Query Separation)에 대해서 (0) | 2023.12.28 |
@PersistenceContext와 EntityManager, 그리고 영속성(Persistence) (0) | 2023.12.28 |
DB 컨넥션 풀과 Hikari Connection pool 에 대해서 (1) | 2023.12.28 |