Skip to content

Latest commit

ย 

History

History
3469 lines (2751 loc) ยท 167 KB

README.md

File metadata and controls

3469 lines (2751 loc) ยท 167 KB

Tech Interview ๋Œ€๋น„ ์ง€์‹ ์ •๋ฆฌ์ง‘

๐Ÿค ๊ธฐ์ˆ  ์ธํ„ฐ๋ทฐ ์ง€์‹ ์ •๋ฆฌ์ง‘

ํ‹€๋ ธ๊ฑฐ๋‚˜ ์• ๋งค๋ชจํ˜ธํ•œ ๋‚ด์šฉ์€ ์–ธ์ œ๋“  ์ด์Šˆ ๋‚จ๊ฒจ์ฃผ์„ธ์š” :)

ํ˜น์‹œ ์„ค๋ช…์„ ๋ด๋„ ๋ชจ๋ฅด๊ฒ ๋‹คํ•˜์‹œ๋Š” ๋ถ„๋“ค๋„ ์–ธ์ œ๋“  ํŽธํ•˜๊ฒŒ ์ด์Šˆ ๋‚จ๊ฒจ์ฃผ์„ธ์š”~~ ํ† ๋ก  ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค~~


์ž๋ฃŒ๊ตฌ์กฐ

์ž๋ฃŒ๊ตฌ์กฐ๋ž€?
ArrayList vs LinkedList
Stack
Queue

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

JAVA


๊ณตํ†ต

Q. ์ž๋ฐ”๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋‹ต๋ณ€
  • ์ž๋ฐ”๋Š” ์ œ์ž„์Šค ๊ณ ์Šฌ๋ง๊ณผ ๋‹ค๋ฅธ ์—ฐ๊ตฌ์›๋“ค์ด ๊ฐœ๋ฐœํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค.
    • ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด (์ ˆ์ฐจํ˜•, ํ•จ์ˆ˜ํ˜• ๋ชจ๋‘ ์ง€์›)
  • ํŠน์ง•
    • JVM (WORA) ๊ฐ€์ƒ๋จธ์‹  -> ์šด์˜์ฒด์ œ์™€ ๋…๋ฆฝ์ 
    • GC๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • Managed ์–ธ์–ด

Q. ์ž๋ฐ”๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด. (ํ™•์žฅ, ์œ ์ง€๋ณด์ˆ˜๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋‹ค)
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” Managed ์–ธ์–ด. (์‹œ๊ฐ„ ๋‹จ์ถ•, ํŽธ์˜์„ฑ)
  • ํ”Œ๋žซํผ๊ณผ ๋…๋ฆฝ์ ์ธ ์–ธ์–ด.
  • ์–ธ์–ด ์ฐจ์›์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•ด์ค€๋‹ค.
  • ๋†’์€ ์ ์œ ์œจ๊ณผ ์˜ค๋žœ ์—ญ์‚ฌ. ๋ฌธ์„œํ™”.

Q. Primitive Type vs Wrapper class

๋‹ต๋ณ€
  • Wrapper Class๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
    • Nullable
    • toString()๋ฅผ ํ†ตํ•ด String ํƒ€์ž…์œผ๋กœ ๋ฐ”๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅ
    • ์›์‹œํƒ€์ž…์„ ๊ฐ์ฒด ํƒ€์ž…์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์ž์œจ์ ์ธ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
    • Generic ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ
    • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์—์„œ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ๊ฐ์ฒด๊ฐ€ ํ•„์š” (?)
  • Boxing vs Unboxing (Auto)
    • Primitive -> Warpper : Boxing
    • Wrapper -> Primitive : Unboxing
    • JVM์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ Boxing์„ ํ•˜๊ธฐ๋„, Unboxing์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
    • ํŽธ๋ฆฌํ•œ AutoBoxing์˜ ๋‹จ์ 
      • Wrapper Class๋ฅผ ์—ฐ์‚ฐํ•˜๋ฉด ์˜คํ† ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ์ด ์ผ์–ด๋‚˜๊ธฐ์— ๋น„ํšจ์œจ์ ์ด๋‹ค.

Q. Generic์€ ์™œ Wrapper Class๋งŒ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€
  • ์šฐ์„  Generic์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๊ฐ€ ํƒ€์ž… ์ฒดํฌ๋ฅผ ์œ„ํ•จ์ด๋‹ค. ์ฆ‰, ์ปดํŒŒ์ผ ํƒ€์ž„์‹œ์—๋งŒ ํƒ€์ž… ์ฒดํฌ ๋ฐ ์ œ์•ฝ์„ ์ ์šฉํ•˜๊ณ , ์ž๋™ ํ˜•๋ณ€ํ™˜์„ ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ ๋œ .class ํŒŒ์ผ์—๋Š” ์‹ค์ œ๋กœ ์ œ๋„ค๋ฆญ ์ •๋ณด๊ฐ€ ์ „ํ˜€ ์—†๋‹ค. (์†Œ๊ฑฐ๋จ)
  • ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์—” Generic์œผ๋กœ ์ฃผ์–ด์ง„ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ ๋œ Object๋งŒ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ๋•Œ๋ฌธ์— Primitive ํƒ€์ž…์€ Object๊ฐ€ ๋  ์ˆ˜ ์—†๊ธฐ์— ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ.
  • ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด Generic ํŠน์„ฑ์ƒ Object๋กœ Convertableํ•œ ํƒ€์ž…๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ฐธ๊ณ  1, ์ฐธ๊ณ  2

Q. ์ƒ์„ฑ์ž vs ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ

๋‹ต๋ณ€
  • ์ƒ์„ฑ์ž์™€ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์žฅ๋‹จ์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์žฅ์ 
    • ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ˜๋“œ์‹œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์บ์‹ฑํ•˜๊ฑฐ๋‚˜, Validation์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ˜ํ™˜ ํƒ€์ž…์˜ ํ•˜์œ„ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ๋‹ค.
    • ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋งค๋ฒˆ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • static ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์—๋Š” ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋‹จ์ 
    • ์ƒ์†ํ•˜๋ ค๋ฉด public, protected ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ˆ, ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋งŒ ์ œ๊ณตํ•˜๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.
    • static ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฐพ๊ธฐ ์–ด๋ ต๋‹ค.

Q. String ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์ธ๋ฐ ์™œ new๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๋Š”๊ฐ€?

๋‹ต๋ณ€
  • String์€ ๋Œ€ํ‘œ์  ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ, String ์ƒ์ˆ˜ ํ’€ ์˜์—ญ์—์„œ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์ฆ‰, ์ƒ์ˆ˜์ฒ˜๋Ÿผ ์ด๋ฏธ ์„ ์–ธ๋œ String ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ์ด ์˜์—ญ์—์„œ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๊ณ , ์—†๋‹ค๋ฉด ์—ฌ๊ธฐ์— ์ƒˆ๋กญ๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

Q. ""์™€ new String("")์˜ ์ฐจ์ด์ ์€?

๋‹ต๋ณ€
  • ""์€ Heap ๋‚ด์˜ ๋ณ„๋„ ๊ณต๊ฐ„์ธ String ์ƒ์ˆ˜ ํ’€ ์˜์—ญ์— ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ™์€ ๋ฌธ์ž์—ด์€ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑ๋œ๋‹ค.
    • String ์ƒ์ˆ˜ ํ’€ ์˜์—ญ์— ์ƒ์„ฑ๋˜๋Š” String ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€์ด๋‹ค.
  • new String()๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Heap์— ๋ฌธ์ž์—ด ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋œ๋‹ค.

Q. ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์จ์•ผํ•˜๋Š” ์ด์œ 

๋‹ต๋ณ€
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ž€?
    • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ž€ ์ƒ์„ฑ ํ›„ ๊ทธ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. ๋ฐ˜๋Œ€ ๊ฐœ๋…์œผ๋กœ ๊ฐ€๋ณ€(mutable)๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค.
    • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ž€ ์™ธ๋ถ€์—์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ ๋ถˆ๋ณ€ ๊ฐ์ฒด: String, Boolean, Integer
    • ๋Œ€ํ‘œ์ ์ธ ๊ฐ€๋ณ€ ๊ฐ์ฒด: StringBuilder
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
    • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๋‹ค. ๋™๊ธฐํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
    • ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ์ ๋‹ค.
      • ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐธ์กฐ ๊ฐ’์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ํ†ตํ•ด ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค์–ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์—์„œ Money๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์–ธ์ œ ์–ด๋””์„œ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ด ๋‚ด๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.
    • ์บ์‹œ๋‚˜ Map๋˜๋Š” Set์˜ ์š”์†Œ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.
  • ์ปฌ๋ ‰์…˜์„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์š”์†Œ๋„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผ๋œ๋‹ค.
    • List๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ํ•ด๋„, ๊ทธ ์š”์†Œ๊ฐ€ ๋ถˆ๋ณ€์ด ์•„๋‹ˆ๋ฉด ์–ธ์ œ๋“  ๊ฐ€๋ณ€์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋‹จ์ ์œผ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋‹จ, ์ด๊ฒƒ์€ GC ์ปค์Šคํ…€์„ ํ†ตํ•ด ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ๋“ฏ ํ•˜๋‹ค.

Q. ๋ถˆ๋ณ€ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

๋‹ต๋ณ€
  • ์›์‹œ ํƒ€์ž…์—์„œ์˜ ๋ถˆ๋ณ€
    • ์›์‹œ ํƒ€์ž…์€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ด๋„ ๋ถˆ๋ณ€์ž„์„ ๋ณด์žฅํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ, ๊ฐ์ฒด์˜ Setter๋ฅผ ํ†ตํ•ด์„œ๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ์˜ ์›์‹œ ํƒ€์ž…์€ ๋ถˆ๋ณ€์„ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.
    • Setter๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , final์„ ๋ถ™์—ฌ์ค˜ ์ƒ์„ฑ์ž๋งŒ์„ ํ†ตํ•ด์„œ ์„ค์ •๋˜๋„๋กํ•˜๋ฉด ๋ถˆ๋ณ€์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜น์€ ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์›์‹œ ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.
  • ์ฐธ์กฐ ํƒ€์ž…์—์„œ์˜ ๋ถˆ๋ณ€
    • ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐธ์กฐ ๊ฐ’์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ธฐ์—, ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ๋” ํž˜๋“ค๋‹ค.
    • final + ๋ฐฉ์–ด์  ๋ณต์‚ฌ (์ƒ์„ฑ์ž, Getter, ๊ธฐํƒ€ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ)๋ฅผ ํ†ตํ•ด ์ฐธ์กฐ ํƒ€์ž…์„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • ์ปฌ๋ ‰์…˜์„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š”, ํ•ด๋‹น ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค.
    • ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ

Q. ์ž๋ฐ”์—์„œ null์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์€?

๋‹ต๋ณ€
  • null์˜ ์ •์˜
    • null์€ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜
    • ๋ชจ๋“  ์ฐธ์กฐ ์œ ํ˜•์ด ๋  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด
    • "๊ฐ์ฒด ์—†์Œ", "์•Œ ์ˆ˜ ์—†์Œ", "์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ"๋“ฑ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ(ํ™˜๊ฒฝ)๋งˆ๋‹ค ์ •์˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • null์˜ ๋ฌธ์ œ์ 
    • null์€ ์‰ฝ๊ฒŒ NPE๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ ํ•˜์—ฌ๊ธˆ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ null์ด ๋ฐ˜ํ™˜๋˜๋Š” ๋ฉ”์„œ๋“œ์ธ์ง€ ์•„๋‹Œ์ง€ ํ•ญ์ƒ ํ™•์ธํ•ด์ค˜์•ผํ•œ๋‹ค.
  • null์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•
    • Assertion (๋‹จ์ •๋ฌธ) ์‚ฌ์šฉ
    • Objects ์‚ฌ์šฉ (isNull, nonNull, requireNonNull, ...)
    • Optional
  • ์ถ”์ฒœํ•˜๋Š” null ๋ฐฉ์ง€ ๋„๊ตฌ
    • Optional
    • JSR 305
    • JSR 308 (@NonNull, @Nullable)

Q. Optional ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•  ์ 

๋‹ต๋ณ€
  • ์‰ฝ๊ฒŒ ์š”์•ฝํ•˜๋ฉด, Optional์€ ์ตœ๋Œ€ 1๊ฐœ ์›์†Œ๋ฅผ ๊ฐ€์ง€๋Š” ํŠน๋ณ„ํ•œ Stream์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • isPresent()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. -> orElse, orElseGet ๋“ฑ์„ ์‚ฌ์šฉํ•˜์ž.
    • isPresent()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ null์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋กœ์ง์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒฝ์šฐ. ์ด ๊ฒฝ์šฐ ๊ตณ์ด Optional๋กœ ๊ฐ์Œ€ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ์ฐจ๋ผ๋ฆฌ ๊ทธ๋ƒฅ null์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋กœ์ง์„ ๋„ฃ๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค. ๋Œ€์‹  orElse, orElseGet๋“ฑ๋“ฑ์„ ์‚ฌ์šฉํ•˜์ž.
  • orElse(new ...) ๋Œ€์‹  orElseGet(() -> new ...))๋ฅผ ์‚ฌ์šฉํ•˜์ž.
    • orElse(new ...)๋Š” ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋œ๋‹ค. ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” orElseGet(() -> new ...))๋ฅผ ์‚ฌ์šฉํ•˜์ž. ์ด๋Š” Optional์— ๊ฐ’์ด ์—†์„ ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค.
  • Optional์€ ํ•„๋“œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜์ž
  • Optional์€ ๋น„์‹ธ๋‹ค. ๋น„์–ด์žˆ๋Š” ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” Optional์„ ๊ฐ์‹ธ์ง€ ๋ง๊ณ , ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•˜์ž.
  • ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ 

Q. java์˜ main ๋ฉ”์„œ๋“œ๊ฐ€ static์ธ ์ด์œ 

๋‹ต๋ณ€
  • ์ƒ๋ช…์ฃผ๊ธฐ
    • JVM์ƒ static์ด ๊ฐ€์žฅ ๋จผ์ € ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„๋‹ค. ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์ˆ˜๊ฑฐ๋œ๋‹ค.
    • main๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ์–ด๋–ค ๊ฐ์ฒด ์ƒ์„ฑ๋ณด๋‹ค๋„ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— static์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์–ด๋””์„œ๋“  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•จ
    • static์œผ๋กœ ํ•ด์•ผ ์–ด๋””์„œ๋“  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ.

Q. java์˜ non-static์™€ static์˜ ์ฐจ์ด

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

Q. java์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…

๋‹ต๋ณ€
  • ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…
    • ์ˆซ์žํ˜•
      • ์ •์ˆ˜ - byte (1byte), short(2byte), int(4byte), long(8byte)
      • ์‹ค์ˆ˜ - float(4byte), double(8byte)
      • java๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ unsigned๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. wrapper class๋ฅผ ์ด์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • ๋ฐ์ดํ„ฐ ํƒ€์ž…๋ณ„ ํ‘œํ˜„ ๊ฐ€๋Šฅ ๋ฒ”์œ„๋Š” ์—ฌ๊ธฐ
    • ๋…ผ๋ฆฌํ˜• - boolean (1byte)
    • ๋ฌธ์žํ˜• - char (2byte) ๋ชจ๋“  ์œ ๋‹ˆ์ฝ”๋“œ
    • ๋ฌธ์ž์—ด - String
  • ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…
    • ๋ฐฐ์—ด ํƒ€์ž…
    • ์—ด๊ฑฐ ํƒ€์ž…
    • ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค

Q. Enum์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • Enum์ด ๋‚˜์˜ค๊ฒŒ ๋œ ์ด์œ ๋Š” ์—ฌ๊ธฐ์ฐธ๊ณ 
  • Enum์ด๋ž€?
    • ์„œ๋กœ ์—ฐ๊ด€๋œ ์ƒ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ์ƒ์ˆ˜
      • ๊ฐ๊ฐ์˜ ์ƒ์ˆ˜๋“ค์€ ๋ชจ๋‘ ์ธ์Šคํ„ด์Šคํ™”๋œ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์ด๋‹ค.
      • ์ด๋กœ ์ธํ•ด ๊ฐ๊ฐ์˜ ์ƒ์ˆ˜๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๊ฒŒ ๋œ๋‹ค. (์ฐธ์กฐ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ)
      • ๊ฐ™์€ ์ง‘ํ•ฉ์˜ ์ƒ์ˆ˜๋“ค์€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์ง€๋ฏ€๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์˜ ์ƒ์ˆ˜๋ผ๋ฆฌ ๋น„๊ต ์—ฐ์‚ฐ์€ ์ปดํŒŒ์ผ ์‹œ์— ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
  • Enum ์‚ฌ์šฉ์ด์œ 
    • ์ƒ์ˆ˜๋ฅผ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. - ์ถ”๊ฐ€ ์†์„ฑ + ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•œ ์ž์œจ์„ฑ ๋ณด์žฅ๋“ฑ๋“ฑ (if๋ฌธ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค)
    • ์„œ๋กœ ์—ฐ๊ด€๋œ ์ƒ์ˆ˜๋“ค๋ผ๋ฆฌ ์ง‘ํ•ฉ์œผ๋กœ ๋ฌถ๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์˜ ์ƒ์ˆ˜๋ผ๋ฆฌ ๋น„๊ต ์—ฐ์‚ฐ์„ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ง‰์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.

Q. Generic์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋‹ต๋ณ€
  • ์ปดํŒŒ์ผ ํƒ€์ž„๋•Œ ๋Ÿฐํƒ€์ž„๋•Œ ์‹คํ–‰๋˜๋Š” ํƒ€์ž…์˜ ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด.
  • ์ž๋ฐ”๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์— ๊ณต๋ณ€์„ฑ์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๋ฒ„๊ทธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋Ÿฐํƒ€์ž„์— ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž…์„ ๊ฒ€์ฆ์„ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
    • <Object>: Object๋งŒ์„ ๋ฐ›์•„ ๋“ค์ธ๋‹ค.
    • <? extends Object>: Object๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ๋“ค์ธ๋‹ค.
  • ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
    • List๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ๋งค๋ฒˆ getํ•  ๋•Œ๋งˆ๋‹ค ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ํƒ€์ž…์บ์ŠคํŒ…์ด ์ž˜๋ชป๋˜๋ฉด ๋Ÿฐํƒ€์ž„์‹œ ClassCastException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. (์ปดํŒŒ์ผ ํƒ€์ž„๋•Œ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ)

Q. ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์ฐจ์ด

๋‹ต๋ณ€
  • ์˜ค๋ฒ„๋กœ๋”ฉ: ์žฌ๊ตฌ์„ฑ
    • ํ•œ ํด๋ž˜์Šค ๋‚ด์— ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•˜๋Š” ๊ฒƒ.
    • ๋‹จ, ๊ธฐ์กด ๋ฉ”์„œ๋“œ์™€ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜ ๋˜๋Š” ํƒ€์ž…์ด ๋‹ฌ๋ผ์•ผํ•œ๋‹ค. (๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ๊ฐ™์€๋ฐ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.)
    • ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ.
  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ: ์žฌ์ •์˜
    • ์ธํ„ฐํŽ˜์ด์Šค ํ˜น์€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜.
    • ๊ธฐ์กด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ.

Q. try-with-resource

๋‹ต๋ณ€
  • JAVA 7๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ
  • Closeable์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋งŒ์ด ์‚ฌ์šฉ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ž๋™ ๋ฐ˜๋‚ฉ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

Q. Stream์ด๋ž€? ์žฅ์ ๊ณผ ํŠน์ง•์€?

๋‹ต๋ณ€
  • Stream์ด๋ž€?
    • Stream์€ ์„ ์–ธํ˜• ๋ฐฉ์‹์œผ๋กœ ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” API.
      • ์„ ์–ธํ˜• ๋ฐฉ์‹: ๋‚ด๋ถ€ ๋ฐ˜๋ณต (WHAT) -> Stream์„ ์ด์šฉํ•œ ๋‚ด๋ถ€ ๋ฐ˜๋ณต
      • ๋ช…๋ นํ˜• ๋ฐฉ์‹: ์™ธ๋ถ€ ๋ฐ˜๋ณต (HOW) -> ๊ธฐ์กด์˜ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•œ ์™ธ๋ถ€ ๋ฐ˜๋ณต
    • ์ŠคํŠธ๋ฆผ์€ '๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„'์ด๋‹ค. ๋ฐฐ์—ด ๋˜๋Š” ์ปฌ๋ ‰์…˜์— ํ•จ์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๊ฐ€๊ณต๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
      • DB์˜ ์ฟผ๋ฆฌ(SELECT)์™€ ๊ฐ™์ด ์ •ํ˜•ํ™”๋œ ์ฒ˜๋ฆฌ ํŒจํ„ด์„ ์ ์šฉ์‹œํ‚จ ๊ฒƒ.
      • ๋ฐฐ์—ด ํ˜น์€ ์ปฌ๋ ‰์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌ(Stream์™€ ๋™์ผํ•˜๋‹ค๊ณ  ๋ด๋„ ๋ฌด๋ฐฉ)ํ•˜๋Š” ๊ฒƒ.
  • Stream์˜ ํŠน์ง•
    • ์ŠคํŠธ๋ฆผ์€ ์™ธ๋ถ€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ž‘์—…ํ•˜๋Š” ์ปฌ๋ ‰์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋‚ด๋ถ€ ๋ฐ˜๋ณต (internal interation)์„ ํ†ตํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค
      • ์™ธ๋ถ€ ๋ฐ˜๋ณต ์˜ˆ์‹œ : for๋ฌธ, ๋‚ด๋ถ€ ๋ฐ˜๋ณต ์˜ˆ์‹œ : stream()....
    • ์ŠคํŠธ๋ฆผ์€ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ปฌ๋ ‰์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ถˆ๋ณ€)
    • ์ŠคํŠธ๋ฆผ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ์€ ํ•„ํ„ฐ-๋งต(filter-map) ๊ธฐ๋ฐ˜์˜ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ฐ (lazy) ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค.
    • ์ŠคํŠธ๋ฆผ์€ parallelStream() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์†์‰ฌ์šด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • ๊ตฌ์กฐ
    • ์ƒ์„ฑ
    • ์ค‘๊ฐ„ ์—ฐ์‚ฐ
    • ์ตœ์ข… ์—ฐ์‚ฐ๏ฟฝ

Q. Stream์—์„œ map๊ณผ flatmap์˜ ์ฐจ์ด๋Š”?

๋‹ต๋ณ€
  • map์€ ๋‹จ์ผ ์ŠคํŠธ๋ฆผ ์•ˆ์˜ ์š”์†Œ๋ฅผ ์›ํ•˜๋Š” ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ฃผ๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ.
  • flatmap์€ ์ŠคํŠธ๋ฆผ์˜ ํ˜•ํƒœ(์š”์†Œ)๊ฐ€ ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ์ผ ๋•Œ ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋‹จ์ผ ์›์†Œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ˜ํ™˜์‹œ์ผœ์ฃผ๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ.

Q. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๊ณผ ํŠน์ง•

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

Q. Lambda์‹์ด๋ž€?

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

Q. ์ต๋ช… ํด๋ž˜์Šค vs ๋žŒ๋‹ค์‹

๋‹ต๋ณ€
  • ๋‘˜์˜ ์ฐจ์ด์ ์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ, ๋žŒ๋‹ค๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํฌํ•จํ•œ๋‹ค.
    • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค
      • static ์ค‘์ฒฉ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    • ๋žŒ๋‹ค์‹
      • ๋žŒ๋‹ค์‹์€ static์ด๋“ , ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ์„ ์œ„ํ•œ non-static์ด๋“  ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • this
    • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ this: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค
      • ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ์˜ this๋Š” ์ต๋ช… ํด๋ž˜์Šค ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    • ๋žŒ๋‹ค์‹์˜ this: ๋žŒ๋‹ค์‹์ด ์„ ์–ธ๋œ (ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”) ํด๋ž˜์Šค
      • ๋žŒ๋‹ค์‹์€ ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ”์„œ๋“œ์—์„œ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
      • ์ฆ‰, ๋žŒ๋‹ค์‹์—์„œ this๋Š” ๋žŒ๋‹ค๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค.
  • ๋ฉ”์„œ๋“œ์˜ ๊ฐœ์ˆ˜
    • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ๋žŒ๋‹ค์‹์€ @FunctionalInterface๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋žŒ๋‹ค๋„ ์ผ์ข…์˜ ํด๋กœ์ €๋‹ค.
    • ํด๋กœ์ €: ํ•จ์ˆ˜ ๋ฒ”์œ„ ๋ฐ–์˜ ์ž์œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
    • ๋žŒ๋‹ค๊ฐ€ ๋žŒ๋‹ค์‹ ๋ฒ”์œ„ ๋ฐ–์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” final์ด์–ด์•ผ ํ•œ๋‹ค.

Q. ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด

๋‹ต๋ณ€
  • ๊ทผ๋ณธ์ ์œผ๋กœ ๋™์ผ. ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์  ์šฉ์–ด, ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ๊ฐœ๋… ์šฉ์–ด
  • ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค์— ๋…๋ฆฝ์ 
    • ํ•จ์ˆ˜(๋žŒ๋‹ค์‹)๋Š” ์ด ๋ชจ๋“  ๊ณผ์ •์—†์ด ์˜ค์ง ํ•จ์ˆ˜(๋žŒ๋‹ค์‹) ์ž์ฒด๋งŒ์œผ๋กœ๋„ ์ด ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์— ์ข…์†์ 
    • ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค์— ํฌํ•จ๋˜์–ด์•ผํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

Q. Java 8์— ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ

๋‹ต๋ณ€
  • ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ
    • ๊ฐ€์žฅ ํฌ๊ฒŒ ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„์€ Java์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘. (๋žŒ๋‹ค, ์ŠคํŠธ๋ฆผ)
    • LocalDate, LocalDateTime ํด๋ž˜์Šค๊ฐ€ ์ƒˆ๋กœ ์ƒ๊น€.
      • ์ด์ „์˜ Date์™€ Calendar๋Š” ๊ฐ€๋ณ€์ด์—ˆ๋‹ค. ์ฆ‰, set์„ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋˜ํ•œ, ๊ฐ์ฒด์˜ ์—ญํ• ์ด ๋ถ„๋‹ด๋˜์–ด ์žˆ์–ด, ๋…„/์›”/์ผ์„ ํ‘œํ˜„ํ•˜๊ณ  ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜ ๋ชจ๋‘๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ์ด ๋“ ๋‹ค.
      • LocalDate์™€ LocalDateTime์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.
    • ์ธํ„ฐํŽ˜์ด์Šค์— default ๋ฉ”์„œ๋“œ ์ •์˜ ๊ฐ€๋Šฅํ•ด์ง.
    • Optional

Q. ==๊ณผ equals()์˜ ์ฐจ์ด์ ์€?

๋‹ต๋ณ€
  • == : ๋™์ผ์„ฑ
    • ==์€ primitive๋ฉด ๊ฐ’ ๋น„๊ต, reference์ด๋ฉด ์ฃผ์†Œ ๋น„๊ต๋ฅผ ํ†ตํ•ด boolean ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • equals() : ๋™๋“ฑ์„ฑ
    • equals()๋Š” Object ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์ด๋ฉฐ, ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ boolean ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
    • equals()์™€ hashCode()๋ฅผ ์žฌ์ •์˜ํ•จ์œผ๋กœ์จ ๋™๋“ฑ์„ฑ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • hashCode()๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?
    • HashMap๊ณผ HashTable์—์„œ key์— ๋Œ€ํ•œ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ equals()์™€ hashCode()๋กœ ํ•˜๊ธฐ ๋–„๋ฌธ์—, ๋‘˜ ๋‹ค ์žฌ์ •์˜ํ•ด์ค˜์•ผํ•œ๋‹ค.
    • hashCode()๋ฅผ ์žฌ์ •์˜ํ•  ๋•, ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ํ†ตํ•ด ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์•ผํ•œ๋‹ค.
  • ๋” ์ž์„ธํ•œ ๋‚ด์šฉ

Q. Checked Exception vs Unchecked Exception

๋‹ต๋ณ€
  • ๋‹ค๋ฅธ ์ 
    • ์ปดํŒŒ์ผ ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์—ฌ๋ถ€
  • Checked Exception
    • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ณ„๋„์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์˜ˆ์™ธ.
    • ๋น„๊ด€์ ์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์ด๋ผ ๋ถˆ๋ฆฐ๋‹ค.
    • ex. SQLException, IOException
  • Unchecked Exception
    • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ณ„๋„์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ์˜ˆ์™ธ.
    • ๋‚™๊ด€์ ์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์ด๋ผ ๋ถˆ๋ฆฐ๋‹ค.
    • ex. NPE, RuntimeException

Q. Checked Exception์„ ์ง€์–‘ํ•˜๋Š” ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ์ž์นซ ์ž˜๋ชปํ•˜๋ฉด ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌด์ฑ…์ž„ํ•˜๊ฒŒ throws๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • OCP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. -> ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง„๋‹ค.
    • ํŠน์ • ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค๋กœ ์˜ˆ์™ธ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์ „๋‹ฌ๋˜๊ณ , ๊ทธ๋กœ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐํ•ฉ๋„๊ฐ€ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ์•…์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.
    • ๋˜ํ•œ, ๋ชจ๋“  ์ƒ์œ„ ๋ฉ”์„œ๋“œ๋“ค์ด ์ตœํ•˜์œ„ ๋ฉ”์„œ๋“œ์˜ ์˜ˆ์™ธ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ์บก์Šํ™”๊ฐ€ ๊นจ์ง„๋‹ค.
  • ์˜ˆ์™ธ๋ฅผ throwํ•œ ๋ฉ”์„œ๋“œ์™€ depth๊ฐ€ 3๋งŒ ๋ฉ€์–ด์ ธ๋„ ์ด ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ ๊ทผ์›์ง€๋ฅผ ์ถ”์ธกํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.
    • ์–ด๋””์„œ ์ง„์งœ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ๊ฒƒ.
  • ๋ฌผ๋ก  ๋ฐ˜๋Œ€ ์˜๊ฒฌ๋„ ์žˆ๋‹ค. ๋ฐ”๋กœ ์—˜๋ ˆ๊ฐ•ํŠธ ์˜ค๋ธŒ์ ํŠธ..
    • ๊ฐ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์•„์ฃผ ๋ช…ํ™•ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๊ฒฌ์ด๋‹ค.
    • ์ฆ‰, ์˜ˆ์™ธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ Unchecked Exception์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์†์ธ๋‹ค๋Š” ๊ฒƒ!
    • ํ•˜์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ Unchecked๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฌธ์„œํ™”๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„๋ณด์ธ๋‹ค.
  • Checked Exception ์ง€์–‘ํ•œ ์˜ˆ์‹œ
    • SQLException -> DataAccessException

Q. ์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…

๋‹ต๋ณ€
  • ์บ์ŠคํŒ… == ํ˜•๋ณ€ํ™˜
  • ์—…์บ์ŠคํŒ…
    • ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ ๋˜๋Š” ๊ฒƒ.
    • ์ƒ์œ„ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋ฌต์‹œ์ ์œผ๋กœ ์—…์บ์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • ๋ฌผ๋ก  ์ด๋•Œ, ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์—๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€ํ•˜๋‹ค.
  • ๋‹ค์šด์บ์ŠคํŒ…
    • ์ž์‹ ์˜ ๊ณ ์œ ํ•œ ํŠน์„ฑ์„ ์žƒ์€ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต๊ตฌ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์ฆ‰, ์—…์บ์ŠคํŒ…๋œ ๊ฒƒ์„ ๋‹ค์‹œ ์›์ƒํƒœ๋กœ ๋Œ๋ฆฌ๋Š” ๊ฒƒ.
    • ์ฃผ์˜ ํ• ์ ์€ ์—…์บ์ŠคํŒ…์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

Q. ์ •์  ๋ฐ”์ธ๋”ฉ vs ๋™์  ๋ฐ”์ธ๋”ฉ์ด๋ž€

๋‹ต๋ณ€
  • ๋ฐ”์ธ๋”ฉ
    • ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์„ฑ๊ฒฉ์„ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ.
    • ex. ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€ ์ •ํ•ด์ง€๋Š” ๊ฒƒ.
  • ์ •์  ๋ฐ”์ธ๋”ฉ
    • ์ปดํŒŒ์ผํƒ€์ž„์— ์„ฑ๊ฒฉ์ด ๊ฒฐ์ •๋œ๋‹ค.
      • ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ์ •์  ํ• ๋‹น(ex. c, c++,java). ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž…์ด ๊ฒฐ์ •๋จ.
      • ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ, ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •๋œ๋‹ค.
  • ๋™์  ๋ฐ”์ธ๋”ฉ
    • ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ.
    • ๋Ÿฐํƒ€์ž„์— ์„ฑ๊ฒฉ์ด ๊ฒฐ์ •๋œ๋‹ค.
      • ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๋™์  ํ• ๋‹น(ex. python, kotlin). ๋Ÿฐํƒ€์ž„์— ํƒ€์ž…์ด ๊ฒฐ์ •๋จ.
      • ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ, ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •๋œ๋‹ค.

Q. Collection vs Collections

๋‹ต๋ณ€
  • Collection
    • ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ฃจํŠธ ์ธํ„ฐํŽ˜์ด์Šค.
    • List, Set, Queue๋“ฑ์€ ๋ชจ๋‘ Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ, map ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹จ์ˆœํžˆ ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ์ €์žฅํ•˜๋Š” List, Set๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ‚ค:๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ๊ทธ์ € ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ฐ™์ด ์ •์˜๋งŒ ๋˜์–ด์žˆ๋‹ค.
  • Collections
    • ์ปฌ๋ ‰์…˜์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ •๋ ฌ, ๊ฒ€์ƒ‰, ์ตœ์†Œ, ์ตœ๋Œ€๊ฐ’๊ฒ€์ƒ‰ ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ์œ ํ‹ธ์„ฑ ๊ฐ์ฒด์ด๋‹ค.

Q. String vs StringBuffer vs StringBuilder

๋‹ต๋ณ€
  • String์€ ๋ถˆ๋ณ€, ๋‚˜๋จธ์ง€ ๋‘˜์€ ๊ฐ€๋ณ€
    • String์€ ๋ถˆ๋ณ€์ด๋ฏ€๋กœ ์ง€์ •๋œ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋‚˜๋จธ์ง€ ๋‘˜์€ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • StringBuffer์™€ StringBuilder์˜ ์žฅ์ 
    • ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๋งŽ์€ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์‹œ์— ๋” ํšจ์œจ์ ์ด๋‹ค.
  • StringBuffer์™€ StringBuilder์˜ ์ฐจ์ด์ 
    • StringBuffer๋Š” equals ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • StringBuilder๋Š” StringBuffer์—์„œ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ๋งŒ ๋บ€ ํด๋ž˜์Šค์ด๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด StringBuilder๊ฐ€ ๋” ํšจ์œจ์ ์ด๋‹ค.

Q. HashMap vs HashTable vs ConcurrentHashmap

๋‹ต๋ณ€
  • ๊ณตํ†ต์ 
    • ๋ชจ๋‘ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด์ด๋ฉฐ, key:value ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.
  • thread-safe
    • HashMap์€ ์ฃผ์š” ๋ฉ”์„œ๋“œ์— synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์–ด thread-safeํ•˜์ง€ ์•Š๋‹ค.
    • HashTable์€ ์ฃผ์š” ๋ฉ”์„œ๋“œ์— synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์–ด thread-safeํ•˜๋‹ค. ๋‹น์—ฐํžˆ HashMap๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค.
    • ConcurrentHashMap์€ ์ฃผ์š” ๋ฉ”์„œ๋“œ์— synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์ง€๋งŒ, thread-safeํ•˜๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ์ ‘๊ทผํ•  ๋•Œ๋งŒ ํ•ด๋‹น ๋ธ”๋ก์ด ์ž ๊ธฐ๊ฒŒ ๋˜๋ฏ€๋กœ, HashTable๋ณด๋‹ค ํšจ์œจ์ ์ด๋‹ค.
      • HashTable์€ ํ•˜๋‚˜์˜ ๋ฒ„ํ‚ท์„ ์ ‘๊ทผํ•ด๋„ ๋ชจ๋“  ๋ฒ„ํ‚ท์„ ์ž ๊ธˆ ์ƒํƒœ๋กœ ๋งŒ๋“ค์ง€๋งŒ, ConcurrentHashMap์€ ํ•ด๋‹น ํ•ด์‹œ ๋ฒ„ํ‚ท๋งŒ์„ ์ž ๊ธˆํ•œ๋‹ค.
  • null ํ—ˆ์šฉ
    • HashMap์€ key, value์— null์„ ํ—ˆ์šฉํ•œ๋‹ค.
    • HashTable๊ณผ ConcurrentHashMap์€ key, value์— null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

Q. HashMap vs TreeMap vs LinkedHashMap

๋‹ต๋ณ€
  • ์กฐํšŒ
    • HashMap์€ Hashing์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ์‹œ O(1)์ด๋‹ค.
    • TreeMap์€ ๋‚ด๋ถ€์ ์œผ๋กœ Red-Black ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ์‹œ O(logN)์ด๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ˆœ์„œ
    • HashMap์€ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • TreeMap๊ณผ LinkedHashMap์€ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

Q. java.util.Stack์ด ์ž˜๋ชป๋œ ์ด์œ 

๋‹ต๋ณ€
  • Stack์˜ ๋ฌธ์ œ์ 
    1. Vector๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. Vector๋Š” LIFO๊ฐ€ ์•„๋‹Œ ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ๋„ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Stack์˜ ๋ณธ์งˆ์—์„œ ๋ฒ—์–ด๋‚œ๋‹ค.
    2. Stack์€ synchronized ํ‚ค์›Œ๋“œ๋กœ thread-safe๋ฅผ ๋ณด์žฅํ•œ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์ ์œผ๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๋‹ค. ์‹ค์‚ฌ์šฉ ์„œ๋ฒ„์—์„  ์ข‹์€ ์„ ํƒ์ด ์•„๋‹ˆ๋‹ค.
  • Stack ๋Œ€์‹  ๋ฌด์—‡์„ ์จ์•ผํ•˜๋Š”๊ฐ€?
    • Java API ๋ฌธ์„œ์—์„œ๋Š” ๋” ์™„๋ฒฝํ•œ LIFO ์ž๋ฃŒ๊ตฌ์กฐ๋กœ Deque์˜ ๊ตฌํ˜„์ฒด์ธ ArrayDeque๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ์ถ”์ฒœํ•œ๋‹ค.
    • thread-safeํ•ด์•ผํ•œ๋‹ค๋ฉด, ConcurrentLinkedDeque์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด๋Š” lock-freeํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ thread-safe๋ฅผ ๋ณด์žฅํ•˜์—ฌ ์„ฑ๋Šฅ์ƒ ๋” ์œ ๋ฆฌํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

Q. Inner Class์™€ Nested Class

๋‹ต๋ณ€
  • ์ž๋ฐ”์—์„  class ์•ˆ์— class๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฐ์ง‘ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ์™ธ๋ถ€ ๋…ธ์ถœ์„ ์ค„์—ฌ ์บก์Šํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋ฉฐ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ข…๋ฅ˜
    • Static Nested Class
    • Inner Class
      • Local Inner Class
      • Anonymous Class
  • Static Nested Class vs Inner Class
    • ๋‘˜์˜ ์ฐจ์ด์ ์€ static์œผ๋กœ์˜ ์„ ์–ธ ์—ฌ๋ถ€์ด๋‹ค. Inner Class๋Š” static์„ ๋ถ™์ด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋‹ค.
    • ๋ฉค๋ฒ„ ์ ‘๊ทผ
      • Static Nested Class๋Š” Outer Class์˜ static ๋ฉค๋ฒ„๋ฅผ ์ œ์™ธํ•œ ์–ด๋– ํ•œ ๋ฉค๋ฒ„๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
      • Inner Class๋Š” Outer Class์˜ ๋ชจ๋“  ๋ฉค๋ฒ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๊ฐ์ฒด ์ƒ์„ฑ
      • Static Nested Class๋Š” Outer Class์™€ ๊ด€๊ณ„์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ๊ฐ€๋Šฅ.
      • Inner Class๋Š” Outer Class์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
        • Inner Class์˜ ๊ฒฝ์šฐ ๋ณดํ†ต Outer Class์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์ด๋กœ์ธํ•ด GC๊ฐ€ ์ˆ˜๊ฑฐํ•˜์ง€ ๋ชปํ•ด, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  • Nested Class๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ Outer Class์— ๋Œ€ํ•œ ๋ฉค๋ฒ„๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ฌด์กฐ๊ฑด Static Nested Class๋กœ ์„ ์–ธํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Q. ์ ‘๊ทผ ์ œ์–ด์ž

๋‹ต๋ณ€
  • ์ ‘๊ทผ ์ œ์–ด์ž๋ž€?
    • ํด๋ž˜์Šค๋‚˜ ๋ฉค๋ฒ„ ์„ ์–ธ ์‹œ ๋ถ€๊ฐ€์ ์ธ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ํ‚ค์›Œ๋“œ.
    • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ •๋ณด ์€๋‹‰(์บก์Šํ™”)์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ข…๋ฅ˜
    • public: ์™ธ๋ถ€์— ์ „์ฒด ๊ณต๊ฐœ๋˜๋ฉฐ, ์–ด๋””์—์„œ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    • protected: ๊ฐ™์€ ํŒจํ‚ค์ง€ ํ˜น์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • default: ํด๋ž˜์Šค ๋ฉค๋ฒ„๋Š” ๊ฐ™์€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์†ํ•˜๋Š” ๋ฉค๋ฒ„์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • private: ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Q. System.out.println()๋Œ€์‹  ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜๋Š”์ด์œ 

๋‹ต๋ณ€
  • System.out.println์˜ ๋‹จ์ 
    • ๋กœ๊ทธ๊ฐ€ ์‹œ์Šคํ…œ ์ฝ˜์†”์—๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.
    • ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ thread-safe๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด synchronized๋ฅผ ์ด์šฉํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค.
  • ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์ 
    • ๋งŽ์€ ๋ถ€๊ฐ€ ์ •๋ณด (์Šค๋ ˆ๋“œ ์ •๋ณด, ํด๋ž˜์Šค ์ด๋ฆ„)๋ฅผ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋กœ๊ทธ๋ฅผ ์‹œ์Šคํ…œ ์ฝ˜์†” ์™ธ์—๋„ ํŒŒ์ผ์ด๋‚˜ ํŠน์ • ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. (์ €์žฅ ๊ฐ€๋Šฅ)
    • ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (์„ฑ๋Šฅ์ƒ ์ข‹์Œ)

Q. ์ง๋ ฌํ™” / ์—ญ์ง๋ ฌํ™”์˜ ์ฐจ์ด

๋‹ต๋ณ€
  • ์ง๋ ฌํ™” : ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ
    • ๊ฐ์ฒด -> ์ŠคํŠธ๋ฆผ (์ „์†ก ํ˜น์€ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•จ)
  • ์—ญ์ง๋ ฌํ™” : ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ
    • ์ŠคํŠธ๋ฆผ -> ๊ฐ์ฒด (์ „์†ก ํ˜น์€ ์ €์žฅ๋œ ๊ฒƒ์„ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ)

Q. ๊นŠ์€ ๋ณต์‚ฌ์™€ ์–•์€ ๋ณต์‚ฌ

๋‹ต๋ณ€
  • ์–•์€ ๋ณต์‚ฌ : ๊ฐ์ฒด์˜ ์ €์žฅ๋œ ๋ฉค๋ฒ„๋“ค์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
    • ๊ฐ์ฒด์•ˆ์— ์ €์žฅ๋œ ๋ฉค๋ฒ„์ค‘ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋Š” ๋ณต์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ฐธ์กฐ๋ณ€์ˆ˜๋งŒ ๋ณต์ œ๋˜๊ณ , ํž™์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ๋Š”๋‹ค.
    • ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณต์‚ฌ๋ณธ๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. ( ํž™์— ์ €์žฅ๋œ ๊ฐ์ฒด๋Š” ๊ทธ๋Œ€๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— )
  • ๊นŠ์€ ๋ณต์‚ฌ : ๊ฐ์ฒด์˜ ์ €์žฅ๋œ ๋ฉค๋ฒ„๋“ค์˜ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊นŒ์ง€ ๋ณต์ œํ•œ๋‹ค.
    • ๊ฐ์ฐจ์•ˆ์— ์ €์žฅ๋œ ๋ฉค๋ฒ„์ค‘ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊นŒ์ง€ ๋ณต์ œํ•œ๋‹ค.
    • ์ฐธ์กฐ๋ณ€์ˆ˜๋„ ๋ณต์ œํ•˜๊ณ , ํž™์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๊นŒ์ง€ ๋ณต์ œํ•œ๋‹ค. ( new๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šคํ™” )
    • ์›๋ณธ์˜ ๋ณ€๊ฒฝ์ด ๋ณต์‚ฌ๋ณธ์˜ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ๋ชปํ•œ๋‹ค. ( ํž™์— ์ €์žฅ๋œ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ )

Q. Lombok ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•  ์  - ์˜ˆ์ •

๋‹ต๋ณ€


JVM, GC

Q. JVM์ด๋ž€?

๋‹ต๋ณ€
  • JVM์ด๋ž€
    • ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ .
    • ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ฃผ์ฒด๋‹ค.
  • JVM์˜ ํŠน์ง•
    • WORA (Write Once, Run Anywhere)
      • JVM์€ ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ ์ด๋ฉฐ, ๋ชจ๋“  ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ ์€ ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹  ๊ทœ๊ฒฉ์— ์ •์˜๋œ ๋Œ€๋กœ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (์ŠคํŽ™)
      • ๋ชจ๋“  ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ CPU๋‚˜ ์šด์˜ ์ฒด์ œ์˜ ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.
      • ์œˆ๋„์šฐ, ๋งฅ, ๋ฆฌ๋ˆ…์Šค.. ๋“ฑ๋“ฑ ์šด์˜์ฒด์ œ์— ์ข…์†์ ์ด์ง€ ์•Š๋‹ค.
    • GC
      • ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋Š” ์‚ฌ์šฉ์ž ์ฝ”๋“œ์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  GC์— ์˜ํ•ด ์ž๋™์ ์œผ๋กœ ์†Œ๋ฉธ๋œ๋‹ค.

Q. ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘ ๊ณผ์ •

๋‹ต๋ณ€
  1. JAVA ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ (.java)๋ฅผ JAVA ์ปดํŒŒ์ผ๋Ÿฌ (javac)๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  2. JVM ๋‚ด์— ์žˆ๋Š” Class Loader๊ฐ€ runtime data area๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ํŒŒ์ผ์„ ์ ์žฌํ•œ๋‹ค.
    • Loading -> Linking -> Initializing
  3. JVM ๋‚ด์— ์žˆ๋Š” execution engine(Interpreter, JIT Compiler, GC)์ด runtime data area์— ์ ์žฌ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€๊ฒฝํ•ด ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์‹คํ–‰ํ•œ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ


Q. JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

๋‹ต๋ณ€
  • ์ž๋ฐ”์˜ ์‹คํ–‰ ๊ณผ์ •
    • JVM ๋‚ด์— ์žˆ๋Š” Class Loader๊ฐ€ runtime data area๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ํŒŒ์ผ์„ ์ ์žฌํ•œ๋‹ค.
  • Runtime Data Area ๊ตฌ์กฐ
    • Method ์˜์—ญ (static ์˜์—ญ)
      • ํด๋ž˜์Šค ์ˆ˜์ค€์˜ ์ •๋ณด (ํด๋ž˜์Šค ์ด๋ฆ„, ๋ถ€๋ชจ ํด๋ž˜์Šค ์ด๋ฆ„, ๋ฉ”์„œ๋“œ, ๋ณ€์ˆ˜)๋ฅผ ์ €์žฅํ•œ๋‹ค. static์œผ๋กœ ์„ ์–ธ๋œ ๋ฐ์ดํ„ฐ๋“ค๋„ ์ €์žฅ๋œ๋‹ค.
      • ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์ž์›์„ ์ €์žฅํ•œ๋‹ค.
      • ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›
    • Heap ์˜์—ญ
      • new๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด ์ €์žฅ๋œ๋‹ค.
      • GC์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ์˜์—ญ.
      • ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›.
    • Stack ์˜์—ญ
      • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ. (์ฝœ์Šคํƒ)
      • ์Šคํƒ ํ”„๋ ˆ์ž„ ๋‚ด์˜ ์ง€์—ญ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ๊ฐ’, ์ฐธ์กฐ ๋ณ€์ˆ˜๋“ฑ์„ ์ €์žฅํ•œ๋‹ค.
      • ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ์˜์—ญ์ด๋ฉฐ, ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ณต์œ ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ

Q. GC๋ž€? - ์˜ˆ์ •

ํ† ๊ธ€

Q. GC ๋™์ž‘ ๋ฐฉ์‹ - ์˜ˆ์ •

ํ† ๊ธ€

Q. call by value์™€ call by reference

๋‹ต๋ณ€
  • call by value
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ „๋‹ฌ๋˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹.
    • ๋ณต์‚ฌ๋œ ์ธ์ž๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ง€์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
    • ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ธ์ž์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„, ํ˜ธ์ถœ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋œ ์™ธ๋ถ€์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • Java์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„๋‹ค.
      • primitive type (์›์‹œํƒ€์ž…): call by value๋กœ ๋™์ž‘ (int, short, long, float, double, char, boolean)
      • reference type (์ฐธ์กฐํƒ€์ž…): call by reference์ฒ˜๋Ÿผ ๋™์ž‘. (๋ฐฐ์—ด, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค)
  • call by reference
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ (ex. c์–ธ์–ด์—์„œ ํฌ์ธํ„ฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ)
    • ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ธ์ž์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ํ˜ธ์ถœ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋œ ์™ธ๋ถ€์˜ ๊ฐ’๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • Java๋Š” call by value๋‹ค.
    • ๊ฐ์ฒด์˜ ์ฃผ์†Œ ๊ฐ’์„ ์ง์ ‘ ๋„˜๊ธฐ์ง€ ์•Š๊ณ , ๊ฐ์ฒด ์ฃผ์†Œ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ๋ณต์‚ฌํ•ด ๋งŒ๋“ค์–ด์„œ ๋„˜๊ธด๋‹ค.
      • ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ์ฐธ์กฐ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ.
    • Java uses only call by value while passing reference variables as well. It creates a copy of references and passes them as valuable to the methods.

Q. ๋ฆฌํ”Œ๋ ‰์…˜์ด๋ž€?

๋‹ต๋ณ€
  • ๋ฆฌํ”Œ๋ ‰์…˜์ด๋ž€?
    • ์ปดํŒŒ์ผ๋˜๊ณ  ์‹คํ–‰๋˜๋ฉด์„œ Class Loader์— ์˜ํ•ด Method ์˜์—ญ์— ๋กœ๋”ฉ๋˜์žˆ๋Š” ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ž๋ฐ” API์ด๋‹ค.
    • ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋Ÿฐํƒ€์ž„์— ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal properties of the program. For example, it's possible for a Java class to obtain the names of all its members and display them.
  • ๋Œ€ํ‘œ์  ์‚ฌ์šฉ ์˜ˆ์‹œ
    • Component Scan (ํด๋ž˜์Šค์˜ ์• ๋…ธํ…Œ์ด์…˜์„ ์Šค์บ”ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•จ)
    • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋ก์‹œ (Method ์ด๋ฆ„)

Q. ๋ฆฌํ”Œ๋ ‰์…˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•  ์ 

๋‹ต๋ณ€
  1. ์ง€๋‚˜์นœ ์‚ฌ์šฉ์€ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.
    • Component Scan์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ํ•œ ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  2. ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธ๋˜์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„ ์‹œ์—๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  3. ์ ‘๊ทผ ์ง€์‹œ์ž๋ฅผ ์˜๋„์ ์œผ๋กœ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์นซํ•˜๋ฉด ๋ณด์•ˆ์  ์ด์œ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Q. ๋™๊ธฐํ™”(synchronized) vs ๋น„๋™๊ธฐํ™”(asynchronized)

๋‹ต๋ณ€

๋™๊ธฐํ™”, ๋น„๋™๊ธฐํ™”๋Š” ๊ฐ๊ฐ ๋‘ ๊ฐ€์ง€์˜ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋“ฏ ํ•˜๋‹ค.

  • ๋™๊ธฐํ™”
    1. ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์Šค๋ ˆ๋“œ๋“ค์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ์„œ๋กœ ์ž‘์—…์— ๋ผ์–ด๋“ค์ง€ ๋ชปํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ. ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ. (Lock์ฒ˜๋ฆฌ)
    2. ์–ด๋Š ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ธ”๋กํ•˜๋Š” ๊ฒƒ.
    • ์ž‘์—…์„ ์š”์ฒญํ•œ ํ›„ ํ•ด๋‹น ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ.
    • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ด๊ณผ ๋™์‹œ์— ๋ฐ˜ํ™˜ ๊ฐ’์ด ๊ธฐ๋Œ€๋˜๋Š” ๊ฒฝ์šฐ.
  • ๋น„๋™๊ธฐํ™”
    1. ์–ด๋Š ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘์—๋„ ๋‹ค์‹œ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ)
    • ์ž‘์—…์„ ์š”์ฒญํ•œ ํ›„ ํ•ด๋‹น ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ.
    • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋ฐ”๋กœ blocking๋˜์ง€ ์•Š๊ณ  ์ด๋ฒคํŠธ ํ ํ˜น์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์— ํ•ด๋‹น task๋ฅผ ์œ„์ž„ํ•˜๊ณ , ๋ฐ”๋กœ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ.
    • ex. ajax, ์Šค๋ ˆ๋“œ, ๋กœ๊น… ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

Q. Thread-Safe๋ž€?

๋‹ต๋ณ€
  • Thread-Safe๋ž€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜, ํ˜น์€ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋™์‹œ์— ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ ธ๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์ธํ•ด ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ฎ์—ฌ์”Œ์›Œ์ง€๊ธฐ๋•Œ๋ฌธ์— Thread-Safeํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค.
  • Thread-Safe ์˜ˆ์‹œ
    • synchronized๋ถ™์€ ๋ฉ”์„œ๋“œ, ConcurrentHashMap๋“ฑ๋“ฑ
  • Thread-Safeํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„ 
    • Mutual Exclusion
      • Thread์— Lock์ด๋‚˜ Semaphore๋ฅผ ๊ฑธ์–ด์„œ ๊ณต์œ ์ž์›์—๋Š” ํ•˜๋‚˜์˜ thread๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
    • Thread-Local
      • ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ ์ ‘๊ทผ์„ ๋ง‰๋Š”๋‹ค.
    • ๋ถˆ๋ณ€ ๊ฐ์ฒด
      • ๊ฐ์ฒด ์ƒ์„ฑ ์ดํ›„์— ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ ๋‹ค. (๋ณ€๊ฒฝ์‹œ ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ฒƒ.)

Q. ๋นŒ๋” ํŒจํ„ด์€ thread-safeํ•œ๊ฐ€? - ์˜ˆ์ •

๋‹ต๋ณ€

Q. JDK 11์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  - ์˜ˆ์ •

๋‹ต๋ณ€
  • 8๊ณผ ๋น„๊ตํ•˜์—ฌ 11์—์„œ ๋ณ€๊ฒฝ๋œ ์ 
    1. ํŽธ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒผ๋‹ค.
      • isBlank(), repeat()...๋“ฑ๋“ฑ
      • List.of๋„ ์ƒ๊น€.
    2. var ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ด์ง (๋™์  ํƒ€์ž…์ฒดํฌ)
    3. java.nio.file.Files ํด๋ž˜์Šค ์œ ํ‹ธ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€๋จ
    4. JDK 11์˜ Long-Term-Support(LTS)๊ฐ€ ๋” ๊ธธ๋‹ค..


OOP


๊ฐ์ฒด์ง€ํ–ฅ

Q. ๊ฐ์ฒด์ง€ํ–ฅ์ด๋ž€?

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

Q. SOLID ์›์น™์ด๋ž€?

๋‹ต๋ณ€
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ์„ค๊ณ„์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์›์น™.

๋ณดํ†ต ์ €์ˆ˜์ค€์˜ SOLID๋ฅผ ๋งŽ์ด ๊ณ ๋ฏผํ•˜์ง€๋งŒ, ๊ณ ์ˆ˜์ค€์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฅผ ๋‹ต๋ณ€์—์„œ ์–˜๊ธฐํ•˜์ž.

  • SRP (Single Responsibility Principle)
    • ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์˜ค์ง ํ•˜๋‚˜๋ฟ์ด์–ด์•ผ ํ•œ๋‹ค.
    • ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜, ์˜ค์ง ํ•˜๋‚˜์˜ ์•กํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฑ…์ž„์ ธ์•ผ ํ•œ๋‹ค.
      • ์•กํ„ฐ: ํ•ด๋‹น ๋ชจ๋“ˆ์— ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•˜๋Š” ํ•œ ๋ช… ์ด์ƒ์˜ ์‚ฌ๋žŒ๋“ค์„ ๊ฐ€๋ฆฌํ‚ด. (ํ•œ๋ช… ํ˜น์€ ์ง‘๋‹จ)
    • ์œ„๋ฐ˜ํ•˜๋Š” ์˜ˆ์‹œ
      • Employee๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ํšŒ๊ณ„ํŒ€, ์ธ์‚ฌํŒ€, DB ๊ด€๋ฆฌ์ž ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด์˜ ์•กํ„ฐ๋Š” 3๊ฐœ๋‹ค.
      • ์ด๋•Œ, ํšŒ๊ณ„ํŒ€๊ณผ ์ธ์‚ฌํŒ€์ด ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋™์ผํ•œ private ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž, ํ•ด๋‹น private ๋ฉ”์„œ๋“œ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋‘ ์•กํ„ฐ์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” SRP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ.
      • ์ด๋Š” ์—ฌ๋Ÿฌ ์•กํ„ฐ๊ฐ€ ๋‹จ์ผ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋ฉฐ, ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ˆ๋ฌด ๊ฐ€๊นŒ์ด ๋ฐฐ์น˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ถ„๋ฆฌ์‹œ์ผœ์•ผ ํ•œ๋‹ค.
    • ์‰ฌ์šด ์˜ˆ์‹œ
      • ๋‚จ์ž๋ณด๋‹จ ๋‚จ์ž์นœ๊ตฌ, ๋‚จํŽธ, ์šด๋™์„ ์ˆ˜๋“ฑ๋“ฑ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด SRP์— ์ ํ•ฉํ•˜๋‹ค.
  • OCP (Open Closed Principle)
    • ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
      • ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  (Closed), ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก (Open)ํ•ด์•ผ ํ•œ๋‹ค.
      • ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋Š” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์›์น™
    • OCP์˜ ํ•ต์‹ฌ์€ ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ๊ณผ ์ปดํŒŒ์ผํƒ€์ž„ ์˜์กด์„ฑ์ด๋‹ค. - ๋‹คํ˜•์„ฑ
      • ํ•ต์‹ฌ์€ ์ปดํŒŒ์ผํƒ€์ž„ ์˜์กด์„ฑ์„ ๊ณ ์ •์‹œํ‚ค๊ณ , ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ. (๋™์  ๋ฐ”์ธ๋”ฉ)
    • ์˜ˆ์‹œ
      • JDBC
  • LSP (Liskov Substitution Principle)
    • ์ƒ์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ•˜์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ ์น˜ํ™˜ํ•ด๋„ ์ƒ์œ„ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™
      • B๊ฐ€ A์˜ ์ž์‹ ํƒ€์ž…์ด๋ฉด, ๋ถ€๋ชจ ํƒ€์ž…์ธ A๊ฐ์ฒด๋Š” ์ž์‹ ํƒ€์ž…์ธ B๋กœ ์น˜ํ™˜ํ•ด๋„, ๊ธฐ์กด ๋™์ž‘์—” ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™.
      • A - B์˜ ๋ถ€๋ชจ ์ž์‹์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ œ๋Œ€๋กœ ๋œ ์ƒ์†์ด์–ด์•ผ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์ด ์ž์‹์ธ B๋กœ ์น˜ํ™˜ํ•ด๋„ ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ
    • ๋ถ€๋ชจ์—์„œ ๊ตฌํ˜„ํ•œ ์›์น™์„ ์ž์‹๋„ ๋”ฐ๋ผ์•ผํ•œ๋‹ค๋Š” ์›์น™.
      • ์ž์‹์—์„œ ๋ถ€๋ชจ์˜ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜์—ฌ, ๊ธฐ์กด์˜ ๋กœ์ง์— ์˜ํ–ฅ์„ ์ฃผ๋ฉด ์•ˆ๋œ๋‹ค.
    • ์˜ˆ์‹œ
      • ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ  ์—‘์…€์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์„ ์–ธ๋˜์–ด์žˆ๋‹ค๊ณ  ํ• ๋•Œ, ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋Š” ์—‘์…€ ๊ธฐ๋Šฅ์„ ์•ž์œผ๋กœ ๊ฐ€๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ์ง€ ๋’ค๋กœ ๊ฐ€๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค
  • ISP (Interface Segregation Principle)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์œผ๋ฉด ์•ˆ๋œ๋‹ค.
      • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ทธ ์—ญํ• ์— ์ถฉ์‹คํ•œ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋งŒ ๊ณต๊ฐœํ•˜๋ผ๋Š” ๊ฒƒ.
    • ํ•˜๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š”, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚ซ๋‹ค.
      • ๋ถˆํ•„์š”ํ•œ ์ง์„ ์‹ค์€ ๋ฌด์–ธ๊ฐ€์— ์˜์กดํ•˜๋ฉด ์˜ˆ์ƒ์น˜๋„ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‰ฝ๊ฒŒ ๋งํ•ด, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ.
  • DIP (Dependency Inversion Principle)
    • ์ถ”์ƒํ™”๋œ ๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์›์น™. ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด ์ถ”์ƒํ™”๋œ ๊ฒƒ์— ์˜์กดํ•ด์•ผํ•œ๋‹ค.
    • ๊ณ ์ฐจ์› ๋ชจ๋“ˆ์€ ์ €์ฐจ์› ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์ด ๋‘ ๋ชจ๋“ˆ ๋ชจ๋‘ ๋‹ค๋ฅธ ์ถ”์ƒํ™” ๋œ ๊ฒƒ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™.
    • ์˜์กด์„ฑ ์—ญ์ „์ด๋ž€
      • ๊ธฐ์กด์—” ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์˜์กด์„ฑ์ด ์—ญ์ „๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์—†๋‹ค.
      • ๋ฐ˜๋ฉด์—, ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ถ”์ƒ์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์Œ์œผ๋กœ์จ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ์ด ์—ญ์ „๋œ๋‹ค. ์ฆ‰, ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ž๊ธฐ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ ์—ญ์ „์ด๋ผํ•œ๋‹ค.
    • ์˜ˆ์‹œ
      • ์นด๋“œ ๊ฒฐ์ œ๋ผ๋Š” ๊ณ ์ฐจ์› ๋ชจ๋“ˆ์ด ์žˆ๋‹ค๋ฉด, ์นด๋“œ ๊ฒฐ์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„  ์‹ ํ•œ ์นด๋“œ ๊ฒฐ์ œ์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์นด๋“œ ๊ฒฐ์ œ๋ผ๋Š” ์ถ”์ƒ์ ์ธ ๊ฒƒ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
      • ๊ทธ๋ฆฌ๊ณ  ์‹ ํ•œ ์นด๋“œ ๊ฒฐ์ œ ํ˜น์€ ๋‹ค๋ฅธ ์นด๋“œ ๊ฒฐ์ œ๋“ค์€ ๋ชจ๋‘ ์นด๋“œ ๊ฒฐ์ œ๋ผ๋Š” ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ €์ฐจ์› ๋ชจ๋“ˆ์ด๋‹ค. (์„ธ๋ถ€์‚ฌํ•ญ์ด๋‹ค.)

Q. ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„

๋‹ต๋ณ€
  • ์‘์ง‘๋„
    • ๋ชจ๋“ˆ์— ํฌํ•จ๋œ ๋‚ด๋ถ€ ์š”์†Œ๋“ค์ด ์—ฐ๊ด€๋ผ ์žˆ๋Š” ์ •๋„๋ฅผ ๋‚˜ํƒ€๋ƒ„.
    • ์‘์ง‘๋„ ๋†’์Œ (์ข‹์Œ): ๋ชจ๋“ˆ ๋‚ด์˜ ์š”์†Œ๋“ค์ด ํ•˜๋‚˜์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ˜‘๋ ฅํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ์€ ๋†’์€ ์‘์ง‘๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‘์ง‘๋„ ๋‚ฎ์Œ: ๋ชจ๋“ˆ ๋‚ด์˜ ์š”์†Œ๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์ถ”๊ตฌํ•œ๋‹ค๋ฉด, ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ํ•œ๋‹ค.
  • ๊ฒฐํ•ฉ๋„
    • ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ์˜ ์˜์กด์„ฑ ์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ๊ฒฐํ•ฉ๋„ ๋†’์Œ: ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ์ž์„ธํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๋‹ค๊ณ ํ•œ๋‹ค.
    • ๊ฒฐํ•ฉ๋„ ๋‚ฎ์Œ (์ข‹์Œ): ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๊ผญ ์•Œ์•„์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ํ•œ๋‹ค.
    • ๊ฒฐํ•ฉ๋„์˜ ์ •๋„๋Š” ํ•œ ์š”์†Œ๊ฐ€ ์ž์‹ ์ด ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์š”์†Œ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š” ์ •๋ณด์˜ ์–‘์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค. ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์„๋ ค๋ฉด ํ˜‘๋ ฅํ•˜๋Š” ๋Œ€์ƒ์— ๋Œ€ํ•ด ๋” ์ ๊ฒŒ ์•Œ์•„์•ผ ํ•œ๋‹ค.
  • ์ด ๋‘˜์€ ์บก์Šํ™”์™€๋„ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.
    • ์บก์Šํ™”์˜ ์ •๋„๊ฐ€ ๊ฐ์ฒด์˜ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ.
    • ์บก์ˆ ํ™”๋ฅผ ์ž˜ ์ง€ํ‚ค๋ฉด ์‘์ง‘๋„๋Š” ๋†’์ด๊ณ , ๋ชจ๋“ˆ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

Q. OOP์˜ 4๊ฐ€์ง€ ํŠน์ง•

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

Q. ์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด

๋‹ต๋ณ€
  • ๋ชฉ์ ์ด ๋‹ค๋ฅด๋‹ค.
    • ์ถ”์ƒ ํด๋ž˜์Šค: ์ƒํƒœ์™€ ํ–‰์œ„๋“ค์„ ๋ชจ์•„ ๋†“์€ ํ…œํ”Œ๋ฆฟ
      • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์€ ๊ทธ๋Œ€๋กœ ๋ฌผ๋ ค๋ฐ›๊ฑฐ๋‚˜ ํ˜น์€ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ์ƒˆ๋กœ์šด ์†์„ฑ๊ณผ ํ–‰์œ„๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ .
    • ์ธํ„ฐํŽ˜์ด์Šค: ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๋ช…์„ธ(์ŠคํŽ™).
      • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ตฌํ˜„์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€์— ๋Œ€ํ•œ ๋ช…์„ธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ .
  • ์ƒํƒœ์™€ ํ–‰์œ„
    • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” non-staticํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ–‰์œ„๋„ ๊ฐ–๋Š”๋‹ค.
    • ์ธํ„ฐํŽ˜์ด์Šค๋Š” non-staticํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉฐ, ํ–‰์œ„๋„ ๊ฐ–์ง€ ๋ชปํ•œ๋‹ค. ํ–‰์œ„์— ๋Œ€ํ•œ ๋ช…์„ธ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. (default๋กœ ์ƒ์ˆ˜๋Š” ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.)
  • ์ ‘๊ทผ ์ œ์–ด์ž
    • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. (์ƒ์†ํ•˜๋ ค๋ฉด protected ์ด์ƒ)
    • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ชจ๋‘ public์œผ๋กœ ๋…ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‚ด๋ถ€ ๊ตฌํ˜„
    • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„๊นŒ์ง€ ๋ฌผ๋ ค์ค€๋‹ค(๊ณต์œ ํ•œ๋‹ค).(๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง„๋‹ค.)
    • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ์—†์œผ๋ฏ€๋กœ, ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ถ”์ƒ ํด๋ž˜์Šค์˜ ๋‹จ์ 
    • ์ƒ์œ„ ํ•˜์œ„ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’๋‹ค. (์ข…์†์ ์ด๋‹ค)
      • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒํƒœ์™€ ํ–‰์œ„๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ๊ด€๊ณ„๊ฐ€ ๋œ๋‹ค.
    • ์ •๋ง ํ•„์š”ํ•œ IS-A ๊ด€๊ณ„๋‚˜ ํ™•์žฅํ•˜๋ ค๋Š” ๋ชฉ์ ์„ ์ œ์™ธํ•˜๊ณค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ค๊ณ„.

Q. ์ธํ„ฐํŽ˜์ด์Šค ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ž€?

๋‹ต๋ณ€
  • ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ž€?
    • ์ž๋ฐ” 8๋ถ€ํ„ฐ ๋‚˜์˜จ ๊ฐœ๋…์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ๊ตฌํ˜„์ด ํฌํ•จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
    • ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? - ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ํ˜ธํ™˜์„ฑ
    • ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์ฆˆ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด, ๊ธฐ์กด์— ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ํด๋ž˜์Šค๋Š” ํ˜ธํ™˜์„ฑ์ด ๋งž์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ์ธํ„ฐํŽ˜์ด์Šค์— ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ์˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

Q. ์ƒ์†๋ณด๋‹ค ์กฐํ•ฉ์ด ์ข‹์€ ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ์ƒ์†
    • ๋‘ ๊ด€์ ์—์„œ ์ข‹์ง€ ์•Š๋‹ค.
      1. ์บก์Šํ™”๋ฅผ ๊นจ๋œจ๋ฆฐ๋‹ค.
        • ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋™์ž‘์— ์ด์ƒ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
          • ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ํ•ด๋‹น ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์— ๋ชจ๋‘ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.
        • ์ƒ์œ„ ํด๋ž˜์Šค ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ํ•˜์œ„ ํด๋ž˜์Šค์— ์ƒ์†ํ•˜๋ฏ€๋กœ ๋‚ด์šฉ์ด ๋…ธ์ถœ.
          • ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์ž˜๋ชปํ•˜๋ฉด LSP๋ฅผ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
      2. ์„ค๊ณ„๋ฅผ ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค.
        • ์ƒ์œ„ ํ•˜์œ„ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฒฐ์ •๋œ๋‹ค.
        • ๋”ฐ๋ผ์„œ ์‹คํ–‰ ์‹œ์ ์— ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
        • ๋ถ€๋ชจ์— ๋„ˆ๋ฌด ์ข…์†์ ์ด๊ฒŒ ๋œ๋‹ค.
  • ์กฐํ•ฉ
    • ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ์ƒ์†์˜ ๋‘ ๊ฐ€์ง€ ๋‹จ์ ์„ ๋ชจ๋‘ ํ•ด๊ฒฐํ•œ๋‹ค.
      • ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • setter๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค ๊ต์ฒด๊ฐ€ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์—, ์„ค๊ณ„๊ฐ€ ์œ ์—ฐํ•˜๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์œ ์—ฐํ•˜๋‹ค.
  • ์˜์กด์„ฑ ๊ด€์ ์—์„œ ์ƒ๊ฐํ•œ๋‹ค๋ฉด
    • ์ƒ์†์€ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•œ๋‹ค (์ปดํŒŒ์ผ ํƒ€์ž„) -> ์ฝ”๋“œ์˜ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • ์กฐํ•ฉ์€ ์ถ”์ƒ์ ์ธ ๊ฒƒ์— ์˜์กดํ•œ๋‹ค (๋Ÿฐํƒ€์ž„) -> ์˜์กด์„ฑ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๋ฏ€๋กœ, ์ฝ”๋“œ์˜ ์ˆ˜์ •์ด ํ•„์š”์—†๋‹ค.

Q. ์ƒ์†์€ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€๊ฐ€?

๋‹ต๋ณ€
  1. ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ '์ง„์งœ' ํ•˜์œ„ ํƒ€์ž…์ธ ์ƒํ™ฉ.
    • ํด๋ž˜์Šค B๊ฐ€ ํด๋ž˜์Šค A์™€ is-a ๊ด€๊ณ„์ผ ๋•Œ๋งŒ ํด๋ž˜์Šค A๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•œ๋‹ค.
  2. ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•  ๋•Œ.
    • ์ƒ์œ„๋Š” ์ƒ์œ„์˜ ์ผ์„ ํ•˜๊ณ , ํ•˜์œ„๋Š” ํ•˜์œ„์˜ ์ผ์„ ํ•˜๋„๋ก ์ƒ์†ํ•˜๋ผ๋Š” ์˜๋ฏธ.
    • ์ƒ์œ„๋Š” ํ•˜์œ„๊ฐ€ ๋ฌด์—‡์„ ํ•ด์•ผํ•˜๋Š”์ง€ abstract๋กœ ๋‚จ๊ฒจ๋‘๊ณ  ํ•˜์œ„๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ.
    • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ณ , ๊ทธ์ € ํ™•์žฅํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • ex. ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด.

Q. ์›์‹œ๊ฐ’ ํฌ์žฅ vs VO

๋‹ต๋ณ€


Q. ํด๋ž˜์Šค vs ๊ฐ์ฒด

๋‹ต๋ณ€


๋””์ž์ธ ํŒจํ„ด

Q. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

๋‹ต๋ณ€
  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€?
    • ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ƒ์—์„œ 1๊ฐœ๋งŒ ์กด์žฌํ•จ์„ ๋ณด์žฅํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด.
  • ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
    • ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” Util์„ฑ ๊ฐ์ฒด ํ˜น์€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์บ์‹ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋กœ๋˜๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1 ~ 45๋กœ ๊ณ ์ •์ด๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ๋ฒˆํ˜ธ๋Š” ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ์บ์‹ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.
  • ์‹ฑ๊ธ€ํ†ค ๋‹จ์ 
    • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ๊ณผ ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค ์‚ฌ์ด์— ๊ฐ•ํ•œ ์˜์กด์„ฑ์ด ์ƒ๊ธด๋‹ค.
      • ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
    • ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€.
      • private ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค.
      • ์‹ฑ๊ธ€ํ†ค์˜ ์‚ฌ์šฉ์€ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ฃผ์˜ํ•  ์  - ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ
    • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์—์„œ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๋“ค์ด ๋™์‹œ์— ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค.
    • ์ฝ๊ธฐ ์ „์šฉ (final)์ผ ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Q. ํ”„๋ก์‹œ ํŒจํ„ด

๋‹ต๋ณ€
  • ํ”„๋ก์‹œ
    • ํด๋ผ์ด์–ธํŠธ์™€ ์‚ฌ์šฉ ๋Œ€์ƒ ์‚ฌ์ด์— ๋Œ€๋ฆฌ ์—ญํ• ์„ ๋งก์€ ๊ฐ์ฒด๋ฅผ ๋‘๋Š” ๋ฐฉ๋ฒ•์˜ ์ด์นญ
    • ex. ํ”„๋ก์‹œ ํŒจํ„ด๊ณผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด
  • ํ”„๋ก์‹œ ํŒจํ„ด
    • ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ํƒ€๊นƒ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•˜๋ ค๋Š” ๋ชฉ์ ์„ ๊ฐ€์ง„ ํŒจํ„ด.
    • ํ”„๋ก์‹œ ํŒจํ„ด์€ ํƒ€๊นƒ์˜ ๊ธฐ๋Šฅ ์ž์ฒด์—๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • ํ”„๋ก์‹œ ํŒจํ„ด ์‚ฌ์šฉ ์ด์œ 
    • ์‹ค์ œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    • Collection.unmodifiableCollection() (์ปฌ๋ ‰์…˜ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด์šฉ ํ”„๋ก์‹œ์—ญํ• )

Q. ํ”„๋ก์‹œ ํŒจํ„ด vs ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด

๋‹ต๋ณ€
  • ํ”„๋ก์‹œ: ํด๋ผ์ด์–ธํŠธ์™€ ์‚ฌ์šฉ ๋Œ€์ƒ ์‚ฌ์ด์— ๋Œ€๋ฆฌ ์—ญํ• ์„ ๋งก์€ ๊ฐ์ฒด๋ฅผ ๋‘๋Š” ๋ฐฉ๋ฒ•์˜ ์ด์นญ
  • ํ”„๋ก์‹œ ํŒจํ„ด: ์‹ค์ œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š”๋ฐ ์ดˆ์ 
    • Collection.unmodifiableCollection() (์ปฌ๋ ‰์…˜ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด์šฉ ํ”„๋ก์‹œ์—ญํ• )
  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด: ๊ธฐ์กด ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š”๋ฐ ์ดˆ์ 
    • InputStream is = new BufferedInputStream(new FileInputStream("a.txt"));
    • HTTP Method๋ฅผ ํฌํ•จํ•œ ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ •.

Q. ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ

๋‹ต๋ณ€

  • ํ”„๋ก์‹œ์˜ ๋‹จ์ 
    • ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
      • ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ํ•„์š” ์—†๋Š” ๋ฉ”์„œ๋“œ๋„ ๊ตฌํ˜„ํ•ด์„œ ํƒ€๊นƒ์œผ๋กœ ์œ„์ž„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.
    • ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งŽ๋‹ค.
      • ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Service๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ Service๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ์šฉ ํ”„๋ก์‹œ(XXXServiceTx) ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผํ•˜๋ฉฐ, ์ด๋•Œ ์ค‘๋ณต๋œ ๋กœ์ง์˜ ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ๋ž€?
    • ํ”„๋ก์‹œ ํŒจํ„ด์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•œ ๋˜ ๋‹ค๋ฅธ ํ”„๋ก์‹œ ๊ตฌํ˜„ ๋ฐฉ์‹.
    • ๋Ÿฐํƒ€์ž„ ์‹œ์— ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด.
      • ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ๋Š” ํ”„๋ก์‹œ ํŒฉํ† ๋ฆฌ์— ์˜ํ•ด ๋Ÿฐํƒ€์ž„ ์‹œ ๋‹ค์ด๋‚ด๋ฏนํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ์˜ ๋™์ž‘ ๋ฐฉ์‹
    • ๋ชจ๋“  ์š”์ฒญ์„ ๋ฆฌํ”Œ๋ ‰์…˜ ์ •๋ณด๋กœ ๋ณ€ํ™˜ํ•ด์„œ InvocationHandler ๊ตฌํ˜„ ๊ฐ์ฒด์˜ invoke() ๋ฉ”์„œ๋“œ๋กœ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹
  • ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ์˜ ๋‹จ์ 
    • ๊ฐ์ฒด์— ๋Œ€ํ•œ Reflection ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ํ•˜๋ฝ์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.
  • JDK Dynamic Proxy

Q. JDK Dynamic Proxy vs CGLib

๋‹ต๋ณ€


์ถœ์ฒ˜: https://www.baeldung.com/wp-content/uploads/2017/10/springaop-process.png

  • ๊ณตํ†ต์ 
    • ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • JDK Dynamic Proxy
    • Proxy Factory๋ฅผ ์ด์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์‹œ ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
    • ๋ฐ˜๋“œ์‹œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋ช…์„ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ ๋‹ค.
      • ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ์— ๋Œ€ํ•œ ๊ฐ•์ œ์„ฑ์ด ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    • ๋‚ด๋ถ€์ ์œผ๋กœ JDK Dynamic Proxy์—์„œ๋Š” InvationHandler๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ, invoke ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ Proxy์˜ ์œ„์ž„ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ƒ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • CGLib
    • CGLib์€ ์ˆœ์ˆ˜ Java JDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ CGLIB๋ผ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
    • CGLIB์˜ Enhancer ํด๋ž˜์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Proxy๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์–ด๋„ Proxy๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
      • CGBLIB Proxy๋Š” ํƒ€๊ฒŸ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— Proxy๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์ƒ์†์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, final์ด๋‚˜ private์™€ ๊ฐ™์ด ์ƒ์†์„ ๋ง‰๋Š” ๋ฐฉ์‹์€ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘์„ ์ด์šฉํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ƒ JDK Dynamic Proxy๋ณด๋‹ค ๋น ๋ฅด๋‹ค.
  • ๊ฒฐ๋ก  - ๋‹ค๋ฅธ์ 
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ๋ฌด
    • ๋‹ค์ด๋‚ด๋ฏน ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹


ํ…Œ์ŠคํŠธ

Q. TDD๋ž€?

๋‹ต๋ณ€
  • ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๋จผ์ € ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ ํ›„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋ฉด ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฑ…์ž„๊ณผ ์—ญํ• ์„ ์ดˆ๊ธฐ ์„ค๊ณ„๋ณด๋‹ค ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

Q. ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์ด์œ  (์ธ์ˆ˜, ํ†ตํ•ฉ, ๋ชฉ, ๋‹จ์œ„)

๋‹ต๋ณ€
  • ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ (์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ)
    • ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด ๋„์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ์ด๋‹ค.
    • ์ธ์ˆ˜ํ…Œ์ŠคํŠธ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋์—์„œ ๋์„ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๋ ˆ์ด์–ด๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (์„œ๋น„์Šค ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ)
    • ์„œ๋น„์Šค๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ๋ฆ„์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. ์ด๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(๋„๋ฉ”์ธ)์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€? ์™ธ๋ถ€ ๋ชจ๋“ˆ (DB, ์™ธ๋ถ€ API)์™€ ์ž˜ ์—ฐ๋™๋˜๋Š”์ง€?์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ผญ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    • input์— ๋งž๋Š” output์ด ์ž˜ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ.
  • ์„œ๋น„์Šค ๋ชฉ ํ…Œ์ŠคํŠธ (ํ–‰์œ„ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ)
    • input์— ๋งž๋Š” output์ด ์ž˜ ๋‚˜์˜ค๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•จ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ์™ธ๋ถ€ ๋ชจ๋“ˆ์„ ๋ช‡ ๋ฒˆ ์ฐŒ๋ฅด๋Š”์ง€๋“ฑ ํ–‰์œ„๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (๋„๋ฉ”์ธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ)
    • ๋„๋ฉ”์ธ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ "๋„๋ฉ”์ธ"์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์ƒํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋กœ์ง(๊ฐ์ฒด)๋‹ค. (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)
    • ๊ฐœ๋ฐœ์ž๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ (๊ธ€)์„ ๋กœ์ง(์ฝ”๋“œ)๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ํ•˜๋Š” ์ง๊ตฐ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋กœ์ง์œผ๋กœ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ณณ์ด ๋ฐ”๋กœ "๋„๋ฉ”์ธ"์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ฝ”๋“œ๋กœ ์ž˜ ์˜ฎ๊ฒจ์กŒ๋Š”์ง€ ๊ผญ ํ…Œ์ŠคํŠธํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    • ๋˜ํ•œ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ญํ• ๊ณผ ์ฑ…์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚จ๋‹ค. ์ด๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„๋ฅผ ์œ ๋„ํ•œ๋‹ค.


Spring

Q. ์Šคํ”„๋ง์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

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

Q. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”? ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ฐจ์ด์ ์€?

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

Q. ์Šคํ”„๋ง์„ ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

๋‹ต๋ณ€
  • ๋ฐฉ๋Œ€ํ•œ ๋ฌธ์„œ
    • ์ž๋ฐ”์ง„์˜์—์„œ ๊ฐ€์žฅ ๋ณดํŽธํ™”๋œ ํ”„๋ ˆ์ž„์›Œํฌ. ๋ฌธ์„œํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋‹ค.
  • ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ, ์ƒ์‚ฐ์„ฑ
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ ์ธํ”„๋ผ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉด ๋œ๋‹ค.
    • ex. IoC, AOP, PSA
  • ๋น„์นจํˆฌ์„ฑ - POJO (๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ) - ๊ฐ์ฒด์ง€ํ–ฅ์  ํŠน์ง•
    • ๋น„์นจํˆฌ์„ฑ์„ ์ง€ํ–ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด์˜ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์›น ์„œ๋น„์Šค๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ex. ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค ์ฒด์Šค ๋ฏธ์…˜ -> ์ฒ˜์Œ์—” ์ฝ˜์†”์—์„œ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ํ–ˆ์Œ. -> ์›น ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ์Šคํ”„๋ง์„ ์ ์šฉ์‹œํ‚ค๋ฉด์„œ ๊ธฐ์กด์˜ ๋„๋ฉ”์ธ ์ฝ”๋“œ์™€ ์„œ๋น„์Šค ๊ด€๋ จ ๋กœ์ง์˜ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ. (์žฌํ™œ์šฉ)
  • ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ”„๋ ˆ์ž„์›Œํฌ - ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌ ๊ฒ€์ฆ๋จ
    • ๋˜ํ•œ, ์Šคํ”„๋ง์€ ๊ฒ€์ฆ๋œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค๊ณผ ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • spring batch๋‚˜ spring security๋“ฑ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.
    • ์ด๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • ์„ฑ๋Šฅ ํ–ฅ์ƒ - ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
    • ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ์‹ฑ๊ธ€ํ†ค์˜ ์žฅ์  - ์„œ๋ฒ„ ๊ด€์ 
      • ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋†’๋‹ค. (๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ƒ ์œ ๋ฆฌ)
    • ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ์‹ฑ๊ธ€ํ†ค์˜ ๋ฌธ์ œ
      • private ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ์— ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค.
      • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
      • ์ „์—ญ ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.
      • ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ค๋‹ค (์˜์กด์„ฑ)
    • ์Šคํ”„๋ง์€ ๊ธฐ์กด ์‹ฑ๊ธ€ํ†ค์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ทจํ•˜๊ณ , ๋‹จ์ ์„ ๋ชจ๋‘ ๋ฐฐ์ œํ•œ ์‹ฑ๊ธ€ํ†ค ํ˜•์‹์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค. (์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ)
      • ํ‰๋ฒ”ํ•œ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ํ™œ์šฉํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
      • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ๊ธฐ์กด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด๊ณผ ๋‹ฌ๋ฆฌ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค์€ ๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„ ๋ฐฉ์‹๊ณผ ๋””์ž์ธ ํŒจํ„ด๋“ฑ์„ ์ ์šฉํ•˜๋Š” ๋ฐ ์•„๋ฌด๋Ÿฐ ์ œ์•ฝ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ…Œ์ŠคํŠธ
    • DI๋ฅผ ํ†ตํ•œ ํ…Œ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•ด์คŒ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.

Q. ์Šคํ”„๋ง ํ•ต์‹ฌ ์›์น™

๋‹ต๋ณ€
  • ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›์น™์€ ์„ธ ๊ฐ€์ง€๋‹ค. IoC/DI, AOP, PSA
  • IoC
    • Inversion Of Control (์ œ์–ด์˜ ์—ญ์ „)์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๊นŒ์ง€ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋ ˆ์ž„์›Œํฌ์—๊ฒŒ ์œ„์ž„ํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ๊ฐ์ฒด์˜ ์ƒ์„ฑ ์ฑ…์ž„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ”„๋ ˆ์ž„์›Œํฌ์— ์œ„์ž„ํ–ˆ๋‹ค. (๋Šฅ๋™ -> ์ˆ˜๋™)
    • IoC vs DI
      • IoC๋Š” DI์˜ ํ•œ ํ˜•ํƒœ. -> ๊ฐ์ฒด์ง€ํ–ฅ์—์„  DI๋ฅผ ํ†ตํ•ด IoC๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • DI
    • DI๋Š” ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ์˜๋ฏธํ•œ๋‹ค. ์˜์กด๊ด€๊ณ„๋ž€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์Šคํ”„๋ง์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ์˜์กด๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐœ๋ฐœ์ž ์ฝ”๋“œ์•ˆ์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ค€๋‹ค.
    • DI๋Š” ์Šคํ”„๋ง์—์„œ IoC๋ฅผ ๊ตฌํ˜„ํ•œ ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด๋ฉฐ, IoC๋Š” DI๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ, ์˜์กด๊ด€๊ณ„ ์„ค์ • ์ฑ…์ž„์„ ์‹ ๊ฒฝ์“ธ ํ•„์š”์—†์ด ์ž์‹ ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • AOP
    • Aspect-Oriented Programming (๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์Šคํ”„๋ง DI๊ฐ€ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์ฃผ์ž…์ด๋ผ๋ฉด AOP๋Š” ๋กœ์ง(code)์ฃผ์ž…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ด€์  ์ง€ํ–ฅ์€ ์‰ฝ๊ฒŒ ๋งํ•ด ์–ด๋–ค ๋กœ์ง์„ ํ•ต์‹ฌ์ ์ธ ๊ด€์ ๊ณผ ๋ถ€๊ฐ€์ ์ธ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋ณด๊ณ  ๊ทธ ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ ๋ชจ๋“ˆํ™”ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
      • ํ•ต์‹ฌ์ ์ธ ๊ด€์ : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
      • ๋ถ€๊ฐ€์ ์ธ ๊ด€์ : ํ•ต์‹ฌ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ–‰ํ•ด์ง€๋Š” ๋กœ์ง (๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ์บ์‹ฑ) - ์žฌ์‚ฌ์šฉ๋œ๋‹ค.
  • PSA
    • Portable Service Abstraction (์ผ๊ด€์„ฑ ์žˆ๋Š” ์„œ๋น„์Šค ์ถ”์ƒํ™”) ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์„œ๋น„์Šค ์ถ”์ƒํ™”๋ž€, ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋‹ค์ˆ˜์˜ ๊ธฐ์ˆ ์„ ๊ณตํ†ต์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์™ธ๋ถ€ ํ™˜๊ฒฝ์˜ ๋ณ€ํ™”์— ๊ด€๊ณ„์—†์ด ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์ˆ ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์˜ˆ์‹œ
      • @Cacheable: ์บ์‹œ๋Œ€์ƒ์œผ๋กœ redis๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ehcache๋ฅผ ์‚ฌ์šฉํ•˜๋˜ @Cacheable์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ์ฝ”๋“œ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • @Transactional: JPA์˜ ๊ตฌํ˜„์ฒด๋กœ hibernate๋ฅผ ์ด์šฉํ•˜๋˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ์ด์šฉํ•˜๋˜ @Transactional์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

Q. Spring vs Spring Boot

๋‹ต๋ณ€
  • Spring Boot์˜ ์žฅ์ ์„ ํ†ตํ•ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋น„๊ตํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.
  • ์ž๋™ ์„ค์ •
    • Spring์˜ ๊ฒฝ์šฐ Dispatcher Servlet์„ ์ง์ ‘ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•ด์ค˜์•ผ ํ•˜๋ฉฐ, IoC ์ปจํ…Œ์ด๋„ˆ๋„ ์ง์ ‘ ์‹คํ–‰ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์˜์กด์„ฑ(JDBC, JPA ๋“ฑ๋“ฑ)์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • Spring Boot๋Š” @EnableAutoConfiguration์„ ํ†ตํ•ด spring-boot-autoconfigure/META-INF/spring.factories์— ๋ช…์‹œ๋œ ๋‹ค์–‘ํ•œ ์„ค์ •๋“ค์„ ์˜์กด์„ฑ์— ๋”ฐ๋ผ ๋นˆ์„ ๋“ฑ๋กํ•ด์ค€๋‹ค. (์˜์กด์„ฑ์ด ์กด์žฌํ•  ๋•Œ๋งŒ ์ž๋™ ๋“ฑ๋ก)
    • ๋˜ํ•œ, Dispatcher Servlet์™€ IoC ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์€ ์„ค์ •๋„ ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค.
  • ์‰ฌ์šด ์˜์กด์„ฑ ๊ด€๋ฆฌ
    • Spring Boot์˜ ๊ฒฝ์šฐ ์˜์กด์„ฑ๋งŒ ์ฃผ์ž…ํ•ด์ฃผ๋ฉด Spring Boot๊ฐ€ ์•Œ์•„์„œ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • ๋‚ด์žฅ ํ†ฐ์บฃ
    • Spring์˜ ๊ฒฝ์šฐ ์ง์ ‘ ํ†ฐ์บฃ์„ ์‹œ๋™ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
    • SpringBoot์˜ ๊ฒฝ์šฐ ๋‚ด์žฅ ํ†ฐ์บฃ์„ ์ด์šฉํ•˜์—ฌ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์›น ์„œ๋น„์Šค๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด์žฅ H2
    • SpringBoot๋Š” ๋‚ด์žฅ H2๋ฅผ ๋นˆ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค.

Q. POJO

๋‹ต๋ณ€
  • ์ง„์ •ํ•œ POJO๋ž€ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์›๋ฆฌ์— ์ถฉ์‹คํ•˜๋ฉด์„œ, ํ™˜๊ฒฝ๊ณผ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์žฌํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งํ•œ๋‹ค.
    • ์–ด๋– ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ž๋ฐ”๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•˜๋‹ค.
  • POJO์˜ ๋‘ ๊ฐ€์ง€ ์˜๊ฒฌ
    1. ์–ด๋– ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์—๋„ ์™„์ „ํžˆ ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ž๋ฐ” ๊ฐ์ฒด. (์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๊ฒƒ๋„ POJO๊ฐ€ ์•„๋‹ˆ๋ž€ ์˜๊ฒฌ)
    2. ์ž๋ฐ” ๊ฐ์ฒด ์•ˆ์— ์ฝ”๋“œ๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐ”๊ฟ”๋„ ๊ทธ๋Œ€๋กœ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด POJO. (ํŠน์ • ์• ๋…ธํ…Œ์ด์…˜์ด ์กด์žฌํ•ด๋„ POJO๋ผ๋Š” ์˜๊ฒฌ)
  • EJB๋ถ€ํ„ฐ ์Šคํ”„๋ง๊นŒ์ง€์˜ ์—ญ์‚ฌ๋ฅผ ๋ณด๋ฉด ๋‘ ๋ฒˆ์งธ๊ฐ€ ๋งž๋Š” ๋“ฏ ํ•˜๋‹ค.
    • EJB ์‹œ์ ˆ์—๋Š” ํŠน์ • ๊ธฐ๋Šฅ(Service, Controller ๋“ฑ)์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํด๋ž˜์Šค๋Š” extends ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ์‹œ์ ˆ์—๋Š” ํŠน์ • ํด๋ž˜์Šค๋Š” EJB ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งค์šฐ ์˜์กด์ ์ด์—ˆ์œผ๋ฉฐ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠน์ • Class๋ฅผ extendsํ•ด์•ผํ•œ๋‹ค๋Š” ๊ด€์ ์—์„œ ๊ฐ์ฒด์ง€ํ–ฅ์  ํŠน์ง•์„ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค(์ด๋ฏธ ์ƒ์†์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฏ€๋กœ ์ƒ์†์˜ ํŠน์ง•์„ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•จ). ์ด๊ฒƒ์— ๋ฐ˜๋ฐœํ•˜์—ฌ EJB์— ์ข…์†์ ์ด์ง€ ์•Š์€ ํด๋ž˜์Šค๋“ค์„ POJO๋ผ๊ณ  ์ •์˜ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
    • EJB ๋•Œ๋Š” ๊ฑ”๋„ค๋“ค์ด ์ •์˜ํ•ด๋‘” ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†/๊ตฌํ˜„ โ†’ ๊ทธ๋ž˜์„œ ์ด๊ฑฐ์— ์ข…์†์ ์ด์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์€ POJO๋ผ๊ณ  ๋ถ€๋ฅด์ž๊ณ  ์ •ํ•œ ๊ฒƒ.
    • ๊ฒฐ๋ก ์ ์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ๊ฐ€ ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ์—๋งŒ ์ข…์†์ ์ด์ง€ ์•Š๋Š”๋‹ค๋ฉด POJO๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. (์• ๋…ธํ…Œ์ด์…˜์€ ์ฃผ์„๊ณผ ๊ฐ™์ด ๋งˆํ‚นํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์ฝ”๋“œ์— ์ง์ ‘์ ์œผ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ œ์™ธ์‹œํ‚จ๋‹ค.)
  • ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ๋ณด์ž๋ฉด
    • @Service์™€ ๊ฐ™์€ ์• ๋…ธํ…Œ์ด์…˜๋“ค์ด ๋ถ™์€ ํด๋ž˜์Šค๋“ค๋„ POJO๊ฐ€ ๋งž๋‹ค.
    • ๊ทธ ์ด์œ ๋Š” ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์• ๋…ธํ…Œ์ด์…˜๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๋ณ€๊ฒฝ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ฌผ๋ก  ์˜ˆ์™ธ๋„ ์กด์žฌํ•œ๋‹ค.
    • @Entity ๋Š” ํŠน์ • ์ œ์•ฝ์‚ฌํ•ญ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—(๋นˆ ์ƒ์„ฑ์ž, id ๋“ฑ๋“ฑ...) POJO๊ฐ€ ์•„๋‹ˆ๋‹ค.

Q. ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ถ”์ฒœํ•˜๋Š” ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ๋ถˆ๋ณ€
    • ๋Œ€๋ถ€๋ถ„์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ํ•œ๋ฒˆ ์ผ์–ด๋‚˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ์‹œ์ ๊นŒ์ง€ ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • ๊ทธ ์ด์œ ๋Š” ๋ถˆ๋ณ€์„ ๋ณด์žฅํ•จ์œผ๋กœ์จ, ์ถ”ํ›„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์„ ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ์ฐจ๋‹จํ•ด ์ฃผ๋Š” ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ƒ์„ฑ์ž ์ฃผ์ž…์€ Setter์˜ ๋‹จ์ ์„ ๋ชจ๋‘ ์ปค๋ฒ„ํ•œ๋‹ค.
    • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์ƒ์„ฑ์ด๋œ๋‹ค. -> NPE ๋ฐœ์ƒ ํ™•๋ฅ  ์กด์žฌ.
    • Setter ์ฃผ์ž…์˜ ๊ฒฝ์šฐ ์ƒํƒœ๊ฐ€ ๋ถˆ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ˆ˜ํ•  ํ™•๋ฅ ์ด ๋†’๋‹ค.
  • ์Šคํ”„๋ง์— ์˜์กด์ ์ด์ง€ ์•Š๋‹ค.
    • ์Šคํ”„๋ง application context๊ฐ€ ์—†์–ด๋„ ๋‹จ๋…์œผ๋กœ ํ…Œ์ŠคํŠธ ํ˜น์€ ๋„๋ฉ”์ธ์œผ๋กœ์จ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Q. ํ•„๋“œ ์ฃผ์ž…์„ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š” ์ด์œ 

๋‹ต๋ณ€
  • ์šฐ์„  ์Šคํ”„๋ง ๊ณต์‹๋ฌธ์„œ์—์„œ๋„ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์Šคํ”„๋ง์— ์˜์กด์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. - ์Šคํ”„๋ง์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„์นจํˆฌ์„ฑ(POJO)๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค.
    • ์šฐ์„  ํ•„๋“œ ์ฃผ์ž…์€ ์ˆ˜์ •์ž(Setter)์ฃผ์ž…๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    • ๋˜ํ•œ, ํ•„๋“œ ์ฃผ์ž…์€ IoC ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋„ˆ๋ฌด ์˜์กด์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.
    • ๋งŒ์•ฝ ํ…Œ์ŠคํŠธ์‹œ application context๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (์ˆœ์ˆ˜ ์ž๋ฐ” ์ฝ”๋“œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€)

Q. servlet๊ณผ serlvet container

๋‹ต๋ณ€
  • servlet
    • Java๋กœ HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€
    • ์„œ๋ธ”๋ฆฟ์€ ํด๋ผ์ด์–ธํŠธ์˜ http ์š”์ฒญ์„ ๋ฐ›์•„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ ์ ˆํ•œ http ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด์ด๋‹ค.
    • ์›นํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• .
    • ์„œ๋ธ”๋ฆฟ์€ ์ผ๋ฐ˜ ์ž๋ฐ” ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ๋งŒ ์‹คํ–‰๋œ๋‹ค.
  • servlet container
    • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ http ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํŒŒ์‹ฑ ํ›„, ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ ์ ˆํ•œ ์„œ๋ธ”๋ฆฟ์„ ์‹คํ–‰์‹œํ‚ค๊ณ , ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ถ€ํ„ฐ ์‘๋‹ต๋ฐ›์€ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•ด http ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ.
    • ์›น ์„œ๋น„์Šค์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋กœ ํ•˜์—ฌ๊ธˆ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(serlvet ๊ตฌํ˜„)๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
    • ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ
      • tcp/ip ์†Œ์ผ“ ์—ฐ๊ฒฐ ๋ฐ ์ข…๋ฃŒ. (ํ†ต์‹  ์ง€์›)
      • http ์š”์ฒญ ๋ฉ”์‹œ์ง€ ํŒŒ์‹ฑ ๋ฐ ์‘๋‹ต ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ.
      • ์„œ๋ธ”๋ฆฟ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ (์„œ๋ธ”๋ฆฟ์˜ ํƒ„์ƒ๊ณผ ์ฃฝ์Œ์„ ๊ด€๋ฆฌ)
      • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ง€์› (์š”์ฒญ๋‹น ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌ)
      • ์„ ์–ธ์ ์ธ ๋ณด์•ˆ ๊ด€๋ฆฌ
    • ๋Œ€ํ‘œ์ ์ธ servlet container: tomcat, netty

Q. servlet container์˜ ๋™์ž‘ ํ๋ฆ„

๋‹ต๋ณ€
  1. ์‚ฌ์šฉ์ž ์š”์ฒญ ํŒŒ์‹ฑ
  2. ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , HttpServletRequest, HttpServletResponse ์ƒ์„ฑ.
  3. ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ถ„์„ํ•˜์—ฌ ๋Œ€์‘๋˜๋Š” ์„œ๋ธ”๋ฆฟ ๊ฒ€์ƒ‰. (DD.xml์„ ํ†ตํ•ด ์„œ๋ธ”๋ฆฟ์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘”๋‹ค.)
  4. ์ฐพ์€ ์„œ๋ธ”๋ฆฟ์˜ service() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ์œ„์ž„.
  5. ์„œ๋ธ”๋ฆฟ์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋„˜๊ธธ ์‘๋‹ต์„ ์ž‘์„ฑ. ์ด๋•Œ Response ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  6. servlet container๊ฐ€ ์„œ๋ธ”๋ฆฟ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ Response๋ฅผ ์ ์ ˆํ•œ http response๋กœ ๋งŒ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜.
  7. ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ์Šค๋ ˆ๋“œ๋Š” ์†Œ๋ฉธํ•˜๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ ํ’€๋กœ ๋ฐ˜ํ™˜.

Q. Bean์ด๋ž€

๋‹ต๋ณ€
  • ์Šคํ”„๋ง IoC Container์— ์˜ํ•ด ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • ์Šคํ”„๋ง IoC Container์— ์˜ํ•ด ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด.
    • ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›์น™์€ IoC/DI์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ๊ฐœ๋….
  • ์Šคํ”„๋ง IoC์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด์„œ ๊ด€๋ฆฌ๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ์„ ์ด๋ฃจ๋Š” ๊ฐ์ฒด๋“ค์„ ์Šคํ”„๋ง์—์„œ๋Š” ๋นˆ์ฆˆ(beans)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ๋นˆ์€ ์Šคํ”„๋ง IoC์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด์„œ ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด ์กฐ๋ฆฝ๋˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.
    • ๋นˆ๊ณผ ๋นˆ ์‚ฌ์ด์˜ ์˜์กด์„ฑ์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ™˜๊ฒฝ์„ค์ •์— ์˜์กดํ•œ๋‹ค.
  • Bean์˜ ์ฃผ์š” ์†์„ฑ
    • class: ์ •๊ทœํ™”๋œ ์ž๋ฐ” ํด๋ž˜์Šค ์ด๋ฆ„
    • id: bean์˜ ๊ณ ์œ  ์‹๋ณ„์ž
    • scope: ๋นˆ ์Šค์ฝ”ํ”„
    • constructor-arg: ์ƒ์„ฑ ์‹œ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•  ์ธ์ˆ˜
    • property: ์ƒ์„ฑ ์‹œ bean setter์— ์ „๋‹ฌํ•  ์ธ์ˆ˜
    • init method์™€ destory method

Q. Java Bean vs Spring Bean

๋‹ต๋ณ€
  • Java Bean
    • ๋ฐ์ดํ„ฐ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค.
    • ํŠน๋ณ„ํ•œ ๊ฒƒ ์—†๊ณ , ๊ทธ์ € ์•„๋ž˜ ๊ทœ์•ฝ์— ๋งž์ถฐ์„œ ๋งŒ๋“  ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
      1. ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•œ๋‹ค.
      2. ๋ชจ๋“  ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ์ ‘๊ทผ์ œ์–ด์ž๊ฐ€ private์ด๋‹ค.
      3. ๋ฉค๋ฒ„๋ณ€์ˆ˜๋งˆ๋‹ค getter/setter๊ฐ€ ์กด์žฌํ•œ๋‹ค.
      4. ์™ธ๋ถ€์—์„œ ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
      5. ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค.
  • Spring Bean
    • Spring Framework์˜ IoC Container์— ์˜ํ•ด ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๊ด€๊ณ„์„ค์ •์ด ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Q. Bean Scope

๋‹ต๋ณ€
  • ๋นˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค.
  • singleton: ํ•˜๋‚˜์˜ Bean ์ •์˜์— ๋Œ€ํ•ด์„œ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๋งˆ๋‹ค ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌ
  • prototype: ํ•˜๋‚˜์˜ Bean ์ •์˜์— ๋Œ€ํ•ด์„œ ๋งค Bean์„ ์ฐพ๋Š” ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Bean์„ ์ƒ์„ฑ. (Ioc ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ์•„์˜ˆ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ์ € ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ)
  • request: ํ•˜๋‚˜์˜ Bean ์ •์˜์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ HTTP Request์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์•ˆ์— ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌ. (๊ฐ๊ฐ์˜ ์š”์ฒญ๋งˆ๋‹ค ์ž์‹ ๋งŒ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„๋‹ค.)
  • session: ํ•˜๋‚˜์˜ Bean ์ •์˜์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ HTTP Session์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์•ˆ์— ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌ.
  • global session: ํ•˜๋‚˜์˜ Bean ์ •์˜์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ global HTTP Session์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์•ˆ์— ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌ.

Q. @Bean vs @Component

๋‹ต๋ณ€
  • ๊ณตํ†ต์ 
    • ๋‘˜ ๋‹ค IoC ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•.
  • ์ฐจ์ด์ 
    • @Bean์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปจํŠธ๋กค ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋“ฑ๋กํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค. (๊ทธ์ € ์ƒ์„ฑ๋งŒ ์ง€์›ํ•œ๋‹ค.) - Method Level
    • @Component๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ปจํŠธ๋กค ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค. - Class Level

Q. Bean ๋“ฑ๋ก ๋ฐฉ๋ฒ•

๋‹ต๋ณ€
  • XML์„ ์ด์šฉํ•œ ๋นˆ ์„ค์ •
  • Component Scan์„ ์ด์šฉํ•œ ๋นˆ ์„ค์ •
  • ์ž๋ฐ” ์„ค์ •ํŒŒ์ผ(@Configuration)์„ ์ด์šฉํ•œ ๋นˆ ์„ค์ •

Q. Bean ์ƒ๋ช…์ฃผ๊ธฐ

ํ† ๊ธ€
  1. ๋นˆ ์ธ์Šคํ„ด์Šคํ™” ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž…
  2. ์Šคํ”„๋ง *Aware ๋™์ž‘์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ ๋ฐ ํ˜ธ์ถœ (ํŠน์ • ๋นˆ์ด ์ž์‹ ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ApplicationContext์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ)
  3. ๋นˆ ์ƒ์„ฑ ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ - @PostConstruct, @InitializingBean, @Bean(initMethod)
  4. ๋นˆ ์†Œ๋ฉธ ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ - @PreDestory, DisposableBean, @Bean(destoryMethod)

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์ฐธ๊ณ .


Q. @ComponentScan

๋‹ต๋ณ€
  • @ComponentScan์ด๋ž€
    • ๋ฆฌํ”Œ๋ ‰์…˜ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ @Component ํ˜น์€ streotype ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ Class๋“ค์„ ์ž๋™์œผ๋กœ scanํ•˜์—ฌ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ์• ๋…ธํ…Œ์ด์…˜.
    • ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” @ComponentScan์ด ๋ถ™์€ ํŒจํ‚ค์ง€๋ถ€ํ„ฐ Scan์„ ํ•œ๋‹ค.
  • ComponentScan ๊ณผ์ •
    • ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์ž‘์‹œํ‚ค๋ฉด, ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    • ๋งŒ์•ฝ @ComponentScan์ด ๋ถ™์€ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์œ„ ํŒจํ‚ค์ง€์— ๋“ฑ๋ก๋œ ๋ชจ๋“  @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•œ๋‹ค.
    • ์ด๋•Œ, reflection api๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (ํ•„์ž๋Š” reflections ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ Class ํŒŒ์ผ์„ ์Šค์บ”ํ–ˆ๋‹ค.)
    • ์Šค์บ”๋œ ํด๋ž˜์Šค๋ฅผ IoC ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.

Q. Spring ์„œ๋ฒ„ ๋ถ€ํŒ…์‹œ ๋™์ž‘ ๊ณผ์ • - ์˜ˆ์ •

๋‹ต๋ณ€
  • ์Šคํ”„๋ง์˜ ๊ฒฝ์šฐ
    1. ํ†ฐ์บฃ์ด ์‹คํ–‰๋œ๋‹ค. (ํ†ฐ์บฃ์„ ํ†ตํ•ด ์‹คํ–‰ํ•ด์•ผ ํ•จ)
    2. ServletContextListener์˜ ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ตฌํ˜„์ฒด์ธContextLoaderListener์— ์˜ํ•ด Application Context์ด ์ƒ์„ฑ๋œ๋‹ค.
    3. Application Context๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์—์„œ, ๋นˆ ์ •์˜ (xml, ์ž๋ฐ” ์„ค์ • ํŒŒ์ผ, component scan)์— ์˜ํ•ด ๋นˆ์ด ์ƒ์„ฑ๋œ๋‹ค.
    4. Application Context์— ์ €์žฅ๋œ ๋นˆ๋“ค์˜ ์˜์กด ๊ด€๊ณ„๊ฐ€ ์ฃผ์ž…๋œ๋‹ค.
    5. ๋นˆ๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋งž๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. (๋นˆ์˜ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ, ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ ๋“ฑ๋“ฑ)
  • ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๊ฒฝ์šฐ
    1. @SpringBootConfiguration
    2. @ComponentScan
    3. @EnableAutoConfiguration

Q. Thread Local

๋‹ต๋ณ€
  • Thread Local์ด๋ž€
    • ๊ฐ Thread๋งˆ๋‹ค ๊ฐ–๋Š” ๋…๋ฆฝ์ ์ธ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • Java.lang ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ์“ฐ๋ ˆ๋“œ ๋ฒ”์œ„ ๋ณ€์ˆ˜. ํ•œ ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•  ๋ณ€์ˆ˜.
  • ํŠน์ง•
    • ๊ฐ™์€ ์“ฐ๋ ˆ๋“œ ๋‚ด์—์„œ๋งŒ ๊ณต์œ 
    • ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์“ฐ๋ ˆ๋“œ๋ผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์ค„ ํ•„์š” ์—†๋‹ค.
  • ์Šคํ”„๋ง์—์„œ์˜ ์‚ฌ์šฉ์ฒ˜
    • ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €์—์„œ transaction Context๋ฅผ ์ „ํŒŒํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    • SpringSecurity์—์„œ๋Š” ThreadLocal์„ ๊ธฐ๋ณธ ์ „๋žต์œผ๋กœ SecurityContextHolder๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Q. Spring MVC ๋™์ž‘ ๊ณผ์ • - ์˜ˆ์ •

ํ† ๊ธ€

Q. DispatcherServlet์ด๋ž€?

๋‹ต๋ณ€
  • Front Controller ํŒจํ„ด์„ ์ด์šฉํ•˜์—ฌ Servlet Container(Tomcat)์— ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›๋Š” Servlet.
  • ๊ณตํ†ต ์ž‘์—… (์ธํ„ฐ์…‰ํ„ฐ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, Multipart ์ฒ˜๋ฆฌ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์š”์ฒญ์— ๋งž๋Š” ํ•ธ๋“ค๋Ÿฌ์— ์ž‘์—…์„ ์œ„์ž„ํ•˜๋Š” Servlet.

Q. Filter vs Interceptor

๋‹ต๋ณ€
  • ๊ณตํ†ต์ 
    • ๋‘˜ ๋‹ค ์›น๊ณผ ๊ด€๋ จ๋œ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์ฐจ์ด์ 
    • ์ ์šฉ๋˜๋Š” ์ˆœ์„œ์™€ ๋ฒ”์œ„, ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค.
    • Filter๋Š” ์„œ๋ธ”๋ฆฟ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ฉฐ, ํŠน์ • Servlet์ด ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•œ๋‹ค. (ex. Dispatcher Server ์ด์ „)
      • ์˜ˆ์™ธ์ฒ˜๋ฆฌ: ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ExceptionHandler๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋Ÿฌ์›€.
      • Context: Filter๋Š” Spring์˜ Context ๋ฐ–์—์„œ ๋™์ž‘ํ•˜๊ธฐ์—, ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” DI๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (๋ฌผ๋ก  ๋ฐฉ๋ฒ•์ด ์žˆ์Œ)
      • ์ •๋ณด: ๋‹จ์ˆœํžˆ request, response ๊ฐ์ฒด๋งŒ ์ œ๊ณตํ•œ๋‹ค.
      • ์‹œ์ : doFilter๋งŒ ์ œ๊ณต.
    • Interceptor๋Š” ์Šคํ”„๋งMVC์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ฉฐ, DispatcherServlet์•ˆ์—์„œ ํŠน์ • ํ•ธ๋“ค๋Ÿฌ๋“ค์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•œ๋‹ค.
      • ์˜ˆ์™ธ์ฒ˜๋ฆฌ: ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ExceptionHandler๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • Context: Spring์˜ Context ๋ฒ”์œ„ ๋‚ด์—์„œ ๋™์ž‘ํ•˜๊ธฐ์—, ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” DI๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ •๋ณด: request, response์— ๋”ํ•ด์„œ ์–ด๋–ค ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์ œ๊ณต๋ฐ›๋Š”๋‹ค.
      • ์‹œ์ : ํ•ธ๋“ค๋Ÿฌ ํ˜ธ์ถœ ์ „(preHandle), ํ˜ธ์ถœ ํ›„ (postHandle), ์š”์ฒญ ์™„๋ฃŒ ์ดํ›„(afterCompletion)์„ ์ œ๊ณต.
  • ์‹คํ–‰ ๊ณผ์ •
    • HTTP ์š”์ฒญ -> Servler Container -> Filter -> Servlet (Dispatcher Servlet) -> Interceptor -> Controller
  • ์‚ฌ์šฉ ์˜ˆ์‹œ
    • Filter - ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์„œ๋ธ”๋ฆฟ์ด ํ•˜๋‚˜(๋””์ŠคํŒจ์ฒ˜)์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ๊ณตํ†ต ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋“ฏ ์‹ถ๋‹ค.
      • xss(cross site sript)๋ฐฉ์–ด, ์ธ์ฝ”๋”ฉ ๋ณ€ํ™˜์ฒ˜๋ฆฌ, ๋กœ๊น….
    • Interceptor - ์Šคํ”„๋ง์˜ ๊ธฐ๋Šฅ(IoC, AOP๋“ฑ๋“ฑ)์„ ํ™œ์šฉํ•ด์„œ ํŠน์ • ํ•ธ๋“ค๋Ÿฌ๋“ค์— ๋Œ€ํ•œ ๊ณตํ†ต ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋“ฏ ์‹ถ๋‹ค.
      • ๋กœ๊ทธ์ธ ์ฒดํฌ, ๊ถŒํ•œ ์ฒดํฌ ๋“ฑ๋“ฑ.

Q. ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ๋ ˆ๋ฒจ

๋‹ต๋ณ€
  • ์ „ํŒŒ ๋ ˆ๋ฒจ
    • ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜์—์„œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ˜ธ์ถœ๋  ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ •ํ•˜๋Š” ๊ฒƒ.
  • ์ž˜ ์„ค๋ช…๋œ ๋ธ”๋กœ๊ทธ: https://deveric.tistory.com/86

Q. @Transactional vs DB ํŠธ๋žœ์žญ์…˜ - ์˜ˆ์ •

๋‹ต๋ณ€
  • @Transactional
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‹จ์—์„œ์˜ ํŠธ๋žœ์žญ์…˜.
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ์˜ ํŠธ๋žœ์žญ์…˜์„ ์˜๋ฏธํ•œ๋‹ค. (DB ํŠธ๋žœ์žญ์…˜๋ณด๋‹ค ๋ฒ”์œ„๊ฐ€ ๋” ๋„“๋‹ค.)
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ DB์— ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘๊ณผ COMMIT or ROLLBACK์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ•œ๋‹ค.
  • DB Transaction
    • DB์— ๋Œ€ํ•œ ํŠธ๋žœ์žญ์…˜.
    • ๊ทธ์ € ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‹จ์—์„œ์˜ ์š”์ฒญ์— ๋งž์ถฐ COMMIT or ROLLBACKํ•œ๋‹ค.

Q. Connection Pool๋ž€? ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

๋‹ต๋ณ€
  • Connection Pool๋ž€
    • DB์™€ ์—ฐ๊ฒฐ๋œ Connection์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์„œ Pool ์†์— ์ €์žฅํ•ด๋‘๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ Connection์„ Pool์—์„œ ์“ฐ๊ณ  ๋‹ค์‹œ Pool์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋ฒ•.
    • ๋™์‹œ ์ ‘์†์ž ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” Connection์„ ํ•˜๋‚˜๋กœ ๋ชจ์•„๋†“๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. (๋ฏธ๋ฆฌ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น Connection ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ)
  • ์™œ ์‚ฌ์šฉํ•˜๋‚˜? (Connection Pool์ด ์—†๋‹ค๋ฉด)
    • Connection Pool์ด ์—†๋‹ค๋ฉด ๋งค ์š”์ฒญ๋งˆ๋‹ค DB์™€์˜ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์ด๋Š” ๋งค๋ฒˆ DB ์ธ์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ด๋ฆ„, ์•”ํ˜ธ, TSL ์‚ฌ์–‘์ด ํ•„์š”ํ•˜๋ฉฐ ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋น„์šฉ์ด ์ปค์ง€๊ฒŒ ๋œ๋‹ค.
    • ๋˜ํ•œ, ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๋งŒ์•ฝ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ œ์•ฝ๋‘์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‰ฝ๊ฒŒ ๋งํ•ด, Connection Pool์„ ์ด์šฉํ•˜๋ฉด ์ •ํ•ด์ง„ ๊ฐœ์ˆ˜๋งŒํผ ๋ฏธ๋ฆฌ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ ํ’€์„ ์ด์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ๋น„์šฉ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Q. Connection Pool์˜ ๋™์ž‘ (DB์— ์ ‘๊ทผํ•˜๋Š” ๋‹จ๊ณ„)

๋‹ต๋ณ€


์ถœ์ฒ˜: ์ž๋ฐ” ์›น์„ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
  • DB์™€ ์—ฐ๊ฒฐ๋œ Connection ๊ฐ์ฒด๋“ค์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ Pool์— ์ €์žฅ.
    • ์ด๋•Œ ์ค‘์š”ํ•œ ์ ์€ ๋ฏธ๋ฆฌ DB์™€ Connection์„ ๋งบ์–ด๋†“๊ณ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
  • DB์— ์š”์ฒญ์‹œ, pool์—์„œ Connection ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ DB์— ์ ‘๊ทผํ•œ๋‹ค.
  • ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค์‹œ Pool์— ๋ฐ˜๋‚ฉํ•œ๋‹ค.

์ด๋Š” ๊ต‰์žฅํžˆ ์ถ”์ƒ์ ์œผ๋กœ ์ž‘์„ฑ๋œ ๊ธ€์ด๋‹ค. ์ถ”ํ›„์— ๋” ์ž์„ธํžˆ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค.


Q. Connection Pool์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

๋‹ต๋ณ€
  • Connection Pool ๋ถ€์กฑ์‹œ
    • ๋ชจ๋“  ์š”์ฒญ์ด DB์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ๊ณ  ๋‚จ์€ Connection์ด ์—†๋‹ค๋ฉด ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ „ํ™˜์‹œํ‚ค๊ณ  Pool์— Connection์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ ์ œ๊ณต๋จ.
  • ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ
    • Timeout์œผ๋กœ ์ธํ•œ ์˜ˆ์™ธ ๋ฐœ์ƒ

Q. WAS์˜ Connection Pool์™€ DB Connection Pool์˜ ๊ฐœ์ˆ˜

๋‹ต๋ณ€
  • Connection Pool ๊ฐœ์ˆ˜๋Š” ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์ด๋‹ค.
    • Connection์€ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค. ๋†’๊ฒŒ ์ธก์ •ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ปค๋„ฅ์…˜์€ ๋งŽ์ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ˜๋Œ€๋กœ, ๋‚ฎ๊ฒŒ ์ธก์ •ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ ๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์–ด๋Š ๊ฒƒ์„ ๋” ๋†’๊ฒŒ ์„ค์ •ํ•ด์•ผํ•˜๋Š”๊ฐ€?
    • WAS์˜ Connection์ด ๋” ๋งŽ์•„์•ผํ•˜๋Š” ์ด์œ ๋Š” WAS๋กœ ์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์ด DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ๋งŒ ์กด์žฌํ•˜๋Š”๊ฑด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๊ทธ๋Ÿฌ๋ฏ€๋กœ, DB Connection Pool๋ณด๋‹ค WAS์˜ Connection Pool์ด ๋งŽ์•„์•ผํ•œ๋‹ค.


JPA

Q. JPA๋ž€

ํ† ๊ธ€
  • JPA
    • Java Persistence API (์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ)
      • ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด๋กœ Hibernate๊ฐ€ ์กด์žฌ
    • ์ž๋ฐ” ์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€
    • ์˜์† ๊ณ„์ธต๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ปฌ๋ ‰์…˜ ๋‹ค๋ฃจ๋“ฏ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
  • ORM
    • Object - Relational Mapping
      • ๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋Œ€๋กœ ์„ค๊ณ„
      • ๊ด€๊ณ„ํ˜• DB๋Š” ๊ด€๊ณ„ํ˜• DB๋Œ€๋กœ ์„ค๊ณ„
    • ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ค‘๊ฐ„์—์„œ ์ž๋™์œผ๋กœ ๋งตํ•‘

Q. JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

ํ† ๊ธ€
  • ๊ฐ์ฒด์™€ DB ํ…Œ์ด๋ธ”๊ฐ„์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ SQL ๋งตํ•‘๊ณผ ORM๊ธฐ์ˆ ์ด ์กด์žฌํ•œ๋‹ค.
  • JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
    • ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ๋Œ€์‹  ํ•ด๊ฒฐํ•ด์คŒ - SQL ๋งตํ•‘์˜ ์ค‘๋ณต๊ณผ ๋ฐ˜๋ณต ๋‹จ์ ์„ ํ•ด๊ฒฐํ•ด์ค€๋‹ค. (์ƒ์†, ์—ฐ๊ด€๊ด€๊ณ„, ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ๋น„๊ต)
    • SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ - ์˜์† ๊ณ„์ธต๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ปฌ๋ ‰์…˜ ๋‹ค๋ฃจ๋“ฏ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
    • ์ƒ์‚ฐ์„ฑ
    • ์œ ์ง€๋ณด์ˆ˜ -> ํ•„๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด SQL์€ JPA๊ฐ€ ๋Œ€์‹  ์ฒ˜๋ฆฌ
    • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ถ”์ƒํ™”์™€ ๋ฒค๋” ๋…๋ฆฝ์„ฑ
    • ์„ฑ๋Šฅ ์ตœ์ ํ™” (1์ฐจ ์บ์‹ฑ, SQL ๋ฐฐ์น˜ ์š”์ฒญ, ์ง€์—ฐ ๋กœ๋”ฉ.
  • ๊ฐœ์ธ์ ์œผ๋ก  ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ–ˆ๋‹ค.
    1. JPA์—์„œ ์ œ๊ณตํ•˜๋Š” Repository๋Š” ๋„๋ฉ”์ธ ๊ณ„์ธต์— ์†ํ•˜๋ฉฐ, Collection์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ •๋ง Collection ๋‹ค๋ฃจ๋“ฏ์ด ์‚ฌ์šฉํ•˜๋ฉด JPA๊ฐ€ ์ž๋™์œผ๋กœ ์˜์†ํ™”๋ฅผ ์‹œ์ผœ์ค€๋‹ค. ๋˜ํ•œ, ๋”ํ‹ฐ ์ฒดํ‚น๋„ ํ•ด์ค€๋‹ค.
    2. ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰๋„ ์ข‹์€ ์ด์œ ์ธ ๋“ฏํ•˜๋‹ค. SQL Mapper๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋Š” SQL์— ๋”ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์–ด๋””๊นŒ์ง€ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ •ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๋‹ค. ํ•˜์ง€๋งŒ JPA๋Š” ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ†ตํ•ด ํ•„์š”ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜๋‹ค.

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

๋‹ต๋ณ€
  • ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ž€?
    • ๊ฐ์ฒด์™€ RDB๋Š” ์ง€ํ–ฅํ•˜๋Š” ๋ชฉ์ ์ด ๋‹ค๋ฅด๊ธฐ์— ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹๊ณผ ํ…Œ์ด๋ธ”์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹๊ฐ„์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜
    • ์ƒ์†
      • ๊ฐ์ฒด๋Š” ์ƒ์†์ด ์กด์žฌํ•˜์ง€๋งŒ, DB ํ…Œ์ด๋ธ”์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์—ฐ๊ด€๊ด€๊ณ„ (๋ฐฉํ–ฅ์„ฑ) - ์ค‘์š”
      • ๊ฐ์ฒด๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. (member๊ฐ€ team์— ์˜์กดํ•˜๋ฉด, member -> team๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ. team -> member๋Š” ๋ถˆ๊ฐ€๋Šฅ) - ๋‹จ๋ฐฉํ–ฅ
      • ํ…Œ์ด๋ธ”์€ ๋ฐฉํ–ฅ์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. (member < - > team, join ํ˜น์€ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์„œ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.) - ์–‘๋ฐฉํ–ฅ
    • ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
      • ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
      • ๋ฌธ์ œ๋Š” SQL์„ ์ง์ ‘ ๋‹ค๋ฃจ๋ฉด ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋Š” SQL์— ๋”ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์–ด๋””๊นŒ์ง€ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ •ํ•ด์ ธ๋ฒ„๋ฆฐ๋‹ค.
      • ์ฆ‰, DAO ๊ณ„์ธต์—์„œ ๋ฐ›์•„์˜จ ๊ฐ์ฒด๊ฐ€ ์–ด๋””๊นŒ์ง€ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅธ๋‹ค. (์–ด๋””๊นŒ์ง€๊ฐ€ null์ผ ๊ฒƒ์ธ๊ฐ€)
    • ๋น„๊ต
      • DB๋Š” ๊ธฐ๋ณธ ํ‚ค์˜ ๊ฐ’์œผ๋กœ ๊ฐ ๋กœ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
      • ๊ฐ์ฒด๋Š” ๋™๋“ฑ์„ฑ๊ณผ ๋™์ผ์„ฑ์„ ํ†ตํ•ด ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
        • SQL ๋งตํ•‘์˜ ๊ฒฝ์šฐ DAO์—์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ์— ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.
        • JPA๋Š” ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  • ํ…Œ์ด๋ธ” ์ฃผ๋„ ๋ชจ๋ธ๋ง vs ๊ฐ์ฒด ์ฃผ๋„ ๋ชจ๋ธ๋ง์™€ ๊ฐ™์€ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์ฐธ๊ณ .

Q. ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์ด๋ž€?

๋‹ต๋ณ€
  • DB ์™ธ๋ž˜ํ‚ค ๊ด€๋ฆฌ์ž
    • ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋‘ ๊ฐ์ฒด ์ฐธ์กฐ ์ค‘์—์„œ DB์™€์˜ ๋™๊ธฐํ™”๋ฅผ ์ฑ…์ž„์ง€๋Š” ๊ฐ์ฒด.
  • ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์—์„œ์˜ ๊ทœ์น™
    • ๊ฐ์ฒด์—์„œ์˜ ์–‘๋ฐฉํ–ฅ์€ ๊ฐ์ฒด ๋‘ ๊ฐœ๊ฐ€ ์„œ๋กœ ๋‹จ๋ฐฉํ–ฅ, ํ…Œ์ด๋ธ”์—์„œ์˜ ์–‘๋ฐฉํ–ฅ์€ ์™ธ๋ž˜ ํ‚ค ํ•˜๋‚˜.
    • ๊ทธ๋Ÿฌ๊ธฐ์— ๊ฐ์ฒด์—์„œ๋Š” ํ•˜๋‚˜๋กœ ์ฃผ์ธ์„ ์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.
  • ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์˜ ํŠน์ง•
    • ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ๋งŒ์ด ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌ(๋“ฑ๋ก, ์ˆ˜์ •) ํ•œ๋‹ค.
    • ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
      • mappedBy๋ฅผ ํ†ตํ•ด ์ฃผ์ธ์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

Q. ์–‘๋ฐฉํ–ฅ์˜ ๋‘ ๊ฐ์ฒด์ค‘ ์–ด๋Š ๊ฒƒ์„ ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์œผ๋กœ ํ•ด์•ผํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€
  • ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ณณ์„ ์ฃผ์ธ์œผ๋กœ ์ •ํ•œ๋‹ค.
    • ํ…Œ์ด๋ธ”์—์„œ 1 : N ๊ด€๊ณ„์—์„œ ์™ธ๋ž˜ ํ‚ค๋Š” ํ•ญ์ƒ ๋‹ค(N)์ชฝ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Q. ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ๋ฌธ์ œ์ 
    • ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ(1)์ด ๋ฐ˜๋Œ€ํŽธ ํ…Œ์ด๋ธ”(N)์˜ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
      • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์™ธ๋ž˜ ํ‚ค๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ๋‹ค.
      • Team ๊ฐ์ฒด ์•ˆ์—์„œ Member๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, ํ…Œ์ด๋ธ”์ƒ์—์„œ ์™ธ๋ž˜ ํ‚ค๋Š” Member๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (๋ฐฉํ–ฅ์„ฑ์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค.)
    • ์—ฐ๊ด€๊ด€๊ณ„ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€๋กœ UPDATE SQL์ด ๋‚ ๋ผ๊ฐ„๋‹ค.
      • ex. team.getMembers().add(member) -> member.team์„ null๋กœ ํ•˜์—ฌ insert -> team insert -> member.team update ์ฟผ๋ฆฌ ๋‚ ๋ฆผ
      • ์ž์„ธํ•œ ๋‚ด์šฉ ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ
  • ๊ฐ€๋Šฅํ•œ ์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Q. N + 1 ๋ฌธ์ œ๋ž€?

๋‹ต๋ณ€
  • N + 1๋ฌธ์ œ๋ž€?
    • ์ฟผ๋ฆฌ 1๋ฒˆ์œผ๋กœ N๊ฑด์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ ธ์™”๋Š”๋ฐ, ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด ๊ฐ ์—”ํ‹ฐํ‹ฐ๋งˆ๋‹ค ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ex. ํŒ€๋“ค ์กฐํšŒ (1) + N๊ฐœ์˜ ํŒ€ ๊ฐ๊ฐ ์กฐํšŒ (N)
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

Q. @Transactional(readOnly = true) ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ด์œ 

๋‹ต๋ณ€

์ฝ๊ธฐ ์ „์šฉ ํŠธ๋žœ์žญ์…˜์ด ์‚ฌ์šฉ๋œ๋‹ค.

  1. ์“ฐ๊ธฐ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์„ธ์…˜ ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ๋ฅผ MANUAL๋กœ ์„ค์ •ํ•˜๊ณ , ๊ฐ•์ œ๋กœ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ•œ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋”๋ผ๋„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ”Œ๋Ÿฌ์‹œ๋˜์ง€ ์•Š๊ณ  ์—”ํ‹ฐํ‹ฐ์˜ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๋”ํ‹ฐ ์ฒดํ‚น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋”ํ‹ฐ ์ฒดํ‚น(๋ณ€๊ฒฝ ๊ฐ์ง€)๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์„ฑ๋Šฅ ํ–ฅ์ƒ.


๋„คํŠธ์›Œํฌ

Q. CORS๋ž€?

๋‹ต๋ณ€
  • ์›น์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ •์ฑ…์€ ๋‘ ๊ฐ€์ง€์ด๋‹ค.
    • SOP (Same-Origin Policy)
    • CORS (Cross-Origin Resource Sharing)
  • SOP์™€ CORS
    • SOP๋Š” "๊ฐ™์€ ์ถœ์ฒ˜์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค"๋ผ๋Š” ๊ทœ์น™์„ ๊ฐ€์ง„ ์ •์ฑ…์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น ํ™˜๊ฒฝ์—์„  ๋‹ค๋ฅธ ์ถœ์ฒ˜์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ด ๊ต‰์žฅํžˆ ํ”ํ•˜๋ฏ€๋กœ ๋ฌด์ž‘์ • ๋ง‰์„ ์ˆ˜๋งŒ์€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ ์กฐํ•ญ์„ ๋‘๊ณ  ์ด ์กฐํ•ญ์— ํ•ด๋‹นํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์€ ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ํ—ˆ์šฉํ•˜๊ธฐ๋กœ ํ•˜๋Š” ์ •์ฑ…์ด ๋ฐ”๋กœ "CORS"์ด๋‹ค.
    • ์‰ฝ๊ฒŒ ๋งํ•ด, SOP ์ •์ฑ…์„ ์›น์—์„œ ์ค€์ˆ˜ํ•˜๊ธด ํ˜„์‹ค์ ์œผ๋กœ ํž˜๋“œ๋‹ˆ, CORS๋ž€ ์ •์ฑ…์„ ๋„์ž…ํ•ด์„œ ์„ค์ •๋œ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋“ค๊ฐ„์˜ ์ž์› ๊ตํ™˜์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ.
  • CORS๋ž€
    • ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠน์ •ํ•œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์ฒด์ œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • CORS ๋™์ž‘๋ฐฉ์‹
    • ์›น ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์š”์ฒญ ํ—ค๋”์— Origin์ด๋ผ๋Š” ํ•„๋“œ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ธ๋‹ค.
    • ์ดํ›„ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ํ•  ๋•Œ ํ—ค๋”์— Access-Control-Access-Origin์ด๋ผ๋Š” ๊ฐ’์— "์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜"๋ฅผ ๋‚ด๋ ค์ฃผ๊ฒŒ๋œ๋‹ค.
    • ์‘๋‹ต์„ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๋Š” ์ž์‹ ์ด ๋ณด๋ƒˆ๋˜ ์š”์ฒญ์˜ Origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ ์‘๋‹ต์˜ Access-Control-Allow-Origin์„ ๋น„๊ตํ•ด๋ณธ ํ›„ ์œ ํšจํ•œ ์‘๋‹ต์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  • Preflight Request (CORS์—์„œ ๊ฐ€์žฅ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ์ ‘๊ทผ์ œ์–ด ์‹œ๋‚˜๋ฆฌ์˜ค์ค‘ ํ•˜๋‚˜)
    • ์š”์ฒญ์„ ํ•œ๋ฒˆ์— ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์˜ˆ๋น„ ์š”์ฒญ๊ณผ ๋ณธ ์š”์ฒญ์„ ๋‚˜๋ˆ„์–ด์„œ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • OPTION๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ธŒ๋ผ์šฐ์ € ์Šค์Šค๋กœ ์ด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์›น ํด๋ผ์ด์–ธํŠธ๋Š” ์ด์ œ ํ•ด๋‹น ์š”์ฒญ์—” ์–ด๋–ค Origin์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ–ˆ์œผ๋ฏ€๋กœ, ๋‹ค์Œ ์š”์ฒญ์‹œ ๋งŒ์•ฝ Origin์ด ๋‹ค๋ฅด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

Q. CSRF๋ž€?

๋‹ต๋ณ€
  • CSRF๋ž€
    • CSRF (Cross Site Request Forgery)๋Š” ์•…์˜์ ์ธ ์›น์‚ฌ์ดํŠธ, ์ „์ž ๋ฉ”์ผ, ๋ธ”๋กœ๊ทธ, ์ธ์Šคํ„ดํŠธ ๋ฉ”์‹œ์ง€ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ ๋œ ๋‹ค๋ฅธ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์—์„œ ์›์น˜ ์•Š๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ณต๊ฒฉ ์œ ํ˜•.
  • CSRF๊ฐ€ ์ด๋ค„์ง€๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ ํ•œ๋‹ค.
    1. ์œ„์กฐ ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ์„œ๋น„์Šค (์€ํ–‰, ๋„ค์ด๋ฒ„๋“ฑ๋“ฑ)์— ํฌ์ƒ์ž๊ฐ€ ๋กœ๊ทธ์ธ ํ•œ ์ƒํƒœ
    2. ํฌ์ƒ์ž๊ฐ€ ํ•ด์ปค๊ฐ€ ๋งŒ๋“  ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ์— ์ ‘์† (์ฃผ๋กœ ์Œ๋ž€๋ฌผ ์‚ฌ์ดํŠธ..)

Q. ์ฟ ํ‚ค์™€ ์„ธ์…˜์ด๋ž€?

๋‹ต๋ณ€
  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ํŠน์„ฑ์ด์ž ์•ฝ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋น„์—ฐ๊ฒฐ์„ฑ (connectionless): ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ํ•œ ํ›„ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ๊ทธ ์—ฐ๊ฒฐ์„ ๋Š์–ด ๋ฒ„๋ฆฌ๋Š” ํŠน์ง•
    • ๋ฌด์ƒํƒœ์„ฑ (stateless): ํ†ต์‹ ์ด ๋๋‚˜๋ฉด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ํŠน์ง•
    • ๋Œ€ํ‘œ์ ์œผ๋กœ ์ฟ ํ‚ค์™€ ์„ธ์…˜๋“ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ง€์†์ ์ธ ๋กœ๊ทธ์ธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์—†๋‹ค. (๋ฌผ๋ก  ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋ก  ๊ฐ€๋Šฅ)
  • ์ฟ ํ‚ค๋ž€?
    • ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์ธก ๋ธŒ๋ผ์šฐ์ € ๋กœ์ปฌ์— ์ €์žฅ๋˜๋Š” ํ‚ค์™€ ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ์ด๋‹ค.
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์ฟ ํ‚ค ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ (๋ธŒ๋ผ์šฐ์ €) ์—์„œ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋Š”๋‹ค.
    • Response Header์— Set-Cookie ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์— ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • ์ฟ ํ‚ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋”ฐ๋กœ ์š”์ฒญํ•˜์ง€ ์•Š์•„๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์‹œ Request Header์— ๋„ฃ์–ด์„œ ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ์ „์†กํ•œ๋‹ค.
    • ์˜ˆ์‹œ: "์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?", ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ, "์˜ค๋Š˜ ๋” ์ด์ƒ ์ด ์ฐฝ ๋ณด์ง€ ์•Š์Œ"
  • ์„ธ์…˜์ด๋ž€?
    • ์„ธ์…˜์€ ์ฟ ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ํŒŒ์ผ (๋ฐ์ดํ„ฐ)์ด๋‹ค.
    • ์„œ๋ฒ„์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜ ID๋ฅผ ๋ถ€์—ฌํ•˜๋ฉฐ, ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์ธ์ฆ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ๊ฐ€ Request๋ฅผ ๋ณด๋‚ด๋ฉด, ํ•ด๋‹น ์„œ๋ฒ„์˜ ์—”์ง„์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์œ ์ผํ•œ ์„ธ์…˜ ID๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.
    • ์˜ˆ์‹œ: ๋กœ๊ทธ์ธํ›„ ์ •๋ณด ์ €์žฅ.
  • ์ฟ ํ‚ค์™€ ์„ธ์…˜ ์ฐจ์ด
    • ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ ์œ„์น˜: ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ, ์„ธ์…˜์€ ์„œ๋ฒ„
    • ๋ณด์•ˆ์„ฑ: ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์ธก์— ์ €์žฅํ•˜๋ฏ€๋กœ ์–ธ์ œ๋“  ์Šค๋‹ˆํ•‘ ๋‹นํ•  ์šฐ๋ ค๊ฐ€ ์žˆ์œผ๋‚˜, ์„ธ์…˜์€ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ sessionid๋งŒ ์ €์žฅํ•˜๊ณ  ๊ทธ๊ฒƒ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์„œ๋ฒ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ์ด ๋น„๊ต์  ์šฐ์ˆ˜ํ•˜๋‹ค.
    • ๋ชจ๋“  ์ •๋ณด๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•˜๋ฉด ์ข‹์ง€๋งŒ, ์„œ๋ฒ„ ์ž์›์˜ ๋‚ญ๋น„์™€ ์†๋„๋•Œ๋ฌธ์— ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์ •๋ณด๋Š” ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Q. ์„ธ์…˜ ๋ฐฉ์‹๊ณผ ํ† ํฐ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ๊ณผ ์žฅ๋‹จ์ ์€?

๋‹ต๋ณ€
  • ์„ธ์…˜ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ 
    • ์žฅ์ 
      • ํ† ํฐ(JWT)๊ณผ ๋น„๊ตํ•˜๋ฉด sessionid๋Š” ๊ต‰์žฅํžˆ ์ž‘๋‹ค. (๋„คํŠธ์›Œํฌ ๋น„์šฉ์ด ํ›จ์”ฌ ์ ๊ฒŒ ๋“ ๋‹ค.)
      • ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์ธก์— ์ €์žฅ/๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ์˜จ์ „ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ ๋ฆฌํ•˜๋‹ค.
    • ๋‹จ์ 
      • sessionid๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌ๋˜๊ธฐ์— ์—ฌ์ „ํžˆ ๊ณต๊ฒฉ์˜ ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค. (์œ ํšจ๊ธฐ๊ฐ„, HttpOnly, Secure๋“ฑ์„ ํ†ตํ•ด ๋ณด์•ˆ์„ฑ์„ ๋†’์—ฌ์•ผํ•œ๋‹ค.)
      • ์„œ๋ฒ„ ํ™•์žฅ์„ฑ๋ฉด์—์„œ ์ข‹์ง€ ์•Š๋‹ค. (๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ์ ์šฉํ•œ๋‹ค๋ฉด ์„ธ์…˜ ์„œ๋ฒ„๋ฅผ ๋”ฐ๋กœ ๋‘๊ฑฐ๋‚˜ sticky session, session clustering๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค)
      • ๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ์ธ ์‹œ ์‹ ๊ฒฝ์จ์ค˜์•ผํ•  ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค.
      • stateful (๋งค ์š”์ฒญ๋งˆ๋‹ค ์„ธ์…˜์— ์š”์ฒญ์„ ๋‚ ๋ฆฌ๋Š” ๋น„์šฉ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.)
  • ํ† ํฐ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ 
    • ์žฅ์ 
      • ์„œ๋ฒ„ ํ™•์žฅ์„ฑ๋ฉด์—์„œ ์ข‹๋‹ค. (๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑํ•ด๋„ ๋”ฐ๋กœ ํ•ด์ค„ ์ž‘์—…์ด ์—†๋‹ค.)
      • ๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์ด ์—†๋‹ค.
      • stateless
    • ๋‹จ์ 
      • ํด๋ผ์ด์–ธํŠธ์ธก์— ํ† ํฐ์ด ์ €์žฅ๋˜๊ฒŒ ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค. (์‹ค์ œ๋กœ body๋ถ€๋ถ„์€ base64url์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.)
        • ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ด์œผ๋ฉด ์•ˆ๋˜๋ฉฐ, ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•ด ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ด์•ผํ•œ๋‹ค.

Q. REST API๋ž€?

๋‹ต๋ณ€

์ง„์ •ํ•œ REST API๋Š” ๋กœ์ด ํ•„๋”ฉ์ด ์ •์˜ํ•œ REST๋ฅผ ์ง€์ผœ์„œ ๋งŒ๋“  API๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋ณธ ์ •๋ฆฌ์ž๋ฃŒ์—์„  ๊ฐ„๋‹จํžˆ๋งŒ ์„ค๋ช…ํ•˜๋ฏ€๋กœ, ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๊ทธ๋Ÿฐ REST API๋กœ ๊ดœ์ฐฎ์€๊ฐ€?

  • REST๋ž€
    • Representational State Transfer์˜ ์•ฝ์ž
    • ์ž์›์„ ์ด๋ฆ„(์ž์›์˜ ํ‘œํ˜„)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค
      • ์ž์›(Resource)์˜ ํ‘œํ˜„(Representation)์— ์˜ํ•œ ์ƒํƒœ ์ „๋‹ฌ
  • REST ๊ตฌ์„ฑ
    • ์ž์› (Resource) : URI
      • ๋ชจ๋“  ์ž์›์€ URI๋ผ๋Š” ๊ณ ์œ ํ•œ ID๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ž์›์€ ์„œ๋ฒ„์— ์กด์žฌํ•œ๋‹ค.
    • ํ–‰์œ„ (Verb) : HTTP Method
      • GET, POST, PUT, DELETE
    • ํ‘œํ˜„ (Representation)
      • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์ด์— ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.
      • REST์—์„œ ํ•˜๋‚˜์˜ ์ž์›์€ JSON, XML๋“ฑ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ Representation (ํ‘œํ˜„)์œผ๋กœ ๋‚˜ํƒ€๋‚ด์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • REST ์ œ์•ฝ ์กฐ๊ฑด (์ด ๋ชจ๋“  ๊ฒƒ์„ ์ง€์ผœ์•ผ ์ง„์ •ํ•œ REST๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.)
    1. client - server
    2. stateless (๋ฌด์ƒํƒœ์„ฑ)
    3. cache (์บ์‹œ)
    4. uniform interface (self-descriptive message, HATEOAS๋“ฑ)
    5. layered system (๋‹ค์ค‘ ๊ณ„์ธต - ๋ณด์•ˆ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™” ๊ณ„์ธต, ํ”„๋ก์‹œ ๋“ฑ๋“ฑ)
    6. code-on-demand (optional)
  • REST API๋ž€?
    • REST ๊ธฐ๋ฐ˜์˜ ๊ทœ์น™์„ ์ง€์ผœ์„œ ์„ค๊ณ„๋œ API
  • ๊ฐœ์ธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ์ž์›์„ ๋” ์‰ฝ๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ธ ๋“ฏ ํ•˜๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ


Q. ์ฃผ์š” HTTP ์ƒํƒœ ์ฝ”๋“œ

๋‹ต๋ณ€
  • 2xx
    • 200 OK
    • 201 Created (PUT ๋˜๋Š” POST์˜ ๊ฒฐ๊ณผ)
    • 202 Accepted
    • 204 No Content (์š”์ฒญ์— ๋Œ€ํ•ด์„œ ๋ณด๋‚ด์ค„ ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ธ ๊ฐ€ ์—†์ง€๋งŒ, ํ—ค๋”๋Š” ์˜๋ฏธ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.)
  • 3xx
    • 301 Moved Permanently (๋ฆฌ๋‹ค์ด๋ ‰์…˜ - ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์˜ URI๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.)
    • 302 Found (๋ฆฌ๋‹ค์ด๋ ‰์…˜ - ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์˜ URI๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.)
  • 4xx
    • 400 Bad Request (์ž˜๋ชป๋œ ๋ฌธ๋ฒ•์ด๋‚˜ ์š”์ฒญ์œผ๋กœ ์ธํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค.)
    • 401 Unauthorized (๋ฏธ์ธ์ฆ)
    • 403 Forbidden (ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝ˜ํ…์ธ ์— ์ ‘๊ทผํ•  ๊ถŒ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•œ๋‹ค. 401๊ณผ ๋‹ค๋ฅธ ์ ์€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)
    • 405 Method Not Allowed
    • 406 Not Accepted
  • 5xx
    • 500 Internal Server Error (์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.)
    • 502 Bad Gateway (์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‘๋‹ต์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ์ž˜๋ชป๋œ ์‘๋‹ต์„ ์ˆ˜์‹ ํ–ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.)

Q. HTTP ๋ฉ”์‹œ์ง€ ๊ตฌ์„ฑ

๋‹ต๋ณ€
  • HTTP Request
    • ์‹œ์ž‘ ์ค„
    • ํ—ค๋”
    • ๋ฐ”๋””
  • HTTP Response
    • ์ƒํƒœ ์ค„
    • ํ—ค๋”
    • ๋ฐ”๋””

Q. OAuth ๋™์ž‘ ๊ณผ์ • - ์˜ˆ์ •

๋‹ต๋ณ€

Q. HTTPS ๋™์ž‘ ๊ณผ์ • - ์˜ˆ์ •

๋‹ต๋ณ€
  • ํ•œ ์ค„ ์ •๋ฆฌ
    • ๋จผ์ € ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ๋Œ€์นญํ‚ค๋ฅผ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์ด์šฉํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ  ๋ฐ›๊ณ  ์ฃผ๊ณ ๋ฐ›์€ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค.
  • HTTPS ์ถ”์ƒ์ ์ธ ๋™์ž‘ ๊ณผ์ • *
  • HTTPS ์ถ”์ƒ์ ์ธ ๊ตฌ์ฒด ๊ณผ์ • (SSL Handshake) *

Q. ํฌ์›Œ๋“œ ํ”„๋ก์‹œ์™€ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์˜ ์ฐจ์ด

๋‹ต๋ณ€


์ถœ์ฒ˜: https://stackoverflow.com/questions/224664/whats-the-difference-between-a-proxy-server-and-a-reverse-proxy-server

  1. End Point - Forward Proxy ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” End Point ๊ฐ€ ์‹ค์ œ ์„œ๋ฒ„ ๋„๋ฉ”์ธ์ด๊ณ  ํ”„๋ก์‹œ๋Š” ๋‘˜ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•ด์ค€๋‹ค. - Reverse Proxy ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” End Point ๊ฐ€ ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์ด๊ณ  ์‹ค์ œ ์„œ๋ฒ„์˜ ์ •๋ณด๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.
  2. ๊ฐ์ถฐ์ง€๋Š” ๋Œ€์ƒ - Forward Proxy ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ์ถฐ์ง„๋‹ค. - ์š”์ฒญ ๋ฐ›๋Š” ์„œ๋ฒ„๋Š” ํฌ์›Œ๋“œ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ์š”์ฒญ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. - Reverse Proxy ๋Š” ๋ฐ˜๋Œ€๋กœ ์„œ๋ฒ„๊ฐ€ ๊ฐ์ถฐ์ง„๋‹ค. - ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋ฒ„์˜ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.


์šด์˜์ฒด์ œ

Q. ์šด์˜์ฒด์ œ๋ž€?

๋‹ต๋ณ€
  • ์šด์˜์ฒด์ œ๋ž€?
    • ์ปดํ“จํ„ฐ ํ•˜๋“œ์›จ์–ด์™€ ์‚ฌ์šฉ์ž ์†Œํ”„ํŠธ์›จ์–ด ์‚ฌ์ด์—์„œ ์ค‘์žฌ์ž ์—ญํ• .
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“  ๊ฐ์ข… ํ•˜๋“œ์›จ์–ด ์ž์›๋“ค์„ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด (์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• )
  • ์ข์€ ์˜๋ฏธ์˜ ์šด์˜์ฒด์ œ
    • ์ปค๋„
  • ๋„“์€ ์˜๋ฏธ์˜ ์šด์˜์ฒด์ œ
    • ์ปค๋„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํฌํ•จ
    • ์šด์˜ ์ฒด์ œ = ์ปค๋„ (ํ•ต์‹ฌ ๋ถ€๋ถ„) + ์‹œ์Šคํ…œ ์œ ํ‹ธ๋ฆฌํ‹ฐ

Q. ํ”„๋กœ๊ทธ๋žจ vs ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ

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

Q. ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

๋‹ต๋ณ€
  • ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์™€ PCB์˜ ์ฐจ์ด
    • PCB๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์šด์˜์ฒด์ œ๊ฐ€ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. (ํ”„๋กœ์„ธ์Šค์˜ ์œ„์น˜ ๊ฐ’, PC๊ฐ’ ๋“ฑ๋“ฑ)
    • ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ทธ์ € ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅ์‹œ์ผœ๋†“๋Š” ๊ณต๊ฐ„์ด๋‹ค.
  • ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ
    • ์ฝ”๋“œ ์˜์—ญ: ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ํ•  ์ฝ”๋“œ๊ฐ€ ๊ธฐ๊ณ„์–ด์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ ๊ณต๊ฐ„.
      • ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •๋˜๋ฉฐ Read-Only์ด๋‹ค.
    • ๋ฐ์ดํ„ฐ ์˜์—ญ: ์ „์—ญ ๋ณ€์ˆ˜, static ๋ณ€์ˆ˜๋“ฑ์ด ์ €์žฅ๋œ ๊ณต๊ฐ„.
      • ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •๋˜๋ฉฐ Read-Write(์‹คํ–‰ ๋„์ค‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)์ด๋‹ค.
    • ํž™ ์˜์—ญ: ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ๋™์  ํ• ๋‹นํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. (ex. malloc)
      • ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •๋˜๋ฉฐ ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๊ณ  ํ•ด์ œ๋œ๋‹ค.
    • ์Šคํƒ ์˜์—ญ: ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰์„ ๋งˆ์น˜๊ณ  ๋ณต๊ท€ํ•  ์ฃผ์†Œ ๋ฐ ๋ฐ์ดํ„ฐ(์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด๊ฐ’ ๋“ฑ)๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„
      • ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •๋˜๋ฉฐ, ์ •ํ•ด์ง„ ํฌ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ๊ณผ์‹œ StackOverFlow๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Q. ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ์Šค๋ ˆ๋“œ๊ฐ€ ์—†์„ ๋•Œ์˜ ๋‹จ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    • ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ
      • ํ”„๋กœ์„ธ์Šค๋Š” ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค์˜ ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋กœ ๋™์ž‘ํ•œ๋‹ค๋ฉด ๋นˆ๋ฒˆํ•œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด ํ†ต์‹ ์˜ ์–ด๋ ค์›€
      • ํ”„๋กœ์„ธ์Šค๋“ค์€ ๋…๋ฆฝ๋œ ์ฃผ์†Œ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„œ๋กœ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋‹ค.
      • ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ, ์†Œ์ผ“๋“ฑ์„ ์ด์šฉํ•ด์„œ ์ ‘๊ทผ ํ•ด์•ผ ํ•œ๋‹ค.
  • ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด
    • ๋น ๋ฅธ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜
      • ์Šค์ผ€์ค„๋ง ๋‹จ์œ„๊ฐ€ ํ”„๋กœ์„ธ์Šค์˜€๋˜ ์‹œ์ ˆ, Context Switching๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ์บ์‹œ flush, ์บ์‹œ ๋ณต์ˆ˜ ๋“ฑ์„ ํ•ด์•ผํ–ˆ๋‹ค.
      • ํ•˜์ง€๋งŒ, ์Šค์ผ€์ค„๋ง ๋‹จ์œ„๊ฐ€ Thread๋กœ ๋˜๋ฉด์„œ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ Thread๋“ค์„ Context Switch๋ฅผ ํ•  ๋•Œ๋Š” TCB๋งŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.
      • ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ์˜ ์ฃผ์†Œ ์ด๋™๋„ ํ•„์š”์—†๋‹ค. (ํ”„๋กœ์„ธ์Šค๋Š” ์ฃผ์†Œ ์ด๋™์„ ํ•ด์•ผํ•จ)
    • ์Šค๋ ˆ๋“œ๊ฐ„ ํ†ต์‹ ์œผ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ตฌํ˜„
      • ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค์˜ Heap, Static, Code ์˜์—ญ์„ ๊ณต์œ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋‚ด์—์„œ ์Šค๋ ˆ๋“œ๋ผ๋ฆฌ์˜ ํ†ต์‹ ์€ ๊ต‰์žฅํžˆ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

Q. ์Šคํƒ์„ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ์ด์œ 

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

Q. PCB vs TCB

๋‹ต๋ณ€


์ถœ์ฒ˜: http://www.kocw.net/home/search/kemView.do?kemId=1223639&ar=relateCourse


์ถœ์ฒ˜: https://slideplayer.com/slide/12698810/
TCB๋Š” PCB๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค

  • PCB (Process Control Block)
    • ์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ.
    • OS์˜ ์Šค์ผ€์ค„๋Ÿฌ์— ์˜ํ•ด Context Switching๋˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด ๋‹จ์œ„
  • TCB (Thread Control Block)
    • ์Šค๋ ˆ๋“œ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ.
    • ํ”„๋กœ์„ธ์Šค์— ์กด์žฌํ•˜๋Š” ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง ๋ฐฉ์‹(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์— ์˜ํ•ด Context Switching๋˜๋Š” ์Šค๋ ˆ๋“œ์˜ ์ •๋ณด ๋‹จ์œ„.
  • ๋‹น์—ฐํžˆ ๊ณต์œ ํ•˜๋Š” ์ž์›์ด ํ›จ์”ฌ ๋งŽ์€ TCB์˜ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ์„ฑ๋Šฅ์ƒ ํ›จ์”ฌ ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ.

Q. ๋ณ‘ํ–‰ (Concurrency) vs ๋ณ‘๋ ฌ (Parallemlism)

๋‹ต๋ณ€

์ž๊พธ ํ—ท๊ฐˆ๋ ค์„œ ๊ทธ๋ฆผ์„ ๋งŽ์ด ์ฒจ๋ถ€ํ•œ๋‹ค..


์ถœ์ฒ˜: https://medium.com/from-the-scratch/dont-be-confused-between-concurrency-and-parallelism-eac8e703943a


์ถœ์ฒ˜: https://www.codeproject.com/Articles/1267757/Concurrency-vs-Parallelism

  • ๊ณตํ†ต์ 
    • ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ผ์„ ํ•˜๋Š” ๊ฒƒ.
  • ๋ณ‘ํ–‰์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ฑ์งˆ์ด๊ณ , ๋ณ‘๋ ฌ์€ ํ•˜๋“œ์›จ์–ด์˜ ์„ฑ์งˆ์ด๋‹ค.


์ถœ์ฒ˜: https://luminousmen.com/post/concurrency-and-parallelism-are-different

* ๋ณ‘ํ–‰ * ์‹ฑ๊ธ€ ์ฝ”์–ด * **์‹œ๋ถ„ํ• ๋กœ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹. ๋™์‹œ์— ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค.** * ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ์ผ์„ ๊ฐ™์€ ์‹œ๊ฐ„์— ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹. * ex. ์‹ฑ๊ธ€ ์ฝ”์–ด์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ๋ฐฉ์‹ * ๋ฉ€ํ‹ฐ ์ฝ”์–ด => ๋ณ‘ํ–‰ + ๋ณ‘๋ ฌ * ์˜ˆ์‹œ - ์‹ฑ๊ธ€ ์ฝ”์–ด CPU * Mutex, Deadlock์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


์ถœ์ฒ˜: https://luminousmen.com/post/concurrency-and-parallelism-are-different

* ๋ณ‘๋ ฌ * ๋ฉ€ํ‹ฐ ์ฝ”์–ด (์‹ฑ๊ธ€ ์ฝ”์–ด์—์„  ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.) * **์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ์ผ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹.** (๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋™์‹œ ์ฒ˜๋ฆฌ) * ๋ฉ€ํ‹ฐ ์ฝ”์–ด๋ฅผ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. * ์˜ˆ์‹œ - GPU

Q. ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค vs ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

๋‹ต๋ณ€
  • ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค
    • ๊ฐœ๋…
      • ๊ฐ™์€ ์‹œ๊ฐ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šฐ๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹.
      • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ. (๋ถ€๋ชจ - ์ž์‹ ๊ด€๊ณ„๋ฅผ ํ†ตํ•œ ๋…๋ฆฝ์ ์ธ ๊ตฌ์กฐ)
    • ์˜ˆ์‹œ - ํฌ๋กฌ
      • ํฌ๋กฌ์˜ ๊ฐ ํƒญ์€ (Renderer) ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์ด๋‹ค, ์ด๋“ค์€ ๊ฐ์ž ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
      • ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํƒญ์€ IPC (Inter-Process Communication) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ํ†ต์‹ ํ•œ๋‹ค. (๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒ)
    • ์žฅ์ 
      • ๋…๋ฆฝ๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์„ฑ์ด ๋†’๋‹ค.
      • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด๋„ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ด์™ธ์˜ ๋‹ค๋ฅธ ํฌ๋ฅด์„ธ์Šค์—” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋‹จ์ 
      • ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ฐ€์ง€๋ฏ€๋กœ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ (์บ์‹œ ์ดˆ๊ธฐํ™”)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      • ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์ฐจ์ง€
  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ
    • ๊ฐœ๋…
      • ๊ฐ™์€ ์‹œ๊ฐ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋„์šฐ๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹.
      • ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ.
    • ์˜ˆ์‹œ
      • ์›น ์„œ๋ฒ„ - ์›น ์„œ๋ฒ„๋Š” ๊ฐ ์š”์ฒญ์„ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
      • ์›น ๋ธŒ๋ผ์šฐ์ € - ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋Š” ๋ Œ๋”๋ง, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      • ์›Œ๋“œ ํ”„๋กœ์„ธ์Šค - ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด ๋งž์ถค๋ฒ• ๋ฐ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ๋“ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      • ์šด์˜์ฒด์ œ ์ปค๋„ - Linux ์‹œ์Šคํ…œ ๋ถ€ํŒ…์‹œ ์—ฌ๋Ÿฌ ์ปค๋„ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์žฅ์น˜ ๊ด€๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
    • ์žฅ์ 
      • ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์ฐจ์ง€
      • TCB๋ฅผ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญํ•˜๋ฏ€๋กœ ์†๋„๊ฐ€ ๋น ๋ฆ„
      • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์— ๋น„ํ•ด ์‘๋‹ต์„ฑ์ด ๋นจ๋ผ์ง„๋‹ค. (ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ)
      • ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค.
    • ๋‹จ์ 
      • ๋™๊ธฐํ™”์˜ ๋ฌธ์ œ ์กด์žฌ
      • ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ์ „์ฒด ์Šค๋ ˆ๋“œ์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ์Œ
  • ์˜ˆ์‹œ
    • ์›น ์„œ๋ฒ„๊ฐ€ ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋กœ ํ• ๋‹นํ•œ๋‹ค๋ฉด ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ๋กœ ํ• ๋‹นํ•œ๋‹ค๋ฉด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Q. Light Weight Process vs Heavy Weight Process - ์˜ˆ์ •

๋‹ต๋ณ€

Q. User Level Thread vs Kernel Level Thread - ์˜ˆ์ •

๋‹ต๋ณ€

Q. Context Switching์ด๋ž€? ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”์ง€?

๋‹ต๋ณ€
  • ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๊ฐœ๋…
    • ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๋กœ CPU์˜ ์ œ์–ด๊ถŒ์ด ์ด์–‘๋˜๋Š” ๊ณผ์ •.
  • ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ๋Š” ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
    • ์ธํ„ฐ๋ŸฝํŠธ: ์—ฌ๋Ÿฌ ์žฅ์น˜๋“ค์ด CPU์˜ ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ. (์‹œ์Šคํ…œ -> ์‹œ์Šคํ…œ)
      • ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ: ์ปจํŠธ๋กค๋Ÿฌ๋“ฑ ํ•˜๋“œ์›จ์–ด ์žฅ์น˜๊ฐ€ ๋ณด๋‚ด๋Š” ์ธํ„ฐ๋ŸฝํŠธ.
      • ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ: ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ณด๋‚ด๋Š” ์ธํ„ฐ๋ŸฝํŠธ. (aka. ํŠธ๋žฉ)
      • ex. ์‹œ๋ถ„ํ• 
    • ์‹œ์Šคํ…œ ์ฝœ (์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ)
      • ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์šด์˜์ฒด์ œ ๋‚ด๋ถ€์— ์ •์˜๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์šด์˜์ฒด์ œ์— ์„œ๋น„์Šค ์š”์ฒญํ•˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ. (์‚ฌ์šฉ์ž -> ์‹œ์Šคํ…œ)
      • ์ปค๋„ ์˜์—ญ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ. (CPU์˜ ์ œ์–ด๊ถŒ์ด ์šด์˜์ฒด์ œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.)
      • ex. ์ž…์ถœ๋ ฅ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ๋“ฑ

Q. ๋‹ค์–‘ํ•œ ์Šค์ผ€์ค„๋Ÿฌ - ์˜ˆ์ •

๋‹ต๋ณ€

Q. CPU ์Šค์ผ€์ค„๋ง

๋‹ต๋ณ€

Ready Queue์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋Š” ๊ฒƒ.

  • CPU ์Šค์ผ€์ค„๋ง์ด ํ•„์š”ํ•œ ์ด์œ 
    • ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ œํ•œ๋œ CPU๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ์Šค์ผ€์ค„๋ง์ด ํ•„์š”ํ•˜๋‹ค.
    • ์ฆ‰, ๋งค ์‹œ์  ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์— CPU๋ฅผ ํ• ๋‹นํ•ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ผ์ด ํ•„์š”ํ•˜๋‹ค.
  • CPU ์Šค์ผ€์ค„๋ง์˜ ๋ชฉํ‘œ
    • CPU๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ, ํŠน์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถˆ์ด์ต์„ ๋‹นํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š”๊ฒƒ.
  • CPU ์Šค์ผ€์ค„๋ง ๋ฐฉ์‹
    • ์„ ์ ํ˜• ๋ฐฉ์‹ (์‹œ๋ถ„ํ• ) - CPU๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง
      • ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ธฐ ์›ํ•˜๋”๋ผ๋„ ๊ฐ•์ œ๋กœ ๋นผ์•—์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•.
    • ๋น„์„ ์ ํ˜• ๋ฐฉ์‹ - CPU๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€์ง€ ์•Š์Œ
      • CPU๋ฅผ ํš๋“ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์Šค์Šค๋กœ CPU๋ฅผ ๋ฐ˜๋‚ฉํ•˜๊ธฐ ์ „๊ฐ€์ง€๋Š” CPU๋ฅผ ๋นผ์•—๊ธฐ์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•.
  • CPU ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ•
    • ์„ ์ž… ์„ ์ถœ (FCFS, First Come First Served)
      • CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋„์ฐฉํ•œ ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘ ๋จผ์ € ์˜จ ๊ฒƒ์„ ๋จผ์ € ์ฒ˜๋ฆฌ.
      • ๋น„์„ ์ ํ˜• ๋ฐฉ์‹ (ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ๋ฐ˜๋‚ฉํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ)
      • ๋‹จ์ 
        • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. - Convoy Effect
    • SJF (Shortest Job Firs)
      • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋จผ์ € ๋„์ฐฉํ–ˆ์–ด๋„ CPU burst time์ด ์งง์€ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹
      • ๋น„์„ ์ ํ˜• ๋ฐฉ์‹
      • ๋‹จ์ 
        • CPU ์‚ฌ์šฉ์ด ์งง์€ job์„ ๋„ˆ๋ฌด ์„ ํ˜ธํ•œ๋‹ค. (์ฐจ๋ณ„ํ•œ๋‹ค) ์‚ฌ์šฉ๊ธฐ๊ฐ„์ด ๊ธด ํ”„๋กœ์„ธ์Šค๋Š” ๊ฑฐ์˜ ์˜์›ํžˆ CPU๋ฅผ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค. - ๊ธฐ์•„ ์ƒํƒœ
    • ๋ผ์šด๋“œ ๋กœ๋นˆ
      • CPU๋ฅผ ํ•œ ๋ฒˆ ํ• ๋‹น๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ผ์ •ํ•˜๊ฒŒ ๊ณ ์ •๋œ ์‹œ๊ฐ„์œผ๋กœ ์ œํ•œํ•˜์—ฌ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐฉ์‹.
      • ๋‹จ์ 
        • ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค ๋•Œ๋ฌธ์— ์งง์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค.
    • ์šฐ์„  ์ˆœ์œ„
      • CPU ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋“ค์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๋จผ์ € ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹.
      • ์„ ์ ํ˜• ๋ฐฉ์‹
        • ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉˆ์ถ”๊ณ  CPU๋ฅผ ์„ ์ ํ•œ๋‹ค.
      • ๋น„์„ ์ ํ˜• ๋ฐฉ์‹
        • ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„์ฐฉํ•˜๋ฉด Ready Queue์˜ Head์— ๋„ฃ๋Š” ๋ฐฉ์‹.
      • ๋ฌธ์ œ
        • ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ„์†ํ•ด์„œ CPU๋ฅผ ์ ์œ ํ•˜์ง€ ๋ชปํ•œ๋‹ค. - ๊ธฐ์•„ ์ƒํƒœ
        • ์‹คํ–‰ ์ค€๋น„๋Š” ๋˜์–ด์žˆ์œผ๋‚˜ CPU๋ฅผ ์‚ฌ์šฉ๋ชปํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ CPU๊ฐ€ ๋ฌด๊ธฐํ•œ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ - ๋ฌด๊ธฐํ•œ ๋ด‰์‡„
      • ํ•ด๊ฒฐ์ฑ… - ๊ธฐ์•„ ์ƒํƒœ ๋ฌธ์ œ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Q. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ์ฐจ์ด

๋‹ต๋ณ€
  • ๋™๊ธฐ / ๋น„๋™๊ธฐ
    • ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋Š” ํ˜ธ์ถœ ๋˜๋Š” ํ•จ์ˆ˜์˜ ์™„๋ฃŒ๋ฅผ ํ˜ธ์ถœํ•œ ์ชฝ์—์„œ ์‹ ๊ฒฝ์„ ์“ฐ๋ƒ ํ˜ธ์ถœ๋ฐ›์€ ์ชฝ์—์„œ ์‹ ๊ฒฝ์„ ์“ฐ๋ƒ์˜ ์ฐจ์ด๋‹ค.
      • ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ๋ฐ ์ข…๋ฃŒ๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹ ๊ฒฝ์“ฐ๋ฉด ๋™๊ธฐ
      • ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ๋ฐ ์ข…๋ฃŒ๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์œผ๋ฉด ๋น„๋™๊ธฐ
    • ๋™๊ธฐ: ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ๊ณผ ๋™์‹œ์— ๋ฐ˜ํ™˜ ๊ฐ’์ด ๊ธฐ๋Œ€๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋™๊ธฐ
    • ๋น„๋™๊ธฐ: ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ™” ๋™์‹œ์— ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋น„๋™๊ธฐ
  • ๋ธ”๋ก / ๋…ผ๋ธ”๋ก
    • ๋ธ”๋ก: ํ˜ธ์ถœ๋ฐ›์€ ์ชฝ์ด ํ˜ธ์ถœํ•œ ์ชฝ์— ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ.
    • ๋…ผ-๋ธ”๋ก: ํ˜ธ์ถœ๋ฐ›์€ ์ชฝ์ด ํ˜ธ์ถœํ•œ ์ชฝ์— ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ.

Q. ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™” ๋ฐฉ๋ฒ• (์„ธ๋งˆํฌ์–ด์™€ ๋ฎคํ…์Šค)

๋‹ต๋ณ€

Q. ๋ฐ๋“œ๋ฝ์ด๋ž€? ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€?

๋‹ต๋ณ€


์ถœ์ฒ˜: https://velog.io/@jess29/DeadLock

  • ๋ฐ๋“œ๋ฝ์ด๋ž€
    • ๊ต์ฐฉ์ƒํƒœ.
    • ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ž‘์—…์ด ์„œ๋กœ ์ƒ๋Œ€๋ฐฉ์˜ ์ž‘์—…์„ ๋๋‚˜๊ธฐ๋งŒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์„œ ๋‹ค์Œ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ.
  • ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ์กฐ๊ฑด
    • ์ƒํ˜ธ๋ฐฐ์ œ (Mutual Exclusion)
      • ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • ์ ์œ ๋Œ€๊ธฐ (Hold and Wait)
      • ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ.
      • ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋œ ์ž์›์„ ๊ฐ€์ง„ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ.
    • ๋น„์„ ์  (No preemption)
      • ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘์—๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค ์ˆ˜ ์—†๋‹ค.
      • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ์ž์›์˜ ์‚ฌ์šฉ์„ ๋๋‚ผ ๋•Œ๊นŒ์ง€ ๊ทธ ์ž์›์„ ๋บ์„ ์ˆ˜ ์—†๋‹ค.
    • ์ˆœํ™˜๋Œ€๊ธฐ (Circular wait)
      • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ž์›์˜ ๋ฐฉํ–ฅ์ด ์›ํ˜•์„ ์ด๋ฃฌ๋‹ค.
      • ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ˆœํ™˜์ ์œผ๋กœ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ.
  • ๋ฐ๋“œ๋ฝ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
    • ์˜ˆ๋ฐฉ
      • ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ์กฐ๊ฑด 3๊ฐ€์ง€ ์ค‘ ์ตœ์†Œ ํ•œ๊ฐ€์ง€๋ฅผ ๋ฏธ์ถฉ์กฑ ์‹œํ‚ค๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ.
    • ํšŒํ”ผ
      • ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ˆ˜์ค€์œผ๋กœ ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹. (์ž์›์„ ๋งŽ์ด ํ• ๋‹นํ• ์ˆ˜๋ก ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ์ปค์ง„๋‹ค.)
      • ํ˜„์žฌ ํ• ๋‹น๋œ ์ž์›์˜ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹œ์Šคํ…œ์„ ์•ˆ์ •์ƒํƒœ์™€ ๋ถˆ์•ˆ์ •์ƒํƒœ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.
      • ํ• ๋‹น๋œ ์ž์›์ด ๋งŽ์œผ๋ฉด ๋ถˆ์•ˆ์ •์ด๊ณ , ํ• ๋‹น ์ž์›์ด ์ ์œผ๋ฉด ์•ˆ์ •์ƒํƒœ์ด๋‹ค.
    • ์ƒํƒœ ๊ฒ€์ถœ ๋ฐ ๋ณต๊ตฌ
      • ๊ต์ฐฉ ์ƒํƒœ ์กด์žฌ ์—ฌ๋ถ€ ๋ฐ ๊ต์ฐฉ ์ƒํƒœ์— ์—ฐ๊ด€๋œ ํ”„๋กœ์„ธ์Šค์™€ ์ž์›์„ ์•Œ์•„๋‚ธ๋‹ค.
      • ๋ฐ๋“œ๋ฝ์„ ์ผ์œผํ‚จ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜, ํ• ๋‹น๋œ ์ž์›์„ ํ•ด์ œํ•จ์œผ๋กœ์จ ๋ณต๊ตฌํ•œ๋‹ค.
    • ๋ฌด์‹œ
      • ๋Œ€๋ถ€๋ถ„ ๊ต์ฐฉ ์ƒํƒœ๋Š” ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๊ณ  ์˜ˆ๋ฐฉ,ํšŒํ”ผ,ํƒ์ง€ ๋ฐ ๋ณต๊ตฌ๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ธฐ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ์‹


DB

RDB

Q. ์ •๊ทœํ™”๋ž€? ์™œ ์ •๊ทœํ™”๋ฅผ ํ•˜๋Š”๊ฐ€?

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

Q. ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ •ํ•ฉ์„ฑ

๋‹ต๋ณ€
  • ๊ฐœ๋…
    • ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ
      • ์–ด๋–ค ๋ฐ์ดํ„ฐ๋“ค์˜ ๊ฐ’์ด ์„œ๋กœ ์ผ์น˜ํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๋งž๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.
      • ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ผ๋ฆฌ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๊ธฐ ์–ด๋ ต๊ณ  ๊ถ๊ทน์ ์œผ๋กœ ์„œ๋กœ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง„๋‹ค. (์ •๊ทœํ™”๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.)
    • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ
      • ๋ฐ์ดํ„ฐ๊ฐ€ ์ •ํ™•ํ•˜๊ณ  ์™„์ „ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ.
      • ๋ฐ์ดํ„ฐ ์™„์ •์„ฑ์ด๋‚˜ ์ •ํ™•์„ฑ์ด๋ผ๋Š” ํ‘œํ˜„์ด ๋” ์ •ํ™•ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.
      • ๋ฌด๊ฒฐ์„ฑ์˜ ์ข…๋ฅ˜
        • ์—”ํ‹ฐํ‹ฐ ๋ฌด๊ฒฐ์„ฑ - ๊ฐœ์ฒด ๋ฌด๊ฒฐ์„ฑ
          • ์—”ํ‹ฐํ‹ฐ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.
          • ๋ชจ๋“  ์ธ์Šคํ„ด์Šค(Row)๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์†์„ฑ(PK)๋Š” ๊ณ ์œ ํ•œ ๊ฐ’์ด๊ฑฐ๋‚˜, Null ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ์•ˆ๋œ๋‹ค.
        • ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ - ์™ธ๋ž˜ํ‚ค
          • ์—”ํ‹ฐํ‹ฐ์˜ ์™ธ๋ž˜ ์‹๋ณ„์ž ๊ฐ’์€ ์ฐธ์กฐ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ์ฃผ ์‹๋ณ„์ž ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ Null ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค.
          • ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์€ ๋ณดํ†ต FK (์™ธ๋ž˜ํ‚ค)์ œ์•ฝ์— ์˜ํ•ด์„œ ์ง€์ผœ์ง„๋‹ค.
        • ๋„๋ฉ”์ธ ๋ฌด๊ฒฐ์„ฑ - ์†์„ฑ ๊ฐ’(์ปฌ๋Ÿผ)๊ณผ ๊ด€๋ จ๋œ ์ œ์•ฝ
          • ์—”ํ‹ฐํ‹ฐ์˜ ํŠน์ • ์†์„ฑ ๊ฐ’์€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ๊ธธ์ด, Null ํ—ˆ์šฉ ์—ฌ๋ถ€, ๊ธฐ๋ณธ ๊ฐ’, ํ—ˆ์šฉ ๊ฐ’ ๋“ฑ ๋™์ผํ•œ ๋ฒ”์ฃผ์˜ ๊ฐ’๋งŒ์ด ์กด์žฌํ•ด์•ผํ•œ๋‹ค.
          • ex. ์ด๋ฆ„ ์†์„ฑ์œผ๋กœ "binghe"๋Š” ํ—ˆ์šฉ, 777๋Š” ๋ถˆ๊ฐ€
        • ์—…๋ฌด ๋ฌด๊ฒฐ์„ฑ
          • ๊ธฐ์—…์—์„œ ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ทœ์น™ (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋น„์Šทํ•จ)
          • ex. ์ฃผ๋ฌธ ๊ธˆ์•ก 4๋งŒ์› ์ด์ƒ์ด๋ฉด ๋ฌด๋ฃŒ๋ฐฐ์†ก
  • ์ฐจ์ด์ 
    • ์ •ํ•ฉ์„ฑ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ๋ฌด์ˆœ ์—†์ด ์ผ๊ด€๋˜๊ฒŒ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ
    • ๋ฌด๊ฒฐ์„ฑ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •ํ™•ํ•˜๊ณ  ์™„์ „ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ.
      • ๋ฐ์ดํ„ฐ๋Š” ์ œ๋Œ€๋กœ๋œ (DBA๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ) ์ƒํƒœ๋กœ ์กด์žฌํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ.
    • ์–ด๋–ค ๋ฐ์ดํ„ฐ๋Š” ์ •ํ•ฉ์„ฑ์€ ๋งŒ์กฑํ•˜๋‚˜ ๋ฌด๊ฒฐ์„ฑ์€ ํ›ผ์†๋œ ์ƒํƒœ์ผ ์ˆ˜ ์žˆ๋‹ค.
      • ex. ์ด๋ฆ„ ์†์„ฑ์— ์ „๋ถ€ ์ „ํ™” ๋ฒˆํ˜ธ(์ˆซ์ž)๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ.

Q. ์ธ๋ฑ์Šค๋ž€?

๋‹ต๋ณ€
  • ์ธ๋ฑ์Šค๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋™์ž‘์˜ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค.
    • ๋น„์œ : DB ์ธ๋ฑ์Šค : ๋ฐ์ดํ„ฐ = ์ฑ… ์ƒ‰์ธ : ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ(์ฑ… ๋‚ด์šฉ)
  • ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ์„ฑ๋Šฅ์„ ํฌ์ƒํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
    • ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ํ•ญ์ƒ ์ •๋ ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์ด ๋ณต์žกํ•˜๊ณ  ๋Š๋ฆฌ๋‹ค. ๋ฐ˜๋ฉด์—, ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ๋น ๋ฅด๋‹ค.

Q. RDB๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋ณดํ†ต ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€
  • B-Tree ํ˜น์€ B+Tree
    • root, branch, leaf ๋…ธ๋“œ๋กœ ๋‚˜๋‰˜๊ณ  ์Šค์Šค๋กœ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ท ํ˜• ํŠธ๋ฆฌ์ด๋‹ค.
    • ์Šค์Šค๋กœ ๊ท ํ˜•์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ O(logN)์˜ ์กฐํšŒ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•œ๋‹ค.
  • B-Tree ์›๋ฆฌ ๋ฐ ์‚ฌ์šฉ ์ด์œ 

Q. ์ธ๋ฑ์Šค ํŠœ๋‹์„ ํ•˜๋Š” ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ์กฐํšŒ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•จ.
  • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์—์„œ ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด Index๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋žœ๋ค I/O ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์ธ๋ฑ์Šค ํŠœ๋‹์˜ ํ•ต์‹ฌ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Q. ์ธ๋ฑ์Šค ํŠœ๋‹ ์ข…๋ฅ˜

๋‹ต๋ณ€

B-Tree ๊ธฐ์ค€

  • ์ˆ˜์ง์  ํƒ์ƒ‰
    • ์ธ๋ฑ์Šค ์Šค์บ” ์‹œ์ž‘์ง€์ ์„ ์ฐพ๋Š” ๊ณผ์ • (leaf ๋…ธ๋“œ์—์„œ ์Šค์บ”์˜ ์‹œ์ž‘ ์ง€์ ์„ ์ฐพ๋Š” ๊ณผ์ •)
    • ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ
  • ์ˆ˜ํ‰์  ํƒ์ƒ‰
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ • (์ธ๋ฑ์Šค leaf ๋…ธ๋“œ๋ฅผ ์ˆ˜ํ‰์ ์œผ๋กœ ์Šค์บ”ํ•œ๋‹ค.)
    • ์กฐ๊ฑด์ ˆ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ. (ROWID๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•จ)
  • ์ธ๋ฑ์Šค ํŠœ๋‹
    1. ์ธ๋ฑ์Šค ์Šค์บ” ํšจ์œจํ™” (์ˆ˜์ง์  ํƒ์ƒ‰)
      • ์ธ๋ฑ์Šค ์Šค์บ” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋น„ํšจ์œจ์„ ์ค„์ด๋Š” ๊ฒƒ.
    2. ๋žœ๋ค ์•ก์„ธ์Šค ์ตœ์†Œํ™” (์ˆ˜ํ‰์  ํƒ์ƒ‰)
      • ์ธ๋ฑ์Šค ์Šค์บ” ํ›„ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ๋ฅผ ์•ก์„ธ์Šคํ•  ๋•Œ, ๋žœ๋ค I/O ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์šฐ์„ ์ ์œผ๋กœ ํŠœ๋‹ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋žœ๋ค ์•ก์„ธ์Šค ์ตœ์†Œํ™” (์ˆ˜ํ‰์  ํƒ์ƒ‰)์ด๋‹ค.
    • ํ•™์ƒ ๋ช…๋ถ€๋ฅผ ๋’ค์ง€๋Š” ๊ณผ์ •์—์„œ์˜ ๋น„ํšจ์œจ๋ณด๋‹ค, ํ•™์ƒ ๋ช…๋ถ€์— ์—†๋Š” ์ •๋ณด๋ฅผ ์œ„ํ•ด ์ง์ ‘ ๊ต์‹ค์— ๊ฐ€๋Š” ๋ถ€๋‹ด์ด ๋” ํฌ๋“ฏ, ๋žœ๋ค์•ก์„ธ์Šค ์ตœ์†Œํ™” ํŠœ๋‹์ด ๋” ์ค‘์š”ํ•˜๋‹ค. (๋‹ค๋ฅธ ๋น„์œ  ์ฐพ์•„๋ณด์ž.)

Q. ์ˆœ์ฐจ I/O์™€ ๋žœ๋ค I/O๋ž€?

๋‹ต๋ณ€
  • ์ˆœ์ฐจ I/O๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ธ์ ‘ํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ๋Š” ์ˆœ์ฐจ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‹ค.
    • ์ธ์ ‘ํ•œ ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ฝ๋Š” ๋‹ค์ค‘ ํŽ˜์ด์ง€ ์ฝ๊ธฐ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.
    • ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„  Full Scan์„ ํ•ด์•ผํ•œ๋‹ค.
  • ๋žœ๋ค I/O๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋–จ์–ด์ง„ ํŽ˜์ด์ง€๋“ค์— ์ž„์˜๋กœ ์ ‘๊ทผํ•˜๋Š” ์ž„์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‹ค.
    • ์ •ํ•ด์ง„ ์ˆœ์„œ์—†์ด ์ด๋™ํ•˜๋Š” ๋งŒํผ ๋””์Šคํฌ์˜ ๋ฌผ๋ฆฌ์ ์ธ ์›€์ง์ž„์ด ํ•„์š”ํ•˜๊ณ , ๋‹ค์ค‘ ํŽ˜์ด์ง€ ์ฝ๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋žœ๋ค I/O๋ฅผ ํ†ตํ•œ๋‹ค๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๋น„๊ต์  ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

Q. Index Range Scan๊ณผ Table Full Scan

๋‹ต๋ณ€

  • Table Full Scan
    • ์ˆœ์ฐจ I/O ๋ฐฉ์‹์™€ MultiBlock I/O๋ฐฉ์‹์œผ๋กœ ๋””์Šคํฌ๋ฅผ ์ฝ์–ด ํ•œ ๋ธ”๋ก์— ์†ํ•œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ์— ์ฝ์–ด๋“ค์ด๋Š” ๋ฐฉ๋ฒ•.
  • Index Range Scan
    • ๋žœ๋ค I/O์™€ Single Block I/O๋กœ ๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด ๋งค๋ฒˆ I/O๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•.
  • ๋ฌด์กฐ๊ฑด Index Range Scan์ด ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
    • ์กฐ๊ธˆ๋งŒ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ์ฝ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์ •๋Ÿ‰์„ ๋„˜์œผ๋ฉด Index Range Scan์˜ ๊ฒฝ์šฐ ๋งค ์ธ๋ฑ์Šค๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•จ์œผ๋กœ ๋‹ค๋Ÿ‰์˜ ๋””์Šคํฌ I/O๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋” ๋น„ํšจ์œจ์ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
    • ๋‹ค๋งŒ, ํฐ ํ…Œ์ด๋ธ”์—์„œ ์†Œ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋Š” ๋‹น์—ฐํžˆ Index Range Scan์ด ์œ ์šฉํ•˜๋‹ค.

Q. ๋‹ค์ค‘ ์ธ๋ฑ์Šค ์ฃผ์˜ํ•  ์ 

๋‹ต๋ณ€
  • ๋‹ค์ค‘ ์ธ๋ฑ์Šค์˜ ์ •๋ ฌ ๋ฐฉ์‹
    • ๋‹ค์ค‘ ์ธ๋ฑ์Šค์˜ ๋‘ ๋ฒˆ์งธ ์นผ๋Ÿผ์€ ์ฒซ ๋ฒˆ์งธ ์นผ๋Ÿผ์— ์˜์กดํ•ด์„œ ์ •๋ ฌ๋ผ ์žˆ๋‹ค.
    • ์ฆ‰, ๋‹ค์ค‘ ์นผ๋Ÿผ ์ธ๋ฑ์Šค์—์„œ๋Š” ์ธ๋ฑ์Šค ๋‚ด์—์„œ ๊ฐ ์นผ๋Ÿผ์˜ ์œ„์น˜(์ˆœ์„œ)๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.
  • ๋‹ค์ค‘ ์ธ๋ฑ์Šค ์„ค์ •์‹œ ์ฃผ์˜ํ•  ์ 
    • ๋‹ค์ค‘ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ๋ฅผ ํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ๊ฐ’๋ถ€ํ„ฐ ์ฐพ๊ณ , ๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์„ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.
    • ์ธ๋ฑ์Šค ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
      • ๋น„๊ต ์ž‘์—…์˜ ๋ฒ”์œ„๊ฐ€ ์ž‘์€ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋‹ค์ค‘ ์ธ๋ฑ์Šค ์„ค์ •์— ์ข‹๋‹ค.
      • ์ฆ‰, ์ž‘์€ ๋ฒ”์œ„๋ฅผ ์•ž์— ๋‘๊ณ , ๋น„๊ต์  ํฐ ๋ฒ”์œ„ ๊ฒ€์ƒ‰ ์ปฌ๋Ÿผ์„ ๋’ค์— ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Q. ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค vs ๋„Œํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค

๋‹ต๋ณ€
  • ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค
    • ๋ฌผ๋ฆฌ์ ์œผ๋กœ ํ–‰์„ ์žฌ๋ฐฐ์—ดํ•œ๋‹ค. (๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€)
    • ์‹ค์ œ DB์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋กœ ๋””์Šคํฌ์— ์ €์žฅ๋œ๋‹ค.
    • ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ์— ํ™œ์šฉํ•˜๋ฉด ์ ์€ I/O๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. (์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค)
    • ์„ ํƒ๋„์˜ ๋ฒ”์œ„๊ฐ€ 30% ์ด๋‚ด์ผ ๋•Œ ํšจ์œจ์ ์ด๋‹ค.
    • ํ…Œ์ด๋ธ”๋‹น ์ตœ๋Œ€ 1๊ฐœ
  • ๋„Œํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค
    • ๋ฌผ๋ฆฌ์ ์œผ๋กœ ํ–‰์„ ์žฌ๋ฐฐ์—ดํ•˜์ง„ ์•Š๋Š”๋‹ค. (๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋ฅผ ๊ฑด๋“ค์ง€ ์•Š๊ณ , ๋ณ„๋„์˜ ์žฅ์†Œ์— ์ธ๋ฑ์Šค ํŽ˜์ด์ง€ ์ƒ์„ฑ)
    • ์‹ค์ œ DB์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ์ •๋ ฌ์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋””์Šคํฌ์— ์ €์žฅ๋œ๋‹ค.
    • Leaf Level ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์— ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์œ„์น˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” Leaf Level๊นŒ์ง€ ์ฐพ์•„๊ฐ„ ๋’ค ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋žœ๋ค I/O๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. (์ธ๋ฑ์Šค๊ฐ”๋‹ค๊ฐ€ ํ•˜๋‚˜ํ•˜๋‚˜ ๋žœ๋คI/O)
    • ์„ ํƒ๋„์˜ ๋ฒ”์œ„๊ฐ€ 3% ์ด๋‚ด์ผ ๋•Œ ํšจ์œจ์ ์ด๋‹ค.
    • ํ…Œ์ด๋ธ”๋‹น ์ตœ๋Œ€ 249๊ฐœ
  • ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๋กœ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋„Œํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค๋Š” ํŽ˜์ด์ง€๋ฅผ ํ•œ ๋ฒˆ ๊ฑฐ์ณ์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹

Q. MySQL์€ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€

  • Connection Pool (Connection Handler) *
  • SQL Parser
    • ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ ํ† ํฐ(MySQL์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋‹จ์œ„์˜ ์–ดํœ˜๋‚˜ ๊ธฐํ˜ธ)์œผ๋กœ ๋ถ„๋ฆฌํ•ด ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.
  • Optimizer
    • ์‚ฌ์šฉ์ž ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. (DBMS์˜ ๋‘๋‡Œ)
    • ์ธ๋ฑ์Šค์˜ ์œ ๋ฌด, ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ ๋˜๋Š” ํŽธํ–ฅ ์ •๋„ ๋“ฑ์˜ ํ†ต๊ณ„์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์‹คํ–‰๊ณ„ํš์„ ์ž‘์„ฑํ•œ๋‹ค.
  • Execution Engine
    • ์˜ตํƒ€๋งˆ์ด์ €๊ฐ€ ๋‘๋‡Œ๋ผ๋ฉด ์‹คํ–‰ ์—”์ง„๊ณผ ํ•ธ๋“ค๋Ÿฌ๋Š” ์†๊ณผ ๋ฐœ์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ex. ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ GROUP BY๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด
      1. ์‹คํ–‰ ์—”์ง„์€ ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋ผ๊ณ  ์š”์ฒญ.
      2. ๋‹ค์‹œ ์‹คํ–‰ ์—”์ง„์€ WHERE ์ ˆ์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ค๋ผ๊ณ  ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ์š”์ฒญ.
      3. ์ฝ์–ด์˜จ ๋ ˆ์ฝ”๋“œ๋“ค์„ 1๋ฒˆ์—์„œ ์ค€๋น„ํ•œ ์ž„์‹œ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅํ•˜๋ผ๊ณ  ๋‹ค์‹œ ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ์š”์ฒญ.
      4. ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋œ ์ž„์‹œ ํ…Œ์ด๋ธ”์—์„œ ํ•„์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์˜ค๋ผ๊ณ  ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ๋‹ค์‹œ ์š”์ฒญ.
      5. ์ตœ์ข…์ ์œผ๋กœ ์‹คํ–‰ ์—”์ง„์€ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ๋„˜๊ธด๋‹ค.
    • ์œ„์™€ ๊ฐ™์ด ์‹คํ–‰ ์—”์ง„์€ ๋งŒ๋“ค์–ด์ง„ ๊ณ„ํš๋Œ€๋กœ ๊ฐ ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ์š”์ฒญํ•ด์„œ ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ๋˜ ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ ์š”์ฒญ์˜ ์ž…๋ ฅ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • Handler - Storage Engine
    • MySQL ์„œ๋ฒ„์˜ ๊ฐ€์žฅ ๋ฐ‘๋‹จ.
    • MySQL ์‹คํ–‰ ์—”์ง„์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๋กœ ์ €์žฅํ•˜๊ณ  ๋””์Šคํฌ๋กœ๋ถ€ํ„ฐ ์ฝ์–ด ์˜ค๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.
    • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ API

Q. Optimizer๊ฐ€ ํ•˜๋Š” ์ผ

๋‹ต๋ณ€
  • optimizer๋Š” ์ธ๋ฑ์Šค์˜ ์œ ๋ฌด, ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ ๋˜๋Š” ํŽธํ–ฅ ์ •๋„ ๋“ฑ์˜ ํ†ต๊ณ„์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์‹คํ–‰๊ณ„ํš์„ ์ž‘์„ฑํ•˜๊ณ  ์ด๋“ค์˜ ๋น„์šฉ์„ ์—ฐ์‚ฐํ•œ ํ›„, ์ตœ์ ํ™”๋œ ์‹คํ–‰๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜๋Š” DBMS์˜ ํ•ต์‹ฌ์—”์ง„ ์ด๋‹ค.

Q. ํŠธ๋žœ์žญ์…˜ ๊ฐœ๋…๊ณผ ์„ฑ์งˆ

๋‹ต๋ณ€
  • ํŠธ๋žœ์žญ์…˜์ด๋ž€?
    • ๋ณต์ˆ˜ ์ฟผ๋ฆฌ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ•œ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ฒƒ. ๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š” ๋‹จ์œ„ ์ž‘์—….
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์˜ ๋‹จ์œ„
    • ex. ํ•˜๋‚˜์˜ ๊ฑฐ๋ž˜ ์™„์„ฑ (๋‹จ์œ„) = ๊ตฌ๋งค ๊ณ„์ขŒ์—์„œ n๋งŒ์› ์ถœ๊ธˆ(์ž‘์€ ๋‹จ์œ„) + ํŒ๋งค์ž ๊ณ„์ขŒ์—์„œ n๋งŒ์› ์ถœ๊ธˆ(์ž‘์€ ๋‹จ์œ„)
  • ํŠธ๋žœ์žญ์…˜ ์„ฑ์งˆ (ACID)
    • Atomicity (์›์ž์„ฑ) -> ๋‹จ์œ„
      • ์›์ž: ๋” ์ด์ƒ ์ชผ๊ฐœ์งˆ ์ˆ˜ ์—†๋Š” ์„ฑ์งˆ
      • ์›์ž์„ฑ์ด๋ž€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์„ ์ˆ˜๋ฐ˜ํ•˜๋Š” ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์ด ์ „๋ถ€ ์„ฑ๊ณตํ• ์ง€ ์ „๋ถ€ ์‹คํŒจํ• ์ง€๋ฅผ ๋ณด์ฆํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.
      • COMMIT OR ROLLBACK
    • Consistency (์ผ๊ด€์„ฑ) -> ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด
      • ํŠธ๋žœ์žญ์…˜์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„ฑ์งˆ
      • ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ „/ํ›„์— ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด(๊ธฐ๋ณธ ํ‚ค, ์™ธ๋ž˜ ํ‚ค, ๋„๋ฉ”์ธ, ๋„๋ฉ”์ธ ์ œ์•ฝ์กฐ๊ฑด ๋“ฑ)์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด ๋ณด์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ.
      • ์˜ˆ์‹œ
        • ํ†ต์žฅ์˜ ์ž”๊ณ ๋Š” ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ์•ˆ๋œ๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์กด์žฌํ•œ๋‹ค.
        • ๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜ ๊ณผ์ •์—์„œ ํ†ต์žฅ์˜ ์ž”๊ณ ๊ฐ€ ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ๋œ๋‹ค๋ฉด ๋กค๋ฐฑ๋˜์–ด ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋œ๋‹ค.
    • Isolation (๋…๋ฆฝ์„ฑ) -> ๋ณ‘ํ–‰ ์ œ์–ด
      • ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ๋ณต์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ํ•ด๋„ '๊ฐ๊ฐ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋ชจ์ˆœ์—†์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์ฆ'ํ•˜๋Š” ๊ฒƒ.
      • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰์‹œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—…์ด ๋ผ์–ด๋“ค์ง€ ๋ชปํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ. (Lock ์ฒ˜๋ฆฌ)
    • Durability (์ง€์†์„ฑ) -> ์˜์†ํ™”
      • ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒ(COMMIT)ํ•˜๊ณ  ์™„๋ฃŒ ํ†ต์ง€๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ›๋Š” ์‹œ์ ์— ๊ทธ ํŠธ๋žœ์žญ์…˜์ด ์˜๊ตฌ์ ์ด ๋˜์–ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์žƒ์ง€ ์•Š๋Š” ๊ฒƒ.
      • ์ปดํ“จํ„ฐ๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๊ณ„์† ์ €์žฅ๋˜๋Š” ์„ฑ์งˆ (RAM์ด ์•„๋‹Œ SSD์— ์ €์žฅ๋œ ์ƒํƒœ)

Q. ํŠธ๋žœ์žญ์…˜ Isolation Level

๋‹ต๋ณ€

  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์ด๋ž€?
    • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋˜๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์˜ ์ž‘์—… ๋‚ด์šฉ์„ ์–ด๋–ป๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ์ฐจ๋‹จํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ ˆ๋ฒจ.
    • ๊ฒฉ๋ฆฌ์„ฑ์ด ๋†’์•„์งˆ ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์•…ํ™”๋œ๋‹ค.
  • READ UNCOMMITED
    • ์ปค๋ฐ‹ ์ „์˜ ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.
    • Dirty Read๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • READ COMMITED
    • ์ปค๋ฐ‹์ด ์™„๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค. (UNDO๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”๋‹ค)
    • ํ•œ ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ํ•œ ๊ฐ’๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค
    • Dirty Read๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ํ•˜์ง€๋งŒ, NON-REPEATABLE READ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.
      • ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋˜‘๊ฐ™์€ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
      • ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ค‘ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด COMMITํ•˜๊ธฐ ์ „ ์กฐํšŒ ๋ฐ์ดํ„ฐ์™€ COMMITํ•œ ํ›„ ์กฐํšŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • REPEATABLE READ
    • ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์กฐํšŒํ•œ ๋‚ด์šฉ์ด ํ•ญ์ƒ ๋™์ผํ•จ์„ ๋ณด์žฅํ•œ๋‹ค.
    • ๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜์— ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ(์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’)์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
      • ๋งŒ์•ฝ 10๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  SELECT ์ฟผ๋ฆฌ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ 10๋ณด๋‹ค ์ž‘์€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฒƒ๋งŒ ๋ณด๊ฒŒ ๋œ๋‹ค.
    • MySQL์˜ InnoDB์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€
    • PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜ํ–‰ํ•œ ๋ณ€๊ฒฝ ์ž‘์—…(INSERT๋ฌธ)์— ์˜ํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ณด์˜€๋‹ค๊ฐ€ ์•ˆ ๋ณด์˜€๋‹ค๊ฐ€ ํ•˜๋Š” ํ˜„์ƒ.
      • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ์ž‘์—…(INSERT, DELETE)๋“ฑ์— ์˜ํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ณด์˜€๋‹ค๊ฐ€ ์•ˆ ๋ณด์˜€๋‹ค๊ฐ€ ํ•˜๋Š” ํ˜„์ƒ.
    • SERIALIZABLE
      • ๋™๊ธฐํ™” : ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.
      • ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ์ œ์ผ ๋–จ์–ด์ง€๋ฏ€๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ž์„ธํ•œ ๋‚ด์šฉ

Q. ๋ฝ์˜ ์ข…๋ฅ˜

๋‹ต๋ณ€
  • ๊ณต์œ  ๋ฝ(Shared Lock) - READ Lock
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ๋˜์–ด์ง€๋Š” Lock.
    • ๊ณต์œ  Lock ๋ผ๋ฆฌ๋Š” ๋™์‹œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ.
    • ๊ณต์œ  Lock์ด ์„ค์ •๋œ ๋ฐ์ดํ„ฐ์— ๋ฒ ํƒ€ Lock์„ ์‚ฌ์šฉํ•  ์ˆœ ์—†๋‹ค.
      • ํŠน์ • ๋ฐ์ดํ„ฐ์— ๊ณต์œ  Lock์„ ๊ฑธ๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ write ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฒ ํƒ€ Lock์„ ์–ป์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ณต์œ  Lock์„ ๊ฐ€์ง„ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ write์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ๋ฒ ํƒ€ ๋ฝ(Exclusive Lock) - Write Lock
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.
    • ๋ฒ ํƒ€ Lock์ด ํ•ด์ œ๋  ๋•Œ ๊นŒ์ง€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ (์ฝ๊ธฐ ํฌํ•จ)์€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

Q. ๋‚™๊ด€์ ์ธ ๋ฝ๊ณผ ๋น„๊ด€์ ์ธ ๋ฝ

๋‹ต๋ณ€
  • DB์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๋™์‹œ์— ์ˆ˜์ •์ด ์ผ์–ด๋‚˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋‹ค.
    1. ํ…Œ์ด๋ธ” row์— Lock์„ ๊ฑฐ๋Š” ๋ฐฉ์‹.
    2. ์ˆ˜์ •ํ•  ๋•Œ ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ๋จผ์ € ์ด ๊ฐ’์„ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ๋ช…์‹œํ•˜์—ฌ ๋‹ค๋ฅธ ํŠธ๋ž™์žญ์…˜์ด ๋™์ผํ•œ ์กฐ๊ฑด์œผ๋กœ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹.
  • ๋‚™๊ด€์ ์ธ ๋ฝ (Optimistic Lock)
    • ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ์‹œ ์ถฉ๋Œ์ด /๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜์—ฌ ๋ณ„๋„ ๋ฝ์„ ๊ฑธ์ง€ ์•Š๋Š” ๋ฐฉ์‹.
      • ๋ฝ์„ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์˜ ๋ฐœ์ƒ์ด ์ผ์–ด๋‚˜๋ฉด ๊ทธ๋•Œ ๋Œ€์‘ํ•˜๊ณ , ์ž์›์„ ์„ ์  ์‹œํ‚ค์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
    • version๊ณผ ๊ฐ™์€ ๋ณ„๋„์˜ ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ๊ฐ™์€ row์— ๋Œ€ํ•ด์„œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ 2๊ฐœ์˜ ์ˆ˜์ • ์š”์ฒญ์ด ์žˆ์„ ๋•Œ 1๊ฐœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ์— ๋”ฐ๋ผ version์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋’ค์˜ ์ˆ˜์ • ์š”์ฒญ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹.
      • ํŠธ๋žœ์žญ์…˜์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • DB์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ํŠน์ง•์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ Application Level์—์„œ ์žก์•„์ฃผ๋Š” Lock ๋ฐฉ์‹.
  • ๋น„๊ด€์ ์ธ ๋ฝ (Pessimistic Lock)
    • "์ž์›์— ๋™์‹œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜์—ฌ, ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ"์ด๋ผ๊ณ  ๋น„๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž์›์„ ์„ ์ ํ•˜๋Š” ๋ฐฉ์‹.
      • ๋ฌด์กฐ๊ฑด ์ž ๊ธˆํ•˜๊ณ  ์„ ์ 
    • ๋น„๊ด€์  ๋ฝ์ด๋ž€ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋  ๋•Œ Shared Lock ๋˜๋Š” Exclusive Lock์„ ๊ฑธ๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • Transaction๊ณผ Lock์„ ์ด์šฉํ•˜์—ฌ ์ถฉ๋Œ์„ ์˜ˆ๋ฐฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋น„๊ด€์  ๋ฝ(Pessimistic Lock)
    • DB์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ํŠน์ง•์„ ์ด์šฉํ•œ Lock ๋ฐฉ์‹.
    • ๋Œ€ํ‘œ์ ์œผ๋กœ select for update๋ฌธ์ด ์žˆ๋‹ค.
    • ๋น„๊ด€์ ์ธ ๋ฝ์€ ๋‚™๊ด€์ ์ธ ๋ฝ๋ณด๋‹ค ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ณ  ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š๋‹ค.
  • ์žฅ๋‹จ์ 
    • ๋‚™๊ด€์ ์ธ ๋ฝ
      • ์žฅ์ : ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.
      • ๋‹จ์ : ๋กค๋ฐฑ์„ ํ•˜๊ธฐ ๊นŒ๋‹ค๋กญ๋‹ค. (์ถฉ๋Œ์ด ๋‚ฌ๋‹ค๋ฉด ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋กค๋ฐฑ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.)
    • ๋น„๊ด€์ ์ธ ๋ฝ
      • ์žฅ์ : ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ(๋กค๋ฐฑ)์— ์šฉ์ดํ•˜๋‹ค. ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ํ™•์‹คํžˆ ์ง€์ผœ์ง„๋‹ค.
      • ๋‹จ์ : ์„ฑ๋Šฅ์ด ๋น„๊ต์  ๋Š๋ฆฌ๋‹ค.
    • ๋‚™๊ด€์  ๋ฝ์€ ์ถฉ๋Œ์ด ๋งŽ์ด ์˜ˆ์ƒ๋˜๊ฑฐ๋‚˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ณณ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Q. Replication ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ฌธ์ œ

๋‹ต๋ณ€
  • ๋ฌธ์ œ ์ •์˜
    • Replication์€ ๋ณดํ†ต ๋””ํดํŠธ๋กœ Binlog ๊ธฐ๋ฐ˜์˜ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.
    • ์ด๋•Œ ๋งˆ์Šคํ„ฐ์— UPDATEํ•œ ์ฟผ๋ฆฌ๊ฐ€, SLAVE์— ๋„์ฐฉํ•˜๊ธฐ ์ „์— SLAVE์— ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• - ์ค€๋™๊ธฐ
    • Replication์—์„œ ์ค€๋™๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ Master๊ฐ€ Slave์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„
    • ๊ฒฐ๊ตญ์€ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ์„œ๋น„์Šค ์šด์˜์—์„œ ์กฐํšŒ์˜ ์•ˆ์ •์„ฑ์ด ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๊ณ  ์ƒ๊ฐ๋˜๊ธฐ์— ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๋“ฏ ํ•˜๋‹ค.
    • ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์‹œ NULL์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ ํ•ด๋„ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•œ๋ฒˆ ๋” ํ•˜๋Š” ๋“ฑ ๋‹ค๋ฅธ ์•ก์…˜์„ ์ทจํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๊ธฐ๋„ ํ•˜๋‹ค.

Q. ์ƒค๋”ฉ์ด๋ž€

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

Q. FK๋ฅผ ๊ฑฐ๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ? ๊ฑธ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

๋‹ต๋ณ€
  • FK๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ
    • ์žฅ์ 
      • DB์—์„œ์˜ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ(์™ธ๋ž˜ํ‚ค ๋ฌด๊ฒฐ์„ฑ)์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹จ์ 
      • ํŠน์ • DB์— ์˜์กด์ ์ด๋‹ค.
  • FK๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
    • ์žฅ์ 
      • WAS์—์„œ์˜ ๋กœ์ง์ด ํŠน์ • DB์— ์˜์กด์ ์ด์ง€ ์•Š๋‹ค.
    • ๋‹จ์ 
      • WAS์—์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ๋” ๋‚ ๋ ค์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Q. MVCC ๊ฐœ๋…๊ณผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋‹ต๋ณ€

Multi Version Concurrency Control

  • MVCC๋ž€?
    • ๋ ˆ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” DBMS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ.
    • ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ (ID๊ฐ€ 12์ธ ๋กœ์šฐ)์— ๋Œ€ํ•ด 2๊ฐœ์˜ ๋ฒ„์ „์ด ์œ ์ง€๋˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ์–ด๋Š ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์—ฌ์ง€๋Š”์ง€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ฆฌ์ง€๋Š” ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • MVCC ์‚ฌ์šฉ์ด์œ 
    • ๊ฐ€์žฅ ํฐ ๋ชฉ์ ์€ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ์žˆ๋‹ค.
      • InnoDB๋Š” Undo ๋กœ๊ทธ๋ฅผ ์ด์šฉํ•ด ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • MySQL MVCC ์˜ˆ์‹œ
mysql> INSERT INTO member (m_id, m_name, m_area) VALUES (12, 'binghe', '์„œ์šธ');

์œ„์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋ฉด MySQL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.


์ถœ์ฒ˜: RealMySQL


mysql> UPDATE member SET m_area='๊ฒฝ๊ธฐ' WHERE m_id=12;

๊ทธ๋ฆฌ๊ณ  UPDATE๋ฌธ์„ ๋‚ ๋ฆฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.


์ถœ์ฒ˜: RealMySQL

  • ๋ฒ„ํผ ํ’€์€ ์ƒˆ๋กœ์šด ๊ฐ’์ธ '๊ฒฝ๊ธฐ'๋กœ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Undo ๋กœ๊ทธ์— ์ด์ „ ๋ฐ์ดํ„ฐ์ธ '์„œ์šธ'์ด ์ €์žฅ๋œ๋‹ค.
  • ์ด๋•Œ ์กฐํšŒ๋ฅผ ํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์กฐํšŒ๋œ๋‹ค.
    • READ_UNCOMMITTED: ๋ฒ„ํผ ํ’€์ด๋‚˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ('๊ฒฝ๊ธฐ')
    • READ_COMMITTED ํ˜น์€ ๊ทธ ์ด์ƒ: Undo ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ('์„œ์šธ')
  • ์ƒํƒœ ๋ณ€ํ™˜
    • COMMIT -> ์ง€๊ธˆ์˜ ์ƒํƒœ๋ฅผ ์˜๊ตฌ์ ์ธ ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ ๋‹ค. (๋ฒ„ํผ ํ’€์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๋””์Šคํฌ I/O๋ฅผ ํ†ตํ•ด ์˜์†ํ™”)
      • COMMIT๋•Œ๋Š” Undo ์˜์—ญ์ด ๋ฐ”๋กœ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ํ˜น์€ ํŠธ๋žœ์žญ์…˜์ด ๋”์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ ์‚ญ์ œ๋œ๋‹ค.
    • ROLLBACK -> Undo์— ์žˆ๋Š” ๋ฐฑ์—… ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ ํ’€๋กœ ๋‹ค์‹œ ๋ณต๊ตฌํ•œ๋‹ค.
      • ROLLBACK๋•Œ๋Š” Undo ์˜์—ญ์˜ ๋‚ด์šฉ์„ ์‚ญ์ œํ•œ๋‹ค.

Q. ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์ฃผ์˜ํ•  ์ 

๋‹ต๋ณ€
  • ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
    • ๋‹ค์ค‘ ์ธ๋ฑ์Šค์˜ ๋‘ ๋ฒˆ์งธ ์นผ๋Ÿผ์€ ์ฒซ ๋ฒˆ์งธ ์นผ๋Ÿผ์— ์˜์กดํ•ด์„œ ์ •๋ ฌ๋ผ ์žˆ๋‹ค.
    • ๋‹ค์ค‘ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ๋ฅผ ํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ๊ฐ’๋ถ€ํ„ฐ ์ฐพ๊ณ , ๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์„ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋„“์€ ๋ฒ”์œ„ ๊ฒ€์ƒ‰์ปฌ๋Ÿผ์„ ๋’ค์— ๋‘ฌ์•ผํ•œ๋‹ค
  • ์„ ํ–‰ ์ปฌ๋Ÿผ ์—†์ด ์‚ฌ์šฉํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • ์„ ํ–‰ ์ปฌ๋Ÿผ ์—†์ด ๋’ค์— ์กด์žฌํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ „ํ˜€ ํƒ€์ง€ ์•Š๋Š”๋‹ค.

Q. ์‹คํ–‰ ๊ณ„ํš ๊ด€๋ จ ๋‚ด์šฉ

๋‹ต๋ณ€
  • ์ฃผ์š” ์ง€ํ‘œ
    • type: ์ ‘๊ทผ ๋ฐฉ์‹ -> ํ…Œ์ด๋ธ”์—์„œ ์–ด๋–ป๊ฒŒ ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ธ์ง€๋ฅผ ์˜๋ฏธ.
    • key: ์‹ค์ œ๋กœ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์‚ฌ์šฉํ•œ ์ธ๋ฑ์Šค.
    • rows: ๋ช‡ ํ–‰์„ ๊ฐ€์ ธ์™”๋Š”๊ฐ€๋ฅผ ํ‘œ์‹œ -> ํ‰๊ท  ๋ช‡ ๊ฐœ์˜ ํ–‰์„ ์ ‘๊ทผํ–ˆ๋Š”์ง€ ํ‘œ์‹œ. (์‹ค์ œ ํ–‰ ์ˆ˜์™€ ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•˜์ง„ ์•Š๋Š”๋‹ค)
    • filtered: ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ•„ํ„ฐ(์กฐ๊ฑด)๋ฅผ ํ†ตํ•ด ๋ช‡ ํ–‰์ด ๋‚จ๋Š”์ง€ ํ‘œ์‹œํ•œ๋‹ค.
    • extra: ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋™์ž‘ํ•˜๋Š” ํžŒํŠธ
      • ์ค‘์š” ํ‚ค์›Œ๋“œ
        • Using filesort(ORDER BY๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๊ณ , ๊ฒฐ๊ณผ ์ง์ ‘ quick sort๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ.)
        • Using temporary: ์•”๋ฌต์ ์œผ๋กœ ์ž„์‹œ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ‘œ์‹œ.
  • ๋” ์ž์„ธํ•œ ๋‚ด์šฉ

Q. DB Replication ๋งˆ์Šคํ„ฐ DB Failover - ์˜ˆ์ •

๋‹ต๋ณ€
  • MHA (Master High Availability) ์‚ฌ์šฉ
    • Master DB ์žฅ์•  ๋ฐœ์ƒ์‹œ, ์ž๋™์œผ๋กœ failover๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ Slave DB๋ฅผ Master DB๋กœ ์Šน๊ฒฉ์‹œ์ผœ ์„œ๋น„์Šค ๋‹ค์šดํƒ€์ž„์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์†”๋ฃจ์…˜์ด๋‹ค.
    • ๊ณ ๊ฐ€์šฉ์„ฑ (High Availability): ์‹œ์Šคํ…œ์ด ์ƒ๋‹นํžˆ ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ง€์†์ ์œผ๋กœ ์ •์ƒ ์šด์˜์ด ๊ฐ€๋Šฅํ•œ ์„ฑ์งˆ


Redis

Q. Redis๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š”?

ํ† ๊ธ€
  • ๋ฐฉ๋Œ€ํ•œ ๋ฌธ์„œ
  • ๋””์Šคํฌ๋ณด๋‹จ ๋ฉ”๋ชจ๋ฆฌ DB
    • ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต๊ตฌ์กฐ ๊ด€์ 
      • ๋””์Šคํฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค CPU์™€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ๋ฉ€๋‹ค. ๋””์Šคํฌ๊ฐ€ ์šฉ๋Ÿ‰์€ ๋” ํฌ์ง€๋งŒ ๋” ๋Š๋ฆฌ๋‹ค.
    • ํ”„๋กœ์„ธ์Šค ๊ด€์ 
      • ๋””์Šคํฌ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  Disk I/O๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ Blocked ์ƒํƒœ๋กœ ๋‘”๋‹ค. ๊ทธ๋ฆฌ๊ณ  I/O ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๊ณ  ๋‚˜์„œ์•ผ Ready ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋‹ค์‹œ CPU์˜ ์ ์œ ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. (๋Š๋ฆผ)
      • ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์žฅ์น˜๋“ค์˜ I/O๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋ฅผ ์ปค๋„ ๋ชจ๋“œ๋กœ ๋ฐ”๊พธ๊ธฐ๋งŒ ํ•˜๋ฉด๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค ์ƒํƒœ๊ฐ€ Blocked ๋˜์ง€ ์•Š๊ณ , Ready์™€ Running ์ƒํƒœ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. (๋น ๋ฆ„)
  • Key-Value ์ €์žฅ์†Œ (NoSQL)
    • Key์™€ Value๋กœ ๋งคํ•‘๋œ ๋‹จ์ˆœํ•œ ๋งต ํ˜•ํƒœ์˜ ์ €์žฅ์†Œ๋กœ์„œ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค. (์ง๊ด€์ )
  • NoSQL (Not Only SQL)
    • ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.
    • NoSQL์€ RDBMS์— ๋น„ํ•ด ์†๋„์™€ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค. (๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ •๊ทœํ™”๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ธ ๋“ฏ ํ•˜๋‹ค.)
  • Value ๊ฐ’์œผ๋กœ ๋‹ค์–‘ํ•œ Collection์„ ์ œ๊ณตํ•œ๋‹ค.
    • ๋‹ค์–‘ํ•œ Collection (์ž๋ฃŒ๊ตฌ์กฐ)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ
    • ๋ ˆ๋””์Šค๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Race Condition์„ ํ”ผํ•ด ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ์„ค์ •์— ๋”ฐ๋ผ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ณด๊ด€, ๋ฐฑ์—…)
  • ์‰ฝ๊ฒŒ Replication ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Q. Redis๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ ์ด์œ 

ํ† ๊ธ€
  • Redis๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๋‹ค.
    • ์ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด, Client์—์„œ ์š”์ฒญํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(๋ฉ”์ธ ์Šค๋ ˆ๋“œ)์—์„œ ๋™์ž‘ํ•œ๋‹ค.
    • Redis ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ด์™ธ์—๋„ AOP ํ˜น์€ ๋ฐฑ์—…์— ์‚ฌ์šฉ๋˜๋Š” I/O ์Šค๋ ˆ๋“œ๋„ ์กด์žฌํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์ด๋ฏ€๋กœ, Redis๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๋งž๋‹ค.
  • Redis์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํŠน์ง• -> ์ฐธ๊ณ  - ๊ณต์‹ ๋ฌธ์„œ
    • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ํ•˜๋‚˜์˜(์‹ฑ๊ธ€) ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋•Œ Multiplexing๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ด๋Š” Redis๊ฐ€ ๋ชจ๋“  ๋‹จ์ผ ์š”์ฒญ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. (Node.js์—์„œ์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋‹ค)
    • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Š๋ฆด ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋˜์ง€๋งŒ, ์‚ฌ์‹ค์€ ๋น ๋ฅด๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋งค ์š”์ฒญ์„ ๊ต‰์žฅํžˆ ์งง์€ ์‹œ๊ฐ„์•ˆ์— ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ธ”๋ก ์ƒํƒœ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ, ๋ฌธ๋งฅ๊ตํ™˜์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Redis๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ ์ด์œ 
    1. CPU๊ฐ€ ๋ณ‘๋ชฉ ํ˜„์ƒ์˜ ์›์ธ์ด ์•„๋‹ˆ๋‹ค.
      • Redis์˜ ๋ณ‘๋ชฉํ˜„์ƒ์˜ ๋Œ€๋ถ€๋ถ„์€ CPU๊ฐ€ ์•„๋‹Œ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ/๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.
    2. ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
      • ์ด๋ฒคํŠธ๋ฃจํ”„ ํŒจํ„ด์„ ํ†ตํ•ด ๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ๋ฌธ๋งฅ๊ตํ™˜์ด ์—†์–ด ์ž์›์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. ์‰ฌ์šด ๊ตฌํ˜„
    4. ์‰ฌ์šด ๋ฐฐํฌ
      • ํ•œ ๊ฐœ์˜ ์ฝ”์–ด๋งŒ ์žˆ์–ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๋ฐฐํฌ/์‹œ์šฉ์ด ์‰ฝ๋‹ค.
  • ์ฐธ๊ณ 

Q. Redis ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•  ์ 

ํ† ๊ธ€
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ - ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™”
    • ๋ฌธ์ œ์ 
      • Physical Memory ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (Swap์„ ์“ฐ๋ฉด ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋ฏ€๋กœ ๋น„์ถ”์ฒœ)
      • Maxmemory๋ฅผ ํ†ตํ•ด ์ตœ๋Œ€ ์‚ฌ์šฉ๋Ÿ‰์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™”๋กœ ์ธํ•ด ๋ฌด์šฉ์ง€๋ฌผ์ผ ์ˆ˜ ์žˆ๋‹ค.
      • ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™”๋กœ ์ธํ•ด ์‹ค์ œ๋ก  12M๋ฅผ ์‚ฌ์šฉ์ค‘์ธ๋ฐ, Redis๋Š” 1MB๋งŒ ์‚ฌ์šฉ์ค‘์ด๋ผ๊ณ  ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•ด๊ฒฐ๋ฒ•
      • ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 60 ~ 70%์ฐจ๋ฉด ์ด์ „์‹œ์ผœ์•ผ ํ•œ๋‹ค.
      • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • Redis๋Š” copy-on-write ํ˜•์‹์„ ์ด์šฉํ•œ๋‹ค. (๋ฐฑ์—… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค)
    • ๋ฌธ์ œ์ 
      • ๋ฆฌ๋ˆ…์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด์ž๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ forkํ•  ๊ฒฝ์šฐ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.
      • ์ด ๋•Œ ๋ถ€๋ชจํ”„๋กœ์„ธ์Šค๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ cow๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
      • Redis์˜ ์‹ค ์‚ฌ์šฉ๋Ÿ‰์€ ์‹ค ๋ฐ์ดํ„ฐ ํฌ๊ธฐ + ๊ด€๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ overhead + Copy-on-Write๋กœ ์ธํ•œ ์ถ”๊ฐ€๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ  ๋ด์•ผํ•œ๋‹ค.
    • cow๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ๋ก€
      • save ๋ช…๋ น์–ด
      • Replication
    • ํ•ด๊ฒฐ๋ฒ•
      • ์บ์‹œ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ๋ฐฑ์—…ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด RDB (save) ์„ค์ •์„ OFFํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • Collection ์ฃผ์˜ ์‚ฌํ•ญ
    • ๋ฌธ์ œ์ 
      • Collection์•ˆ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด, ์ „์ฒด ์กฐํšŒ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๊ด€์ ์—์„œ ์ข‹์ง€ ์•Š๋‹ค.
    • ๋Œ€์•ˆ
      • ํ•˜๋‚˜์˜ ์ปฌ๋ ‰์…˜์— ๋„ˆ๋ฌด ๋งŽ์€ ์•„์ดํ…œ์„ ๋‹ด์œผ๋ฉด ์ข‹์ง€ ์•Š๋‹ค. 10000๊ฐœ ์ดํ•˜๋กœ ์œ ์ง€ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.
  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ - O(N) ๊ด€๋ จ ๋ช…๋ น์–ด
    • ๋ฌธ์ œ์ 
      • Redis๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ฆ‰, ๋™์‹œ์— ํ•œ ๊ฐœ์˜ ๋ช…๋ น์–ด ๋ฐ–์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. O(N)์ด ๊ฑธ๋ฆฌ๋Š” ๋ช…๋ น์–ด๋Š” ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
      • ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋“ค์–ด์˜ค๋ฉด, ๋‹ค๋ฅธ ์š”์ฒญ์— ์˜ํ–ฅ์„ ์ค„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ O(N) ๋ช…๋ น์–ด
      • KEYS: ๋ชจ๋“  key๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ช…๋ น.
        • ๋Œ€์•ˆ => scan ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•˜๋‚˜์˜ ๊ธด ๋ช…๋ น์„ ์งง์€ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
      • FLUSHALL, FLUSHDB
        • ๋ฐ์ดํ„ฐ ๋‹ค ๋‚ ๋ฆฌ๋Š” ๋ช…๋ น.
      • Delete Collections
        • ํ•˜๋‚˜์˜ Collection์•ˆ์— ๋ฐ์ดํ„ฐ 10๋งŒ๊ฐœ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ญ์ œํ•˜๋Š”๋ฐ 1-2์ดˆ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. 1-2์ดˆ๋™์•ˆ ๋‹ค๋ฅธ ์š”์ฒญ์€ ์•„๋ฌด๊ฒƒ๋„ ๋ชปํ•œ๋‹ค..
      • Get All Collections
        • ํ•˜๋‚˜์˜ Collection์•ˆ์— 10๋งŒ๊ฐœ์ •๋„๋ฅผ ๋„ฃ๊ณ , ๋ชจ๋‘๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค๋ฉด ๊ต‰์žฅํžˆ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.
        • ๋Œ€์•ˆ => ํฐ Collection์„ ์ž‘์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Collection์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ €์žฅ.

Q. Redis Expire์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”?

๋‹ต๋ณ€
  • Expire๋ž€?
    • Key์— TTL(Time To Live)๋ฅผ ์„ค์ •ํ•˜๊ณ , ํ•ด๋‹น TTL์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ.
  • Expire์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„
    • O(1)
  • Expire ๋™์ž‘ ์›๋ฆฌ
    • Redis์—์„œ ์ œ๊ณตํ•˜๋Š” Expire ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๋‹ค: a passive way, and an active way. (์ˆ˜๋™, ์ž๋™)
      • ์ˆ˜๋™๋ฐฉ์‹: ํ‚ค๋ฅผ ์ ‘๊ทผํ•  ๋•Œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ์‹.
      • ์ž๋™๋ฐฉ์‹: ์ฃผ๊ธฐ์ ์œผ๋กœ Redis๊ฐ€ ๋งŒ๋ฃŒ๊ฐ€ ์„ค์ •๋œ ํ‚ค ์ค‘์—์„œ ๋žœ๋ค์œผ๋กœ ๋ช‡ ๊ฐœ์˜ ํ‚ค๋ฅผ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ์‹.
    • Redis๋Š” ์ž๋™๋ฐฉ์‹์„ ๋””ํดํŠธ๋กœ ์ œ๊ณตํ•œ๋‹ค.
      • Redis๋Š” ์ดˆ๋‹น 10๋ฒˆ ์•„๋ž˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
        1. ๋งŒ๋ฃŒ๊ฐ€ ์„ค์ •๋œ ํ‚ค ์„ธํŠธ์—์„œ 20๊ฐœ์˜ ๋žœ๋ค ํ‚ค๋ฅผ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
        2. ๋งŒ๋ฃŒ๋œ ๋ชจ๋“  ํ‚ค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
        3. ํ‚ค์˜ 25% ์ด์ƒ์ด ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ, 1๋‹จ๊ณ„๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ 


๊ธฐํƒ€

Q. Refresh Token์€ ์–ด๋””์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์š”? - ์˜ˆ์ •

๋‹ต๋ณ€
  • ๊ฒฐ๋ก ์ ์œผ๋ก  ํŽธ์˜์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ ์‚ฌ์ด์—์„œ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ํ•„์ž๋Š” AT๋ฅผ statelessํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€๊ณ , RT๋Š” statefulํ•˜๊ฒŒ ์„œ๋ฒ„์— ์ €์žฅ์‹œํ‚ค๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ์งง์€ Access Token์˜ ๊ฒฝ์šฐ๋Š” ํด๋ผ์ด์–ธํŠธ๋‹จ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ๊ธด Refresh Token์€ ์–ด๋””์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?
    • Client์— ์ €์žฅํ•  ๊ฒฝ์šฐ (Client์— RT๋ฅผ ์ €์žฅ์‹œํ‚ค๊ณ , AT๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด RT๋ฅผ ํ†ตํ•ด AT๋ฅผ ์žฌ๋ฐœ๊ธ‰ํ•˜๋Š” ๋ฐฉ์‹)
      • ์„œ๋ฒ„์— ๋”ฐ๋กœ RT๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํŽธํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋œ RT๊ฐ€ ํƒˆ์ทจ๋˜๋ฉด ๋ณด์•ˆ์ ์œผ๋กœ ๊ต‰์žฅํžˆ ์œ„ํ—˜ํ•˜๋‹ค. (์„œ๋ฒ„์ธก์—์„œ revoke ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค)
    • Server์— ์ €์žฅํ•  ๊ฒฝ์šฐ (Client์— RT๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” index ๊ฐ’๋งŒ ์ €์žฅ์‹œํ‚ค๊ณ , ์„œ๋ฒ„ DB์— RT๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹)
      • ์„œ๋ฒ„์— RT๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ ๊ด€๋ฆฌํฌ์ธํŠธ๊ฐ€ ๋Š˜์–ด ํŽธ์˜์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์— ์ง์ ‘์ ์ธ RT๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณด์•ˆ์ ์œผ๋กœ ์šฐ์ˆ˜ํ•˜๋‹ค.
        • RT๊ฐ€ ํƒˆ์ทจ๋˜์–ด๋„ ์žฌ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ์ด์ „ RT(ํƒˆ์ทจ๋œ)๋ฅผ ๋ฌด๋ ฅํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋”ฐ๋ผ ์„œ๋ฒ„์— ์ €์žฅ๋œ RT๋ฅผ ๋ฌด๋ ฅํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
        • ์ฆ‰, ํƒˆ์ทจ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จ๋œ๋‹ค๋ฉด ์„œ๋ฒ„์ธก์—์„œ RT๋ฅผ revoke ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋ฌผ๋ก  ์„ธ์…˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” RT๋ฅผ ํ†ตํ•œ AT๋ฅผ ์žฌ๋ฐœ๊ธ‰ํ•  ๋•Œ๋งŒ statefulํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋ฏ€๋กœ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„ ๊ด€๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

Q. Layered Architecture๋กœ ๊ตฌํ˜„ํ•œ ์ด์œ ๋Š”?

๋‹ต๋ณ€
  • ๋ ˆ์ด์–ด๋ฅผ ๋‚˜๋ˆˆ ์ด์œ 
    • ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ. ๊ฐ ๊ณ„์ธต๊ฐ„์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ (์ถ”์ƒํ™”)
  • ์–ด๋–ค ์‹์œผ๋กœ ๋ ˆ์ด์–ด๋ฅผ ๋‚˜๋ˆ„์—ˆ๋Š”๊ฐ€?
    • Presentation
      • Presentation Layer == UI Layer (Web UI, ์•ฑ, Console๋“ฑ๋“ฑ)
        • UI๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ณ„์ธต. (Martin Flower)
        • the presentation layer doesnโ€™t need to know or worry about how to get customer data; it only needs to display that information on a screen in particular format - Software Architecture Patterns by Mark Richards
      • ์ž์›์— ๋Œ€ํ•œ ํ‘œํ˜„์˜ ์—ญํ• ์„ ๋‹ด๋‹น. (์œ ์ผํ•˜๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ๊ณ„์ธต)
        • presents the applicationโ€™s features and data to the user.
      • ์—ญํ• 
        • ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋ณ€ํ™˜
        • ์ธ์ฆ
        • ์˜ˆ์™ธ์ฒ˜๋ฆฌ (ExceptionHandler)
    • Application
      • Service๊ณ„์ธต์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค!
      • ์ด ๊ณ„์ธต์€ ํŠธ๋žœ์žญ์…˜, ๋„๋ฉ”์ธ ๊ฐ„ ์ˆœ์„œ ๋ณด์žฅ์˜ ์—ญํ• ๋งŒ ํ•œ๋‹ค.
        • ๊ทธ๋Ÿผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๋ˆ„๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ!
        • ๋ฐ”๋กœ ๋„๋ฉ”์ธ(Domain) Layer๋‹ค! -> ๋„๋ฉ”์ธ์— ์ž‘์—… ์œ„์ž„
      • ์—ญํ• 
        • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ
        • ๋„๋ฉ”์ธ ๊ฐ„ ์ˆœ์„œ ๋ณด์žฅ ์—ญํ• 
    • Domain
      • ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• . (ํด๋ผ์ด์–ธํŠธ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฝ”๋“œํ™”์‹œํ‚ค๋Š” ๊ณ„์ธต)
      • ์ด ๊ณ„์ธต์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ƒํ™ฉ์„ ๋ฐ˜์˜ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ์™€ ๊ฐ™์€ ์ƒํƒœ ์ €์žฅ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ์ˆ ์ ์ธ ์„ธ๋ถ€์‚ฌํ•ญ์€ Infra์— ์œ„์ž„ํ•œ๋‹ค.
        • ์ฆ‰, ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ต์‹ , ์ง€์†์„ฑ ์„ธ๋ถ€ ์ •๋ณด๋Š” Infra ๊ณ„์ธต์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค.
    • Infrastructure
      • ์ƒ์œ„ ๊ณ„์ธต์„ ์ง€์›ํ•˜๋Š” ์ผ๋ฐ˜ํ™”๋œ ๊ธฐ์ˆ ์  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. (๊ตฌํ˜„์ฒด)