week 4 incheol - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ์ˆ  ๋ฌธ์ œ

JAVA (์ด๊ฒฝํฌ)

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ & ์Šค๋ ˆ๋“œ์„ธ์ดํ”„ํ‹ฐ & ์Šค๋ ˆ๋“œํ’€ ๊ฐ๊ฐ์˜ ํŠน์ง•์„ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ : ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, main() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ, ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„ํ–‰๋œ๋‹ค. ์ด๋Ÿฐ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋Š”๋ฐ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒƒ์„ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(single-thread) ๋ผ๊ณ  ํ•˜๋ฉฐ, ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒƒ์„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(Multi-thread) ํ˜น์€ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ผ ํ•œ๋‹ค.

  • ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ‹ฐ :

    • synchronized : ํ•ด๋‹น ์˜์—ญ์— ๋ฝ์„ ๊ฑธ์–ด์„œ ์“ฐ๋ ˆ๋“œ ์„ธ์ดํ”„ํ•˜๋„๋ก ์œ ์ง€ํ•œ๋‹ค. ์žฅ์ ์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ฝ์„ ๊ฑธ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ๋‹ค์†Œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋‹ค์ˆ˜์˜ ๋ณ‘๋ชฉํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
      • block scope : ํŠน์ • ์˜์—ญ์„ block scope๋กœ ๊ฑธ์–ด๋‘”๋‹ค.
      • method scope : ๋ฉ”์†Œ๋“œ์— ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค.
    • volatile : ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™”๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๋Œ€์‹  ๋‹ค์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ writeํ•  ๊ฒฝ์šฐ์—” ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†๊ณ , ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ write๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋Š” readํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•˜๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ๊ฐ์˜ ์“ฐ๋ ˆ๋“œ๋Š” ์“ฐ๋ ˆ๋“œ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์“ฐ๋ ˆ๋“œ ์บ์‹œ์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๊ณ  ์“ฐ๋ ˆ๋“œ ์บ์‹œ์— ๋ฐ˜์˜๋œ๋‹ค. non-volatile ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ž‘์—…์€ JVM ์ด ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ CPU ์บ์‹œ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ฝ์–ด๋“ค์ด๊ฑฐ๋‚˜, CPU ์บ์‹œ๋กœ๋ถ€ํ„ฐ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ํ•  ๋•Œ์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ๋ณด์žฅ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ volatile ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ, ๋‹จ์ง€ ์ด volatile ๋ณ€์ˆ˜๋งŒ์ด ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด ์“ฐ๋ ˆ๋“œ๊ฐ€ volatile ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ์ˆ˜์ •ํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜๋“ค์ด ํ•จ๊ป˜ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ(flushed)๋œ๋‹ค.
    • concurrentpage โ†’ atomic***
  • ์Šค๋ ˆ๋“œ ํ’€ : ์Šค๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†“์€ ์ผ๋ จ์˜ ์Šค๋ ˆ๋“œ ์ง‘ํ•ฉ์ด๋‹ค. ์Šค๋ ˆ๋“œ ํ’€์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ• ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ์‹คํ–‰๋ ๋•Œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์†Œ๋ฉธํ•˜๋Š” ๋น„์šฉ์€ ๋ฌด์‹œํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠน์ • ์Šค๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋ ๋•Œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋” ํšจ์œจ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ์Šค๋ ˆ๋“œํ’€์„ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก java.util.concurrent Package์—์„œ ExecutorService ์ธํ„ฐํŽ˜์ด์Šค์™€ Excutors ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. Executors์˜ ๋‹ค์–‘ํ•œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Executor Service ๊ตฌํ˜„๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์Šค๋ ˆ๋“œ ํ’€์ด๋‹ค.

    • ์Šค๋ ˆ๋“œ ํ’€์„ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋Š” execute(), submit()์ด ์žˆ๋‹ค.
    • ์žฅ์ 
      • ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
      • ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋‹จ์ 
      • ๋„ˆ๋ฌด ๋งŽ์ด ์ƒ์„ฑํ•ด๋†“์œผ๋ฉด ์˜คํžˆ๋ ค ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋…ธ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋ฐ”์—์„œ๋Š” forkJoinPool์„ ์ง€์›ํ•œ๋‹ค.
    • ForkJoinPool์˜ ์ ˆ์ฐจ๋ฅผ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์ด์•ผ๊ธฐ ํ•˜๋ฉด
      1.  ํฐ ์—…๋ฌด๋ฅผ ์ž‘์€ ๋‹จ์œ„์˜ ์—…๋ฌด๋กœ ์ชผ๊ฐ ๋‹ค.
      2. ๋ถ€๋ชจ ์“ฐ๋ ˆ๋“œ๋กœ ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ๋กœ์ง์„ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ์—์„œ ์ชผ๊ฐœ์ง„ ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰(Fork) ์‹œํ‚จ๋‹ค.
      3. 2์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€, ํŠน์ • ์“ฐ๋ ˆ๋“œ์—์„œ ๋”์ด์ƒ Fork๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ  ์—…๋ฌด๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ€๋ชจ ์“ฐ๋ ˆ๋“œ์—์„œ Joinํ•˜์—ฌ ๊ฐ’์„ ์ทจํ•ฉํ•œ๋‹ค.
      4. 3์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ์ตœ์ดˆ์— ForkJoinPool์„ ์ƒ์„ฑํ•œ ์“ฐ๋ ˆ๋“œ๋กœ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์—ฌ ์ž‘์—…์„ ์™„๋ฃŒํ•œ๋‹ค.

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

    ๊ทธ๋ฆผ 1)

    https://mblogthumb-phinf.pstatic.net/20160609_158/2feelus_1465431425719GQ0V2_PNG/2016-06-09_at_9.17.47_AM.png?type=w2

Hashtable๊ณผ HashMap์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

hashtable๊ณผ hashmap

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

์ด๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด HashMap์„, ๋™๊ธฐํ™” ๋ณด์žฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Hashtable์„ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

HashMap๊ณผ Hashtable์€ ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•˜๋Š๋ƒ ํ•˜์ง€ ์•Š๋Š๋ƒ๋Š” ์ธก๋ฉด ์ด์™ธ์—๋Š” ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค. ์‚ฌ์šฉ๋ฒ•๋„ ๋˜‘๊ฐ™์•„, put() ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ , get() ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœํ•˜๋ฉด๋œ๋‹ค.

Vector๋Š” ๋ฐ์ดํ„ฐ(Data)์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋งŒ์„ ์ด์šฉํ–ˆ์ง€๋งŒ, Hashtable์€ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ํ‚ค์™€ ๊ฐ’์„ ํ•จ๊ป˜ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด์˜ ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์„ธ์š”.

  • ์ง๋ ฌํ™”๋ž€ data๋ฅผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก byte ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.
  • serialversionUID๊ฐ’์€ ์ง๋ ฌํ™”ํ•˜๋ฉด์„œ ํ•จ๊ป˜ ์ •์˜ํ•ด์ฃผ๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ์—ญ์ง๋ ฌํ™”ํ•  ๊ฒฝ์šฐ์— ๋ชจ๋ธ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ UID๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • String -> StringBuilderint -> long์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ์—ญ์ง๋ ฌํ™”์—์„œ Exception์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋ฐ” ์ง๋ ฌํ™”๋Š” ์ƒ๋‹นํžˆ ํƒ€์ž…์˜ ์—„๊ฒฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๋น ์ง€๊ฒŒ ๋œ๋‹ค๋ฉด Exception ๋Œ€์‹  null๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SPRING (์ •์ธ์ฒ )

Spring Security ๊ณผ์ •์„ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜์‹œ์˜ค

https://k.kakaocdn.net/dn/cAp74D/btqAWyBRZsE/Lk6EL0R680ykd45G6A5rK1/img.png

์œ„ ๊ทธ๋ฆผ์˜ ๋™์ž‘ ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. WebSecurityConfigurerAdapter ๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ณด์•ˆ ์„ค์ •์œผ๋กœ ๊ตฌ์„ฑ๋œ ํด๋ž˜์Šค ๊ตฌํ˜„์ฒด์ด๋‹ค. ์ด๋ฅผ ์ƒ์†๋ฐ›์•„ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ ‘๊ทผ ๊ถŒํ•œ์ด๋‚˜ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฐฉ์‹ ๋“ฑ๋“ฑ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊ฑด์ง€ ๊ฒฐ์ •ํ•˜์—ฌ configure ๊ธฐ๋Šฅ์— ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.
  2. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ •๋ณด์™€ ํ•จ๊ป˜ ์ธ์ฆ ์š”์ฒญ(Http Request)
  3. AuthenticationFilter๊ฐ€ ์ด ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ•๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ฐ€๋กœ์ฑˆ ์ •๋ณด๋ฅผ ํ†ตํ•ด UsernamePasswordAuthenticationToken์ด๋ผ๋Š” ์ธ์ฆ์šฉ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. AuthenticationManager์˜ ๊ตฌํ˜„์ฒด์ธ ProviderManager์—๊ฒŒ UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  5. ๋‹ค์‹œ AuthenticationProvider์— UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  6. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” UserDetailsService์— ์‚ฌ์šฉ์ž ์ •๋ณด(์•„์ด๋””)๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
  7. ๋„˜๊ฒจ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ†ตํ•ด DB์—์„œ ์ฐพ์€ ์‚ฌ์šฉ์ž ์ •๋ณด์ธ UserDetails ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋•Œ UserDetails ๋Š” ์ธ์ฆ์šฉ ๊ฐ์ฒด์™€ ๋„๋ฉ”์ธ์šฉ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ธ์ฆ์šฉ ๊ฐ์ฒด์— ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  8. AuthenticationProvider๋Š” UserDetails๋ฅผ ๋„˜๊ฒจ๋ฐ›๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  9. ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ถŒํ•œ ๋“ฑ์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์€ Authentication ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  10. ๋‹ค์‹œ ์ตœ์ดˆ์˜ AuthenticationFilter์— Authentication ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  11. Authentication ๊ฐ์ฒด๋ฅผ SecurityContext์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ SecurityContextHolder๋Š” ์„ธ์…˜ ์˜์—ญ์— ์žˆ๋Š” SecurityContext์— Authentication ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜์— ์‚ฌ์šฉ์ž์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์ „ํ†ต์ ์ธ ์„ธ์…˜-์ฟ ํ‚ค ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Spring ๋ฉ”์‹œ์ง€ ํ Rabiit MQ vs KAFKA

๋ฉ”์‹œ์ง€ ํ์˜ ์žฅ์ 

  • ๋น„๋™๊ธฐ(Asynchronous): Queue์— ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋น„๋™์กฐ(Decoupling): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํƒ„๋ ฅ์„ฑ(Resilience): ์ผ๋ถ€๊ฐ€ ์‹คํŒจ ์‹œ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๊ณผ์ž‰(Redundancy): ์‹คํŒจํ•  ๊ฒฝ์šฐ ์žฌ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณด์ฆ(Guarantees): ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋œ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ™•์žฅ์„ฑ(Scalable): ๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์Šค๋“ค์ด ํ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ํ ์‚ฌ์šฉ์ฒ˜

  • ๋‹ค๋ฅธ ๊ณณ์˜ API๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฉ”์ผ ๋ฐœ์†ก ๋ฐ ๋ฌธ์„œ ์—…๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋งŽ์€ ์–‘์˜ ํ”„๋กœ์„ธ์Šค๋“ค์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RabbitMQ

  • ๊ตฌ์„ฑ์ด ์‰ฝ๋‹ค.

  • ์œ ์—ฐํ•œ ๋ผ์šฐํŒ…์ด ๊ฐ€๋Šฅํ•˜๋ฉด ๊ด€๋ฆฌ UI ๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค.

  • ์ œํ’ˆ ์„ฑ์ˆ™๋„๊ฐ€ ๋†’๋‹ค.

  • ๊ฐœ๋ฐฉํ˜• ํ”„๋กœํ† ์ฝœ์„ ์œ„ํ•œ AMQP ๋ฅผ ๊ตฌํ˜„์œ„ํ•ด ๊ฐœ๋ฐœ

  • ํ•„์š”์— ๋”ฐ๋ผ ๋™๊ธฐ/๋น„๋™๊ธฐ์‹์ด ๊ฐ€๋Šฅํ•จ

  • ์†Œ๋น„์ž์ค‘์‹ฌ์˜ ์„ค๊ณ„

  • 20k/sec ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅ

Apache Kafka

  • ๊ตฌ๋…๋ฐฉ์‹์˜ ๋น„๋™๊ธฐ์‹ ๊ตฌ์„ฑ

  • ๊ณ ์„ฑ๋Šฅ ๊ณ ๊ฐ€์šฉ์„ฑ

  • ๋ถ„์‚ฐ์ฒ˜๋ฆฌ์— ํšจ๊ณผ์ ์œผ๋กœ ์„ค๊ณ„ ๋จ.

  • ์ƒ์‚ฐ์ž ์ค‘์‹ฌ์˜ ์„ค๊ณ„

  • ๋ฒ”์šฉ ๋ฉ”์„ธ์ง• ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์€ ์ œ๊ณต๋˜์ง€ ์•Š์Œ.

  • 100k/sec ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅ

  • ๊ฒฐ๋ก 

    ๊ธฐ์กด์˜ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์—์„œ๋Š” broker๊ฐ€ consumer์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ pushํ•ด ์ฃผ๋Š” ๋ฐฉ์‹์ธ๋ฐ ๋ฐ˜ํ•ด, Kafka๋Š” consumer๊ฐ€ broker๋กœ๋ถ€ํ„ฐ ์ง์ ‘ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ€๋Š” pull ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ consumer๋Š” ์ž์‹ ์˜ ์ฒ˜๋ฆฌ๋Šฅ๋ ฅ๋งŒํผ์˜ ๋ฉ”์‹œ์ง€๋งŒ broker๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๊ธฐ์กด์˜ push ๋ฐฉ์‹์˜ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์—์„œ๋Š” broker๊ฐ€ ์ง์ ‘ ๊ฐ consumer๊ฐ€ ์–ด๋–ค ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๊ณ  ์–ด๋–ค ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌ ์ค‘์ธ์ง€ ํŠธ๋ž™ํ‚นํ•˜์˜€๋‹ค๋ฉด, Kafka์—์„œ๋Š” consumenr๊ฐ€ ์ง์ ‘ ํ•„์š”ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ broker๋กœ ๋ถ€ํ„ฐ pullํ•˜๋ฏ€๋กœ broker์˜ consumer์™€ ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์ด ๊ฒฝ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • ๋ฉ”์‹œ์ง€๋ฅผ pull ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ, ๋ฉ”์‹œ์ง€๋ฅผ ์Œ“์•„๋‘์—ˆ๋‹ค๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” batch consumer์˜ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    ํ์˜ ๊ธฐ๋Šฅ์€ **๊ธฐ์กด์˜ JMS์˜ AMQP ๊ธฐ๋ฐ˜์˜ RabbitMQ(๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…, ํŽ˜๋ฐ๋ ˆ์ด์…˜ ๊ธฐ๋Šฅ ๋“ฑ)**๋“ฑ์— ๋น„ํ•ด์„œ๋Š” ๋งŽ์ด ๋ถ€์กฑํ•˜์ง€๋งŒ ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์„ธ์ง€๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ ์šฉ๋Ÿ‰ ๋ฟ ์•„๋‹ˆ๋ผ, ๋ณต์‚ฌ๋ณธ์„ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋…ธ๋“œ ์žฅ์• ์— ๋Œ€ํ•œ ์žฅ์•  ๋Œ€์‘์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฉ๋Ÿ‰์—๋Š” ํ™•์‹คํ•˜๊ฒŒ ๊ฐ•์ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Spring์˜ Filter์™€ Interceptor์˜ ์ฐจ์ด์ ์„ ์•„๋Š”๊ฐ€?

  • Filter์™€ Interceptor๋Š” ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด ๋‹ค๋ฅด๋‹ค.

  • Filter๋Š” Web Application์— ๋“ฑ๋ก์„ ํ•˜๊ณ , Interceptor๋Š” Spring์˜ Context์— ๋“ฑ๋ก์„ ํ•œ๋‹ค.

  • Interceptor๋Š” ServletDispatcher ๋‚ด์— ์‹คํ–‰ํ•จ. ๋”ฐ๋ผ์„œ @ControllerAdvice @ExceptionHandler๋ฅผ ์ด์šฉํ•ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

  • Interceptor๋Š” Handler๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์ „(preHandle), Handler๋ฅผ ์‹คํ–‰ํ•œ ํ›„(postHandle), view๋ฅผ ๋ Œ๋”๋งํ•œ ํ›„(afterCompletion) ๋“ฑ, Servlet๋‚ด์—์„œ๋„ ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ์‹คํ–‰ ์‹œ์ ์„ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐ„๋‹ค.

  • Filter๋Š” ServletRequest ํ˜น์€ ServletResponse๋ฅผ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    public class SomeFilter implements Filter {
      //...
      
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        chain.doFilter(new CustomServletRequest(), new CustomResponse());
      }
    }
  • Interceptor์™€ Filter๋Š” Servlet ๋‹จ์œ„์—์„œ ์‹คํ–‰๋œ๋‹ค. <> ๋ฐ˜๋ฉด AOP๋Š” ๋ฉ”์†Œ๋“œ ์•ž์— ProxyํŒจํ„ด์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋œ๋‹ค.

  • ํ•„ํ„ฐ๋Š” ๋นˆ์€ ์•„๋‹ˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋นˆ ์„ค์ •์œผ๋กœ ๋“ฑ๋ก์€ ํ• ์ˆ˜ ์žˆ๋‹ค.

  • ํ•„ํ„ฐ๋Š” ๋นˆ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•„ํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๋นˆ์— ์ฃผ์ž…๋ ์ˆ˜๋Š” ์—†๋‹ค.

  • ํ•„ํ„ฐ๋Š” ๋ณธ์ธ์€ ์ฃผ์ž…๋ ์ˆœ ์—†์–ด๋„ ๋‹ค๋ฅธ ๋นˆ๋“ค์„ ์ฃผ์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ• ์ˆœ ์žˆ๋‹ค.

  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ž‘ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ๋Š” ๊ฐ™์€ ๋ฒ”์œ„์ด๋‹ค.

  • ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ๋Š” ์‹œํ๋ฆฌํ‹ฐ์— ๊ด€ํ•œ ๋นˆ๋“ค์„ ์‚ฌ์šฉํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

DATABASE/SQL (์žฅ์ง€์ˆ˜)

RDB์˜ ๋ฐ๋“œ๋ฝ์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ๊ณผ ๊ต์ฐฉ์ƒํƒœ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐฐํƒ€์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฝ์„ ํš๋“ํ•˜๋ ค ํ• ๋•Œ (์ฝ์–ด๊ฐ€๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ) ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉดSELECT ... LOCK IN SHARE MODE ์‚ฌ์šฉ
  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐฐํƒ€์ ์œผ๋กœ ์ฝ๊ฑฐ๋‚˜, ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฝ์„ ํš๋“ํ•˜๋ คํ•  ๋•Œ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด SELECT ... FOR UPDATE ์‚ฌ์šฉ

DB ์˜ตํ‹ฐ๋งˆ์ด์ €์— ๋Œ€ํ•ด ์•„๋Š”๊ฐ€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์˜ 3๋‹จ๊ณ„

๋ณตํ•ฉ์ธ๋ฑ์Šค, ๋‹จ์ผ์ธ๋ฑ์Šค์˜ ์ฐจ์ด์™€ ๋ณตํ•ฉ์ธ๋ฑ์Šค ์‚ฌ์šฉ์‹œ ์ฃผ์˜์ ์€?

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

  • ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์€ '์ด์ง„ํŠธ๋ฆฌ ๊ฒ€์ƒ‰'์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์ด ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ '์‚ฝ์ž…', '์‚ญ์ œ', '์ˆ˜์ •'์ด ์ž์ฃผ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋ฉด์„œ ์‚ฝ์ž…, ์‚ญ์ œ, ์ˆ˜์ •์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  • ๊ฒฐํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

    - AND ์—ฐ์‚ฐ์ž์— ์˜ํ•ด ์ž์ฃผ ๊ฐ™์ด ์งˆ์˜ ๋˜๋Š” ์ปฌ๋Ÿผ๋“ค

    - ๋‹ค์ˆ˜์˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์งˆ์˜๊ฐ€ ํŠน์ • ์ปฌ๋Ÿผ๋“ค์„ ์งˆ์˜

  • ์ฆ‰, ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์žก๋Š”๋‹ค๋ฉด ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€์ˆœ์—์„œ ๋‚ฎ์€์ˆœ์œผ๋กœ (group_no, from_date, is_bonus) ๊ตฌ์„ฑํ•˜๋Š”๊ฒŒ ๋” ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค ์กฐํšŒ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

    • betweenlike<> ๋“ฑ ๋ฒ”์œ„ ์กฐ๊ฑด์€ ํ•ด๋‹น ์ปฌ๋Ÿผ์€ ์ธ๋ฑ์Šค๋ฅผ ํƒ€์ง€๋งŒ, ๊ทธ ๋’ค ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ๋“ค์€ ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ์ฆ‰, group_no, from_date, is_bonus์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์žกํ˜€์žˆ๋Š”๋ฐ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ where group_no=XX and is_bonus=YY and from_date > ZZ๋“ฑ์œผ๋กœ ์žก์œผ๋ฉด is_bonus๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ๋ฒ”์œ„์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ๊ธฐ์–ตํ•˜์‹œ๋ฉด ์ข€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.
    • ๋ฐ˜๋Œ€๋กœ =in ์€ ๋‹ค์Œ ์ปฌ๋Ÿผ๋„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • in์€ ๊ฒฐ๊ตญ =๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰์‹œํ‚จ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
      • ๋‹จ, in์€ ์ธ์ž๊ฐ’์œผ๋กœ ์ƒ์ˆ˜๊ฐ€ ํฌํ•จ๋˜๋ฉด ๋ฌธ์ œ ์—†์ง€๋งŒ, ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๋„ฃ๊ฒŒ๋˜๋ฉด ์„ฑ๋Šฅ์ƒ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
      • in์˜ ์ธ์ž๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์™ธ๋ถ€๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , in ์€ ์ฒดํฌ์กฐ๊ฑด์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • AND์—ฐ์‚ฐ์ž๋Š” ๊ฐ ์กฐ๊ฑด๋“ค์ด ์ฝ์–ด์™€์•ผํ•  ROW์ˆ˜๋ฅผ ์ค„์ด๋Š” ์—ญํ• ์„ ํ•˜์ง€๋งŒ, or ์—ฐ์‚ฐ์ž๋Š” ๋น„๊ตํ•ด์•ผํ•  ROW๊ฐ€ ๋” ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์ด ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.
      • WHERE ์—์„œ OR์„ ์‚ฌ์šฉํ• ๋•Œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ๊ฐ’ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      • ์ธ๋ฑ์Šค๋Š” ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • where salary * 10 > 150000;๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋ชปํƒ€์ง€๋งŒ, where salary > 150000 / 10; ์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • ์ปฌ๋Ÿผ์ด ๋ฌธ์ž์—ด์ธ๋ฐ ์ˆซ์ž๋กœ ์กฐํšŒํ•˜๋ฉด ํƒ€์ž…์ด ๋‹ฌ๋ผ ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์œ ๋ฝ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

โš ๏ธ **GitHub.com Fallback** โš ๏ธ