Post

[Security] Secure Coding(6-1) - ORM

[Security] Secure Coding(6-1) - ORM

๐Ÿ”’ ์‹œํ์–ด ์ฝ”๋”ฉ ์ˆ˜์—… ์ •๋ฆฌ

ORM ํ”„๋ ˆ์ž„์›Œํฌ

๐Ÿ“šORM: ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ธฐ์ˆ 

โœ…ORM ํ•„์š”์„ฑ:

  • ๋ถˆ์ผ์น˜ ๋ฌธ์ œ ํ•ด๊ฒฐ: ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ์Šคํ‚ค๋งˆ ๊ฐ„ ๋ถˆ์ด์น˜ ํ•ด์†Œ
  • ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ: SQL ์ง์ ‘ ์ž‘์„ฑ ๋ถ€๋‹ด ๊ฐ์†Œ, ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ๋ณด์•ˆ ๊ฐ•ํ™”: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ์ถ”์ƒํ™”๋กœ ๋ณด์•ˆ ์ทจ์•ฝ์ (์˜ˆ: SQL Injection) ์ตœ์†Œํ™”

alt text

์ „ํ†ต์  SQL ์ฟผ๋ฆฌ VS ORM ๋น„๊ต

alt text

๊ฐ๊ฐ ์ •์˜์™€ ํŠน์ง• ๋น„๊ต

alt text

์žฅ์ ๊ณผ ๋‹จ์  ๋น„๊ต

  • ์ „ํ†ต์  SQL ์ฟผ๋ฆฌ ๋ฐฉ์‹์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ
    • ์„ฑ๋Šฅ ํŠœ๋‹์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
    • ๋ณต์žกํ•œ ๋‹ค์ค‘ ์กฐ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ
    • ํŠน์ • DBMS ๊ณ ์œ  ๊ธฐ๋Šฅ(์˜ˆ: ์ €์žฅ ํ”„๋กœ์‹œ์ €, ์œˆ๋„์šฐ ํ•จ์ˆ˜)์„ ์ ๊ทน ํ™œ์šฉํ•  ๋•Œ
  • ORM ์‚ฌ์šฉ์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ
    • CRUD ์ค‘์‹ฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์„ ํ˜ธํ•  ๋•Œ

ORM ์ฃผ์š” ๊ธฐ๋Šฅ

  1. ๋งคํ•‘ ๊ธฐ๋Šฅ
    • ๊ฐ์ฒด-ํ…Œ์ด๋ธ” ๋งคํ•‘
      • ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”, ํ•„๋“œ์™€ ์ปฌ๋Ÿผ์„ ์ž๋™ ๋งคํ•‘ โ†’ SQL ์ž‘์„ฑ ์—†์ด ๋ฐ์ดํ„ฐ ์กฐ์ž‘
    • ๊ด€๊ณ„ ๋งคํ•‘
      • 1:1, 1:N, N:M ๊ด€๊ณ„๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜ ๋˜๋Š” XML ์„ค์ •์„ ํ†ตํ•ด ์ •์˜ ๋ฐ ๊ด€๋ฆฌ
    • ์ž๋™ ์Šคํ‚ค๋งˆ ์ƒ์„ฑ
      • ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ DB ์Šคํ‚ค๋งˆ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
  2. CRUD ์ž‘์—… ์ง€์›
    • Create, Read, Update, Delete ๊ธฐ๋Šฅ์„ ๊ฐ์ฒด ์กฐ์ž‘๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง์ ‘ ์ ‘๊ทผ ์—†์ด, ๊ฐ์ฒด ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ์ž๋™ ๋™๊ธฐํ™”(DIRTY CHECKING)
  3. ๊ณ ๊ธ‰ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ
    • ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด (HQL, JPQL ๋“ฑ)
      • SQL๋ณด๋‹ค ์ถ”์ƒํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐ ์กฐ์ž‘ ๊ฐ€๋Šฅ
    • Criteria API
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋™์  ์ฟผ๋ฆฌ ์ž‘์„ฑ ์ง€์›
    • ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ ์ง€์›
      • ํ•„์š”์‹œ ์ง์ ‘ SQL์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต
  4. Lazy Loading & ์บ์‹ฑ
    • ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)
      • ์‹ค์ œ ์‚ฌ์šฉ ์‹œ์ ์— ์—ฐ๊ด€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ๋น„์šฉ ์ ˆ๊ฐ
    • 1์ฐจ/2์ฐจ ์บ์‹œ
      • ๋™์ผ ์„ธ์…˜(1์ฐจ ์บ์‹œ) ๋‚ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ(2์ฐจ ์บ์‹œ)์—์„œ ์บ์‹œ๋ฅผ ํ™œ์šฉํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™”
  5. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ
    • ์ž๋™ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ
      • ๋ช…์‹œ์  ํŠธ๋žœ์žญ์…˜ ์—†์ด, ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„๋ฅผ ๊ด€๋ฆฌ
      • ์ผ์ผํžˆ ์ปค๋ฐ‹๊ณผ ๋กค๋ฐฑ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ์•ˆํ•ด๋„ ๋จ
    • ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐ ๋‚™๊ด€์ /๋น„๊ด€์  Lock ์ง€์›
      • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ๋™์‹œ ์ ‘๊ทผ ์ฒ˜๋ฆฌ
      • ๋‚™๊ด€์  Lock: ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ๋ฒ„์ „์„ ์ฝ๊ณ  ์ˆ˜์ •ํ•  ๋•Œ ๋ฒ„์ „ ๋ฒˆํ˜ธ ํ™•์ธ โ†’ ๋ฒ„์ „์ด ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋จผ์ € ์ˆ˜์ •ํ•จ, ์ฆ‰ ์ถฉ๋Œ!
      • ๋น„๊ด€์  Lock: ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ DB์—์„œ Lock์„ ๊ฑธ๊ณ  ์ˆ˜์ •, ์ž‘์—… ์™„๋ฃŒ ํ›„ Lock ํ•ด์ œ
  6. ๊ธฐํƒ€ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ
    • ์—ฐ๊ด€ ๊ด€๊ณ„ ๋ฐ Fetch ์ „๋žต
      • ์—ฐ๊ด€ ๊ฐ์ฒด ๋กœ๋”ฉ ์ „๋žต ์„ค์ •์œผ๋กœ ์„ฑ๋Šฅ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
    • ์œ ์—ฐํ•œ ์„ค์ • ๋ฐ ํ™•์žฅ์„ฑ
      • XML, ์–ด๋…ธํ…Œ์ด์…˜, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์„ ํ†ตํ•œ ๋‹ค์–‘ํ•œ ์„ค์ • ์˜ต์…˜๊ณผ ํ™•์žฅ์„ฑ ์ œ๊ณต

MyBatis ํ”„๋ ˆ์ž„์›Œํฌ ํ™œ์šฉ

๐Ÿ“šMyBatis: Java Persistence ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, SQL ์ฟผ๋ฆฌ์™€ ์ž๋ฐ” ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ง€์›

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ SQL์„ ์ž‘์„ฑํ•œ ํ›„, XML์ด๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋งคํ•‘์„ ์„ค์ •ํ•˜์—ฌ DB์™€ ์ƒํ˜ธ์ž‘์šฉ

โœ…ํŠน์ง•:

  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ์™€ ์ตœ์ ํ™”์— ์œ ๋ฆฌ
  • ORM์˜ ์ถ”์ƒํ™” ์—†์ด ์ง์ ‘ SQL ์ž‘์„ฑ์œผ๋กœ๋งŒ ์„ธ๋ฐ€ํ•œ ์ œ์–ด ๊ฐ€๋Šฅ
  • XML, ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋งคํ•‘ ์„ค์ • ๊ฐ€๋Šฅ

MyBatis ์ฃผ์š” ๊ธฐ๋Šฅ

  1. SQL ๋งคํ•‘ ๋ฐ ์‹คํ–‰
    • Mapper ํŒŒ์ผ(XML) ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ SQL ๋ฌธ์„ ์ •์˜
    • SQL ๋ฌธ๊ณผ ์ž๋ฐ” ๊ฐ์ฒด ๊ฐ„์˜ ์ž๋™ ๋งคํ•‘ ์ œ๊ณต
  2. ๋™์  SQL ์ง€์›
    • ์กฐ๊ฑด๋ฌธ(<if>, <choose>) ๋ฐ ๋ฐ˜๋ณต๋ฌธ(<foreach>)์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์—ฐํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ๊ฐ€๋Šฅ

alt text

  1. ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ(Type Handler)
    • ์ž๋ฐ” ๊ฐ์ฒด์™€ DB ๋ฐ์ดํ„ฐ ๊ฐ„ ๋ณ€ํ™˜์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ ์ง€์›
  2. ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋Šฅ
    • ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ์‹คํ–‰ ์ „/ํ›„ ๋กœ์ง์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ

Mybatis ์„ค์ • ๋ฐ ๊ตฌ์„ฑ

  1. ์„ค์ • ํŒŒ์ผ(mybatis-config.xml)
    • ํ™˜๊ฒฝ(๋ฐ์ดํ„ฐ์†Œ์Šค, ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € ๋“ฑ) ์„ค์ • ๋ฐ ์ „์—ญ ์˜ต์…˜ ๊ตฌ์„ฑ

alt text

  1. Mapper ํŒŒ์ผ ๊ตฌ์„ฑ
    • SQL ๋ฌธ๊ณผ ๋งคํ•‘ ์ •๋ณด๋ฅผ ๋‹ด์€ XML ํŒŒ์ผ ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ
    • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด Mapper๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

alt text

  1. ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋ฐ ์„ธ์…˜ ๊ด€๋ฆฌ
    • DB ์ปค๋„ฅ์…˜ ํ’€๊ณผ SqlSessionFactory๋ฅผ ์ด์šฉํ•ด ์„ธ์…˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ
    • ์Šคํ”„๋ง๊ณผ ์—ฐ๋™ ์‹œ, ์Šคํ”„๋ง ๋ถ€ํŠธ ์ž๋™ ์„ค์ • ๋ฐ ํ†ตํ•ฉ ํ™œ์šฉ

Mybatis ์žฅ๋‹จ์  ๋ฐ ์‚ฌ๋ก€

โœ…์žฅ์ :

  • SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฏ€๋กœ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ํŠœ๋‹์— ์œ ๋ฆฌ
  • ORM๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ์„ค์ •์œผ๋กœ ๋ฐ์ดํ„ฐ ๋งคํ•‘์„ ๊ด€๋ฆฌ
  • DB ์ž‘์—…์˜ ์ „ ๊ณผ์ •์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

โŒ๋‹จ์ :

  • ์ง์ ‘ SQL ์ž‘์„ฑ ์‹œ, ๋น„์Šทํ•œ ์ฟผ๋ฆฌ์˜ ์ค‘๋ณต ๊ด€๋ฆฌ ํ•„์š”
  • ORM์ฒ˜๋Ÿผ ์™„์ „ํ•œ ๊ฐ์ฒด ๊ด€๊ณ„ ์ž๋™ ๋งคํ•‘์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ
  • XML/์–ด๋…ธํ…Œ์ด์…˜ ๋งคํ•‘ ํŒŒ์ผ ๊ด€๋ฆฌ ๋ฐ ๋™์  SQL ์ž‘์„ฑ์— ๋Œ€ํ•œ ํ•™์Šต ํ•„์š”

๐Ÿ’ก์‚ฌ์šฉ ์‚ฌ๋ก€:

  • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ตœ์ ํ™”๊ฐ€ ์š”๊ตฌ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ๊ธฐ์กด JDBC์˜ ๋ฐ˜๋ณต ์ž‘์—…์„ ์ค„์ด๋ฉด์„œ๋„ ์„ธ๋ฐ€ํ•œ SQL ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ

ORM ์‚ฌ์šฉ ์‹œ ๋ณด์•ˆ ์ด์Šˆ

  • ORM์˜ ์—ญํ• 
    • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„ ๋งคํ•‘์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ž„
    • SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ CRUD ๋ฐ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
  • ๋ณด์•ˆ ์ด์Šˆ์˜ ์ค‘์š”์„ฑ
    • ORM ์ž์ฒด๊ฐ€ SQL Injection ๋“ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฉ์–ดํ•˜์ง€๋งŒ, ์ž˜๋ชป๋œ ์‚ฌ์šฉ ์‹œ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
    • ๋งคํ•‘, ์บ์‹ฑ, ๋™์  ์ฟผ๋ฆฌ ๋“ฑ ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ๋ณด์•ˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ

SQL Injection + ๋™์  ์ฟผ๋ฆฌ ์ทจ์•ฝ์ 

๊ธฐ๋ณธ์ ์ธ ORM์€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋ณดํ˜ธ๋˜์ง€๋งŒ, ๋™์  ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด SQL ์ธ์ ์…˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

โ†’ Native Query ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ ํ•„์š”!

โœ…๋Œ€์‘ ๋ฐฉ์•ˆ:

  • ํ•ญ์ƒ ์•ˆ์ „ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ๋™์  ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ - ORM์ด ์ œ๊ณตํ•˜๋Š” ๋™์  SQL ํƒœ๊ทธ(์˜ˆ: MyBatis์˜ if, choose ๋“ฑ) ์‚ฌ์šฉ
  • Native Query ์‚ฌ์šฉ ์‹œ ๋ณ„๋„ ๊ฒ€์ฆ ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์ฒ ์ €

์บ์‹ฑ ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ ๊ด€๋ จ ๋ณด์•ˆ ์ด์Šˆ

  • ์บ์‹ฑ ์ทจ์•ฝ์ 
    • 2์ฐจ ์บ์‹œ๋‚˜ ๊ณต์œ  ์บ์‹œ ์„ค์ • ์‹œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋…ธ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ
    • ์บ์‹œ ๋ฌด๊ฒฐ์„ฑ ๊ด€๋ฆฌ ๋ฏธํก ์‹œ, ์บ์‹œ ๋ณ€์กฐ ๊ณต๊ฒฉ(Cache Poisoning) ์œ„ํ—˜
  • ์ง€์—ฐ ๋กœ๋”ฉ ๋ฐ ๋ฐ์ดํ„ฐ ๋…ธ์ถœ
    • ํ•„์š” ์ด์ƒ์œผ๋กœ ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์—ฐ ๋กœ๋”ฉ๋˜์–ด, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ ๋…ธ์ถœ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    • ORM ๋งคํ•‘ ์‹œ ๋ฏผ๊ฐ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋กœ๋“œํ•˜๋Š” ๋ฌธ์ œ

โœ…๋Œ€์‘ ๋ฐฉ์•ˆ:

  • ์บ์‹œ ์„ค์ • ์‹œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์ œ์™ธ ๋ฐ ์ ‘๊ทผ ์ œ์–ด ๊ฐ•ํ™”
  • Lazy Loading ์„ค์ •๊ณผ ์—ฐ๊ด€ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„ ํƒ์ ์œผ๋กœ ๋กœ๋“œํ•˜๋„๋ก ์„ค๊ณ„

๋งคํ•‘, ์„ค์ • ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ ์ทจ์•ฝ์ 

  • ์ž˜๋ชป๋œ ๋งคํ•‘ ์„ค์ •
    • ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ ์˜ค๋ฅ˜๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ๋ˆ„๋ฝ ๋˜๋Š” ๊ณผ๋„ํ•œ ๋ฐ์ดํ„ฐ ๋…ธ์ถœ
    • ์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ๋ฐ ์—ฐ๊ด€ ๊ด€๊ณ„ ์„ค์ • ๋ฏธํก ์‹œ, ๋ฌดํ•œ ๋ฃจํ”„ ๋˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ฐœ์ƒ
  • Mass Assignment (๋Œ€๋Ÿ‰ ํ• ๋‹น) ์ทจ์•ฝ์ 
    • ํด๋ผ์ด์–ธํŠธ ์ž…๋ ฅ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์—”ํ‹ฐํ‹ฐ์— ๋ฐ”์ธ๋”ฉํ•  ๊ฒฝ์šฐ, ์›์น˜ ์•Š๋Š” ํ•„๋“œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

โœ…๋Œ€์‘ ๋ฐฉ์•ˆ:

  • ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ ์‹œ - ๋ฏผ๊ฐ ํ•„๋“œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ œ์™ธํ•˜๊ฑฐ๋‚˜ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •
  • ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ๊ณผ DTO(Data Transfer Object)๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ๋Œ€๋Ÿ‰ ํ• ๋‹น ๊ณต๊ฒฉ ๋ฐฉ์ง€
This post is licensed under CC BY 4.0 by the author.