Per ardua ad astra !
I'm On My Way
Per ardua ad astra !
전체 방문자
오늘
어제
  • 분류 전체보기 (126)
    • Algorithm (50)
      • 백준 (30)
      • SWEA (3)
      • JUNGOL (3)
      • Programmers (5)
      • LeetCode (2)
    • 안드로이드 개발 (6)
      • Java로 개발 (0)
      • Kotlin으로 개발 (3)
    • Spring (41)
      • Spring기본 (17)
      • JPA기본 (15)
      • JPA활용 SpringBoot 기본 (9)
      • API 개발 기본 (0)
    • 네트워크 (3)
    • 운영체제 (0)
    • Life (3)
      • 책 (0)
      • 자기계발 (1)
      • 일상 (2)
    • 노마드코더 (3)
      • python으로 웹 스크래퍼 만들기 (3)
    • 프로그래밍 언어 (17)
      • Java 기본 (2)
      • 코틀린 기본 (15)

블로그 메뉴

  • 홈
  • 방명록

인기 글

hELLO · Designed By 정상우.
Per ardua ad astra !

I'm On My Way

Spring/JPA기본

자동 DDL 쿼리생성, 엔티티 매핑을 위한 기본키, 콜롬 어노테이션

2021. 7. 12. 11:14

자동 DDL 쿼리 생성

 

JPA에는 설정한대로 자동으로 DDL 쿼리를 짤 수 있도록 설정할 수 있다.

 

사용 방법

persistence.xml에 
<property name="hibernate.hbm2ddl.auto" value="create" />을 추가하면 된다.

 

value = "create"일 때 작동 방식
1. drop table if exists - 기존에 table존재하면 삭제
2. create table Member... - 테이블 생성

 

create가 아닌 다른 값인 경우
value:
- "create-drop": create처럼 생성하고 종료시점엔 table drop
- "update": 변경분만 반영(sql의 alter 명령어와 같음)
- "validate": 엔티티와 테이블이 정상적으로 매핑되었는지만 확인
- "none": 사용하지 않음

 

사용 편의와 로직


-> 애플리 케이션 로딩시점에 설정한 Dialect DB에 따라 DDL 생성이 가능하다. 
-> DDL을 애플리케이션 실행시점에 자동생성 가능
-> 단, 이렇게 생성된 DDL은 개발장비에서만 사용
-> 테이블 중심 -> 객체 중심
-> DDL은 운영서버에서는 사용하지 않거나 적절히 다듬은 후 사용

주의: create, create-drop, update는 운영장비에 절대 쓰면 안된다. 개발 초기단계에는 create, update 가능, 테스트 서버에서는 update와 validate 가능 -> 그러나, 절대 create 사용하면 안됨 그럼 데이터 싹다날라감. 그 이후는 거의 쓰지말길 권고 

 

익셉션:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" already exists; SQL statement:

만약 value="create"로 설정햇는데 계속 이런 에러가 발생한다면 

https://www.inflearn.com/questions/17219 링크를 참조해서 해결해도 되고, 근본적인 해결이 어렵다면 H2 SQL에서

DROP TABLE ITEMS CASCADE;
DROP TABLE MEMBERS CASCADE;
DROP TABLE ORDERITEMS CASCADE;
DROP TABLE ORDERS CASCADE;

를 직접 입력하여 삭제하는 것이 편하다. 설정한대로 drop table을 할 때 연관된 외부키 Constraints가 있어서 삭제가 안되서 익셉션이 발생하는 것 같은데, 이럴경우 H2에서 직접 cascade로 연관된 Constraints까지 다 삭제하는 것이 깔끔하다 생각한다.  

 

(2021.07.17 수정!!! : hibernate 버전을 5.4.13.Final으로 H2 데이터베이스의 버전을 1.4.199로 설정하니 해결되었다.)

 

필드와 컬럼 매핑

 

@Column 어노테이션(DB 속성에 조건을 추가)과 속성 

 

@Column(name = "USERNAME") 
@Column(nullable = true, updatable = true)  => 자주쓰임
@Column(unique = true)  => 잘 안쓰임. 왜냐 Constraint명이 너무 복잡스럽게 생성되기 때문에
=> @Table(uniqueConstraints = "제약명") 선호
@Column(length = 10) 
@Column(ColumnDefinition = "varchar(100) default 'EMPTY'")

 

컬럼의 속성에 따른 기능은 sql의 지식이 어느정도 있다면 다 이해할 수 있을 것이라고 판단한다.

 

 

@Enumerated

열거형 자료형인 경우 사용, 열거형 자료형은 서로 관련있는 상수들기리 모아 상수를 정의하는 것으로 생각하면 됨. 예를들면 성적-> A(에이), B(비), C(C) 같은 경우
참고:https://mine-it-record.tistory.com/204

@Enumerated(EnumTyoe.ORDINAL): enum의 인덱스 번호를 DB에 저장(integer)
@Enumerated(EnumType.STRING): enum 이름을 DB에 저장(String)
=> 보통은 메모리 조금 써서 String으로 쓰는 것이 낫다. 왜냐하면 Ordinal 했다가 열거형 데이터가 추가되어 순서가 뒤죽박죽 되었을 때의 위험이 너무 크기 때문이다.


@Temporal

LocalDate, LocalDateTime 자료형을 쓰는 경우는 따로 어노테이션 붙일 필요가 없음
temporal은 시간의 라는 형용사, 시간관련 Date 자료형을 사용하는 경우 사용


@Lob

자료형이 String이면 BLOB, 나머지는 CLOB 자료형의 Column으로 매핑
lob 뜻: 구조화되지 않은 용량이 큰 데이터를 저장할 수 있는 데이터 타입이라고 한다. 

따로 속성은 없다.

 

@Transient

Transient: 일시적인 순간적인
이 어노테이션이 붙은 필드는 DB의 Column으로 사용되지 않음
개발자가 db의 column에 따로 저장하지 않고 계산을 한다던가  일시적으로 사용하고 싶은 변수일 때 사용 

DDL 자동 생성할 때만 실행되고 JPA 실행 로직에는 영향을 주지 않는다.



기본 키 매핑

    • @Id  => Java단에서 키로 지정할 콜럼을 직접 지정하는 것이다. 
    • @GeneratedValue => 기본키를 어떻게 만들 것인가 ?

      @GeneratedValue(strategy = "GenerationType.XXX") 의 strategy속성 값에 따른 기본키 특성파악

      1.
      IDENTITY (나는 모르겠고 DB니가 알아서 해줘)
      -> DB에 기본키 특성 위임 

      ex) MySQL의 AUTO_INCREMENT-> commit 이후에 Insert SQL 쿼리를 날린 후에 ID값을 알 수 있다.

      2. Sequence
       (DB의 시퀸스 오브젝트 사용, Oracle)
      -> 시퀸스 제너레이터를 만들어서 명칭을 정할 수 있음 (@SquenceGenerator 필요)


      3. Table (키 생성용 테이블을 만듬, 모든 DB 가능)-> 똑같이 @TableGenerator로 만들 수 있음

      4. Auto
      (DB 종류와 Dialect에 따라 자동 지정, 기본값임)

 

이 게시물은 '자바 ORM 표준 JPA 프로그래밍' 강의를 수강하고 정리한 내용임을 밝힙니다. 
출처: https://www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com

 

    'Spring/JPA기본' 카테고리의 다른 글
    • 상속 관계 매핑 (Inheritance), 정보 상속(MappedSuperclass)
    • 연관관계 매핑 기초(단방향, 양방향), 다양한 연결관계 매핑
    • JPA 시작
    • JPA란? JPA 장점, JPA 프로젝트 설정
    Per ardua ad astra !
    Per ardua ad astra !
    개발자 지망생이며 열심히 공부하고 기억하기 위한 블로그입니다.

    티스토리툴바