IT๊ณต๋ถ€์ผ๊ธฐ
article thumbnail

๐Ÿ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์ž, DBMS

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด DBMS(database management system)!

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ๊ณต์œ ๋กœ ๋™์‹œ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DBMS๋Š” ์ด๋Ÿฐ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋ฉด์„œ๋„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ MySQL, Oracle์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ” ๊ด€๊ณ„ํ˜• DBMS (relational DBMS : RDBMS)

๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” DBMS!

ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

(์ด ์ฑ…์€ ๊ฐœ๋ฐœ์‹œ H2, ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” MySQL ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.)

H2 : ์ž๋ฐ”๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” RDBMS. ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ง€์›ํ•˜๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๊ณต๊ฐ„์— ๋”ฐ๋กœ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์šฉ์–ด ์ •๋ฆฌ

โœ” ํ…Œ์ด๋ธ”

๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋‹จ์œ„

ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค

ํ–‰์€ ์—ฌ๋Ÿฌ ์†์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

โœ” ํ–‰ ๋˜๋Š” ๋ ˆ์ฝ”๋“œ

ํ…Œ์ด๋ธ”์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜

ํ…Œ์ด๋ธ”์˜ ๊ฐ€๋กœ๋กœ ๋ฐฐ์—ด๋œ ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ

ํ–‰์€ ๋ฐ˜๋“œ์‹œ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž์ธ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

ํ–‰์„ ๋ ˆ์ฝ”๋“œ(record)๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ

 

โœ” ์—ด

ํ…Œ์ด๋ธ”์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜

ํ–‰์— ์ €์žฅ๋˜๋Š” ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ

๊ฐ ์š”์†Œ์— ๋Œ€ํ•œ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 

โœ” ๊ธฐ๋ณธํ‚ค

primary key๋Š” ํ–‰์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ’์€ ํ…Œ์ด๋ธ”์—์„œ ์œ ์ผํ•ด์•ผ ํ•˜๋ฉฐ ์ค‘๋ณต ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ณดํ†ต ๋ฐ์ดํ„ฐ ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ

๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ฒŒ๋ฅผ ๋งบ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ‚ค๋Š” ์ˆ˜์ •๋˜์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ์œ ํšจํ•œ ๊ฐ’์œผ๋กœ, Null์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

โœ” ์ฟผ๋ฆฌ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ, ์‚ญ์ œ, ์ƒ์„ฑ, ์ˆ˜์ •๊ฐ™์€ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น๋ฌธ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์šฉ ์–ธ์–ด๋กœ SQL์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ” ORM ์ด๋ž€?

object-relational mapping์˜ ์•ฝ์ž

์ž๋ฐ”์˜ ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ’์„ ๋งˆ์น˜ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQL์„ ์ „ํ˜€ ๋ชฐ๋ผ๋„ ์ž๋ฐ” ์–ธ์–ด๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•ด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด ์ž๋ฐ” ์–ธ์–ด๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

 

โœ” ์žฅ์ 

1. SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด ์ถ”์ƒํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— MySQL -> PostgreSQL์œผ๋กœ ์ „ํ™˜ํ•œ๋‹ค๊ณ  ํ•ด๋„ ์ถ”๊ฐ€๋กœ ๋“œ๋Š” ์ž‘์—…์ด ๊ฑฐ์˜ ์—†๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

4. ๋งคํ•‘ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋ช…ํ™•ํ•จ์œผ๋กœ ERD์— ๋Œ€ํ•œ ์˜์กด๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

โœ” ๋‹จ์ 

1. ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ์ด ์ปค์งˆ์ˆ˜๋ก ์‚ฌ์šฉ ๋‚œ์ด๋„ ์ฆ๊ฐ€

2. ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šด ์ฟผ๋ฆฌ๋Š” ORM์œผ๋กœ ํ•ด๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ” JPA์™€ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ

์ž๋ฐ”์—์„œ๋Š” JPA, ์ฆ‰ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ ์‹ค์ œ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” ORM ํ”„๋ ˆ์ž„์›Œํด๋ฅด ์ถ”๊ฐ€๋กœ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ (hibernate)๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” JPA ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด์ด์ž, ์ž๋ฐ”์šฉ ORM ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” JDBC API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์˜ ๋ชฉํ‘œ๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ž์œ ์ž์žฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”๋ฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

 

-> ์ •๋ฆฌ

JPA(Java Persistence API) : ์ž๋ฐ” ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ. ๊ฐ์ฒด ์ง€ํ–ฅ ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‹ค๋ฆฌ ์—ญํ• 

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(hibernate) : JPA ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” JDBC API ์‚ฌ์šฉ

 

๐Ÿ” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ž€?

โœ” ์—”ํ‹ฐํ‹ฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ๊ฐ์ฒด.

์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋‹ค๋ฅด์ง€ ์•Š์œผ๋‚˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ๋‹ค๋Š” ํŠน์ง•์œผ๋กœ ๊ตฌ๋ถ„๋จ.

์ฆ‰, ์—”ํ‹ฐํ‹ฐ๋Š” ๊ฐ์ฒด์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

 

โœ” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €

์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๋“ฑ์˜ ์—ญํ• 

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ๋งŒ๋“œ๋Š” ๊ณณ์„ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ entity manager factory๋ผ๊ณ  ํ•˜๊ณ  ํ•œ๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ ๋‚ด๋ถ€์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ๋ฅด ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ณ  

@PersistenceContext ๋˜๋Š” @Autowired๋ฅผ ์‚ฌ์šฉํ•ด ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•จ.

 

@PersistenceContext
EntitiyManager em; // ํ”„๋ก์‹œ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €. ํ•„์š”ํ•  ๋•Œ ์ง„์งœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํ˜ธ์ถœ

 

๋˜ํ•œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นˆ์€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌด์— ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ๋•Œ๋ฌธ์—

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๋งค๋„ˆ์ €์™€ ์—ฐ๊ฒฐํ•˜๋Š” ํ”„๋ก์‹œ(๊ฐ€์งœ) ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•จ.

ํ•„์š”ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๋ จ๋œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ํ˜ธ์ถœํ•จ.

 

๐Ÿ” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€?

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Œ.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” JPA์˜ ์ค‘์š”ํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ, ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์ƒ์˜ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์—”ํ‹ฐํ‹ฐ๋ฅผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ์œ„ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ด๋ฅผ JPA๊ฐ€ ์•Œ์•„์„œ ์ฟผ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌ.

 

- ๊ธฐ๋ณธ์ ์ธ ํŠน์ง•

 

โœ” 1์ฐจ ์บ์‹œ

์บ์‹œ์˜ ํ‚ค๋Š” ์—”ํ‹ฐํ‹ฐ์˜ @Id์• ๋„ˆํ…Œ์ด์…˜์ด ๋‹ฌ๋ฆฐ ๊ธฐ๋ณธํ‚ค ์—ญํ• ์„ ํ•˜๋Š” ์‹๋ณ„์ž์ด๋ฉฐ ๊ฐ’์€ ์—”ํ‹ฐํ‹ฐ์ด๋‹ค.

์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด 1์ฐจ ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ, ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ฐ’์ด ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•ด 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•œ ๋‹ค์Œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์•„๋„ ๋˜์„œ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ฐ€๋Šฅ

 

โœ” ์“ฐ๊ธฐ ์ง€์—ฐ

transactional write-behind, ์“ฐ๊ธฐ ์ง€์—ฐ์€ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‹ค์ œ๋กœ ์งˆ์˜๋ฌธ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์ฟผ๋ฆฌ๋ฅผ ๋ชจ์•˜๋‹ค๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋ฉด ๋ชจ์•˜๋˜ ์ฟผ๋ฆฌ๋ฅผ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ

์ ๋‹นํ•œ ๋ฌถ์Œ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

โœ” ๋ณ€๊ฒฝ ๊ฐ์ง€

ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋ฉด 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’๊ณผ ํ˜„์žฌ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ ๋œ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•ด ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜.

์“ฐ๊ธฐ ์ง€์—ฐ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ๋‹นํ•œ ๋ฌถ์Œ์œผ๋กœ ์ฟผ๋ฆฌ ์š”์ฒญ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ” ์ง€์—ฐ ๋กœ๋”ฉ

lazy loading, ์ง€์—ฐ ๋กœ๋”ฉ์€ ์ฟผ๋ฆฌ๋กœ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ”๋กœ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

ํ•„์š”ํ•  ๋•Œ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ

(๋ฐ˜๋Œ€๋กœ ์กฐํšŒํ•  ๋•Œ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด ์—ฐ๊ด€๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์ฆ‰์‹œ ๋กœ๋”ฉ์ด๋ผ๊ณ  ํ•จ)

 

๐Ÿ” ์—”ํ‹ฐํ‹ฐ์˜ ์ƒํƒœ

 

public class EntityManagerTest {
    @Autowired
    EntitiyManger em;
    
    public void example() {
    	// 1. ๋น„์˜์† ์ƒํƒœ
        Member member = enw Member(1L, "ํ™๊ธธ๋™");
        
        // 2. ๊ด€๋ฆฌ ์ƒํƒœ
        em.persist(member);
        
        // 3. ๋ถ„๋ฆฌ ์ƒํƒœ
        em.detach(member);
        
        // 4. ์‚ญ์ œ ์ƒํƒœ
        em.remove(member);
    }
}

โœ” ๋น„์˜์† ์ƒํƒœ

์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฒ˜์Œ ๋งŒ๋“ค๋ฉด ์—”ํ‹ฐํ‹ฐ๋Š” ๋น„์˜์† ์ƒํƒœ

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

 

โœ” ๊ด€๋ฆฌ ์ƒํƒœ

persist() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ด ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

โœ” ๋ถ„๋ฆฌ ์ƒํƒœ

๋งŒ์•ฝ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด detach()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ

๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ” ์‚ญ์ œ ์ƒํƒœ

๋” ์ด์ƒ ๊ฐ์ฒด๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด remove() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ญ์ œ ๊ฐ€๋Šฅ

 

๐Ÿ” ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ์™€ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ spring data๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ ๊ธฐ๋Šฅ์„ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ์ถ”์ƒํ™”ํ•จ.

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” CRUD๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ์•Œ์•„์„œ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

 

๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน์„ฑ์— ๋งž์ถฐ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ๋„ ์ œ๊ณตํ•œ๋‹ค.

ํ‘œ์ค€ ์ŠคํŽ™์ธ JPA๋Š” ์Šคํ”„๋ง์—์„œ ๊ตฌํ˜„ํ•œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ฅผ,

๋ชฝ๊ณ ๋””๋น„๋Š” ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ๋ชฝ๊ณ ๋””๋น„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ” ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ž€?

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ์˜ ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์—์„œ JPA์˜ ์œ ์šฉํ•œ ๊ธฐ์ˆ ์ด ์ถ”๊ฐ€๋œ ๊ธฐ์ˆ .

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค์ธ PagingAndSortingRepository๋ฅผ ์ƒ์†๋ฐ›์•„ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ฆ.

JPA๋ฅผ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ณต

 

@PersistenceContext
EntityManager em;

public void join() {
    // ๊ธฐ์กด์— ์—”ํ‹ฐํ‹ฐ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ•ด์„œ ์ƒํƒœ ๋ณ€๊ฒฝ)
    Member member = new Member(1L, "ํ™๊ธธ๋™");
    em.persist(member);
}

 

 

๊ธฐ๋ณธ CRUD ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ JpaRepository ์ƒ์† ์˜ˆ

public interface MemberRepository extends JpaRepository<Member, Long> {
}

 

๐Ÿ” ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ

// ์ƒ์„ฑ Create
memberRepository.save(new Member(1L, "A"));

// ์กฐํšŒ Read
Optional<Member> member = memberRepository.findById(1L); // ๋‹จ๊ฑด ์กฐํšŒ
List<Member> allMembers = memberRepository.findAll();    // ์ „์ฒด ์กฐํšŒ

// ์‚ญ์ œ Delete
memberRepository.deleteById(1L);

 

1. save() : ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ์ €์žฅ

    ์ „๋‹ฌ ์ธ์ˆ˜๋กœ ์—”ํ‹ฐํ‹ฐ Member๋ฅผ ๋„˜๊ธฐ๋ฉด ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

 

2. findById() : id๋ฅผ ์ง€์ •ํ•ด ์—”ํ‹ฐํ‹ฐ ํ•˜๋‚˜ ์กฐํšŒ ๊ฐ€๋Šฅ

    findAll() : ์ „์ฒด ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ

 

3. deleteById() : id๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ

    (delete()๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ „๋‹ฌ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ ์‚ญ์ œ ๊ฐ€๋Šฅ)

 

๐Ÿ” ์• ๋„ˆํ…Œ์ด์…˜ ์—ญํ•  ์ •๋ฆฌ

โœ” @Entitiy : ์—”ํ‹ฐํ‹ฐ๋กœ ์ง€์ •

โœ” @NoArgsConstructor(access = AccessLevel.PROTECTED) // protected ์ œ์–ด์ž๋ฅผ ๊ฐ€์ง„ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ƒ์„ฑ

 

โœ” @Id : id ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ๊ธฐ๋ณธํ‚ค ์ง€์ •

โœ” @GeneratedValue(strategy = GenerationType.IDENTITY) : ์ž๋™ 1์”ฉ ์ฆ๊ฐ€

IDENTITY = AUTO_INCREMENT์™€ ๋™์ผ

 

โœ” @Column(name -= "name", nullable = false) : name์ด๋ผ๋Š” not null ์ปฌ๋Ÿผ๊ณผ ๋งคํ•‘