본문 바로가기

Spring/JPA

JPA 필드와 칼럼 매핑

필드와 컬럼 매핑

데이터베이스 스키마 자동 생성하기

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

(JPA 통해서 직접 테이블 만들 수 있다)

-테이블 중심 → 객체 중심

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

-이렇게 생성된 DDL은 개발 장비에서만 사용 (운영에서 JPA가 테이블 드랍하고, 만들고? 큰일 날 지도.)

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

데이터베이스 스키마 자동 생성하기

-hibernate.hbm2ddl.auto create: 기존 테이블 삭제 후 다시 생성 (DROP + CREATE)(운영x) create-dorop: create와 같으나 종료시점에서 테이블 DROP(운영x) update: 변경분만 반영(운영x) validate: 엔티티와 테이블 정상 매핑되었는지만 확인 (개발 단계에서 쓰는 것도 뭐..) none: 사용하지 않음

주의

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

-개발 초기 단계는 create 또는 update

-테스트 서버는 update또는 validate

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

스키마 자동 생성하기 실습

persistence.xml

<property name="hibernate.hbm2ddl.auto" value="create" />
<!--
create: 기존테이블 삭제 후 다시 생성 (DROP+CREATE)- 운영DB xx, 웬만하면 개발도 xx
createㄱ-drop: create와 같으나 종료시점에 테이블 drop - 운영DB xx, 웬만하면 개발도 xx
update: 변경분만 반영 - 운영DB xx, 웬만하면 개발도 xx
validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
none: 사용하지 않음
local에서 사용하기에 좋겠다.
-->

그리고 엔티티 만드는 설정해주면?

EntityManagerFactory emf = Persistence.createEntityManagerFactory("helloJPA");

        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try{
            Member member = new Member();
            member.setId(100L);
            member.setName("안녕하세요");

            em.persist(member);
            tx.commit();
        }catch(Exception e){
            tx.rollback();
            e.printStackTrace();
        }finally{
            em.close();
        }
        emf.close();
    }

이런 식으로 drop하고 새롭게 create하니까... 아주 큰 사고가 날 수 있다는 것! 그래서 운영 단계에서는 create, drop 붙는 명령어는 다 막아줘야 함

매핑 어노테이션

DB랑 매핑할 때 어노테이션이 있는데 얘네는 철저하게 DB에 어떻게 매핑할지에 대한 정보를 담고 있어. 자바 코드와 관련은 없음x

@Column

DBA: 우리 표준 유저이름은 USERNAME이야. 가장 많이 사용 됨!

@Column(name = "USERNAME")
private String name;

그러면 엔티티에서는 name이지만, 실 DB는 USERNAME으로 들어가게 되겠지?

추가 옵션

  • name: 필드와 매핑할 테이블의 컬럼 이름
  • insertable, updatable: 읽기 전용
  • nullable : null 허용여부 결정, DDL 생성시 사용
  • unique: 유니크 제약 조건, DDL 생성시 사용
  • columnDefinition, length, precision, scale(DDL)

예)

@Column(name = "USERNAME", insertable=false, nullable=false, length = 20)
    private String name;

@Temporal

시간 관련 데이터 넣을 때 관련 데이터 넣을 때

@Temporal(TemporalType.TIMESTAMP)
private Date regDate;

member.setRegDate(new Date());

TIMESTAMP: 날짜와 시간 TIME : 시간 DATE : 날짜

@Enumerated

Enum타입 매핑 Enum타입으로 MemberType을 만들어보자

public enum MemberType {
    USER, ADMIN
}

@Enumerated(EnumType.STRING)
privateMemberType memberType;

EnumType.STRING으로 해주자. default는 숫자(ORDINAL)로 들어감. 나중에 EnumType 데이터 순서 변동 되면 다 꼬이게 됨... 그냥 String으로 쓰는 게 좋다.

member.setMemberType(MemberType.USER);

@Lob

내용 길이 너무 길 때 사용! CLOB( character )

BLOB( byte )

@Transient

이 컬럼 객체 가지고 있고 싶긴 한데... db에 넣고 싶지 않아 할 때 씀 웬만하면 안 쓰는 게 좋겠죠?

식별자 매핑 어노테이션

@Id

-@Id(직접 매핑)

@GeneratedValue

-IDENTITY: 데이터베이스에 위임, →MYSQL

-SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, →ORACLE.

-@SequenceGenerator 필요

-TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용

-@TableGenerator 필요

-AUTO:방언에 따라 자동 지정, 기본 값( 위 세가지 방식 중 자동으로 선택 )

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

// member.setId(1L);
// 자동으로 시퀀스 값 1 부터 ++

권장하는 식별자 전략

-기본 키 제약 조건 : null 아님, 유일, 변하면 안된다. -미래까지 이 조건 만족하는 자연키 찾기 힘들다. ex) 주민? → 정책 변화 db저장x -권장 : Long+대체키+키 생성 전략 사용 ( int.. 십억, 이십억 금방 옵니당 )

해당 포스팅은 T아카데미에서 진행한 김영한 강사님의 JPA 유튜브 강의를 듣고 정리한 것입니다 : ) https://www.youtube.com/watch?v=WfrSN9Z7MiA&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U

반응형

'Spring > JPA' 카테고리의 다른 글

JPA 연관관계 매핑 -양방향 매핑  (0) 2021.04.11
JPA 연관관계 매핑-단방향 매핑  (0) 2021.04.11
JPA persistence.xml과 라이브러리 설정  (0) 2021.04.11
JPA 기초와 매핑 : 실습  (0) 2021.04.11
JPA 기초와 매핑  (0) 2021.04.11