도입
지난 시간에는 JPA의 영속성 컨텍스트에 대하여 알아보았다. 영속성 컨텍스트는 JPA의 동작을 이해하기 위해 반드시 알아야할 부분으로 매우 중요한 내용이었다. 이번 시간도 JPA를 공부할 때 매우 중요한 부분을 알아보려고 한다. ORM은 객체로 RDB를 사용하는 기능을 제공한다고 하였다. JPA가 ORM으로 동작하기 위해서 객체와 테이블을 매핑해주어야 한다. 이번 시간에는 JPA로 어떻게 객체로 테이블을 매핑하는지 알아보도록 하겠다.
테이블 - 객체 연결 Annotation을 이용하자.
객체와 테이블을 매핑하기 위해서는 2개의 Annotation만 사용하면 된다. 클래스 하나당 하나의 테이블로 매핑을 시켜주어야 하므로 클래스에 @Entity를 붙여 주어야 한다. 그리고 어느 값이 키 값인지 알아내기 위하여 @Id도 반드시 있어야한다. 그 외에 @Table도 있는데 각각 간단히 알아보도록 하겠다.
@Entity
@Entity를 클래스에 붙여주어 JPA가 관리하는 엔티티로 설정해줄 수 있다. 테이블과 매핑을 하게될 경우 반드시 기본 생성자(Default)를 만들어주게 되어있다. 기본 생성자로 JPA에서 프록시와 같은 기능을 제공해주기 때문이다. 여기서 팁을 주면 lombok의 @NoArgsConstructor을 사용하면 기본 생성자를 쉽게 만들어 줄 수 있다.
@Id
@Entity가 붙어있는 클래스에는 반드시 @Id로 키값을 명시해 주어야 한다. @Id를 붙여줌으로써 Primary key를 설정해주는 역할을 수행해준다. 키 값을 넣어주는 전략은 @GeneratedValue를 사용하여 변경해줄 수 있으며 자동으로 DB에서 넣어주게 하는 전략도 있다.
@Table
JPA는 객체와 매핑을 할 때 항상 기본값으로 클래스의 이름과 테이블의 이름이 동일하게 매핑이된다. 만약 클래스의 이름과 다른 테이블의 이름을 사용한다면 @Table annotation을 사용하여 Table의 이름을 변경해줄 수 있다.
DB 스키마 자동 생성
DB에 데이터를 넣기 위해서는 DB에 스키마를 생성해주어야 한다. 따라서 DDL을 직접 입력하여 DB에 추가를 해주어야 한다. 이것을 자동으로 할 수 있는 방법이 있다. 설정파일에 hibernate,hbm2ddl.auto의 값을 세팅해 주는 방법이다. 세팅 값은 create, create-drop, update, validate가 있다.
create
create는 기존의 테이블을 drop하고 다시 생성하는 것이다. 애플리케이션이 실행되는 시점에 drop과 create가 일어난다.
create-drop
create와 동일하게 작업을 수행하지만, 차이점은 애플리케이션이 종료되는 직전에 drop을 시켜준다.
update
테이블에 추가적으로 추가된 칼럼만 DB에 alter를 통해 추가시켜준다. 만약 칼럼을 지워주었더라도 DB에서 지워주지는 않는다.
validate
엔티티와 테이블이 정상적으로 매핑이 되어있는지 확인하여주는 것이다. 만약 테이블과 클래스의 엔티티들이 서로 다르다면 에러메세지를 날려준다.
자동 생성을 써야할까?
ddl을 자동생성해주는 것은 가급적 사용하지 않는 것이 좋다. 자신이 로컬의 환경에서 개발을 하는 경우에는 ddl 자동생성을 사용해서 개발의 효율을 높일 수 있지만 여러 사람들이 함께 작업하는 테스트 서버와 같은 곳에서 사용을 하게 된다면, 다른 사람이 테스트를 위해 만든 스키마를 변경시키는 등의 문제점을 일으킬 수 있다. 운영서버에서 사용하게 되면 alter와 같은 것을 날려주며 서버에 장애를 일으킬 수 있다.
따라서 로컬에서 개발할 때 정도만 사용해주면 좋겠다.
이 글은 김영한님의 강의 "자바 ORM 표준 JPA 프로그래밍"를 공부한 후 작성한 글 입니다.
'Back-end > JPA' 카테고리의 다른 글
JPA 기본 키 매핑하기 (0) | 2022.01.12 |
---|---|
JPA로 필드와 칼럼 매핑하는 annotation 알아보기 (0) | 2022.01.10 |
JPA 영속성 컨텍스트란? (0) | 2022.01.03 |
JPA로 CRUD하기 (0) | 2021.12.30 |
JPA 프로젝트 설정(Maven, H2 DB) (0) | 2021.12.30 |