김영한님의 JPA 강의를 보고 정리한 내용입니다.
JPA에서 제일 중요하게 봐야 되는 두 가지 중 하나는 JPA가 내부적으로 어떤 매커니즘으로 동작하는지에 대한 매커니즘적인 측면과 객체와 관계형 데이터베이스를 어떻게 매핑을 해서 사용하는지에 대한 정적인 측면으로 나뉜다. 쉽게 말하면 영속성 컨텍스트와 엔티티 매핑의 두 가지로 나뉜다고 볼 수 있을 것 같다.
엔티티 매핑에는 다음과 같은 매핑 어노테이션이 있다.
@Entity@Table@Column@Id@ManyToOne@JoinColumn@Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. 해당 어노테이션이 붙지 않으면 JPA와는 전혀 관계없는 그냥 내가 마음대로 쓰고 싶은 클래스라고 볼 수 있다.@Entity가 필수이다.주의
- 기본 생성자 필수 (파라미터가 없는
public또는protected생성자)enum,interface,inner class,final class사용 불가- 저장할 필드에
final사용 불가
name@Table은 엔티티와 매핑할 테이블을 지정한다.namecatalogcatalog 매핑schemaschema 매핑uniqueConstraintspersistence.xml 설정 파일에 hibernate.hbm2ddl.auto의 값으로 아래의 속성을 적용한다. application.properties에 설정할 경우 spring.jpa.hibernate.ddl-auto로 설정할 수 있다.
애플리케이션 실행 -> drop -> create -> 애플리케이션 종료애플리케이션 실행 -> drop -> create -> drop -> 애플리케이션 종료alter table ... add column ...... (반영 X)필드 추가 -> 실행 -> 에러 발생 (엔티티와 테이블의 매핑 정보가 다름)value = "asdjfakjhdsfklj" 적는 것과 똑같지만 관례상 none으로 적는다.
persistence.xml과application.properties의 차이가 뭘까?
persistence.xml은 JPA가 사용하는 설정 파일인 반면,application.properties은 스프링 부트가 사용하는 설정 파일이다. 하지만persistence.xml을 따로 만들지 않고,application.properties에 설정해도 정상적으로 동작하는 이유는 스프링 부트가 내부에서 JPA를 만들 때persistence.xml이 없어도 동작하도록 구현되어 있기 때문이다. 따라서 스프링과 JPA를 함께 사용한다면application.properties을 사용하자.
create, create-drop, update 사용하면 안된다.create 또는 updateupdate 또는 validatenone결국 이런 웹 애플리케이션에서 사용하는 DBMS 계정은 alter나 drop을 못하도록 계정을 분리하는 것이 맞다.
데이터베이스 스키마 자동 생성과 다른 것이다. (내가 잘 몰랐던 내용이라 넣어봄)
@Column(nullable = false, length = 10)@Table(uniqueConstraints = {@UniqueConstraint(name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"})})@Column(unique = true)create, update, insert, delete 쿼리를 날리는 것과 관련있다.@Table의 name 속성을 바꾸면 JPA는 해당 name에 있는 테이블명에 create, update, insert, delete 쿼리를 날리기 때문에 런타임 기능에 영향을 준다고 한 것 같다.@Column의 속성값의 경우 DDL 생성이 켜져있을 때, 처음 애플리케이션 실행 시에만 DDL에서 작동할 뿐, JPA의 기능을 활용하는 런타임에서는 사용하지 않는다는 의미인 것 같다.