본문 바로가기
JPA

자바 ORM 표준 JPA 프로그래밍 - 엔티티와 테이블 생성

by 임동무 2023. 2. 15.

JPA 에서는 엔티티라는 개념을 사용한다.

이는 '데이터 모델링에 사용되는 객체' 라고 이해하면 된다.

 

- 엔티티 선언

JPA 에서 엔티티를 사용할 때는 @Entity 어노테이션을 통해 해당 클래스를 엔티티로 설정할 수 있다.

@Entity
public class Team {

    @Id @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    
    private String name;
}

위의 코드에서 Team 이라는 클래스는 @Entity 어노테이션을 통해

'이 객체는 데이터 모델링에 사용되는 객체야' 라고 말해주는 것이다.

 

엔티티에는 Id 가 필요하다. Id 는 식별자로 테이블에서의 기본키를 매핑해주는 것이다. 

또한 @GeneratedValue 어노테이션은 생성을 위임하는 어노테이션으로 Id 값이 자동으로 생성되도록 설정하는 것이다.

 

하지만 @Table 어노테이션을 붙일 경우에는 테이블명, 제약조건 등을 옵션을 통해 설정할 수 있다.

(@Entity 와 @Table 을 통해 객체와 테이블을 매핑해주지만, @Table 을 생략하는 경우 Entity 의 클래스 명이 테이블명으로 설정되며 매핑이 된다.)

 

이 외의 변수들은 테이블의 컬럼으로 추가된다.

Long 타입의 id 처럼 @Column 을 명시해주거나 혹은 이에 옵션을 더해 이름 설정 등을 할 수 있으며 

String 타입의 name 처럼 @Column 을 명시해주지 않는 경우, 변수명이 자동으로 컬럼명이 된다.

(자세한 것은 다음 포스팅..)

 

 

- 생성자

JAVA 에서 클래스의 생성자를 생성하지 않는 경우에는 default 생성자 (빈 생성자) 가 있다는 것을 알 것이다.

하지만, 생성자를 추가한 경우 JPA 를 사용할 떄에는 반드시 default 생성자를 추가해주어야 한다. 이는 JPA의 라이브러리에서 default 생성자를 필요로 하기 때문이며 생성자를 추가하지 않은 경우에는 상관없지만 생성자를 추가한 경우에는 꼭! default 생성자를 추가해주어야 한다.

 

 

- 엔티티 사용

JPA 를 사용할 때, 어플리케이션을 실행하면 엔티티를 기준으로 JPA 는 각 데이터베이스의 방언을 적절하게 사용하여 DDL 을 생성하고 이 DDL 을 통해 데이터베이스 스키마를 자동으로 생성해준다.

이 기능은 옵션에 따라 달라지는데

 

Gradle 을 사용한다면 .yml 파일에서

Maven 을 사용한다면 persistence.xml 파일에서

이 옵션을 확인할 수 있다.

 

<property name="hibernate.hbm2ddl.auto" value="create" />

나의 프로젝트는 Maven 이고, 이를 바탕으로 보면 위의 옵션에서 이를 확인할 수 있다.

 

value 값에 옵션을 넣을 수 있으며 옵션으로는

1. create

2. create-drop

3. update

4. validate

5. none

이 있다.

 

1. create

create 옵션은 어플리케이션 실행 시점에 DDL 을 기반으로 모든 테이블을 새로 생성한다.

그래서 어플리케이션을 실행할 때, 기존에 존재하는 테이블( 현재 어플리케이션에서 생성하려는 테이블 중에서만 )을 삭제하는 쿼리가 날라가며 해당 테이블을 다시 새로 생성한다. 기존에 존재하지 않는다면 그냥 생성한다.

 

2. create-drop

create-drop 옵션은 어플리케이션을 실행할 때는 create 와 동일하게 동작하며 어플리케이션 종료 시에 이 때 생성된 모든 테이블을 다시 drop 한다.

 

3. update

update 옵션은 어플리케이션 실행할 때, 변경사항만 수정하는 방식으로 동작한다.

 

4. validate

validate 옵션은 어플리케이션을 실행할 때, 현재 테이블관계와 엔티티 관계간의 정합성을 확인한다. 만약 동일하지 않다면 오류를 발생시킨다.

 

5. none

none 옵션은 말 그대로 아무것도 설정하지 않는 것이다. ddl 을 생성해주지 않는다.

 

- 옵션 사용

 

개발 초기 단계에서는 create/update

테스트 서버에서는 update/validate 를 주로 사용한다.

테스트서버에서 여러 개발자가 사용하는 경우 create 로 설정되었다면 서로다른 개발자들이 실행할 때마다 테이블이 삭제 후 재생성 되기 때문이다.

이후 스테이징과 운영 서버에서는 절대 create, create-drop, update 를 사용하면 안되며 validate 또는 none 을 사용해야 한다.

즉, 로컬서버에서만 자유롭게 사용을 권장하며 스테이징 및 운영 서버에서는 스크립트를 직접 짜서 테스트 후에 적용하는 것을 추천한다. 

댓글