본문 바로가기

Spring&IntelliJ

JPA 객체와 테이블 매핑할때 사용되는 어노테이션1 (스키마 자동생성 옵션) @Entity, @Table


요약:

@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

자바의 클래스 이름과 DB의 테이블이름이 대소문자에 있어 차이가 있더라도 문제가 되지 않는다는 말

@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

 

\\
여기서의 스키마 자동 생성 옵션은 persistence.xml이나 application.yml파일 안의 설정 값을 말하는 것임.

기본적으로 클래스이름과 그와 맵핑되는 테이블의 이름은 대소문자가 다르더라도 이름만 같으면 @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제약 조건 생성시 사용하는 속성.  여기서 제약 조건이라는 것이 스키마 자동생성을 의미하는 것임.

이러한 properties.xml파일안에서의 설정 추가로 아래와 같이 프로그램이 시작되고 자동으로 테이블이 생성되는 쿼리를 DB에 날려주는 것을 볼수 있음.

 

 

(다만 스키마 자동 생성 기능을 사용하고 있을 경우(=persistence.xml파일에 관련 설정을 추가한 경우)에만 이 속성(uniqueConstraints)을 적용할 수 있습니다.)

스키마 자동생성 기능이란? 영속객체 정보를 이용하여 프로그램 시작할때 DDL을 생성하고 테이블을 생성해주는 기능
 DB에서 테이블을 만들거나, 변경하거나, 삭제하는 기능(DDL)을 영속객체의 정보를 가지고 JPA위에서 실행을 시켜주는 것입니다. 그렇다는 것은 곧 테이블을 자동 생성, 변경, 삭제가 가능하다는 의미입니다. 즉 기존에 내가 테이블을 직접 생성하여 프로젝트를 시작하는 것이 아닌 JPA만 있으면 DDL명령을 실행하여 자동으로 테이블을 생성할 수 있다는 의미입니다. 


이와같은 스키마 자동생성 기능은 운영환경이 아닌 로컬환경에서만 사용하는 것이 맞습니다. 왜? 운영환경에서 스키마가 자동생성이 된다면 운영중 큰 문제가 생길 수 있기 때문입니다. 따라서 로컬환경, 테스트 환경에서만 스키마 자동 생성 기능을 사용할 수 있습니다.