๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring๐Ÿƒ

Raw JPA

728x90

์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

 

ํ…Œ์ด๋ธ” ๋งคํ•‘ ๊ธฐ๋Šฅ์œผ๋กœ RDB๋ฅผ ๊ฐ์ฒด๋กœ ์˜ฎ๊ธฐ๊ธฐ

1. @Entity

๊ฐ์ฒด ๊ด€์ ์—์„œ์˜ ์ด๋ฆ„, ํด๋ž˜์Šค ๋ช…์ด ๋””ํดํŠธ, ์—”ํ‹ฐํ‹ฐ์˜ ์ด๋ฆ„์€ JQL์—์„œ ์“ฐ์ธ๋‹ค

JQL : Entity ๋ช…์œผ๋กœ ์ฟผ๋ฆฌ์งค ๋•Œ ์“ฐ์ด๋Š” ์–ธ์–ด(ex : JPQL, QueryDsl)

2. @Table

RDB์˜ ํ…Œ์ด๋ธ” ์ด๋ฆ„, @Entity์˜ ์ด๋ฆ„์ด ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ๊ฐ’ ~ ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์€ SQL์—์„œ ์“ฐ์ธ๋‹ค ~ SQL : Table ๋ช…์œผ๋กœ ์ฟผ๋ฆฌ์งค ๋•Œ ์“ฐ์ด๋Š” ์–ธ์–ด(ex : JDBC, SQL Mapper)

3. @Id

์—”ํ‹ฐํ‹ฐ์˜ ์ฃผ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ, ์ž๋ฐ”์˜ ๋ชจ๋“  ์›์‹œ ํƒ€์ž…๊ณผ ๊ทธ ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

4. @GeneratedValue

์ฃผ ํ‚ค์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ๋งคํ•‘, ์ƒ์„ฑ ์ „๋žต๊ณผ ์ƒ์„ฑ๊ธฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

5. @Column

Raw JPA ํ•„๋“œ ํƒ€์ž… ๋งคํ•‘ ๊ธฐ๋Šฅ

Value ํƒ€์ž… ์ข…๋ฅ˜

๊ธฐ๋ณธํƒ€์ž…

1) @Column : ์‚ฌ์ด์ฆˆ ์ œํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ, @Entity๊ฐ€ ์žˆ์„ ์‹œ ์ž๋™์œผ๋กœ ํ•„๋“œ์— ๋ถ™๋Š”๋‹ค

2) @Enumerated : Enum ๋งคํ•‘์šฉ๋„๋กœ ์“ฐ์ด๋ฉฐ ์‹ค๋ฌด : @Enumerated(EnumType.String)๋กœ ์‚ฌ์šฉ ๊ถŒ์žฅ

~ Ordinal์€ ์ˆœ์„œ ๋ณ€๊ฒฝ ์‹œ ๊ผฌ์ผ ์ˆ˜ ์žˆ๋‹ค

Composite Value ํƒ€์ž…

@Embeddable

@Embedded

@AttributeOverrides

@AttributeOverride

์ฐธ๊ณ 

https://klyhyeon.tistory.com/272

 

[JPA] @Embedded ์™€ @Embeddable

@Embedded ์™€ @Embeddable ์—”ํ‹ฐํ‹ฐ ์—ฌ๋Ÿฌ ํ•„๋“œ๊ฐ€ ํ•œ ๊ฐ์ฒด๋กœ ๋ฌถ์—ฌ์„œ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ @Embeddable ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์—”ํ‹ฐํ‹ฐ์— @Embedded์„ ๊ฑธ์–ด์ค๋‹ˆ๋‹ค. @Entity @Table(name = "PRODUCT") public class Product { @Embedded private Address

klyhyeon.tistory.com

Collection Value ํƒ€์ž…

๊ธฐ๋ณธ ํƒ€์ž… ์ฝœ๋ ‰์…˜

์ปดํฌ์ง“ ํƒ€์ž… ์ฝœ๋ ‰์…˜

 

RawJPA ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘๊ธฐ๋Šฅ

@OneToOne

๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์“ฐ๋ฉด ๋ฌธ์ œ ๋ฐœ์ƒ๊ฐ€๋Šฅ

FetchType = LAZY ๊ธฐ๋ณธ์„ค์ •

์†์„ฑ

mappedBy : ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ ํ•„๋“œ ์„ ํƒ

fetch : ๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜์ „๋žต ์„ค์ •

cascade : ์˜์†์„ฑ ์ „์ด ๊ธฐ๋Šฅ ์‚ฌ์šฉ

targetEntity : ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์˜ ํƒ€์ž… ์ •๋ณด ์„ค์ •

@ManyToOne

์†์„ฑ

optional(๊ธฐ๋ณธ๊ฐ’ = true) : false ์„ค์ • ์‹œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•œ๋‹ค

fetch : ๊ธฐ๋ณธ EAGER๋กœ ๋˜์–ด์žˆ์œผ๋‚˜ ์‹ค๋ฌด LAZY ์ถ”์ฒœ

cascade : ์˜์†์„ฑ ์ „์ด ๊ธฐ๋Šฅ ์‚ฌ์šฉ

targetEntity : ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์˜ ํƒ€์ž… ์ •๋ณด ์„ค์ • (targetEntity = Member.class ์‹์œผ๋กœ ์‚ฌ์šฉ)

@JoinColumn

์™ธ๋ž˜ ํ‚ค ๋งคํ•‘ ์‹œ ์‚ฌ์šฉ (Join ์„ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ ๋งคํ•‘์ •๋ณด)

@ManyToOne ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ์ฃผ๋กœ ํ•จ๊ป˜ ์“ฐ์ธ๋‹ค. (์กฐ์ธ๋Œ€์ƒ ์ปฌ๋Ÿผ ์ง€์ •๊ธฐ๋Šฅ์„ ์•ˆ์“ธ๊ฑฐ๋ฉด ์ƒ๋žตํ•ด๋„ ๋จ)

name ์†์„ฑ์€ ๋งคํ•‘ํ•  ์™ธ๋ž˜ํ‚ค์˜ ์ด๋ฆ„

์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•ด๋„ ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ƒ์„ฑ

์ƒ๋žต ์‹œ ์™ธ๋ž˜ํ‚ค์˜ ์ด๋ฆ„์ด ๊ธฐ๋ณธ ์ „๋žต์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์„ฑ

์†์„ฑ

name : ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค์˜ ์ด๋ฆ„

referencedColumnName : ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…

foreignKey : ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ์กฐ๊ฑด ์ง€์ • (ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ์—๋งŒ ์ ์šฉ๋จ)

unique/nullable/insertable/updateable/columnDefinition/table : @Column์˜ ์†์„ฑ๊ณผ ๊ฐ™์Œ

@ManyToMany

๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋งคํ•‘ ์ •๋ณด (N:M)

๋‹ค๋Œ€๋‹ค ์„ค์ •์„ ํ•˜๊ฒŒ๋˜๋ฉด ์ค‘๊ฐ„ ๋งคํ•‘ํ…Œ์ด๋ธ”(JoinTable)์ด ์ž๋™ ์ƒ์„ฑ

์ค‘๊ฐ„ ๋งคํ•‘ ํ…Œ์ด๋ธ”์€ JPA์ƒ์—์„œ ์ˆจ๊ฒจ์ ธ์„œ(Entity ์ •์˜ ์—†์ด) ๊ด€๋ฆฌ

-> ๋งคํ•‘ ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ์„œ ์‹ค๋ฌด์—์„œ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ

-> ์‹ค๋ฌด์—์„œ๋Š” ๋งคํ•‘ ํ…Œ์ด๋ธ”์„ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ง์ ‘ ์ •์˜

TableA(@OneToMany) > MappingTable(@ManyToOne,@ManyToOne) > TableB(@OneToMany)

 

ex) User : ์ผ๋Œ€๋‹ค -> UserChannel : ๋‹ค๋Œ€์ผ, ๋‹ค๋Œ€์ผ -> Channel : ์ผ๋Œ€๋‹ค

 

๋ณตํ•ฉ ํ‚ค ์‚ฌ์šฉํ•˜๊ธฐ

์„ ์–ธ ๋ฐฉ๋ฒ•

  1. @IdClass๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ณตํ•ฉํ‚ค๋Š” ๋ณตํ•ฉํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์—”ํ‹ฐํ‹ฐ ์œ„์— @IdClass(์‹๋ณ„์ž ํด๋ž˜์Šค) ์‚ฌ์šฉ
  2. @EmbeddedId๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ณตํ•ฉํ‚ค๋Š” ๋ณตํ•ฉํ‚ค ์œ„์— @EmbeddedId ์‚ฌ์šฉ

RawJPA ๊ธฐํƒ€๊ธฐ๋Šฅ

Cascade

์‚ฌ์šฉ ์œ„์น˜

์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ : ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ

์‚ฌ์šฉ ์กฐ๊ฑด

- ์–‘์ชฝ ์—”ํ‹ฐํ‹ฐ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์ด ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค ex) ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€ : ํ•จ๊ป˜ ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค

- ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ๋กœ์˜ ์˜์†์„ฑ ์ „์ด๋Š” ํ˜„์žฌ ์—”ํ‹ฐํ‹ฐ์—์„œ๋งŒ ์ „์ด๋˜์–ด์•ผ ํ•œ๋‹ค(๋‹ค๋ฅธ ๊ณณ์—์„œ ๋˜ ๊ฑธ๋ฉด ์•ˆ๋œ๋‹ค)

ex) ๊ฒŒ์‹œ๊ธ€์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋Œ“๊ธ€์˜ ์˜์†์„ฑ ์ „์ด๋ฅผ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค

 

์˜ต์…˜ ์ข…๋ฅ˜

ALL : ์ „์ฒด ์ƒํƒœ ์ „์ด

PERSIST : ์ €์žฅ ์ƒํƒœ ์ „์ด

REMOVE : ์‚ญ์ œ ์ƒํƒœ ์ „์ด

MERGE : ์—…๋ฐ์ดํŠธ ์ƒํƒœ ์ „์ด

REFRESH : ๊ฐฑ์‹  ์ƒํƒœ ์ „์ด

DETACH : ๋น„์˜์†์„ฑ ์ƒํƒœ ์ „์ด

OrphanRemoval

์‚ฌ์šฉ ์œ„์น˜

๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ

์‚ฌ์šฉ๋ฒ•

Cascade.REMOVE์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์‚ญ์ œ ์ „ํŒŒ ์‹œ ์‚ฌ์šฉ

https://cdaosldk.tistory.com/126

 

๊ฒŒ์‹œํŒ์˜ ๋Œ“๊ธ€์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ๋Œ“๊ธ€ ์‚ญ์ œ ์—†์ด ๊ฒŒ์‹œ๋ฌผ๋งŒ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ์™ธ Referentia

๋ถ€๋ชจ(๊ฒŒ์‹œ๋ฌผ) -> ์ž์‹(๋Œ“๊ธ€) ๊ด€๊ณ„๋กœ DB๊ฐ€ ์„ค์ •๋˜์–ด์žˆ์„ ๋•Œ, ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์šธ ๋•Œ ๋‚จ๊ฒจ์ง€๋Š” ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ณ ์•„ ๊ฐ์ฒด๋กœ ๋ณธ๋‹ค. ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘˜ ๊ฒฝ์šฐ Referential integrity constra

cdaosldk.tistory.com

* Cascade.REMOVE์™€์˜ ์ฐจ์ด์ 

OrphanRemoval์˜ ๊ฒฝ์šฐ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์˜ ์ž์‹ ์—”ํ‹ฐํ‹ฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ๋งŒ ํ•ด๋„ ๊ทธ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค

-> Casecade.REMOVE์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ด ๋” ์„ธ๋ฐ€ํ•œ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค

 

์˜์†์„ฑ ์ „์ด ์ตœ๊ฐ• ์กฐํ•ฉ : OrphanRemoval = true, Cascade.ALL

~ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์ด ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์™€ ์™„์ „ํžˆ ๋™์ผํ•ด์ง€๋ฉฐ, ์ง์ ‘ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ Repository๊ฐ€ ํ•„์š”์—†๊ฒŒ ๋œ๋‹ค ~ ์‹ค๋ฌด : ๋งคํ•‘ ํ…Œ์ด๋ธ”(๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„)์—์„œ ๋งŽ์ด ์“ฐ์ธ๋‹ค

Fetch

์‚ฌ์šฉ ์œ„์น˜

์—”ํ‹ฐํ‹ฐ์— FetchType์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค :

@ElementCollection, @ManyToMany, @OneToMany, @ManyToOne, @OneToOne

์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ์ ์œผ๋กœ  LAZY๋ฅผ ์„ค์ •ํ•œ ๋’ค ํ•„์š” ์‹œ fetch join์„ ์ˆ˜ํ–‰

ํ•ญ์ƒ ๊ฐ™์ด ์“ฐ์ด๋Š” ์—ฐ๊ด€๊ด€๊ณ„์ผ ๊ฒฝ์šฐ์—๋งŒ EAGER๋ฅผ ์„ค์ •

์˜ต์…˜

EAGER : ์ฆ‰์‹œ ๋กœ๋”ฉ (๋ถ€๋ชจ ์กฐํšŒ์‹œ ์ž์‹๋„ ๊ฐ™์ด ์กฐํšŒ)

LAZY : ์ง€์—ฐ ๋กœ๋”ฉ (์ž์‹์€ ํ•„์š”ํ•  ๋•Œ ๋”ฐ๋กœ ์กฐํšŒ)

 

 

 

728x90