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

Spring๐Ÿƒ

ORM์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ(JDBC, Querry Mapper) + ์„ฑ์žฅ ๊ณผ์ •

728x90

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

 

๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•œ ๊ฒƒ : https://cdaosldk.tistory.com/69

1. DB ํƒ„์ƒ ํ›„ JAVA ์•ฑ๊ณผ ์—ฐ๋™์„ ์œ„ํ•ด JDBC ์ถœ์‹œ

JDBC Driver Manager๋Š” ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ DB์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต

JDBC Driver Manager๋Š” ๋Ÿฐํƒ€์ž„ ํ•  ๋•Œ 

-Connection์„ ์ƒ์„ฑํ•ด ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งŒ๋“ค๊ณ 

-Statement๋ฅผ ์ƒ์„ฑํ•ด ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ 

-ResultSet์„ ์ƒ์„ฑํ•ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค

์‚ฌ์šฉ ํ›„ ๊ฐ๊ฐ Close()๋ฅผ ํ†ตํ•ด ์ž์›์„ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค

 

JDBC ๋ฐฉ์‹์œผ๋กœ ์‹ค์Šตํ•ด๋ณด๊ธฐ

  • ์—ฐ๊ฒฐ์ •๋ณด ํŒŒ๋ผ๋ฏธํ„ฐ ์ •์˜
  • Connection ์ƒ์„ฑ
  • ์‹คํ–‰ํ•  SQL ๋ฌธ ์ง€์ •
  • ํŒŒ๋ผ๋ฏธํ„ฐ ์„ ์–ธ๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ์ œ๊ณต
  • Statement ์ค€๋น„์™€ ์‹คํ–‰
  • ๊ฒฐ๊ณผ ๋‹ด๊ธฐ
  • Connection, Statement, ResultSet ๋‹ซ๊ธฐ
  • Connection, Statement, ResultSet ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

-> ์ค‘๋ณต์ฝ”๋“œ ๋ฐœ์ƒ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ DB๋ณ„๋กœ ํ•  ์ˆ˜ ์—†์Œ, ์ž์› ๊ด€๋ฆฌ๋ฅผ ๋”ฐ๋กœ ํ•ด์ค˜์•ผํ•œ๋‹ค

2. Querry Mapper : Persistence Framework

SQL Mapper : JDBC Templeate, MyBatis cf) MyBatis : ๊ณผ๊ฑฐ ์ „์ž์ •๋ถ€ ํ‘œ์ค€

ORM : JPA, Hibernate

 

JDBC Templeate

- ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด ํ•„๋“œ ๋งคํ•‘

- RowMapper๋กœ ์‘๋‹ต ํ•„๋“œ ๋งคํ•‘์ฝ”๋“œ ์žฌ์‚ฌ์šฉ

- Connection, Statement, ResultSet ๋ฐ˜๋ณต์  ์ฒ˜๋ฆฌ๋ฅผ ๋Œ€์‹  ํ•ด์ค€๋‹ค

JDBC Templeate๋Š” JDBC Driver๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋™์ž‘

MyBatis

-๋ฐ˜๋ณต์ ์ธ JDBC ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋‹จ์ˆœํ™”

- SQL ์ฟผ๋ฆฌ๋“ค์„ XML ํŒŒ์ผ์— ์ž‘์„ฑํ•˜์—ฌ ์ฝ”๋“œ์™€ SQL์„ ๋ถ„๋ฆฌ

- ๋‹จ์  : DB ๊ธฐ๋Šฅ์— ์ข…์†์ , ํ…Œ์ด๋ธ”๋งˆ๋‹ค CRUD ๋ฐ˜๋ณต, DB ํƒ€์ž… ๋ฐ ํ…Œ์ด๋ธ”์— ์ข…์†์ 

 

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. xml

2. ์–ด๋…ธํ…Œ์ด์…˜ ํ™œ์šฉ : ์ฟผ๋ฆฌ๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜์˜ value๊ฐ’์œผ๋กœ ๋„ฃ๋Š” 

 

MyBatis ์‹คํ–‰ ๊ณผ์ • : 

์ฐธ๊ณ  : https://lotuus.tistory.com/75

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ SqlSessionFactoryBuilder๊ฐ€ ์„ค์ •ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์—ฌ SqlSessionFactory ์ƒ์„ฑ

2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DB์ž‘์—… ์‹œ SqlSessionFactory๊ฐ€ SqlSession๊ฐ์ฒด ์ƒ์„ฑ

3. ์ƒ์„ฑ๋œ SqlSession์„ ์ฐธ๊ณ ํ•ด์„œ mapper์ธํ„ฐํŽ˜์ด์Šค ํ˜ธ์ถœ (SqlSession์— mapper์ •๋ณด๊ฐ€ ๋‚ด์žฅ๋˜์–ด์žˆ๋‹ค)

5. mapper๊ฐ€ SqlSession์„ ํ˜ธ์ถœํ•˜์—ฌ SQL์‹คํ–‰

3. QuerryMapper์˜ DB ์˜์กด์„ฑ ๋ฐ ์ค‘๋ณต ์ฟผ๋ฆฌ ๋ฌธ์ œ๋กœ ORM ํƒ„์ƒ

-> ORM์€ DAO ๋˜๋Š” Mapper๋ฅผ ํ†ตํ•ด ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ…Œ์ด๋ธ”์„ ์•„์˜ˆ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์™€ ๋Œ€์‘ ์‹œํ‚จ๋‹ค

4. ORM์˜ ์„ฑ์žฅ ๊ณผ์ •

ORM์ด ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ

1) ์ƒ์†

๊ฐ์ฒด : ๊ฐ์ฒด ๊ฐ„ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋‚˜ ์ƒ์†๊ด€๊ณ„๋ฅผ ๋งบ์„ ์ˆ˜ ์žˆ๋‹ค

RDB : ํ…Œ์ด๋ธ”๋“ค์€ ์ƒ์†๊ด€๊ณ„๊ฐ€ ์—†๊ณ  ๋ชจ๋‘ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ๋งคํ•‘์ •๋ณด์— ์ƒ์†์ •๋ณด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค(@OneToMany, @ManyToOne)

 

2) ๊ด€๊ณ„

๊ฐ์ฒด : ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐฉํ–ฅ์„ ๊ฐ€์ง„๋‹ค(๋‹ค๋Œ€๋‹ค ๊ฐ€๋Šฅ)

RDB : ์™ธ๋ž˜ ํ‚ค(FK)๋ฅผ ์„ค์ •ํ•ด Join์œผ๋กœ ์กฐํšŒ์‹œ์—๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ(๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ์‹œ ๋งคํ•‘ ํ…Œ์ด๋ธ” ํ•„์š”)

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ๋งคํ•‘์ •๋ณด์— ๋ฐฉํ–ฅ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค(@JoinColumn, @MappedBy)

 

3) ํƒ์ƒ‰

๊ฐ์ฒด : ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ˆœ์ฐจ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ฝœ๋ ‰์…˜๋„ ์ˆœํšŒ

RDB : ํƒ์ƒ‰ ์‹œ ์ฐธ์กฐํ•˜๋Š” ๋งŒํผ ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๋‚˜, join์ด ๋ฐœ์ƒํ•˜์—ฌ ๋น„ํšจ์œจ์ 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ๋งคํ•‘/์กฐํšŒ ์ •๋ณด๋กœ ์ฐธ์กฐํƒ์ƒ‰ ์‹œ์ ์„ ๊ด€๋ฆฌํ•œ๋‹ค(@FetchType, fetchJoin())

 

4) ๋ฐ€๋„

๊ฐ์ฒด : ๋ฉค๋ฒ„ ๊ฐ์ฒด ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ํด ์ˆ˜ ์žˆ๋‹ค

RDB : ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ์กด์žฌ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฉค๋ฒ„ ๊ฐ์ฒด๋Š” ํ…Œ์ด๋ธ”์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ƒ์†์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค(@embedded)

 

5) ์‹๋ณ„์„ฑ

๊ฐ์ฒด : ๊ฐ์ฒด์˜ hashCode ๋˜๋Š” ์ •์˜ํ•œ equals() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์‹๋ณ„

RDB : PK๋กœ๋งŒ ์‹๋ณ„

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : PK๋ฅผ ๊ฐ์ฒด id๋กœ ์„ค์ •ํ•˜๊ณ  EntityManager๋Š” ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค(@Id, @GenerateValue)

 

1์ฐจ, 2์ฐจ ์บ์‹œ

1์ฐจ ์บ์‹œ

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์ €์žฅ์†Œ

์ผ๋ฐ˜์ ์œผ๋กœ ํŠธ๋žœ์ ์…˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ ๊ฐ„ 1์ฐจ ์บ์‹œ๊ฐ€ ์œ ํšจ

1์ฐจ ์บ์‹œ๋Š” ํ•œ ํŠธ๋žœ์ ์…˜ ๋™์•ˆ ๊ณ„์† ์›๋ณธ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค

 

2์ฐจ ์บ์‹œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ”์œ„ ์บ์‹œ, ๊ณต์œ  ์บ์‹œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์บ์‹œ ์œ ์ง€

์›๋ณธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณต์‚ฌ๋ณธ์„ ๋„˜๊ฒจ์ค€๋‹ค ~ ์—ฌ๋Ÿฌ ํŠธ๋žœ์ ์…˜์—์„œ ๋™์ผํ•œ ์›๋ณธ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด

์ ์šฉ๋ฐฉ๋ฒ•

1. Entity์— @Cacheable ์ ์šฉ ํ›„ ์„ค์ • ์ถ”๊ฐ€

2. sharedCache.made ์„ค์ •

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(1์ฐจ ์บ์‹œ)๋ฅผ ํ™œ์šฉํ•œ ์“ฐ๊ธฐ ์ง€์—ฐ

+ https://cdaosldk.tistory.com/163

 

JPA ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ์—๋Ÿฌ ์žก๊ธฐ(1)

์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ 1. JPA ์—ฐ๊ด€๊ด€๊ณ„ ์›๋ฆฌ 1) JPA ์ •๋ฆฌ( ORM, Hibernate, JPA ) JPA : ์ž๋ฐ” ์ง€์†์„ฑ(์˜์†์„ฑ) API, ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌํžˆ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š”(DB) ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ์Œ JPA ์ค‘ ๋Œ€ํ‘œ์ 

cdaosldk.tistory.com

์˜์†์„ฑ : ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์–ด๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ

~ ํŒŒ์ผ์ด๋‚˜ DB์— ์ €์žฅํ•˜๋ฉฐ ๊ทธ ๋ฐ์ดํ„ฐ์— ๋ถ€์—ฌ๋œ๋‹ค

 

์“ฐ๊ธฐ์ง€์—ฐ ๋ฐœ์ƒ์‹œ์ 

- flush() ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ตœ์ ํ™”

- flush() ๋™์ž‘์œผ๋กœ ์ „์†ก๋œ ์ฟผ๋ฆฌ๋Š” ๋”์ด์ƒ ์ฟผ๋ฆฌ ์ตœ์ ํ™”๋Š” ๋˜์ง€ ์•Š๊ณ , ์ดํ›„ commit()์œผ๋กœ ๋ฐ˜์˜๋งŒ ๊ฐ€๋Šฅ

์“ฐ๊ธฐ์ง€์—ฐ ํšจ๊ณผ ~ ํŠธ๋žœ์ ์…˜ ๋‹น ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ตœ์†Œ ์ฟผ๋ฆฌ๋งŒ ๋‚ ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค

- ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ชจ์•„ ํ•œ ๋ฒˆ์— ์ฟผ๋ฆฌ ์ „์†ก

- ์˜์†์„ฑ ์ƒํƒœ์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ผ์–ด๋‚˜๋”๋ผ๋„ ํ•ด๋‹น ํŠธ๋žœ์ ์…˜ ์ข…๋ฃŒ ์‹œ ์ฟผ๋ฆฌ๋Š” 1๋ฒˆ๋งŒ ์ „์†ก

- ์˜์†์„ฑ ์ƒํƒœ์—์„œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค ์‚ญ์ œ๋˜์—ˆ๋‹ค๋ฉด ์‹ค์ œ DB์—๋Š” ์•„๋ฌด ๋™์ž‘์ด ์ „์†ก๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค

+ ํ‚ค ์ƒ์„ฑ์ „๋žต์ด .IDENTITY์ธ ๊ฒฝ์šฐ ์ƒ์„ฑ ์ฟผ๋ฆฌ๋Š” ์“ฐ๊ธฐ์ง€์—ฐ์ด ์—†๋‹ค : ๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ์™ธ๋ถ€ ํŠธ๋žœ์ ์…˜์— ์˜ํ•œ

์ค‘๋ณต ํ‚ค ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ๋‹จ์ผ ํ‚ค ๋ณด์žฅ

728x90