필드와 컬럼 매핑
데이터베이스 스키마 자동 생성하기
-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 |
Uploaded by Notion2Tistory v1.1.0