이번 글에서는 JPA를 사용하는데 가장 중요한 엔티티와 테이블을 매핑하는 작업을 해볼 것이다.
@Entity
JPA를 사용해서 테이블과 매핑할 클래스는 위 @Entity
어노테이션을 필수로 붙여야만 한다.
해당 어노테이션이 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 부르게된다.
속성
주의점
사용법
@Entity
public class Member {
public Member() {} // 기본 생성자 필수!!!
}
@Table
@Table 어노테이션은 엔티티와 매핑할 테이블을 지정할 때 쓰인다.
생략하게되면 엔티티 이름이 테이블 이름으로 사용한다.
속성
catalog, schema는 DB 서버 측에서 정의하는 nameSpace이다.
테이블 스키마 자동생성 기능 (DDL-auto)
JPA는 DB 스키마를 자동으로 생성하는 기능을 지원한다.
클래스의 매핑 정보를 보면 어떤 테이블에 어떤 컬럼을 사용하는지 알 수 있기에 이 매핑 정보와 데이터베이스 방언을 적절히 사용하여 스키마를 생성할 수 있다.
persistence.xml에 파일 안에 다음 내용을 추가하면 된다.
<property name="hibernate.hbm2ddl.auto" value="create"/>
<aside> 💡 알아두어야 할 점 & 주의 할 점 개발 혹은 테스트 환경이라면 상관없지만, DB 혹은 테이블을 통째로 지우고 생성하는 것은 큰 위험부담이 생긴다.
이에 따라서 개발 시에 위 기능을 적극적으로 활용하여 공부하고, 운영 시에는 사용하지 않거나 하더라도 validate, none으로 사용하자.
</aside>
제약조건 설정
@Entity
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
name = "AGE_UNIQUE",
columnNames = {"AGE"} )})
public class Memeber {
@Id @Column(name = "ID")
private String id;
@Column(name = "NAME", nullable = false, length = 10)
private String name;
}
@Id
@Id 어노테이션을 사용해서 Member의 기본키를 지정할 수 있다.
이와 같이 사용되는 기본 키의 값들이 생성되는 여러 전략들을 살펴보도록 하자.
@GeneratedValues
를 사용한다.
직접 할당
member.setId("id1");
처럼 일반적인 컬럼에 값을 넣을 때와 같다.IDENTITY - 자동 생성
예로 들자면 MySQL의 AUTO_INCREMENT가 있다.
@Id
@GeneratedValues(strategy = GenerationType.IDENTITY)
private Long Id;
-----------------------------------------------------
private static voic logic(EntityManager em){
Board board = new Board();
em.persist(board);
System.out.println(board.getId);
}
위와 같이 INDENTITY 전략을 사용할 수 있고, JPA는 기본 키 값을 얻어오기 위해 DB를 추가로 조회하게 된다.
그렇기에 위 코드에서 em.persist()
로 엔티티를 저장한 직후 .getId()
를 통해 출력하게 되어도 저장시점에서 JPA가 값을 조회하였기 때문에 정상적으로 출력된다.
시퀀스는 유일한 값을 순서대로 생성하는 특별한 DB 객체이다.
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
@Entity
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ",
initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
privat Long Id;
}
SEQUENCE 전략은 IDENTITY와 다르게 동작된다.
em.persist()
이후 무슨 일이 일어나는지 전략 별로 간단히 정리해보자.이렇게 엔티티와 데이터베이스 간 매핑하는 방법을 살펴보았다.
하지만 위 예제들에서는 항상 테이블이 한개 였기에, 다음에는 여러 테이블에 연관관계에 따라서 어떻게 매핑해야하는지 알아보도록 하자.
아래 내용은 매핑을 위한 어노테이션들을 정리함으로써 어떤 것들이 보기 위함이며, 깊게 생각하지는 말되 후에 사용할 때 참고하거나 더 깊게 정리해보는 것이 필요할 것 같다.