๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ!
- JPA (Java Persistence API)
- ์ํฐํฐ ๋งคํ
โ๏ธ JPA (Java Persistence API)
- Java ์ง์์์ ์ฌ์ฉํ๋ ORM(Object-Relational Mapping) ๊ธฐ์ ์ ํ์ค ์ฌ์(Specification)
- Jakarta Persistence ๋ผ๊ณ ๋ ๋ถ๋ฆผ
- ํ
์ด๋ธ๊ณผ ๋งคํ๋๋ ์ํฐํฐ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ์์์ฑ ์ปจํ
์คํธ(Persistence Context)์ ๋ณด๊ดํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
๋ด์์ ์ค๋ ์ง์ ๋๋๋ก ํจ
โ โ
โ ์ธํฐํ์ด์ค๋ก JPA๋ผ๋ ํ์ค ์ฌ์์ด ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์, ์ด ์ฌ์์ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฐ๋ก ์์
( ์ฐ๋ฆฌ๋ ์ด ์ฌ์์ ๊ตฌํํ ๊ตฌํ์ฒด์ ๋ํด ํ์ตํ๋ ๊ฒ )
๐ก ์ฌ์ (Specification)
โ ์ค๊ณ๊ตฌ์กฐ / ๊ธฐ์ ์ค๋ช ์ ๋ฑ์ ์๋ฏธ
โ๏ธ JPA ํ์ค ์ฌ์์ ๊ตฌํํ ๊ตฌํ์ฒด
Hibernate ORM, EclipseLink, DataNucleus ๋ฑ
( ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ Hibernate ORM ์ ๋ํด์ ํ์ต )
[์ฐธ๊ณ ] https://docs.jboss.org/hibernate/orm/6.0/javadocs/
โ Spring Data JPA ๊ธฐ์ ์ ํฌํจํ JPA API์ฌ์ฉ์ ์ํด์๋build.gradle
ํ์ผ์ dependncies
๋ด์ ์๋์ ๊ฐ์ ์์กด์ฑ ์ถ๊ฐํด์ผํจ โฌ๏ธ
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
( Spring Data JPA๊ฐ ์๋ JPA API๋ง ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด JPA ๊ด๋ จ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๋๋ก ์ถ๊ฐ )
โ JPA์ 4๊ฐ์ง Lifecycle ์ํ
[์ฐธ๊ณ ] https://thorben-janssen.com/entity-lifecycle-model/
โ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์์์ JPA ์์น
- ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ์๋จ์ ์์น
- ๋ฐ์ดํฐ ์ ์ฅ, ์กฐํ ๋ฑ์ ์์ ์ JPA๋ฅผ ๊ฑฐ์ณ JPA์ ๊ตฌํ์ฒด์ธ Hibernate ORM์ ํตํด์ ์ด๋ฃจ์ด์ง
- Hibernate ORM์ ๋ด๋ถ์ ์ผ๋ก JDBC API๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ
โ๏ธ ์์์ฑ ์ปจํ ์คํธ(Persistence Context)
- ํ
์ด๋ธ๊ณผ ๋งคํ๋๋ ์ํฐํฐ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ๋ณด๊ด
โ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ค๋ ์ง์ ๋๊ฒ ํ๊ณ , ์ด ๋ณด๊ด๋ ์ํฐํฐ ์ ๋ณด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ CRUD ํ๋๋ฐ ์ฌ์ฉ๋จ - 1์ฐจ ์บ์ / ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์๋ก ๊ตฌ๋ถ
โ JPA API ์คpersist()
๋ฉ์๋ ์ฌ์ฉํ๋ฉด, 1์ฐจ ์บ์์ ์ํฐํฐ ์ ๋ณด ์ ์ฅ๋จ
๐ก ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์
โ ๊ฐ๋ ์ ์ผ๋ก๋ ์ ์ฅ์๋ผ๊ณ ํํํ์ง๋ง,
๋ด๋ถ์ ์ผ๋ก๋ Entity ๊ธฐ๋ฐ์ผ๋ก SQL ์ฟผ๋ฆฌ๋ฌธ์ด commit ํ๋ ์์ ์ ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ฒ์ ๋งํจ
โ๏ธ ์ํฐํฐ ๋งคํ ์ข ๋ฅ
- ์ํฐํฐ - ํ ์ด๋ธ ๊ฐ ๋งคํ
- ๊ธฐ๋ณธํค ๋งคํ
- ์ํฐํฐํ๋(๋ฉค๋ฒ ๋ณ์) - ํ ์ด๋ธ ์ปฌ๋ผ ๊ฐ ๋งคํ
- ์ํฐํฐ - ์ํฐํฐ์ ์ฐ๊ด ๊ด๊ณ ๋งคํ
โ๏ธ ์ํฐํฐ - ํ ์ด๋ธ ๊ฐ ๋งคํ
โ๏ธ @Entity
- ์ํฐํฐ ํด๋์ค์ ํ
์ด๋ธ ๋งคํํ๋ ์ ๋ํ
์ด์
(ํ์)
โ @Id์ ๊ผญ ํจ๊ป ํ์๋ก ์ฌ์ฉ
๐ก @Entity๋ง ๋ถ์ด๊ณ @Id ์๋ถ์ผ ๊ฒฝ์ฐ
Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.codestates.entity_mapping.single_mapping.Member ์ด ์๋ฌ ๋ฐ์
- ํด๋์ค ๋ ๋ฒจ์ ๋ถ์
โ JPA ๊ด๋ฆฌ ๋์ ์ํฐํฐ๊ฐ ๋จ - ์ ํธ๋ฆฌ๋ทฐํธ name ์ฌ์ฉ ๊ฐ๋ฅ
โ ์ํฐํฐ์ ์ด๋ฆ ์ค์
( ์ค์ ์ํ๋ฉด ํด๋์ค๋ช ์ ์ํฐํฐ ์ด๋ฆ์ผ๋ก ํจ )
Ex. @Entity(name = "USERS")
๐ก @Entity ์ฃผ์ ์ฌํญ
- ์ ๊ทผ ์ ์ด์๊ฐ public / protected์ธ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์
- final ํด๋์ค, enum, interface, inner ํด๋์ค์๋ ์ฌ์ฉ์ด ๋ถ๊ฐ
- ์ ์ฅํ๋ ค๋ ์์ฑ์ final X
โ๏ธ @Table
- ์ํฐํฐ ํด๋์ค์ ํ ์ด๋ธ ๋งคํํ๋ ์ ๋ํ ์ด์ (์ต์ )
- ํด๋์ค ๋ ๋ฒจ์ ๋ถ์
- ์ ํธ๋ฆฌ๋ทฐํธ name ์ฌ์ฉ ๊ฐ๋ฅ
โ ๋ฐ์ดํฐ๋ฒ ์ค์ ํ ์ด๋ธ ์ด๋ฆ ์ค์
( ์ค์ ์ํ๋ฉด ํด๋์ค๋ช ์ ํ ์ด๋ธ ์ด๋ฆ์ผ๋ก ํจ )
โ๏ธ @Entity(name = "") vs @Table(name = "")
@Entity(name = "")๋ Entity๋ฅผ ์๋ณํ ์ด๋ฆ์ ์ ํ๋ ๊ฒ์ด๊ณ ,
@Table(name = "")๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฑ๋ Table์ ์ด๋ฆ์ ์ ํ๋ ๊ฒ
โ
โ @Table์ด ์๊ณ @Entity(name ="")๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ,
@Entity์ name ์์ฑ์ ์ํด, Entity์ Table ์ด๋ฆ์ด ๋ชจ๋ ๊ฒฐ์
[์ฐธ๊ณ ] https://www.inflearn.com/questions/75556
โ
โ @Table ์ ๋ํ ์ด์ ์ ์ต์ ์ด์ง๋ง, @Entity ์ ๋ํ ์ด์ ๊ณผ @Id ์ ๋ํ ์ด์ ์ ํ์
โ๏ธ @NoArgsConstructor
- ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๊ธฐ๋ณธ ์์ฑ์ ํ์๋ก ์ถ๊ฐ
( Spring Data JPA์ ๊ธฐ์ ์ ์ ์ฉํ ๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ )
โ๏ธ ๊ธฐ๋ณธํค ๋งคํ
โ๏ธ @Id
- ์ด ์ ํฐํ ์ด์ ์ ์ถ๊ฐํ ํ๋๊ฐ ๊ธฐ๋ณธํค(Primary Key) ์ปฌ๋ผ์ด ๋จ
โ๏ธ @GeneratedValue(strategy = GenerationType.์์ฑ๋ฐฉ๋ฒ)
- ๊ธฐ๋ณธํค ์์ฑ ๋ฐฉ๋ฒ์ ์ ํด์ค ๋ ์ฌ์ฉํ๋ ์ ๋ํ ์ด์
โ๏ธ ๊ธฐ๋ณธํค ์์ฑ ์ ๋ต
1. ๊ธฐ๋ณธํค ์ง์ ํ ๋น
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ง์ ํ ๋นํด์ฃผ๋ ๋ฐฉ์
- @Id ์ ๋ํ ์ด์ ์ฌ์ฉํ๋ ๋ฐฉ์
( ์๋๋ DIRECT ๋ฐฉ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ )
2. ๊ธฐ๋ณธํค ์๋ ์์ฑ
- IDENTITY
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ณธํค ์์ฑ์ ์์ํ๋ ๋ฐฉ์
Ex. MySQL์ AUTO_INCREMENT ๊ธฐ๋ฅ ( ๊ธฐ๋ณธํค์ ์ซ์๊ฐ ์๋์ผ๋ก +1 )
โ commit() ์ ๊น์ง๋ ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์์์ ์๋ณ์๊ฐ ์๋ ๊ฐ์ฒด๋ง ๊ฐ์ง๊ณ ์๋ค๊ฐ, commit() ํ๋ฉด์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ ์๋ณ์๋ ๋์์ ์๊ฒจ์ ํ ์ด๋ธ์ ๋ค์ด๊ฐ โ ์ด ํ, 1์ฐจ ์บ์์ ๊ฐ์ฒด์๋ ๊ทธ ์๋ณ์๊ฐ ์ ์ฉ๋จ
( ์๋๋ IDENTITY ์์ฑ ๋ฐฉ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ )
- SEQUENCE
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๊ณตํ๋ ์ํ์ค๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ณธํค๋ฅผ ์์ฑํ๋ ๋ฐฉ์
โ ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ์ ์ ์ฅํ๊ธฐ ์ ์ ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์ ๋ด์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ฒด์ ์ํ์ค๋ก ๊ฐ์ ธ์จ ์๋ณ์๋ฅผ ์ฑ์ ๋ฃ์ โ commit() ํ๋ฉด ํ ์ด๋ธ์ ์๋ณ์ ๋ฐ๋ก ์ฑ์์ง
( ์๋๋ SEQUENCE ์์ฑ ๋ฐฉ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ )
- TABLE
โ ํค ์์ฑ ์ ์ฉ TABLE์ ๋ณ๋๋ก ๋ง๋ค๊ณ , ํค๋ฅผ ์กฐํ/์ ๋ฐ์ดํธ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ์กํด์ผํด์ ์ฑ๋ฅ๋ฉด์์ ์ข์ ์ ํ X
โ
โ IDENTITY / SEQUENCE ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์
โ๏ธ ์ํฐํฐ ํ๋(๋ฉค๋ฒ ๋ณ์) - ํ ์ด๋ธ ์ปฌ๋ผ ๊ฐ ๋งคํ
โ๏ธ @Column
- ํ๋์ ์ปฌ๋ผ์ ๋งคํํด์ฃผ๋ ์ ๋ํ ์ด์
๐ก @Column ์ ๋ํ ์ด์ ์ด ์๊ณ ํ๋๋ง ์ ๋ฆฌ๋์ด ์๋ค๋ฉด,
JPA ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํ๋๊ฐ ํ ์ด๋ธ์ ์ปฌ๋ผ๊ณผ ๋งคํ๋๋ ํ๋๋ผ๊ณ ๊ฐ์ฃผํจ
( ์ ํธ๋ฆฌ๋ทฐํธ๋ ๋ํดํธ ๊ฐ์ด ์ ์ฉ๋จ )
๐ก @Column ์ ๋ํ ์ด์ ์ด ์๋ต๋์๊ฑฐ๋ ์ ํธ๋ฆฌ๋ทฐํธ๊ฐ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฃผ์ ์ฌํญ
@Column(nullable = true, updatable = true, unique = false)
์ฌ๊ธฐ์ nullable ๊ฐ์ ๋ํดํธ๊ฐ true์ธ๋ฐ
์ด ๊ฒฝ์ฐ, ํ๋์ ๋ฐ์ดํฐ ํ์ ์ด int, long ๊ฐ์ Java์ ์์ ํ์ ์ผ ๊ฒฝ์ฐ null ๊ฐ ์ ๋ ฅ ๋ถ๊ฐ!
( null์ ๊ฐ์ฒด ํ์ ์ผ ๊ฒฝ์ฐ์๋ง ์ ์ฉ๋๋๊น )
โ โ ์ต์ํ nullable=false๋ ์ค์ ํ์ฌ ์๋ฌ ๋ฐฉ์งํ๊ธฐ !!
- ๋ณ์๋ง๋ค ์ ์ด์ผํจ
โ ๋ฒ๊ฑฐ๋กญ๊ธด ํ์ง๋ง ํ ์ด๋ธ ์ค๊ณ๊ฐ ์ด๋ค ์์ผ๋ก ๋์ด์๋์ง ํ๋์ ํ์ธ ๊ฐ๋ฅ
โ๏ธ @Column์ ์ ํธ๋ฆฌ๋ทฐํธ
- nullable
โ ์ปฌ๋ผ์ null ๊ฐ ํ์ฉํ ์ง ์ฌ๋ถ ( ๋ํดํธ - true ) / email ์ ๋ก๊ทธ์ธ ID ๋ก ๋ง์ด ์ฌ์ฉ๋์ด ํ์๊ธฐ ๋๋ฌธ์ false ๋ก ์ง์ ํจ
โ - updatable
โ ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๋์ง ์ฌ๋ถ ์ง์ ( ๋ํดํธ - true )
Ex. email์ ๋ก๊ทธ์ธ ID ๋ก ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฑ๋กํ๋ฉด ์์ ๋ถ๊ฐ์ด๊ธฐ ๋๋ฌธ์ false ๋ก ์ง์ ํด์ผํจ
โ - unique
โ ํ๋์ ์ปฌ๋ผ์ ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด ์ค์ (๊ณ ์ ํ ๊ฐ์ผ๋ก ์ค์ ) ( ๋ํดํธ - false )
Ex. email์ ๊ณ ์ ๊ฐ์ด๋ฏ๋ก true๋ก ์ง์
โ - length
โ ์ปฌ๋ผ์ ์ ์ฅํ ์ ์๋ ๋ฌธ์ ๊ธธ์ด ์ง์ ( ๋ํดํธ - 255 )
โ - name
โ ์ํฐํฐ ํด๋์ค ํ๋๋ช ๊ณผ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ปฌ๋ผ์ ์์ฑ ๊ฐ๋ฅ
โ
[์ฐธ๊ณ ] https://docs.oracle.com/javaee/7/api/
โ๏ธ @Transient
- ์ด ์ ๋ํ
์ด์
์ถ๊ฐํ๋ฉด ํ
์ด๋ธ ์ปฌ๋ผ๊ณผ ๋งคํํ์ง ์๊ฒ ๋ค๋ ์๋ฏธ๋ก JPA ๊ฐ ์ธ์
โ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅ X / ์กฐํํ ๋ ๋งคํ X
(์ฃผ๋ก ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ์ฉํ๊ธฐ ์ํ ์ฉ๋)
โ๏ธ @Enumerated(EnumType.ํ์
)
/ @Enumerated(values = EnumType.ํ์
)
- enum ํ์ ๊ณผ ๋งคํํ ๋ ์ฌ์ฉํ๋ ์ ๋ํ ์ด์
- ์๋์ ๋๊ฐ์ง Enumํ์ ์ ๊ฐ์ง ์ ์์
โ๏ธ EnumType ์ข ๋ฅ
- ORDINAL
โ enum์ ์์๋ฅผ ๋ํ๋ด๋ ์ซ์๋ฅผ ํ ์ด๋ธ์ ์ ์ฅ
Ex. ์ฐ๋ฆฌ ์ค์ต์์ enum orderStatus() ์์ ์ํ๋ฅผ 4๊ฐ๋ฅผ ์ง์ ํ๋๋ฐ,
์ด๊ฒ String์ผ๋ก ์ ์ฅ๋๋ ๊ฒ์ด ์๋๋ผ ์ซ์๋ก ์ธ๋ฑ์ค์ฒ๋ผ ์ ์ฅ๋จ
But, ์ด ๊ฒฝ์ฐ ์ค๊ฐ์ ์๋ก์ด enum ํ๋๊ฐ ์ถ๊ฐ๋๋ฉด ์์,๋ฒํธ๊ฐ ์ด์ํด์ ธ์ ์ ์ฌ์ฉ X
โ โ - STRING
โ enum์ ์ด๋ฆ์ ํ ์ด๋ธ์ ์ ์ฅ
โ
โ EnumType.STRING ์ฌ์ฉ ๊ถ์ฅ
โ๏ธ ์ํฐํฐ - ์ํฐํฐ์ ์ฐ๊ด ๊ด๊ณ ๋งคํ
- ๋ณดํต ๋ค(N)์ ํด๋นํ๋ ํด๋์ค์ ์ผ(1)์ ํด๋นํ๋ ๊ฐ์ฒด๋ฅผ ์ธ๋ํค๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ์ !
- ๋จ๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ
โ ํ์ชฝ ํด๋์ค๋ง ๋ค๋ฅธ ์ชฝ ํด๋์ค์ ์ฐธ์กฐ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ด๊ณ - ์๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ
โ ์์ชฝ ํด๋์ค๊ฐ ์๋ก์ ์ฐธ์กฐ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ด๊ณ
๐ฌ ๋ฌด์กฐ๊ฑด ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ํ๋ฉด ์ฝ์ง ์์๊น?
NO. ๋ถํ์ํ ์ฐ๊ด๊ด๊ณ๋ก ์คํ๋ ค ์ํฐํฐ๊ฐ ๋ณต์กํด์ง ์ ์์
Ex. ์ฌ์ฉ์(User) ์ํฐํฐ๊ฐ ๋ง์ ์ํฐํฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ฐ,
์ด ๊ฒฝ์ฐ ๋ชจ๋ ํด๋์ค์ ์๋ฐฉํฅ ๊ด๊ณ๋ก ๋งคํ์ ํ๋ค๋ฉด User ํด๋์ค ๋ด์ ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ๊ฒ
โ โ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ๋ฐฉํฅ ๋งคํ์ ํ๊ณ ํ์ ํ์๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ญ๋ฐฉํฅ ๋งคํ์ ์ถ๊ฐ
๐ก JPA vs Spring Data JDBC ์ ๋ฐฉํฅ์ฑ
- JPA
โ ๋จ๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ์ ์๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋ชจ๋ ์ง์
โ - Spring Data JDBC
โ ๋จ๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ๋ง ์ง์
โ๏ธ ์ผ๋๋ค ๋จ๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ ( One To Many )
- ์ผ(1)์ ํด๋นํ๋ ํด๋์ค๊ฐ ๋ค(N)์ ํด๋นํ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๊ด๊ณ
Ex. ํ๋ช ์ ํ์์ด ์ฌ๋ฌ ๊ฑด์ ์ฃผ๋ฌธ
โ Member ํด๋์ค์ Order์ List๊ฐ ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
โ But, ์ผ๋๋ค ๋จ๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ๋ ์ ์ฌ์ฉ X
ํ ์ด๋ธ ๊ฐ ๊ด๊ณ๋ก ๋ณด์์ ๋,
๋ค(N)์ ํด๋นํ๋ ํ ์ด๋ธ์ด ์ผ(1)์ ํด๋นํ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค๋ฅผ ์ธ๋ํค๋ก ๊ฐ์ง๋ ํํ์ธ๋ฐ,
๊ธฐ๋ณธ ๊ฐ์ฒด ์ฐธ์กฐ ๊ด๊ณ๋ก ๋ณด์์ ๋,
์ผ(1)์ ํด๋นํ๋ ํด๋์ค๊ฐ ๋ค(N)์ ํด๋นํ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ฐ๊ธฐ ๋๋ฌธ์
๋ค(N)์ ์ ์ฅ์์๋ ํ ์ด๋ธ์์ ์ธ๋ํค์ ํด๋นํ๋ ์ผ(1) ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์์์ ์ผ๋ฐ์ ์ธ ํ ์ด๋ธ ๊ฐ ๊ด๊ณ ํํ X
โ ๋ค(N) ํด๋์ค์ ์ ๋ณด๋ฅผ ํ ์ด๋ธ์ ์ ์ฅํ๋๋ผ๋ ์ธ๋ํค์ ํด๋นํ๋ ์ผ(1) ํด๋์ค์ id ๊ฐ์ด ์๋ ์ฑ๋ก ์ ์ฅ์ด ๋ฉ
โ โ ๋ค๋์ผ ๋จ๋ฐฉํฅ ๋งคํ์ ๋จผ์ ํ ํ์ ํ์ํ ๊ฒฝ์ฐ,
์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ์ ์ถ๊ฐํด์ ์๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ผ๋ฐ์
๐ฌ ๊ถ๊ธํ๋ ์ !!!
์์ ๋จ๋ฐฉํฅ ์ผ๋๋ค ๋งคํ์์ Member(1) ํด๋์ค์ Order(N) ๊ฐ์ฒด๊ฐ List๋ก ์ฐธ์กฐ๊ฐ ๋์ด์๋๋ฐ,
์ฌ๊ธฐ์ @JoinColumn(name = "") ์ ๋ํ ์ด์ ์ ์ธ๋ํค์ ๋ช ์ ์ ํด์ฃผ๋ ๊ฒ์ด๊ณ , Member(1)๊ฐ ์ธ๋ํค๋ก Order(N)์ ์ฐธ์กฐ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋์ ์ธ๋ํค์ ์ด๋ฆ์ MEMBER_ID๋ก ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ, Member ํด๋์ค ๋ด์ Order ๊ฐ์ฒด๋ฅผ List๋ก ๊ฐ์ ธ์๋๋ฐ
์ ๊ทธ Order ๊ฐ์ฒด์ pk๋ฅผ MEMBER_ID๋ผ๋ ์ธ๋ํค ์ด๋ฆ์ผ๋ก ์ค์ ํ๋ ๊ฑด์ง ์ ์ดํด๊ฐ ๊ฐ์ง ์์๋ค.
๐ฌ Answer )
๋ณด๋ฉด ์ด์ํ์ง๋ง, ๋จ๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ Order์์๋ Member๋ฅผ ์ฐธ์กฐํ์ง ์์
๊ทธ๋์ @JoinColumn์ ๊ทธ์ชฝ์ ์ถ๊ฐํ๋ ค๊ณ ํด๋ ์ถ๊ฐํ ์ ์์
๋ฐ๋ผ์ Member ์ชฝ์์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ์ชฝ์ ์ถ๊ฐํด์ฃผ๋ ๊ฒ !
โ
โ ๋จ๋ฑกํฅ์ด๋ผ์ ํ์ชฝ์๋ค๋ง ๋ชจ๋ ๋ฃ์ด์ผํ๋๊น Order๋ ์ฐธ์กฐ ํ๊ณ ,
์ฐธ์กฐ๊ฐ ๋ ์ธ๋ํค์ธ Member(1)ํด๋์ค์ memberId๋ MEMBER_ID๋ผ๋ ์ด๋ฆ์ผ๋ก ์ถ๊ฐํด์ฃผ๋ ๊ฒ !
โ๏ธ ๋ค๋์ผ ์ฐ๊ด ๊ด๊ณ ( Many To One ) โญ
- ๋ค(N)์ ํด๋นํ๋ ํด๋์ค๊ฐ ์ผ(1)์ ํด๋นํ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๊ด๊ณ
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๋งคํ ๋ฐฉ์
Ex. ํ๋ช ์ด ์ฌ๋ฌ๊ฑด์ ์ฃผ๋ฌธ
โ Order ํด๋์ค์ member๊ฐ ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
@ManyToOne
์ ๋ํ ์ด์ ์ผ๋ก ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ช ์ํด์ค@JoinColumn(name = "์ธ๋ํค๋ช ")
์ ๋ํ ์ด์ ์ผ๋ก ์ธ๋ํค ์ด๋ฆ ์ค์ - ์ฐธ์กฐ๋ Member ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ด
โ Member ํด๋์ค์ Order๊ฐ List๋ก ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
@OneToMany
์ ๋ํ ์ด์ ์ผ๋ก ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๋ช ์ํด์ค- ์ ์ ๋ํ
์ด์
์ ์ ํธ๋ฆฌ๋ทฐํธ๋ก
(mappedBy = "์ธ๋ํค ์ญํ ํ๋ ํ๋")
๋ฅผ ๋ฃ์ด์ฃผ์ด ์ธ๋ํค์ ์ญํ ์ ํ๊ณ ์์์ ์๋ ค์ค - ์ฐธ์กฐ๋ฅผ ๋ฐ๋ Order ๊ฐ์ฒด๋ฅผ List๋ก ๊ฐ์ ธ์ด
( ํ ํ์์ด ์ฌ๋ฌ ์ฃผ๋ฌธ ๊ฐ๋ฅ์ด๋๊น )
๐ก mappedBy์ ์ค๋ ๊ฐ์ด ํท๊ฐ๋ฆด ๋ !
- ๋ ๊ฐ์ฒด๋ค ๊ฐ์ ์ธ๋ํค์ ์ญํ ์ ํ๋ ํ๋๋ ๋ฌด์์ธ๊ฐ?
- ์ธ๋ํค์ ์ญํ ์ ํ๋ ํ๋๋ ๋ค(N)์ ํด๋นํ๋ ํด๋์ค ์์ ์์
โ
์ด ๋๊ฐ์ง๋ฅผ ์๊ฐํด๋ณด๋ฉด ์ฌ์!
โ๏ธ ๋ค๋๋ค ์ฐ๊ด ๊ด๊ณ ( Many To Many ) โญ
@ManyToMany
์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์ง ์๊ณ Join ํ ์ด๋ธ๊ณผ ๊ฐ์ ํด๋์ค๋ฅผ ํ๋ ๋ ๋ง๋ค์ด 1-N-1 ๊ด๊ณ๋ก,
๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋๋ฒ ์ค์ ํ๋ฉด ๋จ!
โ @ManyToMany ์ ๋ํ ์ด์ ์ ์จ์ ๋ฐ๋ก ํด๋์ค๋ฅผ ๋ง๋ค์ง ์๊ณ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋งบ์ด์ค ์ ์์ง๋ง, ์ด ๊ฒฝ์ฐ ์ค๊ฐ์ ๊ฐ์ด ์ถ๊ฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ X
Ex. Coffee ํด๋์ค์ Order ํด๋์ค๊ฐ ์์ ๋,
ํ ์ปคํผ๋ฅผ ์ฌ๋ฌ๋ช
์ด ์ฃผ๋ฌธ ๊ฐ๋ฅ / ํ๋ช
์ด ์ฌ๋ฌ ์ปคํผ ์ฃผ๋ฌธ ๊ฐ๋ฅ โ ๋ค๋๋ค ๊ด๊ณ
โ ์ด๋ฅผ ๋ค๋์ผ ๊ด๊ณ๋ก ํ์ด์ค OrderCoffee ํด๋์ค ์์ฑ
๊ฒฐ๊ตญ ๊ด๊ณ๋ Coffee(1) - OrderCoffee(N) / OrderCoffee(N) - Order(1) ์ด ๋๋ ๊ฒ!
์ด ํ๋ ๋ค๋์ผ ๊ด๊ณ์ ๊ฐ์ด ์งํํ๋ฉด ๋จ !
โ OrderCoffee ํด๋์ค์ Order / Coffee๊ฐ ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
โ Order ํด๋์ค์ OrderCoffee๊ฐ ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
โ Coffee ํด๋์ค์ OrderCoffee๊ฐ ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
โ๏ธ ์ผ๋์ผ ์ฐ๊ด ๊ด๊ณ ( One To One )
@OneToOne
์ ๋ํ ์ด์ ์ ์ฌ์ฉํ๊ณ ,
๋ค๋์ผ ์๋ฐฉํฅ ๋งคํ ์ฒ๋ผ ์ธ๋ํค๊ฐ ์๋ ๊ณณ์ด ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ
( ์ด ์ธ๋ํค๋ฅผ ์ด๋์ ๋๋๋๋ ์ฐ๋ฆฌ๊ฐ ์ ํ๊ธฐ ๋๋ฆ ! )
Ex. ํ๋ช
์ ํ์์ด ํ๊ฐ์ ์คํฌํ๋ฅผ ์ฐ์ ์ ์๋ค๊ณ ํ ๋,
๋๋ Stamp๊ฐ Member์ ์ธ๋ํค๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ์ฌ ์๋์ ๊ฐ์ด ๋ง๋ค์๋ค
โ Stamp ํด๋์ค์ Member๊ฐ ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
โ Member ํด๋์ค์ Stamp๊ฐ ์ฐธ์กฐ๋์ด ์๋ ๋ชจ์ต
[์ฐธ๊ณ ] https://beagle-dev.tistory.com/306
๐ก ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ
- ์๋ฐฉํฅ ๊ด๊ณ์ผ ๋ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํด์ผํจ
( ๋ ๋จ๋ฐฉํฅ ๊ด๊ณ ์ค, ์ ์ด์ ๊ถํ(์ ์ฅ,์์ ,์ญ์ ๋ฑ)์ ๊ฐ๋ ์ค์ง์ ์ธ ๊ด๊ณ์ ์ฃผ์ฒด๊ฐ ๋๊ตฌ์ธ์ง JPA์๊ฒ ์๋ ค์ฃผ๋ ๊ฒ )
โ mappedBy ์์ฑ์ ์ฌ์ฉํด์ ์ฃผ์ธ์ ์ง์
โ
โ ์ธ๋ ํค๊ฐ ์๋ ๊ณณ = ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ !!
๐ก ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํด์ผํ๋ ์ด์
- ํ ์ด๋ธ์ ๋งคํ์ ๋ด๋นํ๋ JPA ์ ์ฅ์์ ๋ ํด๋์ค ์ค ์ด๋ ๊ฒ์ ์์ ํด์ผํ ์ง ํผ๋์ ์ฃผ๊ฒ ๋จ
โ ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์ ์ ํด ๋ช ํํ๊ฒ ์ด๋ ํด๋์ค์์ ๋ญ๋ฅผ ์์ ํ๊ฒ ๋ค๊ณ ์ ํ๋ ๊ฒ !
โ ์์์ฑ ์ ์ด
- ํน์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์์ ๊ด๋ฆฌํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ๊ฐ์ด ๊ด๋ฆฌํ๊ณ ์ ํ๋
๊ฒ
( ์ฐ๊ด๋ ์ํฐํฐ์ ์ ๋ณด๊น์ง ํ๊บผ๋ฒ์ ์กฐํํ๊ฑฐ๋ ์ญ์ ํ๋ ๋ฑ์ ๋์ ํ ์ ์์ ) - ์ฐ๊ด๊ด๊ณ ๋งคํ ์ ๋ํ
์ด์
์ cascade ์ ํธ๋ฆฌ๋ทฐํธ๋ก ์ค์
Ex.@OneToOne(mappedBy = "member", cascade = CascadeType.PERSIST)
โ๏ธ Cascade Type ์ข
๋ฅ
PERSIST
- ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ์์ํ์ํด
REMOVE
- ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ์์์ฑ ์ปจํ ์คํธ์์ ์ ๊ฑฐ
MERGE
- ์์ ์ํ์ ์ํฐํฐ์ ์ค์์ ์ํ์ ์ํฐํฐ๋ฅผ ๋ณํฉํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๊น์ง
๋ณํฉ์ ์ ์ฉ
- ์์ ์ํ์ ์ํฐํฐ์ ์ค์์ ์ํ์ ์ํฐํฐ๋ฅผ ๋ณํฉํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๊น์ง
REFRESH
- ์ํฐํฐ๋ฅผ ๋ค์ ์ฝ์ด ์ฌ ๋, ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ๋ค์ ์ฝ์ด์ด
DETACH
- ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ์ค์์ํ(Detach)
[์ฐธ๊ณ ] https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html#pc-cascade
- ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ์ค์์ํ(Detach)
โ๏ธJPA API
private EntityManager em;
// JPA ์ ์์์ฑ ์ปจํ
์คํธ๋ EntityManager ์ธํฐํ์ด์ค์ ์ํด์ ๊ด๋ฆฌ๋จ
private EntityTransaction tx;
// ์ด ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ์ ์ฅ
โ๏ธ tx.begin();
- Transaction ์์์ ์ํ ๋ฉ์๋ ํธ์ถ
โ๏ธ em.persist(new ๊ฐ์ฒด(๊ฐ));
- ๊ฐ์ฒด๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ
- ์ด ๋ฉ์๋ ํธ์ถ ์, 1์ฐจ ์บ์์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๊ณ , ์ด ๊ฐ์ฒด๋ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ INSERT ์ฟผ๋ฆฌ ํํ(INSERT ...(๊ฐ์ฒด๋ช ))๋ก ๋ฑ๋ก๋จ
But, ์ค์ ํ
์ด๋ธ์๋ ์ด ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๊ณ , ์ค์ ๋ก๊ทธ์๋ INSET ์ฟผ๋ฆฌ ์๋ณด์
โ commit()
์ผ๋ก ๋ฐ๋ก ์ ์ฅํด์ค์ผ ํจ
โ ์์ ์ฃผ์ํ๋ฉด์ persist() ํด์ผํจ !
Ex. Coffee(1) / Order(1) / OrderCoffee(N) ํด๋์ค๊ฐ ์์ ๋,
OrderCoffee ํด๋์ค๋ Coffee์ Order์ ์ธ๋ํค๋ฅผ ์ฐธ์กฐ๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์
Coffee / Order ๋ณด๋ค ๋ฆ๊ฒ persist() ํด์ผํจ
โ๏ธ em.find(์กฐํํ ์ํฐํฐ ํด๋์ค ํ์
, ์กฐํํ ์ํฐํฐ ํด๋์ค์ ์๋ณ์ ๊ฐ);
commit()
์ผ๋ก ํ ์ด๋ธ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์์์ ์กฐํ
( ํ ์ด๋ธ์์ ์กฐํ X )
โ๏ธ em.remove();
- ์์์ฑ ์ปจํ
์คํธ์ 1์ฐจ ์บ์์ ์๋ ์ํฐํฐ ์ ๊ฑฐ ์์ฒญ
โ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ DELETE ์ฟผ๋ฆฌ ๋ฑ๋ก
โ๏ธ em.flush();
commit()
๋ฉ์๋ ํธ์ถ์ JPA ๋ด๋ถ์ ์ผ๋ก em.flush() ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์
โ๏ธ tx.commit();
- ์์์ฑ ์ปจํ
์คํธ์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ๋ฑ๋ก๋ ์ฟผ๋ฆฌ ์คํ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ ์ฅ
๐ ์ค์ต
- projects ๋ด์ be-template-jdbc 2
์ ์ฌ์ง๊ณผ ๊ฐ์ด yml ํ์ผ์ ์๋ ๋๊ฐ ์ถ๊ฐํด์ฃผ๊ธฐ !
ddl-auto: create
โ ์คํค๋ง ์๋ ์์ฑ
( ์ํฐํฐ ํด๋์ค์ ๋งคํ๋๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ์์ฑํด์ค )
( schema.sql ํ์ผ ์์ฑ ํ์ X )show-sql: true
โ SQL ์ฟผ๋ฆฌ ์ถ๋ ฅ
( JPA API ๋ฅผ ํตํด์ ์คํ๋๋ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ก๊ทธ๋ก ์ถ๋ ฅ )
( ๋์ ๊ณผ์ ์ดํด ์ฌ์ )
ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๋ด๋ถ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ๋ ฅํ๋ฉด ์๋์ ๊ฐ์ด ํ
์ด๋ธ์ด ์๋์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์์ !
์๋๋ find() ๋ฉ์๋๋ก ID๊ฐ 1์ธ Member์ email ์ฃผ์๋ฅผ ์์์ฑ ์ปจํ
์คํธ์์ ์กฐํํ๊ณ ์๋ ๊ฒ ํ์ธ ๊ฐ๋ฅ !
application.yml ํ์ผ์ ์๋์ ๊ฐ์ด ์ถ๊ฐํ๋ค๋ฉด
spring: //์ด๊ฑด ์ด๋ฏธ ์ฐ์ฌ ์์
jpa: //์ด๊ฒ๋ ์ฐ์ฌ ์์
properties: //์ถ๊ฐ
hibernate: //์ถ๊ฐ
format_sql: true //์ถ๊ฐ
์์ ์์ ์ฌ์ง๋ค๊ณผ ๊ฐ์ด ํ์ค๋ก ๋ฐ๋ฐํ๋ ๋ก๊ทธ๋ค์ ์๋์ ๊ฐ์ด ์์๊ฒ ๋ณด๊ธฐ ๊ฐ๋ฅ !!
[์ฐธ๊ณ ] https://lannstark.tistory.com/14
์๋์ ์ฝ๋๋ฅผ ์คํํ๋ฉด,
Member resultMember2 = em.find(Member.class, 2L);
//์๋ณ์ ๊ฐ์ด 2L ์ธ member ๊ฐ์ฒด ์กฐํ
//์กฐํ๋ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ํ
์ด๋ธ์๋ SELECT ์ฟผ๋ฆฌ ์ ์กํ์ฌ ์กฐํ
System.out.println(resultMember2 == null); //์์์ ์กฐํํ๋ ๊ฐ์ฒด๊ฐ ์์ผ๋๊น ์ด ๊ฒฐ๊ณผ true
SELECT ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๊ฒ์ ๋ณผ ์ ์๊ณ ,
์ด SELECT ์ฟผ๋ฆฌ๋ฅผ ํตํด em.find(Member.class, 2L)
๋ก ์กฐํ๋ฅผ ํ๋๋ฐ
์๋ณ์ ๊ฐ 2L์ ํด๋นํ๋ member2 ๊ฐ์ฒด๊ฐ ์์์ฑ ์ปจํ
์คํธ์ 1์ฐจ ์บ์์ ์๊ธฐ ๋๋ฌธ์
์ถ๊ฐ์ ์ผ๋ก ํ ์ด๋ธ์์ ํ๋ฒ ๋ ์กฐํํ๋ค๋ ๊ฒ ์ ์ ์์
์๋์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์คํ์ํค๋ฉด,
private void example03() {
tx.begin();
Member member1 = new Member("hgd@gmail.com");
Member member2 = new Member("hgd@gmail.com");
em.persist(member1);
em.persist(member2);
//member1, member2 ๊ฐ์ฒด๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ
//--> 1์ฐจ ์บ์ - member2 ๊ฐ์ฒด / ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์ - INSERT ...(member2)
//--> ํ
์ด๋ธ์๋ ์ ์ฅ X
tx.commit();
//์์์ฑ ์ปจํ
์คํธ์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์๋ INSERT ์ฟผ๋ฆฌ๋ฌธ ์คํ
//--> ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ ์ฅ
}
์๋์ ๊ฐ์ด ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ๋ member ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๊ฒ์ ์ ์ ์์!
++์ถ๊ฐ๋ก
@Setter
์ ๋ํ
์ด์
์ ํด๋์ค ๋ ๋ฒจ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์ ์ด์ง ์์ !
ํด๋น ํด๋์ค์ ์๋ณ์(Id)์ฒ๋ผ ์์ ์ด๋๋ฉด ์๋๋ ์ ๋ณด๋ ๋ฐ๋์ง ์์์ผํ๋๋ฐ
ํด๋์ค ๋ ๋ฒจ์ @Setter ์ ๋ํ
์ด์
์ ๋ถ์ผ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ์ ์์ !
โ @Setter
์ ๋ํ
์ด์
์ ์์ ์ด ํ์ํ ํ๋(๋ฉ์๋) ๋ ๋ฒจ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์ง !
๐ ๋๋์
ํ์คํ JDBC ๋ณด๋ค ์ฝ๊ณ ๊ทธ๋์ ๊ทธ๋ฐ์ง ์ฌ๋ฐ๋ค !!
๋ญ๊ฐ ์ดํด๋ ์ ๋๊ณ ์ ๋ฆฌ๋ ๋ ์ ๋๋ ๋๋
JDBC ์์๋ ์์ง ์ดํด ๋ชปํ ๋ถ๋ถ์ด ์์ง๋ง ์๊ฐ์ด ์์ด์ ์ผ๋จ ๋์ด๊ฐ์๋๋ฐ,
์ค๋ฌด์์๋ JPA๋ฅผ ๋ณดํต ์ฌ์ฉํ๋ค๊ณ ํ๋ ์ ๋ง ๋คํ์ด๋ค ใ
ใ
( ๋ณธ ๊ฒ์๋ฌผ์ 2022/11/03์ ์์ฑํ ๊ธ์ ์ฎ๊ธด ๊ธ์ ๋๋ค. ์๋ฌธ์ ์๊ธฐ์ ์์! )
'โข CodeStates BootCamp > Section 3' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ [Section3] 9. [ Spring MVC ] ํธ๋์ญ์ (0) | 2023.04.11 |
---|---|
๐ [Section3] 8. [ Spring MVC ] Spring Data JPA 2 (0) | 2023.04.11 |
๐ [Section3] 6. [ Spring MVC ] Spring Data JDBC 2 (1) | 2023.04.10 |
๐ [Section3] 5. [ Spring MVC ] Spring Data JDBC 1 (0) | 2023.04.10 |
๐ [Section3] 4. [ Spring MVC ] ์์ธ ์ฒ๋ฆฌ (0) | 2023.04.10 |