엔티티 매핑 - DB 스키마 자동 생성

길셔·2022년 10월 10일
0

JPA

목록 보기
5/7

DB 스키마 자동 생성

  • DDL을 애플리케이션 실행 시점에 자동 생성
  • 테이블 중심 > 객체 중심
  • DB 방언을 활용해서 DB에 맞는 적절한 DDL 생성
  • 이렇게 생성된 DDL은 개발 장비에만 사용
  • 생산된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용
  • 속성
    • hibernate.hbm2ddl.auto
      • DB설정이 있는 xml에
      • property name=”hibernate.hbm2ddl.auto” value =”create”를 넣으면 됌

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

    • create-drop : create와 같으나 종료시점에 테이블 drop
      • 보통 test DB같은 경우에 사용하고 깔끔하게 지우기용

    • update : 변경분만 반영(운영DB에는 사용하면 안됌)
      • 컬럼을 추가하고 싶을 때 alter와 같음
        • 단, 추가는 되는데 삭제는 안됌

    • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인

    • none : 사용하지 않음
      • 관례상 none으로 작성하는거지 안적으면 된다.

    • 사용 시 주의 할 것
      • DB 방언에 따른 데이터 타입 확인
      • 운영 장비에는 절대 create, create-drop,update 사용하면 안된다.
      • 개발 초기 단계는 로컬 서버에 create or update 권장
      • 테스트 서버는 update or validate정도 권장
      • create는 절대 x (여러 사람과 테스트중 drop-create하면 데이터 다 날라감)
      • 스테이징과 운영 서버는 validate or none 권장
      • but, 개발 서버도 이 속성들 사용 권장 X

  • DDL 생성 기능
    • 제약조건 추가 : 회원 이름은 필수, 10자 초과 x
      • @Column(nullable = false, length=10)

    • 유니크 제약조건 추가
      • @Table(uniqueConstraints = {@UniqueConstraint(name=”NAME_AGE_UNIQUE”,columnNames=”NAME”,”AGE”} )})

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


필드와 컬럼 매핑

  • 매핑 어노테이션 정리

    • @Column : 컬럼 매핑 (제일 중요!)

      • 필드와 매핑할 테이블의 컬럼 이름 (기본값: 객체의 필드 이름)

      • insertable, updatable : 등록 변경 가능 여부(기본값 : true)
        • insert or update 시 데이터 변경 여부에 대한 체크

      • nullable(DDL) : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.

      • unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다.

      • columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다.( ex. = varchar(100) defalut ‘EMPTY’ )
        • 필드의 자바 타입과 방언 정보를 사용

      • length(DDL) : 문자 길이 제약조건, String 타입에만 사용한다. (기본값 : 255)

      • precision, scale(DDL) : BigDecimal 타입에서 사용한다.(BigInteger도 사용할 수 있다.)
        • precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다. 참고로 double,float 타입에는 적용되지 않는다. 정밀한 소수를 다루어야 할 때만 사용한다.

    • @Temporal : 날짜 타입 매핑

      • DATE : 날짜 ( date 타입과 매핑)
        • ex. TemporalType.Date

      • TIME : 시간 ( time 타입과 매핑)

      • TIMESTAMP : 날짜+시간 (timestamp 타입과 매핑)

      • Date와 같이 예전 형식에 사용

      • java8부터 지원하는 LocalDate, LocalDateTime을 사용할 때는 생략 가능

    • @Enumerated : enum 타입 매핑

      • 주의 사항
        • ORDINAL 사용 X
        • value(기본값 : ORDINAL) :
        • EnumType.ORDINAL : enum 순서를 DB에 저장
        • EnumType.STRING : enum 이름을 DB에 저장

    • Lob : BLOB, CLOB 타입과 매핑

      • @Lob에는 지정할 수 있는 속성이 없다.
      • 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
        • CLOB : String, char[],java.sql.CLOB
        • BLOC : byye[],java.sql.BLOB

    • Transient : 특정 필드를 컬럼에 매핑되고 싶지 않을때 사용

      • DB에 저장 X, 조회 X
      • 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
profile
까먹지말자

0개의 댓글