[JPA ๊ธฐ๋ณธ] JPA๋ž€ ๐Ÿ‘จโ€๐Ÿ’ป

ํ™์ •์™„ยท2022๋…„ 10์›” 26์ผ
0

JPA

๋ชฉ๋ก ๋ณด๊ธฐ
29/38
post-thumbnail
post-custom-banner

JPA ์†Œ๊ฐœ


๊ธฐ์กด JDBC๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋ณด๋‹ค SQL๊ณผ JDBC API๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋‹ค. ๋ฌผ๋ก , ์ฝ”๋“œ ์ค‘๋ณต์„ ์—†์• ๊ธฐ ์œ„ํ•ด์„œ Ibatis๋‚˜ JDBCTemplate ๊ฐ™์€ SQLMapper๋ฅผ ๋„์ž…ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฐ˜๋ณตํ•ด์„œ ์ž‘์—…์„ ํ•ด์•ผ ํ–ˆ๋‹ค.

๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์— ๋งž์ถฐ์„œ ๋ณด๋‚ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ๊ตฌ์กฐ๋Š” ํ…Œ์ด๋ธ” ํ˜•ํƒœ์— ์˜์กด์ ์ด๊ฒŒ ๋  ์ˆ˜๋ฐ–์— ์—†์—ˆ๊ณ  ์„ค๊ณ„ ๋˜ํ•œ ๊ฐ์ฒด ์ค‘์ ์ด ์•„๋‹Œ ํ…Œ์ด๋ธ” ์ค‘์ ์œผ๋กœ ์„ค๊ณ„๊ฐ€ ๋  ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค.
์ฆ‰, ๊ฐ์ฒด์ง€ํ–ฅ ๋ชจ๋ธ๋ง์— ๋Œ€ํ•œ ์žฅ์ ์„ ํฌ๊ธฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ๋ชจ๋ธ๋กœ ์„ค๊ณ„ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋ฐ”๋€ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์žˆ์—ˆ์œผ๋‹ˆ ๋ฐ”๋กœ ORM ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ORM ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์ค‘๊ฐ„์—์„œ ํ•ด๊ฒฐํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค.


JPA๋Š” ์ž๋ฐ” ORM ๊ธฐ์ˆ  ํ‘œ์ค€์ด๋‹ค. ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ๊ฐœ๋ฐœ์ž๋Š” ๊ฐœ๋ฐœ์— ์กฐ๊ธˆ ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด JPA๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•œ๋‹ค.

ORM (Object Relation Mapping)

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ 
  • ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•ด์„œ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ํ•ด๊ฒฐํ•ด ์ค€๋‹ค.



SQL์„ ์ง์ ‘ ๋‹ค๋ฃฐ ๋•Œ์˜ ๋ฌธ์ œ


์ผ๋ฐ˜์ ์ธ JDBC๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ DAO์˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. SQL ์ž‘์„ฑ
  2. JDBC API๋ฅผ ์‚ฌ์šฉํ•ด์„œ SQL ์‹คํ–‰
  3. ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋งž๊ฒŒ ์ฒ˜๋ฆฌ (์กฐํšŒ ๊ธฐ๋Šฅ์ผ ๊ฒฝ์šฐ ๊ฐ์ฒด๋กœ ๋งคํ•‘)

์œ„ 3๊ฐ€์ง€ ๊ณผ์ •์€ CRUD์—์„œ ๋ชจ๋‘ ๋™์ผํ•œ ์ ˆ์ฐจ์ด๋ฉฐ ์ด๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด๋‹ค. ๋˜ํ•œ Connectionํ•˜๊ณ  ์ด๋ฅผ Close ํ•ด์ฃผ๋Š” ์ž‘์—…๊นŒ์ง€ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  JDBCTemplate์—์„œ Connection๊ณผ Close ์ž‘์—…์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์„ ํ•ด๊ฒฐํ•ด ์ฃผ์—ˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ SQL ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์‚ฐํ•  ์ˆ˜๋ฐ–์— ์—†๋‹ค.


โœ… ์ฐธ๊ณ 

member๋ผ๋Š” ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋ฉด member ํ•„๋“œ๋“ค์„ ๊บผ๋‚ด์˜จ ๋’ค SQL์— ์‚ฝ์ž…ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. 
๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์•ž์„œ ๋งํ•œ 3๊ฐ€์ง€ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.        

ํ•˜์ง€๋งŒ ๋Œ€์ƒ์ด DB๊ฐ€ ์•„๋‹Œ Collection์˜ List๋ผ๊ณ  ๊ฐ€์ •์„ ํ•ด๋ณด์ž

List<Member> list = new ArrayList(); 
list.add(member);

์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. 
์ด๊ฒƒ์ด ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์ด ์•„๋‹Œ ๊ฐ์ฒด์ง€ํ–ฅ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ด๊ณ  ์šฐ๋ฆฌ๋Š” ์ด์™€ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.   



SQL์— ์˜์กด์ ์ธ ๊ฐœ๋ฐœ

SQL์„ ์ด์šฉํ•œ DAO๋ฅผ ์™„์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์–ด๋Š ๋‚  ๊ฐ‘์ž๊ธฐ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•ด์„œ ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€์‹œ์ผœ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ๊ธฐ์กด์— ์งœ์ธ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.


  1. DTO ์ˆ˜์ •
  2. DAO SQL ์ฟผ๋ฆฌ ๋ฐ statement ์ˆ˜์ •
  3. ๊ธฐํƒ€ ์˜์กด๋œ, ์—ฐ๊ด€๋œ, ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค ์ˆ˜์ •

๊ฒฐ๋ก ์ ์œผ๋กœ SQL ๋ฌธ์„ ๋ฐ”๊พธ๊ฒŒ ๋จ์œผ๋กœ์จ ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ๋ฐ”๊พธ๊ณ  ์ด์— ๊ด€ํ•œ ์ฝ”๋“œ๋„ ๋ณ€๊ฒฝํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ๊ด€๋ จ๋œ ์ฝ”๋“œ๊ฐ€ 100๊ฐœ, 1000๊ฐœ ์žˆ๋‹ค๋ฉด ์ „๋ถ€ ๋‹ค ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด๊ฐ€ ์—ฐ๊ด€๋œ ์ฝ”๋“œ, ๊ฐ์ฒด๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์—†์„์ง€๋Š” ์‚ฌ์šฉํ•˜๋Š” SQL์— ๋‹ฌ๋ ค ์žˆ๋‹ค.
์ด๋Ÿฐ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์„ ์‚ฌ์šฉํ•ด์„œ SQL์„ ์ˆจ๊ฒจ๋„ ์–ด์ฉ” ์ˆ˜ ์—†์ด DAO๋ฅผ ์—ด์–ด์„œ ์–ด๋–ค SQL์ด ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

์ด๋Ÿฌํ•œ SQL์— ์˜์กด์ ์ธ ์—”ํ‹ฐํ‹ฐ๋“ค์€ ๋ณ€๋™์ด ์‹ฌํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฌผ๋ฆฌ์ ์œผ๋กœ SQL๊ณผ JDBC API๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค ํ•˜๋”๋ผ๋„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ•ํ•œ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ SQL์„ ์ง์ ‘ ๋‹ค๋ฃฐ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์„ ์š”์•ฝํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.


  • ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ๊ณ„์ธต ๋ถ„ํ• ์ด ์–ด๋ ต๋‹ค.
  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋‹ค.
  • SQL์— ์˜์กด์ ์ธ ๊ฐœ๋ฐœ์„ ํ”ผํ•˜๊ธฐ ์–ด๋ ต๋‹ค.



JPA์™€ ๋ฌธ์ œ ํ•ด๊ฒฐ

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

์ฆ‰, ๊ฐœ๋ฐœ์ž๋Š” JPA API๋งŒ ์‚ฌ์šฉํ•˜๋ฉด SQL ๊ตฌ๋ฌธ์„ ๊ธฐ์ˆ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


  • ์ €์žฅ ๊ธฐ๋Šฅ
    • persist(Entity) : ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค. INSERT SQL
  • ์กฐํšŒ ๊ธฐ๋Šฅ
    • find(Entity.class, id) : ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ๋‹ค. SELECT SQL
  • ์ˆ˜์ • ๊ธฐ๋Šฅ
    • JPA๋Š” ๋ณ„๋„์˜ ์ˆ˜์ • ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ ํ•  ๋•Œ ๊ฐ™์ด ์ˆ˜์ •
  • ์—ฐ๊ด€๋œ ๊ฐ์ฒด ์กฐํšŒ
    • JPA๋Š” ๊ฐ์ฒด๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ์—์„œ ์—ฐ๊ด€๋œ ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.



ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜


์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฐœ์ „ํ•˜๋ฉด์„œ ๊ทธ ๋‚ด๋ถ€์˜ ๋ณต์žก์„ฑ๋„ ์ ์  ์ปค์ง„๋‹ค.
์ฆ‰, ์ง€์† ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ์ผ์€ ๋Š์ž„์—†์ด ์ฆ๊ฐ€ํ•˜๋Š” ๋ณต์žก์„ฑ๊ณผ์˜ ์‹ธ์›€์ด๋‹ค.
๋ณต์žก์„ฑ์„ ์ œ์–ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ๊ฒฐ๊ตญ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ค์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋œ๋‹ค.


๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ์ƒ์†, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™”, ์ •๋ณด ์€๋‹‰ ๋“ฑ์„ ์ง€์›ํ•ด ์ฃผ๋ฉฐ ์ด๋ฅผ ์ด์šฉํ•ด ๋ณต์žก์„ฑ์„ ์ œ์–ดํ•ด ์ค€๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์ด ๋˜์–ด๋ฒ„๋ฆฐ ๊ฐ์ฒด๋Š” ์ด๋Ÿฌํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜ ์žฅ์ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ค์–ด์ง€๊ณ  ์ด๋กœ ์ธํ•ด ๋ณต์žก์„ฑ๋„ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ฐ์ฒด๊ฐ€ ๋‹จ์ˆœํ•˜๋ฉด ์ƒ๊ด€์ด ์—†์ง€๋งŒ ๊ฐ์ฒด๊ฐ€ ์ƒ์†๋ฐ›์•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ(ํ•„๋“œ๋กœ ์‚ฌ์šฉ) ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค.


์˜ˆ๋ฅผ ๋“ค๋ฉด ํšŒ์› ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š”๋ฐ ํšŒ์› ๊ฐ์ฒด๊ฐ€ ํŒ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํŒ€ ๊ฐ์ฒด๋„ ๊ฐ™์ด ์ €์žฅํ•ด ์ค˜์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฌ์ง€ ์•Š์„ ๊ฒฝ์šฐ ํšŒ์› ๊ฐ์ฒด๋Š” ํŒ€ ๊ฐ์ฒด์™€์˜ ์—ฐ๊ด€์„ฑ์„ ์žƒ์–ด๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ์žฅ์ ์„ ์œ ์ง€ํ•˜๊ณ ์ž ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ํ˜„์‹ค์„ฑ์ด ์—†๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ๊นŒ๋‹ค๋กญ๋‹ค.

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

์ฆ‰ ์ถ”์ƒํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ ๊ฐ™์€ ๊ฐœ๋…์ด ์—†๊ณ  ์ด๋กœ ์ธํ•ด ๊ฐ์ฒด๋„ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ง€ํ–ฅํ•˜๋Š” ๋ชฉ์ ์ด ์„œ๋กœ ๋‹ค๋ฅด๊ณ  ๋‘˜์˜ ๊ธฐ๋Šฅ๊ณผ ํ‘œํ˜„๋„ ๋‹ค๋ฅด๋ฏ€๋กœ ์ด๋ฅผ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ผ ๋งํ•œ๋‹ค.

  • ๊ฐ์ฒด : ๋‹ค์–‘ํ•œ ๊ฐ์ฒด์˜ ์žฅ์ ์„ ์ด์šฉํ•œ ๋ณต์žก์„ฑ ํ•ด์†Œ
  • RDB : ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ๊ตฌ์กฐํ™” ๋ฐ ์ง‘ํ•ฉ์„ฑ ๊ฐ•์กฐ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž๋ฐ”๋ผ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๊ฒฐ๊ตญ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ค‘๊ฐ„์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

์ด์ œ ์ด๋Ÿฌํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ฌธ์ œ์ ์„ ์‚ดํŽด๋ณด์ž



์ƒ์†

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


class Item{}
class Album extends Item{}
class Movie extends Item{}
class book extends Item{}

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•œ ์ƒํƒœ์—์„œ SQL์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ์ตœ์†Œ 2๋ฒˆ์€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Album ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋„ฃ์–ด์ค„ ๋•Œ Album ๊ฐ์ฒด๋Š” Item ๊ฐ์ฒด๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๊ธฐ์— Item ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋„ ๊ฐ™์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋กœ์„œ๋Š” ์—ฐ๊ด€์ด ์žˆ์ง€๋งŒ ์œ„ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์—์„œ๋Š” Album๊ณผ Item ํ…Œ์ด๋ธ”์€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. ์ด๋Š” ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

INSERT INTO Item ...
INSERT INTO Album ...



์—ฐ๊ด€๊ด€๊ณ„

๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์ฐธ์กฐ์— ์ ‘๊ทผํ•ด์„œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•œ๋‹ค.
๋ฐ˜๋ฉด์— ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ์—ฐ๊ด€๋œ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•œ๋‹ค.


๊ฐ์ฒด

class Member{

    Team team; // ์ฐธ์กฐ  
    
    ...
    
    Team getTeam(){
        return team;
    }
    
}

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

User user = findUser();
Team team = user.getTeam();

๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐ์ฒด ๋‚ด์˜ ์š”์†Œ๋“ค์„ ์ด์šฉํ•˜๋ฉด ์‰ฝ๋‹ค.

User user = userDao.findUser();
Team team = TeamDao.findTeam(user.getTeamId());

ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด DAO๋ฅผ 2๊ฐœ ์ƒ์„ฑํ•˜๊ณ  2๋ฒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์ด์œ ๋Š” ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ํ…Œ์ด๋ธ”์ด 2๊ฐœ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (ํ…Œ์ด๋ธ”์„ 2๊ฐœ๋กœ ๋‚˜๋ˆˆ ๊ฒƒ์ด ์ž˜๋ชป์ด๋ผ๋Š” ์–˜๊ธฐ๋Š” ์•„๋‹ˆ๋‹ค.)

์ด๋ ‡๋“ฏ ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ”์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜์„ฑ์œผ๋กœ ์ธํ•ด ์œ„์™€ ๊ฐ™์ด ์ ‘๊ทผ์„ ํ•˜๊ฒŒ ๋˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๊ณผ์ •์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋””์ž์ธํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ข‹๋‹ค๋Š” ์–˜๊ธฐ๋Š” ์•„๋‹ˆ๋‹ค. DB์—์„œ๋Š” User๊ฐ€ ๊ธฐ์ค€์ด๋“  Team์ด ๊ธฐ์ค€์ด๋“  JOIN์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ์ฒด์—์„œ๋Š” User์—์„œ Team์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Team์—์„œ User๋ฅผ ๋„์ถœํ•˜๊ธฐ๋Š” ํž˜๋“ค๋‹ค.


์—ฐ๊ด€๊ด€๊ณ„ - ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”์— ๋งž์ถ”์–ด ๋ชจ๋ธ๋ง

class Member{
    Long teamId; // ์ฐธ์กฐ  
    ...
}

class Team{
    Long id;
}

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ…Œ์ด๋ธ”์—์„œ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ๋•Œ๋Š” ํŽธ๋ฆฌํ•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”์— ๋Œ€์‘ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‚ฌ์‹ค Team_ID ์™ธ๋ž˜ ํ‚ค๊ฐ’์„ ๋ณด๊ด€ํ•˜๋Š” teamId ํ•„๋“œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์—ฐ๊ด€๋œ Team์„ ์ฐพ๋Š” ์—ฐ์‚ฐ์ด ์ถ”๊ฐ€์ ์œผ๋กœ ์ƒ๊ธฐ๋˜๊ฐ€ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์—ฐ๊ด€๋œ Team๋„ ๊ฐ™์ด ๋ณ€ํ˜•ํ•˜๊ฑฐ๋‚˜ ๋ถˆ์ผ์น˜์„ฑ์„ ๋ ์ง€ ์•Š๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ณต์žก์„ฑ์ด ์ƒ๊ธด๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๊ฒŒ ๋˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์žฅ์ ์„ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


์—ฐ๊ด€๊ด€๊ณ„ - ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ์— ๋งž์ถ”์–ด ๋ชจ๋ธ๋ง

class Member{
    Team team; // ์ฐธ์กฐ  
    
    ...
    
    getTeam(){
        return team;
    }
}

class Team{
    Long id;
}

์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋ชจ๋ธ๋ง์„ ํ•  ๊ฒฝ์šฐ ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋Š” ์—†์–ด์ง„๋‹ค. ๋Œ€์‹  ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ๋ณธ๋‹ค๋ฉด ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์ชผ๊ฐœ์„œ ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”์— ๋‚˜๋ˆ„๋Š” ๋กœ์ง์„ ์ƒ์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (์ด ๊ฐ™์€ ์ž‘์—…์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•˜๋˜๊ฐ€ DAO์—์„œ ์ถ”๊ฐ€๋กœ ๋กœ์ง์„ ์งœ์ฃผ์–ด์•ผ ํ•œ๋‹ค.)


๊ฐ์ฒด ๋ชจ๋ธ์€ ์™ธ๋ž˜ ํ‚ค๊ฐ€ ํ•„์š” ์—†๊ณ  ๋‹จ์ง€ ์ฐธ์กฐ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.
ํ…Œ์ด๋ธ”์€ ์ฐธ์กฐ๊ฐ€ ํ•„์š” ์—†๊ณ  ์™ธ๋ž˜ ํ‚ค๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ์€ ์ด ๊ฐ™์€ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ค‘๊ฐ„์—์„œ ๋ณ€ํ™˜ ์—ญํ• ์„ ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜ ์—ญํ• ์„ ์˜ˆ๋ฅผ ๋“ ๋‹ค๋ฉด,

member.getTeam().getId; 

์œ„์ฒ˜๋Ÿผ ๊ฐ์ฒด ๋‚ด์˜ id ํ•„๋“œ๋ฅผ ํ†ตํ•ด ID ๊ฐ’์„ ์ด์šฉํ•œ ํ…Œ์ด๋ธ” ์ฐธ์กฐ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.



๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

ํšŒ์›์ด ์†Œ์†๋œ ํŒ€์„ ์กฐํšŒํ•  ๋•Œ๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฐ๊ด€๋œ ํŒ€์„ ์ฐพ์œผ๋ฉด ๋˜๋Š”๋ฐ, ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด๋ผ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋‹ค์Œ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

member.getOrder().getOrderItem()... 

ํ•˜์ง€๋งŒ ๋‹ค์Œ SQL์„ ์‚ฌ์šฉํ•˜์—ฌ member์™€ team์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒฝ์šฐ, Order์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ null ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ด๋Š” ํƒ์ƒ‰์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•œ๋‹ค.

SELECT M.*, T.*
    FROM MEMBER M
    JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
// null -> member์™€ team์—์„œ๋งŒ ํ–ˆ์œผ๋ฏ€๋กœ order_id ๊ฐ’์ด ์žˆ๋”๋ผ๋„ ์กฐ์ธ์„ ์•ˆ ํ•ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค.
member.getOrder();

์ฆ‰, SQL์„ ์ง์ ‘ ๋‹ค๋ฃจ๋ฉด ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋Š” SQL์— ๋”ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์–ด๋””๊นŒ์ง€ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ •ํ•ด์ง„๋‹ค. ์ด๊ฒƒ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๊ฐ€ ๋‹ค๋ฅธ๋ฐ ์–ธ์ œ ๋Š์–ด์งˆ์ง€ ๋ชจ๋ฅผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํ•จ๋ถ€๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ํฐ ์ œ์•ฝ์ด๋‹ค. (SQL ์ฟผ๋ฆฌ๋ž‘ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ๋„ ์ˆ™์ง€ํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์–ด๋ ค์›€์ด ์žˆ๋‹ค.)

public void process(){
    Member member = memberDAO.find(memberId); // SQL ์‹คํ–‰
    member.getTeam(); // ์•ž์„  ์ฟผ๋ฆฌ๋กœ Team ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ๊ฐ€? 
    member.getOrder().getDelivery(); // Order ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ๊ฐ€?, ๊ฐ€๋Šฅํ•˜๋„๋ผ๋„ Delivery๋Š”?     
}

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์–ธ์ œ ๋Š์–ด์งˆ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ์—๋Š” DAO๋ฅผ ์—ด์–ด์„œ SQL์„ ์ง์ ‘ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด SQL์— ์˜์กด์ ์ธ ๊ฐœ๋ฐœ๋กœ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ข…์†๋˜์–ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ
๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ์œ„ํ•ด์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ JOIN ํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์ ์œผ๋กœ ๋งŽ์€ ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค. ๊ฒฐ๊ตญ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ DAO์™€ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ์ˆ™์ง€ ๋ฐ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.



๋น„๊ต

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ธฐ๋ณธ ํ‚ค์˜ ๊ฐ’์œผ๋กœ ๊ฐ ROW๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
๋ฐ˜๋ฉด์— ๊ฐ์ฒด๋Š” ๋™์ผ์„ฑ ๋น„๊ต์™€ ๋™๋“ฑ์„ฑ ๋น„๊ต๋ผ๋Š” 2๊ฐ€์ง€ ๋น„๊ต ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • ๋™์ผ์„ฑ ๋น„๊ต : == ๋น„๊ต, ๊ฐ์ฒด์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋น„๊ต
  • ๋™๋“ฑ์„ฑ ๋น„๊ต : equals() ๋น„๊ต, ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋น„๊ต

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


String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
..Member๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ DB ๋กœ์ง..
return new Member(DB ๋กœ์ง์„ ํ†ตํ•ด ์–ป์€ ๊ฐ’);
Member member1 = memberDAO.getMember(100);
Member member2 = memberDAO.getMember(100);

System.out.println(member1 == member2) // ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ false ์ถœ๋ ฅ 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€์ ์œผ๋กœ ๋ณด๋ฉด ๋‘˜์€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์ด์ง€๋งŒ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ๋Š” ๋‘˜์€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋‚˜์˜จ๋‹ค. ๋ฌผ๋ก  equals()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๋“ฑ์„ฑ์— ๋Œ€ํ•œ true๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์ผ์„ฑ์— ๋Œ€ํ•ด์„œ false ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ๋œ๋‹ค๋Š” ๊ฒƒ์ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์ž„์—๋„ ๊ทธ ์ˆœ๋ฆฌ๊ฐ€ ๋งž์ง€ ์•Š๋‹ค


Member member1 = list.get(0);
Member member2 = list.get(0);

System.out.println(member1 == member2) // ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๊ฐ™์œผ๋ฏ€๋กœ true ์ถœ๋ ฅ   

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ DB๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด์ง€ํ–ฅ ๊ด€์ ์œผ๋กœ๋งŒ ๋ณธ๋‹ค๋ฉด true ๊ฐ’์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋กœ์šฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š๋‹ค. ์—ฌ๊ธฐ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ƒํ™ฉ๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ๋ฌธ์ œ๋Š” ๋” ์–ด๋ ค์›Œ์ง„๋‹ค.



JPA๋ฅผ ์ด์šฉํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„ ํ•ด๊ฒฐ



JPA์™€ ์ƒ์†

์ƒ์†๋œ ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ” ๋ถ„๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋ถ„๋ฆฌํ•˜์˜€๊ธฐ์— ์šฐ๋ฆฌ๋Š” 2๋ฒˆ์˜ SQL ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
JPA๋Š” ์ด๋Ÿฌํ•œ ์ƒ์†๊ณผ ๊ด€๋ จ๋œ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ•ด๊ฒฐํ•ด ์ฃผ๋Š”๋ฐ ๋งˆ์น˜ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋“ฏ์ด JPA์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.


๊ธฐ์กด ๋ฐฉ์‹

public void save (Item item, Album album){
    String insertSQL1 = "INSERT INTO ITEM...";
    String insertSQL2 = "INSERT INTO ALBUM...";
    ...
    st.executeUpdate(insertSQL1);
    st.executeUpdate(insertSQL2);
    ...
}

JPA ๋ฐฉ์‹

public void save(Album album)(){
    jpa.persist(album);
}

์ด๋ ‡๋“ฏ ๋‹จ์ˆœ album ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์†์— ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์žฅ์ ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.



JPA์™€ ์—ฐ๊ด€๊ด€๊ณ„

JPA๋Š” ์—ฐ๊ด€๊ด€๊ณ„์™€ ๊ด€๋ จ๋œ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ค€๋‹ค.

member.setTeam(team);
jpa.persist(member);

๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ์กด ๊ฐ์ฒด์ง€ํ–ฅ ๋ชจ๋ธ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ JPA API๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. JPA๋Š” ์ฐธ์กฐ๋ฅผ ์™ธ๋ž˜ ํ‚ค๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ ์ ˆํ•œ INSERT SQL์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „๋‹ฌํ•œ๋‹ค. ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ๋•Œ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ๋„ JPA๊ฐ€ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค.

Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();



JPA์™€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

๊ธฐ์กด ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์€ SQL์— ๋”ฐ๋ผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์—ˆ์—ˆ๋‹ค. (JOIN ์•ˆ ํ•˜๋ฉด ๋ชป ๊ฐ€์ ธ์˜จ๋‹ค.) ํ•˜์ง€๋งŒ JPA๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ๋งˆ์Œ๊ป ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Member member = jpa.find(Member.class, memberId);   
member.getOrder().getOrderItem().getOrderOptionGroup().getOderOption()...

JPA๋Š” ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ์ ์ ˆํ•œ SELECT SQL์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ๋ฏธ๋ฃฌ๋‹ค๊ณ  ํ•ด์„œ ์ง€์—ฐ ๋กœ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. JPA๋Š” ์ง€์—ฐ ๋กœ๋”ฉ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ถ”๊ฐ€์ ์œผ๋กœ JPA์™€ ๊ด€๋ จ๋œ ์–ด๋–ค ์ฝ”๋“œ๋„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰, ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ์กฐํšŒ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

// ์ฒ˜์Œ ์กฐํšŒ ์‹œ์ ์— SELECT MEMBER SQL
Member member = jpa.find(Member.class, memberId);

Order order = member.getOrder();
order.getOrderDate(); // Order๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— SELECT ORDER SQL 



ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ์ •๋ฆฌ

๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์€ ์ง€ํ–ฅํ•˜๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. ๋ฌธ์ œ๋Š” ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ฐจ์ด๋ฅผ ๊ทน๋ณตํ•˜๋ ค๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ์ฝ”๋“œ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” ์ •๊ตํ•œ ๊ฐ์ฒด ๋ชจ๋ธ๋ง์„ ํ• ์ˆ˜๋ก ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ์ด ๋”์šฑ ํ•„์š”ํ•˜๋‹ค

JPA๋Š” ์ด๋Ÿฌํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ๊ณ  ์ •๊ตํ•œ ๊ฐ์ฒด ๋ชจ๋ธ๋ง์„ ์œ ์ง€ํ•˜๊ฒŒ๋” ๋„์™€์ค€๋‹ค. ๋ฌด์กฐ๊ฑด ์ข‹๋‹ค๋Š” ๋ง์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ์ด๋กœ ์ธํ•ด ๋”์šฑ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

profile
์Šต๊ด€์ด ์ „๋ถ€๋‹ค.
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€