📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • 매핑하는데 필요한 (앞으로 알아볼) 애노테이션
  • @Entity
  • @Table
  • @Id
  • 식별자 선택 전략

Was this helpful?

  1. JPA 책

엔티티 매핑

JPA를 사용하는 이유는 엔티티(개체)와 테이블을 정확하게 매핑해서 객체 지향적으로 데이터 베이스에 접근하기 위해서이다.

여기서 엔티티란? - 우리가 알고 있는 그 실제, 객체라고 생각하면 될 듯 하다

매핑하는데 필요한 (앞으로 알아볼) 애노테이션

  • 객체와 테이블의 매핑 : @Entity, @Table

  • 기본 키(primary key) 매핑 : @Id

  • 필드와 컬럼 매핑 : @Column, @Transient

  • 연관관계 매핑 : @OneToMany, @JoinColumn

@Entity

JPA를 사용해서 객체와 테이블을 연동하기 위해서 가장 필수적으로 들어가야하는 애노테이션으로, 이것을 붙히면 자동으로 JPA에서 관리해준다.

기능 : JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용되어서 매핑되기 때문에 테이블명과 엔티티의 명을 잘 생각해서 처리해줘야 한다. ****

주의사항

  • 기본 생성자가 필수적으로 필요 → 파라미터가 없는 public, protected 생성자(@NoArgsConstructor)

    • 자바는 생성자가 없으면 자동으로 빈 생성자를 만들어주는데, 만약 따로 만들어진 생성자가 있다면 그냥 텅 빈 생성자를 만들어서 위의 조건에 맞춰주자!

  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다

  • 저장할 필드에 final은 사용할 수 없다

@Table

@Table은 엔티티와 매핑할 테이블을 지정하는 애노테이션이다. 옵션으로 만약 name = “이름값” 이렇게 해두면 매핑하고 싶은 엔티티 이름은 사용해서 매핑해주는데, 만약에 그냥 이 애노테이션만 붙힌다면 해당 class의 이름을 테이블의 이름으로 매핑해준다.

속성

  • name : 매핑할 테이블 이름

  • catalog : catalog 기능이 있는 데이터베이스에서 catalog을 매핑한다.

    • 데이터 베이스에서 catalog란 데이터 베이스에 있는 개체들에 대한 정의를 가지고 있는 메타 데이터들로 구성된 데이터 베이스 내의 인스턴스이다

  • schema : schema 기능이 있는 데이터 베이스에서 schema를 매핑한다.

  • uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마의 자동 생성 기능을 사용해서 DDL을 만들 때만 사용하고 이건 스키마를 자동으로 생성해주는 기능을 사용했을때만 적용되는 속성이다. 만약 직접 DDL을 만든다면 필요 없는 속성이겠다

    • Data Definition Language(데이터 정의어) : 테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어

      • CREATE, ALTER, DROP, RENAME, TRUNCATE

예제에 추가적으로 컬럼 타입들을 추가

  • @Enumerated : enum 타입을 컬럼으로 사용할 수 있음

    • 2가지 타입이 있음

      • EnumType.ORDINAL - enum의 순서 값을 저장, 이건 좀 그렇게 좋은 방법은 아닌 듯 함

      • EnumType.STRING - enum의 이름을 저장

  • @Temporal : 날짜 타입을 매핑해주는데, LocalDate이나 LocalDateTime을 사용한다면 생략할 수 있음

  • @Lob : 데이터 베이스에서 varchar보다 긴 데이터를 저장할 때 사용하고 매핑하는 필드 타입이 만약 문자라면 CLOB를 매핑해주고 나머지는 BLOB로 매핑

    • CLOB : String, char[]

    • BLOLB : byte[]

JPA에서 제공하는 데이터 베이스에서 스키마를 자동으로 생성하는 기능 추가하기

application.properties에

spring.jpa.hibernate.ddl-auto=create

이렇게 속성을 추가해주면, 애플리케이션 실행 시점에 데이터 베이스 테이블을 자동으로 생성한다.

이것을 보기 위해서는

spring.jpa.hibernate.show_sql=true

를 통해서 애플리케이션 실행 시, jpa에 의해 자동으로 생성되는 SQL을 확인할 수 있다.

ddl-auto 속성에는 몇 가지가 있음

  • create : 기존 테이블을 삭제하고 새로 생성(drop → create)

  • create-drop : create 속성에 추가로 애플리케이션을 종료할 떄 생성한 DDL을 제거한다(drop → create → drop)

  • update : 데이터 베이스 테이블과 엔티티 매핑 점보를 비교해서 변경 사항만 수정

  • validate : 데이터 베이스 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. 이 설정을 해두면 DDL을 수정하지 않는다

  • none : 자동 생성 기능을 사용하지 않으려면 hibernate.hbm2ddl.auto의 속성 자체를 삭제하거나 유효하지 않은 값은 옵션 값을 주면 된다.

  • 속성을 보면 예상할 수 있겠지만 개발 단계별로 중요한 속성 값들을 골라서 사용하면 된다.

    • 개발 단계에서는 create, update

    • 자동화 테스트 단계, CI서버에서는 create, created-drop

    • 테스트 서버에서는 update, validate

    • 스테이징과 운영에서는 none, validate

이름 매핑의 방식

자바에서 객체를 표시하는 방법은 Camel 케이스를 사용한다. camel케이스란 맨 앞에는 소문자로 시작해서 다른 단어로 바뀔 때 대문자로 바꾼다. roleType처럼

하지만 데이터 베이스에는 언더바를 사용해서 구분한다. role_type처럼

따라서 이렇게 구성했었다

@Column(name="role_type")
String roleType;

하지만 이렇게 매핑하는 것을 맞춰서 진행할수도 있지만 원하는 매핑 전략으로 수정할 수 있다. 물론 본인은 저 방식에 적응되어 있기 때문에 굳이 이렇게 할... 크흠 필요하면 hibernate improvednamingstrategy 으로 검색

@Id

해당 엔티티에 primary key(기본키)를 설정해주는 애노테이션

데이터 베이스에서 제공해주는 기본키 생성 전략에는 여러가지 있다.

  • 직접 할당 : 기본 키를 애플리케이션에서 직접 할당

  • 자동 생성 : 대리키 사용 방식

    • IDENTITY : 기본 키 생성을 데이터 베이스에 위임한다

    • SEQUENCE : 데이터 베이스의 시퀀스를 사용해서 기본 키를 할당

    • TABLE : 키 생성 테이블을 사용

기본 키 직접 할당

자바에서 @Id에 적용할 수 있는 타입들

자바 기본형, 자바 wrapper형, String, java.util.Date, java.sql.Date, java.math.BigDecimal, java.math.BigInteger

기본 키 자동 생성 - IDENTITY

기본 키의 생성을 데이터 베이스에게 위임한다는 의미이다.

예를 들어 insert할 당시에, 기본 키에 해당 하는 값이 안들어오면 데이터 베이스에서 알아서 값을 생성해서 삽입된다. 물론 이 부분에서 @GenerationValue 애노테이션을 사용해서 strategy 속성 값을 GenerationType.IDENTITY를 사용해서 설정을 해주어야 한다.

내부 동작은 먼저 엔티티를 데이터 베이스에 저장한 후에 식별자를 조회해서 엔티티의 식별자에 할당하는 방식

이걸 사용하면 JPA는 기본 키 값을 가져오기 위해서 데이터 베이스를 추가로 조회한다는 점!!!!!!

기본 키 자동 생성 - SEQUENCE

데이터 베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터 베이스 오브젝트이고 이것을 사용해서 기본 키를 생성하는 전략이다.

만약에 이걸 사용하기 위해서는 속성을 GenerationType.SEQUENCE로 처리해주고, generator를 따로 선언해서 설정을 해줘야한다.

이것의 내부 동작은 persist()를 호출할 때 먼저 데이터 베이스 시퀀스를 사용해서 식별자를 조회하고 조회한 식별자를 엔티티에 할당한 후에, 해당 엔티티를 영속성 컨텍스트에 저장한다.

@SequenceGenerator의 속성

  • name : 식별자 생성기 이름(필수값)

  • sequenceName : 데이터 베이스에 등록되어 있는 시퀀스 이름

  • initalValue : DDL 생성 시에만 사용되고, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정(기본값 1)

  • allocationSize : 시퀀스 한 번 호출에 증가하는 수이고 성능 최적화에 수치 조절(기본값 50)

    • 데이터 베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 반드시 1로 설정해야함

  • catalog, schema : 데이터 베이스 catalog, schema 이름

코드정의

public class DatePrefixedSequenceIdGenerator extends SequenceStyleGenerator {

    public static final String DATE_FORMAT_PARAMETER = "dateFormat";
    public static final String DATE_FORMAT_DEFAULT = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
    private String datePrefix;

    public static final String NUMBER_FORMAT_PARAMETER = "numberFormat";
    public static final String NUMBER_FORMAT_DEFAULT = "%07d";
    private String numberFormat;

    public static final String TIME_FORMAT_PARAMETER = "timeFormat";
    public String TIME_FORMAT_DEFAULT = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));
    private String timeFormat;

    private UUID uid;
    private String format;

    @Override
    public Serializable generate(SharedSessionContractImplementor session,
                                 Object object) throws HibernateException {
        return
                //prefix된 값을 넣어주는 방식
//                String.format(datePrefix, LocalDate.now())
//                +"_"+
//                String.format(timeFormat, super.generate(session, object))
                LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))
                        + "_" +
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))
                        + "_" +
                        String.format(numberFormat, super.generate(session, object));
    }

    @Override
    public void configure(Type type, Properties params,
                          ServiceRegistry serviceRegistry) throws MappingException {
        super.configure(LongType.INSTANCE, params, serviceRegistry);

        datePrefix = ConfigurationHelper.getString(DATE_FORMAT_PARAMETER,
                params, DATE_FORMAT_DEFAULT);
        numberFormat = ConfigurationHelper.getString(NUMBER_FORMAT_PARAMETER,
                params, NUMBER_FORMAT_DEFAULT);
        timeFormat = ConfigurationHelper.getString(TIME_FORMAT_PARAMETER,
                params, TIME_FORMAT_DEFAULT);

    }
}

사용

@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TestHistory {
    @Id
    @GeneratedValue(strategy= GenerationType.SEQUENCE, generator = "history_date_seq")
    @GenericGenerator(name="history_date_seq", strategy = "com.kona.tester.DatePrefixedSequenceIdGenerator")
    private String id;
    private String agencyName;
    private String testName;
    private String status;
    private String errMsg = "X";
}

테이블 전략 - 키 생성 전용 테이블을 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터 베이스 시퀀스를 흉내내는 전략

@TableGenerator를 사용해서 테이블 키 생성기를 등록

속성

  • name : 식별자 생성기 이름 (필수)

  • table : 키 생성 테이블 명

  • pkColumnName : 시퀀스 컬럼명

  • valueColumnName : 시퀀스 값 컬럼명

  • pkColumnValue : 키로 사용할 값 이름

  • initialValue : 초기 값, 마지막으로 생성된 값이 기준

  • allocationSize : 시퀀스 한 번 호출에 증가하는 수이고 성능 최적화에 수치 조절(기본값 50)

  • catalog, schema : 데이터 베이스 catalog, schema 이름

  • uniqueConstraints(DDL) : 유니크 제약 조건을 지정할 수 있다.

이 전략은 값을 조회하면서 select하고, 값 증가를 위해 update를하기 때문에 select를 2번이나 하는 단점이 있다.

식별자 선택 전략

기본 키는 이러한 조건들을 만족하는 속성을 가지고 있어야한다

  1. null값은 허용하지 않는다.

  2. 유일해야한다.

  3. 변해선 안된다.

필드와 컬럼의 매핑

필드와 컬럼을 매핑하는 애노테이션

  • @Column

  • @Enumerated

  • @Temporal

  • @Lob

  • @Transient

  • @Access

@Column은 개게 필드를 테이블 컬럼에 매핑하는 방식이다.

속성

  • name : 필드와 매핑할 테이블의 컬럼 이름

  • insertable : 엔티티 저장 시, 이 필드도 같이 저장한다. false로 설정하면 이 필드는 데이터베이스에 저장하지 않음 → false옵션은 읽기 전용일 때 사용(거의 사용X)

  • updatable : 엔티티 수정 시, 이 필드도 같이 수정한다. false로 설정하면 이 필드는 데이터베이스에서 수정하지 않음 → false옵션은 읽기 전용일 때 사용(거의 사용X)

  • table : 하나의 엔티티를 두 개 이상의 테이블에 매핑할 떄 사용

  • nullable : null 값의 허용 여부를 설정한다. false로 설정 시, DDL 생성 시 not null 제약조건이 붙음

    • 자바 기본 타입(int, long 등)에 @Column을 설정해주지 않는다면 not null이 붙어서 ddl이 생성됨

    • 객체타입(integer 등)에 @Column을 설정하지 않는다면 nullable로 ddl이 생성됨

    • 그래서 자바 기본 타입에 @Column을 설정해주면 nullable로 ddl이 생성된다는 것!

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

  • columnDefinistion : 데이터 베이스에서 컬럼의 정보를 직접 줄 수 있다 - 알아서 필드의 자바 타입과 데이터 베이스의 특징을 통해서 잘 설정된다!

  • length : 문자 길이 제약조건, String 타입에서만 사용하고 default값은 255

  • precision, scale : BigDecimal타입에서 사용하고 precision은 소수점을 포함한 모든 자리수를, scale은 소수의 자리수를 표시한다. 이 두 타입은 정말 특별한 경우에만 사용한다.

@Enumerated

이 애노테이션을 사용해서 편리하게 enum을 매핑할 수 있다.

EnumType.ORDINAL - enum에 정의된 값이 아니라 정의된 순서가 데이터 베이스에 저장된다.장점으로는 순서가 저장되기 때문에 데이터의 크기가 아주 작다는 점이지만 단점은 이미 저장된 enum의 순서를 바꿀 수 없다는 점이다.

EnumType.STRING - enum에 정의된 값 자체가 데이터 베이스에 저장된다. 장점은 enum에 값이 추가되거나 enum이 수정되어도 안전하다는 점이지만 단점은 데이터 베이스에 저장되는 데이터의 크기가 크다는 점이다.

@Temporal

이 애노테이션을 사용해서 날짜 타입(java.util.Date, java.util.Calendar)를 매핑할 때 사용

속성

  • TemporalType.TIME - 데이터 베이스 time 타입과 매핑(21:47:34)

  • TemporalType.TIMESTAMP - 날짜와 시간, 데이터 베이스 timestamp 타입과 매핑(2021-12-28 21:48:53)

@Lob

이 애노테이션을 사용해서 BLOB, CLOB와 매핑

@Transient

이 애노테이션이 붙어 있는 필드는 매핑하지 않는다. 그래서 데이터 베이스에 저장하지 않고 그냥 객체에서만 사용하고 싶은 필드에 붙힌다.

@Access

JPA가 엔티티 데이터에 접근하는 방식을 지정

  • 필드 접근 : AccessType.FIELD로 지정해서 필드에 직접 접근하고 필드 접근 권한이 private이어도 접근할 수 있다.

  • 프로퍼티 접근 : AccessType.PROPERTY로 지정하고 Getter를 사용

실습도 슬쩍 해보자!

Previous영속성 관리 개념Next실습 예제

Last updated 3 years ago

Was this helpful?

- 데이터 베이스 date 타입과 매핑(2021-12-28)

TemporalType.DATE