대충 넘어가지 않는 습관을 위한 기록

JPA 기록 - 엔티티 매핑 : ddl-auto, 필드와 컬럼 매핑

uhyvn 2024. 4. 5. 11:54

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 보고 기록한 글입니다.

 


 

데이터베이스 스키마 자동 생성 (ddl-auto)

 

- DDL을 애플리케이션 실행 시점에 자동 생성

- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성

- 이렇게 생성된 DDL은 개발 장비에서만 사용

- 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용

 

 


 

 

데이터베이스 스키마 자동 생성 - 속성

 

- create : 기존테이블 삭제 후 다시 생성 (DROP + CREATE)

- create-drop : create와 같으나 종료시점에 테이블 DROP

- update : 변경분만 반영 (컬럼 삭제는 불가능)

- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인 (정상이 아니라면 실행 에러)

- none : 사용하지 않음

 

 

--->

데이터베이스 스키마 자동 생성 - 주의

- 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.

- 개발 초기 단계는 create 또는 update로 사용 가능

- 테스트 서버는 update 또는 validate로 사용 가능

- 스테이징과 운영 서버는 validate 또는 none

 

그러나 로컬을 제외한 개발 서버, 테스트 서버 등 모두 사용하지 않는 것이 좋다.

굳이 사용한다면 validate정도..

 

update는 될 수도 있을 것 같은데 왜 안되냐?

alter가 나갈 수 있는데, 그럼 그 순간 데이터베이스 락이 걸린다..!

 

모든 스크립트를 시스템이 자동으로 쳐준다고 할 때(create나 update와 같이), 조금이라도 올바르지 않은 스크립트가 자동으로 적용된다면 시스템이 중단되는 사고가 일어날 수 있다.

그래서 직접 스크립트를 작성하고 테스트 DB에 검증을 해보고 관리해야 한다.

 

- 꿀팁 : 하나씩 다 작성하지 않고, 로컬에서 자동 생성으로 나오는 스크립트를 토대로 다듬어서 작성하면 시간 단축 가능!

 

 


 

 

 

매핑 어노테이션 정리

- @Column : 컬럼 매핑

- @Temporal : 날짜 타입 매핑

- @Enumerated : enum 타입 매핑

- @Lob : BLOB, CLOB 매핑 (varchar보다 많은 데이터)

- @Transient : DB에 저장하지 않고 메모리에서만 사용할 수 있게 함

 

 


 

 

@Column

name 필드와 매핑할 테이블의 컬럼 이름
insertable, updatable 등록, 변경 가능 여부
nullable(DDL) null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.
unique(DDL) @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다.
columnDefinition(DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있다.
ex) varchar(100) default 'EMPTY'
length(DDL) 문자 길이 제약조건, String 타입에만 사용한다.
precision, scale(DDL) BigDecimal 타입에서 사용한다 (BigInteger도 사용 가능)
precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다.
참고로 double, float 타입에는 적용되지 않는다.
아주 큰 숫자와 정밀한 소수를 다루어야 할 때만 사용한다.

 

 

 

@Enumerated

- 자바 enum 타입을 매핑할 때 사용

주의! ORDINAL 사용 X

-> enum값이 추가됐을 경우, 순서가 보장안됨.

 

value

- EnumType.ORDINAL : enum 순서를 데이터베이스에 Integer로 저장 (0,1,2,3, ...)

- EnumType.STRING : enum 이름을 데이터베이스에 저장

 

기본값 : ORDINAL

 

 

 

 

 

@Temporal

참고 : LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)

 

- 날짜 타입(java.util.Date, Calendar)을 매핑할 때 사용

 

value

- TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (예: 2013-10-11)

- TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (예: 11:11:11)

- TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (예: 2013-10-11 11:11:11)

 

 

 

 

 

@Lob

- 데이터베이스 BLOB, CLOB 타입과 매핑

- @Lob에는 지정할 수 있는 속성이 없다.

- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑

    - CLOB : String, char[], java.sql.CLOB

    - BLOB : byte[], java.sql.BLOB

 

 

 

 

 

@Transient

- 필드 매핑 X

- 데이터베이스에 저장 X, 조회 X

- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용

@Transient
private Integer temp;