코드네임 JY

[스프링 JPA] 엔티티 매핑 본문

백엔드 공부

[스프링 JPA] 엔티티 매핑

영재임재영 2023. 2. 9. 11:40

🍳 객체와 테이블 매핑

@Entity 어노테이션

✅ 객체를 테이블에 매핑할 수 있게 해주고, 이제부터 JPA가 관리해준다!

✅ 기본 생성자 반드시 필요하다! (한 달 전에 엔티티 공부할 때 고생했던 기억! 링크 🖇️)

 

@Table 어노테이션

 간단하게 사용할거면 테이블 이름 정도 바꾸는 용도로 사용!

 

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

스프링에서 DB를 사용하다보면, properties 파일이나 yml 파일에서 spring.jpa.hibernate.ddl-auto 옵션을 볼 수 있다.

로컬에서 혼자 개발하는거면 큰 상관이 없을텐데.. 사람들이랑 팀 프로젝트를 한다면 이런 설정 하나 잘못했다가는 큰일이 난다..

 

✅ create : IF 기존 테이블 있으면 DROP 진행하고 CREATE

잘못 사용하면 큰일난다 😱😱 요즘 개발바닥 유튜브를 자주 보는데 create 관련 실제 겪으신 엄청난 문제가.. (링크 🖇️)

✅ create-drop : create 옵션과 같으나 어플리케이션 종료시점에 테이블 DROP

→ 테스트 케이스에서 다 수행하고 마지막에 깔끔히 삭제하고 싶을 때 사용한다!

✅ update : ALTER 사용해서 변경한 내용만 반영

→ 실제 서비스 배포 시에는 create, create-drop, update 사용하면 안 된다!!

✅ validate : 객체 구성(엔티티)과 스키마(테이블)가 다른지 확인

✅ none : 옵션 사용하지 않음

🥓 필드와 컬럼 매핑

@Column 어노테이션

✅ 컬럼(행)의 특성을 지정

(MySQL 기준으로 쓰면) NOT NULL, UNIQUE, DEFAULT 등의 옵션 지정할 수 있음!

✅ length도 자주 사용한다! (기본 값 : 255)

 

@Enumerated 어노테이션

자바의 enum 타입을 매핑할 때 사용

STRING, ORDINAL(비추) 옵션이 있음!

 ORDINAL은 INTEGER 형태로 값을 저장하기 때문에, enum 구성을 수정할 경우 데이터의 의미가 망가질 수 있음 주의!!


@Temporal 어노테이션

 날짜 타입을 매핑할 때 사용

최신 하이버네이트에서는 LocalDate, LocalDateTime 자료형 객체를 사용하기 때문에 굳이 사용할 필요 없음!

 

@Lob 어노테이션

오라클 DB에서 대형 데이터를 저장할 때 사용

문자면 CLOB, 그 외에는 BLOB으로 사용 (그냥 참고)

 

@Transient 어노테이션

 메모리 상에서 임시로 데이터를 저장하고 싶을 때 사용

그 말인 즉슨, 실제 DB에는 이 옵션이 붙는다면 해당 필드가 반영되지 않음

🥪 기본 키 매핑

기본 키는 매우 중요하다! 컬럼을 식별할 수 있는 존재이기 때문이다!

의미는 알고 있었지만, 그동안 무의식적으로 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 로 자주 썼었다.

이는 '자동 생성 + MySQL 데이터베이스에 기본 키 생성을 위임한다' 는 뜻이었는데 다른 방식들도 존재한다!

 

@Id 어노테이션

그냥 @Id 어노테이션만 쓰고 Setter 방식으로 ID 값을 넣어줄 수도 있다!

하지만 기본 키는 엄청 중요한 개념이란걸 알고 있지 않나! 사용자가 직접 생성하도록 하는 것은 좋지 않다!

 

@GeneratedValue 어노테이션

IDENTITY : 기본 키 생성을 데이터베이스에 위임 (대표적으로 MySQL에서 사용)

MySQL 방식이라면, 이는 AUTO_INCREMENT와 같은 의미이다!

SEQUENCE : 데이터베이스 오브젝트를 통해 유일한 값을 순서대로 생성 (Oracle에서 사용)

TABLE : 키를 생성하는 전용 테이블을 따로 만들어서 SEQUENCE 방식으로 동작

AUTO : 아무것도 쓰지 않고 생략하면 AUTO! DB Dialect에 따라서 타입이 위의 3개 중에서 자동 지정

Comments