๐คEntity
๋๋งค์ธ ๊ฐ์ฒด์ธ Entity๋ ์ค์ต์ ํตํด ๊ณต๋ถํด๋ณด์.
โ GenerationType ์ด ๋ญ๊น?
@Entity // ํด๋น ๊ฐ์ฒด๊ฐ JPA์์ ๊ด๋ฆฌํ๊ณ ์๋ ๊ฐ์ฒด์ธ๊ฒ์ ์ ์.
public class User {
@Id // ์ํฐํฐ์๋ ์๋ณ์๊ฐ ํ์ํ๋ฐ @ID๋ก ํํ.
@GeneratedValue // GenerationType (IDENTITY, SEQUENCE, TABLE, AUTO)
private long id;
/*IDENTITY
* DB์์ AUTOINCREMENT๋ฅผ ์ด์ฉํด ์๋์ผ๋ก ID๊ฐ์ด ๋์ด๋๋ ๊ฒ ์ฒ๋ผ id๊ฐ์ ๋จผ์ insert ์ํจ๋ค.
* ๊ทธ๋์ ํธ๋์ ์
์ด ๋๋๊ธฐ ์ ์ , ์ฆ ๋กค๋ฐฑ ๋๋คํ๋๋ผ๋ ์ด๋ฏธ insert ๋์ด ์์ด์ ๋ง์น ์ด๋นจ๋น ์ง๊ฒ ์ฒ๋ผ ์ค๊ฐ์ ๋น๋ ํ์์ด ์ผ์ด๋๋ค.
/*SEQUENCE
* Sequence๋ ์ค๋ผํด, postqre์์ ์ฐ๋๋ฐ ์ธ์ํธ๋ฅผ ํ ๋ ์์ฟผ์ค๋ก๋ถํฐ ์ฆ๊ฐ๋ id ๊ฐ์ ๋ฐ์์ ์ค์ id๊ฐ์ ๋ฃ๋ ๋ฐฉ์์ด๋ค.
*/
/*TABLE
* DB์ข
๋ฅ์ ์๊ด์์ด Table์ id๊ฐ์ ์ ์ฅํด ๋๊ณ ์ถ์ถํ์ฌ ์ด์ฉํ๋ค.
*/
/*AUTO
* ์ง์ ํ์ง ์์ผ๋ฉด AUTO๋ฅผ ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ DB ์ ํฉํ ๊ฐ์ ์๋์ผ๋ก ๋๊ฒจ์ฃผ๋๋ฐ, DB ์์กด์ฑ์ด ์์ด ์ฝ๋ฉํ ์ ์๋ค.
* ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก DB๋ ๊ณ ์ ํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ์ง์ ํด ์ฌ์ฉํ๋๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
*/
...
...
}
GenerationType์ ์ค์ ํด๋ณด์.
โ GenerationType (Table)
@Table(name = "user_legacy")
public class User {
...
...
...
}
๐ Test๋ฅผ ํด๋ณด๋ฉด
create table user_legacy (
id bigint not null,
created_at timestamp,
email varchar(255),
name varchar(255),
updated_at timestamp,
primary key (id)
)
๐ Test๊ฐ ์ํ๋ ๋ table์ ๋ง๋๋๊ฑธ ๋ณผ ์ ์๋ค.
โ @indexes(์ธ๋ฑ์ค) ์ @uniqueConstraints(์ ์ฝ์กฐ๊ฑด)
@Table(name = "user" ,indexes = {@Index(columnList = "name")}, uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
public class User {
๐ ์์ ๊ฐ์ด indexes์ uniqueConstraints ์ค์ ํด ์ฃผ๋ฉด ddl์ด ์์ฑ๋ ๋ index๊ฐ ์์ฑ์ด ๋๊ณ , ์ ์ฝ์กฐ๊ฑด์ด ์์ฑ๋๋ค.
Hibernate: create index IDXgj2fy3dcix7ph7k8684gka40c on user (name)
Hibernate:
alter table user
add constraint UKob8kqyqqgmefl0aco34akdtpe unique (email)
๐ค ํ์ง๋ง ์์๊ฐ์ด ํ์ํ๋ค๊ณ ํด์ ์ค์ DB์ ๋๊ฐ์ ์ง๋๊ฑด ์๋๋ค. JPA๋ฅผ ์ด์ฉํด์ DB DDL์ ์์ฑํ ๋๋ ์ ์ฉ๋์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ select delete update ๊ฐ์ ์ฟผ๋ฆฌ์ ์๋ฌด๋ฐ ์ ์ฉ์ด ์๋๋ค. ์ฆ, ์ค์ DB์ index๊ฐ ์๋๋ฐ JPA์์ ์ค์ ํด์ค๋ค๊ณ ํด์ ์คํ์ด ๋์ง ์๋๋ค๋ ๊ฑฐ๋ค.
โ @Colume
@Id // ์ํฐํฐ์๋ ์๋ณ์๊ฐ ํ์ํ๋ฐ @ID๋ก ํํ.
@GeneratedValue // GenerationType (IDENTITY, SEQUENCE, TABLE, AUTO)
private long id;
@NonNull
private String name;
@NonNull
@Column(updatable = false, insertable = false)
private String email;
@Column(name ="crtd_at", nullable = false,unique = true)
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
๐ Column์ name์ ์ง์ ํ๋๊ฑด ์์ฆ์๋ ์ํ๋ค. ์๋๋ฉด ์ ๋งํ๋ฉด ๋ช ์์ ์ผ๋ก DB์์ปด๋ผ์ด๋ฆ๊ณผ ์ํฐํฐ์ ๋ณ์ ์ด๋ฆ์ ๊ฐ๊ฒ ํ๊ธฐ๋๋ฌธ์ด๋ค. ํ์ง๋ง DB์ปฌ๋ผ์ด๋ฆ๊ณผ ์ํฐํฐ์ ๋ณ์ ์ด๋ฆ์ด ๋ค๋ฅด๋ฉด name์ ์ด์ฉํด์ฌ mappingํด์ค๋ค.
๐ nullable ์ ๋ง ๊ทธ๋๋ก notNull์ ์ฝ์ DDL์ ์ถ๊ฐํด ์ฃผ๋ ๊ฒ ์ด๋ค. ์์ @indexes @uniqueConstraints์ ๊ฐ์ด ์ค์ DB์ ์ ์ฉ ๋๋๊ฑด ์๋์ง๋ง, ์ค์ ์๋น์ค๋ฅผ ๋ง๋ค๋ notnullํ์๋ ์ ๋ง ์ ์ฉํ๊ธฐ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก ์ ์ด์ฃผ๋๊ฒ์ด ์ข๋ค.
๐ unique๋ ์ค๋ณต ๋ถ๊ฐ์ธ๊ฑฐ ๋ค ์์ง? ๊ทธ๋ผ @Table์ ์๋ ์ ์ฝ์ฌํญ uniqueConstraints์ ๋ค๋ฅธ์ ์ ๋ญ๊น?
๐ค uniqueConstraints ๋ ํ
์ด๋ธ์ ๋ณตํฉ ์ปฌ๋ผ, ์ฆ 2 ์์ฑ์ ๋ฌถ์ด์ unique๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๊ณ , ์ปฌ๋ผํ๋๋ง ์ง์ ํ๊ณ ์ถ์๋๋ ๊ทธ ๋ณ์ ์์ unique = true ํ๋ ๊ฒ์ด๋ค.
์ฝ๊ฒ ๋งํ๋ฉด ์ด๋ฐ๊ฑฐ ์๋๊ฐ?
๐๋ณตํฉ ์ ๋ํฌ ex ๐ ๊ทธ๋ฅ ์ ๋ํฌ ex
๋ฐ | ๋ฒํธ ์ ํ๋ฒํธ
1 | 3 01012341234
1 | 2 01012341235
1 | 3 01012341236
1 | 4 01012341237
โ @Column์ insertable ๊ณผ updatable
๐ฎ insertable,updatable ์ด ๋๋์ ๋ค๋ฅธ ์ค์ ๊ณผ๋ ๋ค๋ฅด๊ฒ DML์๋ ์ํฅ์ ๋ผ์น๋ค.
@Column(insertable = false)
private LocalDateTime createdAt;
@Column(updatable = false)
private LocalDateTime updatedAt;
@Test
void insertAndUpdateTest(){
/*insert*/
User user =new User();
user.setName("martin");
user.setEmail("martin2@fast.com");
userRepository.save(user);
/*update*/
User user2 = userRepository.findById(1L).orElseThrow(RuntimeException::new);
user2.setName("marrrrrtin");
userRepository.save(user2);
}
๐ ์์ ๊ฐ์ด createdAt ์๋ (insertable = false)๋ฅผ updatable์๋ (updatable = false)๋ฅผ ์ง์ ํด ์คฌ๋ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณด์.
insert
into
user
(email, name, updated_at, id)
values
(?, ?, ?, ?)
update
user
set
created_at=?,
email=?,
name=?
where
id=?
์์ ๋ก๊ทธ์ฒ๋ผ insert๋ฌธ์๋ createdAt ์ ํธ๋ฆฌ๋ทฐํธ๊ฐ ๋น ์ก๊ณ update๋ฌธ์๋ updated_at๊ฐ ๋น ์ง๊ฑธ ์ ์ ์๋ค.
โ
@Transient
Entity๋ Data๊ฐ์ฒด๊ธฐ ๋๋ฌธ์ DB๋ ์ฝ๋ ๊ฐ์ ๊ทธ๋๋ก ๋ฐ์ํ๋ค. ํ์ง๋ง ๊ฐ์ฒด๋ก์จ์ ์ญํ ๋ ํ๊ธฐ ๋๋ฌธ์ DB๋ ์ฝ๋์ ๋ณ๊ฐ์ Data๋ฅผ ๊ฐ์ง๊ณ ์ถ์ Needs๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ ํธ๋์ง์ธํธ๋ฅผ ์ด๋ค.
@Transient
private String testData;
์ด๋ ๊ฒ ํ๋ฉด ddl์๋ ์๋ค์ด๊ฐ๊ณ dml์๋ ์๋ค์ด๊ฐ๋ค. ์์์ฑ์ฒ๋ฆฌ์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ด๋ค.์ฆ DB๋ ์ฝ๋์ ์ฒ๋ฆฌ๊ฐ ์๋๋ค.
๐ค๐คENUM Type?
Enum ํ์
์ DB์๋ 0,1, ์์๋๋ก ๋ค์ด๊ฐ๋ค. ์ฆ, ๋จ์,์ฌ์ ๊ฐ์ฒด๊ฐ ์ฐจ๋ก๋ก ์์ด๋ DB์์ 0,1์ผ๋ก ๋งตํ๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ํญ์ Enum์ ์ฐ๊ธฐ ๋ณด๋จ ๊ทธ๋ฅ String ํ์
์ ์ป๋ค. Jpa์์๋ ๊ทธ๋ ๊ฒ ํด์ผํ ๊น?
์ค์ตํด๋ณด์.
โ
enum type ํด๋์ค์์ฑ
public enum Gender {
MALE,
FEMALE
}
โ User ์ํฐํฐ์ ์ด๋ํ์ gender ์ฌ์ฉ.
private Gender gender;
โ nativeQuery ์ฟผ๋ฆฌ๋ฅผ ์์ง ์๋ฐฐ์ ์ง๋ง, ์ผ๋จ UserRepository์ ์ฐ์ต์ฉ์ผ๋ก ์จ๋ณด์.
@Query(value = "select * from user limit 1;", nativeQuery = true)
Map<String, Object> findRawRecord();
โ ๊ทธ๋ฆฌ๊ณ Test
@Test
void enumTest() {
User user = userRepository.findById(1L).orElseThrow(RuntimeException::new);
user.setGender(Gender.MALE);
userRepository.save(user);
userRepository.findAll().forEach(System.out::println);
System.out.println(userRepository.findRawRecord().get("gender"));
}
์์์ ์ธ๊ธํ๋ค ์ถ์ด MALE์ ์ ๋๋ฅผ ๋ณด๋ 0์ด๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ ์ด์ Enum Data์์
@Enumerated(value = EnumType.STRING)
private Gender gender;
@Enumerated(value = EnumType.STRING)
๋ค์ Testํ๋ฉด
์ด์ ์ซ์๊ฐ ์๋ ๋ฌธ์์ด๋ก ์ถ๋ ฅ๋๋ค.
์ด๊ฑฐ ์ ๋ง ์ค์ํ๋ค. ๐ก
'Dev > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ์ฐ๊ด๊ด๊ณ (1:N) (0) | 2022.03.02 |
---|---|
JPA EntityListener (0) | 2022.03.02 |
JPA ์ฟผ๋ฆฌ๋ฉ์๋ ์ ๋ ฌ (0) | 2022.03.02 |
JPA ์ฟผ๋ฆฌ๋ฉ์๋(QueryMethod) (0) | 2022.03.02 |
JPA Repository Interface ์์ธ 2 (0) | 2022.03.02 |