/images/profile.png

What is Kafka?

ํ•„์ž๊ฐ€ ๋งก๊ณ ์žˆ๋Š” ์„œ๋น„์Šค์— Elastic Stack ์„ ๋„์ž…ํ•˜๋ฉด์„œ ์ค‘๊ฐ„์— ๋ฒ„ํผ๊ฐ€ ํ•„์š”ํ•˜์—ฌ Message-Queue ์‹œ์Šคํ…œ๋“ค์„ ์•Œ์•„๋ณด๋˜ ์ค‘ Kafka ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ฒŒ ๋œ๋‹ค.

๊ธฐ๋ณธ์„ค๋ช… ๋ฐ ๊ธฐ์กด ๋ฉ”์„ธ์ง• ์‹œ์Šคํ…œ๊ณผ ๋‹ค๋ฅธ์ 

  • ๋ฉ”์„ธ์ง• ํ์˜ ์ผ์ข…
  • ๋ง ๊ทธ๋Œ€๋กœ ๋ถ„์‚ฐํ˜• ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ, LinkedIn์—์„œ ์—ฌ๋Ÿฌ ๊ตฌ์ง + ์ฑ„์šฉ ์ •๋ณด๋“ค์„ ํ•œ๊ณณ์—์„œ ์ฒ˜๋ฆฌ(๋ฐœํ–‰/๊ตฌ๋…)ํ• ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์œผ๋กœ ๊ฐœ๋ฐœ์ด ์‹œ์ž‘
  • ๋Œ€์šฉ๋Ÿ‰์˜ ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋˜์–ด ์„ค๊ณ„๋œ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ, ๊ธฐ์กด ๋ฒ”์šฉ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ๋Œ€๋น„ TPS๊ฐ€ ๋งค์šฐ ์šฐ์ˆ˜
  • ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๊ธฐ์กด ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ €์žฅ โ†’ ์นดํ”„์นด ์žฌ์‹œ์ž‘์œผ๋กœ ์ธํ•œ ๋ฉ”์„ธ์ง€ ์œ ์‹ค ์šฐ๋ ค ๊ฐ์†Œ
  • ๊ธฐ์กด์˜ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์—์„œ๋Š” broker๊ฐ€ consumer์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ pushํ•ด ์ฃผ๋Š” ๋ฐฉ์‹์ธ๋ฐ ๋ฐ˜ํ•ด, Kafka๋Š” consumer๊ฐ€ broker๋กœ๋ถ€ํ„ฐ ์ง์ ‘ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ€๋Š” pull ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— consumer๋Š” ์ž์‹ ์˜ ์ฒ˜๋ฆฌ๋Šฅ๋ ฅ๋งŒํผ์˜ ๋ฉ”์‹œ์ง€๋งŒ broker๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
/images/what-is-kafka/kafka2.png

์นดํ”„์นด ์ฃผ์š” ๊ฐœ๋…

  • producer : ๋ฉ”์„ธ์ง€ ์ƒ์‚ฐ(๋ฐœํ–‰)์ž.
  • consumer : ๋ฉ”์„ธ์ง€ ์†Œ๋น„์ž
    • consumer group : consumer ๋“ค๋ผ๋ฆฌ ๋ฉ”์„ธ์ง€๋ฅผ ๋‚˜๋ˆ ์„œ ๊ฐ€์ ธ๊ฐ„๋‹ค.offset ์„ ๊ณต์œ ํ•˜์—ฌ ์ค‘๋ณต์œผ๋กœ ๊ฐ€์ ธ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
  • broker : ์นดํ”„์นด ์„œ๋ฒ„๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  • zookeeper : ์นดํ”„์นด ์„œ๋ฒ„ (+ํด๋Ÿฌ์Šคํ„ฐ) ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ 
  • cluster : ๋ธŒ๋กœ์ปค๋“ค์˜ ๋ฌถ์Œ
  • topic : ๋ฉ”์„ธ์ง€ ์ข…๋ฅ˜
  • partitions : topic ์ด ๋‚˜๋ˆ ์ง€๋Š” ๋‹จ์œ„
  • Log : 1๊ฐœ์˜ ๋ฉ”์„ธ์ง€
  • offset : ํŒŒํ‹ฐ์…˜ ๋‚ด์—์„œ ๊ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ€์ง€๋Š” unique id

์นดํ”„์นด๋Š” ์–ด๋–ค์‹์œผ๋กœ ๋Œ์•„๊ฐ€๋Š”๊ฐ€

  • zookeeper ๊ฐ€ kafka ์˜ ์ƒํƒœ์™€ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค. /images/what-is-kafka/kafka3.png

  • ์ •ํ•ด์ง„ topic ์— producer ๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐœํ–‰ํ•ด๋†“์œผ๋ฉด consumer ๊ฐ€ ํ•„์š”ํ• ๋•Œ ํ•ด๋‹น ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ„๋‹ค. (์—ฌ๊ธฐ์„œ ์นดํ”„์นด๋กœ ๋ฐœํ–‰๋œ ๋ฉ”์„ธ์ง€๋“ค์€ consumer๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ์†Œ๋น„ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์—†์–ด์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์นดํ”„์นด ์„ค์ • log.retention.hours(default : 168[7์ผ])์— ์˜ํ•ด ์‚ญ์ œ๋œ๋‹ค.)

/images/what-is-kafka/kafka4.png
  • partition ๊ฐœ์ˆ˜์™€ consumer group ๊ฐœ๋…
/images/what-is-kafka/kafka5.png
  • ํ•˜์–€์ƒ‰(consumer-01) : ํŒŒํ‹ฐ์…˜ ๊ฐœ์ˆ˜๊ฐ€ 4๊ฐœ์ธ๋ฐ ๋น„ํ•ด ์ปจ์Šˆ๋จธ๊ฐ€ 3๊ฐœ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์–ด๋А ์ปจ์Šˆ๋จธ๊ฐ€ ๋‘๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์„ ๋‹ด๋‹นํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค.
  • ์ฃผํ™ฉ์ƒ‰(consumer-02) : ํŒŒํ‹ฐ์…˜ ๊ฐœ์ˆ˜๊ฐ€ 4๊ฐœ์ธ๋ฐ ๋น„ํ•ด ์ปจ์Šˆ๋จธ๊ฐ€ 5๊ฐœ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•˜๋‚˜์˜ ๋…ธ๋Š”(?) ์ปจ์Šˆ๋จธ๊ฐ€ ์ƒ๊ธฐ๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค.
  • ๊ฐ€์žฅ ์ ์ ˆํ•œ ๊ฐœ์ˆ˜๋Š” ์ •ํ•ด์ง€์ง€ ์•Š์•˜์ง€๋งŒ ํ†ต์ƒ ์ปจ์Šˆ๋จธ๊ทธ๋ฃน์˜ ์ปจ์Šˆ๋จธ ๊ฐœ์ˆ˜์™€ ํŒŒํ‹ฐ์…˜ ๊ฐœ์ˆ˜๋ฅผ ๋™์ผํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€๊ณค ํ•œ๋‹ค.

์ฐธ๊ณ  url

Deview-2017 Day1 ๋ฆฌ๋ทฐ

๋ฒŒ์จ 10๋ฒˆ์งธ Naver์—์„œ ์ฃผ์ตœํ•˜๋Š” Deview. ์˜ฌํ•ด๋„ ์–ด๊น€์—†์ด ์ฐธ์„์„ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฒˆ์—” ๋ณด๊ณ  ๋“ฃ๊ณ  ๋А๊ผˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ์กฐ๊ธˆ์ด๋ผ๋„ ๊ฐ„์งํ•˜๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ๋ฐ”๋กœ ๋ธ”๋กœ๊น…์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. (์˜ค๋žœ๋งŒ์— ๋ธ”๋กœ๊น…์ด๊ธด ํ•˜์ง€๋งŒ…) ํ•ญ์ƒ Deview์— ์˜ฌ๋•Œ๋งˆ๋‹ค ๋А๋ผ๋Š” ๋ถ€๋ถ„์ธ๋ฐ ์ด๋ฒˆ์ฐธ์„์ด 3๋ฒˆ์งธ ๋˜๋Š”๋“ฏ ํ•˜๋‹ค ์„ธ์ƒ์€ ์ข๊ณ  ๋Šฅ๋ ฅ์ž๋Š” ๋งŽ์œผ๋ฉฐ ๋‚ด๊ฐ€ ํ•œ๋ฒˆ์ฏค ๋ณธ๊ฒƒ๋“ค์€ ์ด๋ฏธ ์ง€๋‚˜๊ฐ„ ๊ธฐ์ˆ ๋“ค์ด๋ผ๋Š”๊ฒƒ, ๋”๋ถˆ์–ด ๋‹จ์ƒ์œ„์— ์˜ฌ๋ผ๊ฐ€ ๋ฐœํ‘œํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ์˜ˆ์ „์—” ๋‚˜์™€ ๋˜‘๊ฐ™์ด ๋ฐœํ‘œ๋ฅผ ๋“ฃ๋Š” ์ผ๋ฐ˜ ์‚ฌ๋žŒ์ด์˜€๋‹ค๋Š”๊ฒƒ. ์ด๋ฒˆ์—๋„ ๋งŽ์€ ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ตฌ๊ตฌ์ ˆ์ ˆ ๊ฐœ์ธ์ ์œผ๋กœ ๋А๋‚€์ ์„ ์ ๋Š”๊ฒƒ์— ์•ž์„œ ๊ฐ•ํ•œ ๊ธฐ์–ต์ด ๋‚จ์•˜๋˜ ๋ช‡๋ช‡ ์„ธ์…˜๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ๋ฆฌ๋ทฐ๋ฅผ ๋จผ์ € ํ•˜๋Š”๊ฒŒ ๋งž๋Š” ์ˆœ์„œ๊ฐ™๋‹ค.

์ฑ… ์ฝ์–ด์ฃผ๋Š” ๋”ฅ๋Ÿฌ๋‹ ( ๊น€ํƒœํ›ˆ / ๋ฐ๋ธŒ์‹œ์Šคํ„ฐ์ฆˆ )

์Šฌ๋ผ์ด๋“œ ์ž๋ฃŒ

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

๊ทธ๋Ÿฐ REST API๋กœ ๊ดœ์ฐฎ์€๊ฐ€ ( ์ด์‘์ค€ / ๋น„๋ฐ”๋ฆฌํผ๋ธ”๋ฆฌ์นด )

์Šฌ๋ผ์ด๋“œ ์ž๋ฃŒ

๋ฐœํ‘œ์ž๋ถ„์„ ์–ด๋””์„œ ๋งŽ์ด ๋ดค๋‹ค ํ–ˆ๋”๋‹ˆ๋งŒ ์˜ˆ์ „์— ์šฐ๋ฆฌ ํšŒ์‚ฌ ์‚ฌ๋žŒ์ด์˜€๋‹ค. ์ˆ˜์—…๋„ ๋“ค์–ด๋ดค๊ณ , ๊ฐ™์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””๋„ ํ–ˆ๊ณ (ํ•œ๋ฒˆ ๋‚˜๊ฐ”์ง€๋งŒ…). ๋ฐœํ‘œ ์ฒซ ๋ถ€๋ถ„์— ์ž์‹ ์ด 10๋…„์ „์— ๋ฐ๋ทฐ staff ๋ฅผ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ 10๋…„์„ ๋‹ค ๋ชป์ฑ„์šฐ๊ณ  ํ‡ด์‚ฌ๋ฅผ ํ–ˆ๋‹ค๊ณ  ใ…Žใ…Ž.. ์•„๋ฌดํŠผ ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋ฆ„ ๋ฐ˜๊ฐ€์šด ๋ถ„์ด๋ผ ๋” ๊ด€์‹ฌ๊ฐ–๊ณ  ๋“ฃ๊ฒŒ ๋˜์—ˆ๋‹ค. REST ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?์— ๋Œ€ํ•œ ๋ฐœํ‘œ๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์•„๋ž˜ 3๊ฐ€์ง€์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • REST API ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  REST API๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • REST API ๊ตฌํ˜„์„ ํฌ๊ธฐํ•˜๊ณ  HTTP API ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • REST API ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ REST API ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. (ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ API๋“ค์˜ ์ƒํƒœ)

REST API๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํƒ€์ผ์ค‘ ๋ˆˆ์—ฌ๊ฒจ ๋ณผ๋งŒํ•œ ๋ถ€๋ถ„์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. (uniform interface)

  • self-descriptive messages : ๋ฉ”์‹œ์ง€๋Š” ์Šค์Šค๋กœ ์„ค๋ช…์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • hypermedia as the engine of application state (HATEOAS) : ์ „์ด(์ƒํƒœ์˜ ์ด๋™)๊ฐ€ ๋ ์ˆ˜์žˆ๋Š” ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ฉด REST API๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์ œ๋Œ€๋กœ ์•Œ๊ณ  ๋งŒ๋“ค์–ด๋ผ ๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ•ํ•œ ๋ฐœํ‘œ๋‚ด์šฉ๊ฐ™๋‹ค. ๋‚˜๋„ ์ด์ œ๊นŒ์ง€๋Š” ๊ทธ๋ƒฅ json ์œผ๋กœ ๋‚ด๋ ค์ค€๋‹ค๋Š” ๊ฒƒ, GETใ†POST ๋“ฑ HTTP Method ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋งŒ ์•Œ๊ณ ์žˆ์—ˆ๋Š”๋ฐ ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๋ฐœํ‘œ์ž๋ถ„์ด ๋ง์”€ํ•˜์‹  ๋‘๊ฐ€์ง€ ๋‚ด์šฉ์€ ์ง€ํ‚ค๋Š”๊ฒŒ ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ฆ‰, ์ •๋ง REST ํ•˜๊ฒŒ ๋งŒ๋“ค๊บผ๋ฉด ์ •ํ™•ํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๊ณ  ๋งŒ๋“œ๋Š”๊ฒŒ ์ข‹์•„๋ณด์ธ๋‹ค.

๋™๋„ค ์ปคํ”ผ์ƒต๋„ ์‚ฌ์ด๋ Œ์˜ค๋”๋ฅผ ์“ธ ์ˆ˜ ์žˆ์„๊นŒ? ( ํ—ˆํ˜•, ๋‚˜๋™์ง„ / ์‚ผ์„ฑ์ „์ž[Lunch class] )

์Šฌ๋ผ์ด๋“œ ์ž๋ฃŒ

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

  • PWA(Progressive Web App) : PWA ๋กœ ๋ชจ๋ฐ”์ผ ์ฒญ์ฒฉ์žฅ์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. (๊ฒฐํ˜ผ์‹ ์ „๋‚ ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๊ฒฐํ˜ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ[์ถ”์ฒจ]๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋“ฑ..)
  • Physical Web(Beacon), NFC …
  • Browser Fingerprint (Device ๊ตฌ๋ถ„)
  • Push Nofification
  • Web Payment

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

Apache keepAlive

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

hexo ๋ธ”๋กœ๊ทธ์— tranquilpeak ํ…Œ๋งˆ ์ ์šฉํ•˜๊ธฐ

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

๊ธฐ์กด์—๋Š” hueman์ด๋ผ๋Š” ํ…Œ๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ (๋งํฌ), ์˜ค๋žœ๋งŒ์— ๋ธ”๋กœ๊ทธ๋ฅผ ๋‹ค์‹œ(?) ์‹œ์ž‘ํ•˜๋Š” ๋А๋‚Œ์„ ๋‚ด๋ณด๊ณ  ์‹ถ์—ˆ๊ณ  ๋ณด๋‹ค ๋” ์‹ฌํ”Œํ•˜๊ณ  ์œ ํ–‰์— ์•ˆํƒˆ๊ฒƒ ๊ฐ™์€(์ˆœ์ „ํžˆ ํ•„์ž ์ƒ๊ฐ) ํ…Œ๋งˆ๋ฅผ ์ฐพ์•„๋ณด๋‹ค tranquilpeak์ด๋ผ๋Š” ํ…Œ๋งˆ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์šฐ์„  ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค์น˜๊ณผ์ •์„ ๋‚˜์—ดํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. themes ํด๋”๋‚ด์— ํ…Œ๋งˆํŒŒ์ผ์„ ๋ฐ›์€ํ›„ ์••์ถ• ํ•ด์ œ
  2. ํ…Œ๋งˆ ํด๋” ์ด๋ฆ„์„ ๋ณ€๊ฒฝ
  3. _config.yml ํŒŒ์ผ ๋‚ด์— ํ…Œ๋งˆ ์„ค์ • ๋ถ€๋ถ„ ๋ณ€๊ฒฝ ( theme: tranquilpeak )
  4. hexo clean โ†’ hexo generate โ†’ hexo server(or hexo deploy)

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

  1. npm install
  2. bower install
  3. css ๋‚˜ js ๋ณ€๊ฒฝ
  4. grunt build
  5. hexo clean โ†’ hexo generate โ†’ hexo server(or hexo deploy)

๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ…Œ๋งˆ์— ์ ์šฉ๋œ ํฐํŠธ๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ๋ธ”๋กœ๊ทธ ๋ฅผ ์ฐธ์กฐํ•˜์˜€๋‹ค. (ํ•ด๋‹น ์•„ํ‹ฐํด์—๋‹ค ๋Œ“๊ธ€ํญํƒ„์„ ใ…Žใ…Ž;;)

๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ž

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

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

์ฒซ์ˆ ์— ๋ฐฐ๋ถ€๋ฅด๋žด. ํ•˜๋‚˜๋‘˜์”ฉ ํผ์ฆ ๋งž์ถฐ๋‚˜๊ฐ€๋“ฏ ํ•ด๋ณด๋‹ค๋ณด๋ฉด ๋‚ด ์ž์‹ ์ด ๋ฐ”๋€Œ์–ด ์žˆ๊ฒ ์ง€.

mybatis insert/update ์ฟผ๋ฆฌ์‹คํ–‰ํ›„ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ

Select๋ฌธ์ด ์•„๋‹Œ ๋‹ค๋ฅธ SQL Query(insert, update ๋“ฑ) ๋ฅผ ์‹คํ–‰ํ•˜๊ณ ์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค. ์ •ํ™•ํžˆ ์ž˜ ์ˆ˜ํ–‰๋˜์—ˆ๋‚˜์— ๋Œ€ํ•œ ํ™•์ธ. ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์ˆ˜ํ–‰๋˜์—ˆ๋‚˜๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. โ€ป ์ฐธ๊ณ  url : http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html

useGeneratedKeys, keyProperty ์˜ต์…˜

์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์ƒ์„ฑํ‚ค๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด(mySql ๊ฐ™์€) ํ•ด๋‹น์˜ต์…˜์„ ์ด์šฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด ๋ฐ›์„์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋กœ๋“ค์–ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์•„๋ž˜ ๋ชจ๋ธ๊ฐ์ฒด๋ฅผ ๋„˜๊ธด๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ 

public Student {
  int id;
  String name;
  String email;
  Date regist_date;
}

์•„๋ž˜ mybatis ๊ตฌ๋ฌธ์œผ๋กœ insert๋ฅผ ์‹œ๋„ํ•˜๊ฒŒ๋˜๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธด Student ๊ฐ์ฒด์˜ id๊ฐ’์— insert ํ–ˆ์„๋•Œ์˜ key๊ฐ’(id)์ด ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.

Student student = new Student();
student.setName('bla');
student.setEmail('bla@naver.com');

mapper.insertStudents(student); // ์ฟผ๋ฆฌ์‹คํ–‰
student.getId(); // ์ถ”์ถœ ๊ฐ€๋Šฅ
<insert id="insertStudents" useGeneratedKeys="true" keyProperty="id" parameterType="Student">
  insert into Students ( name, email )
  values ( #{name}, #{email} )
</insert>

selectKey ์˜ต์…˜

Oracle ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” Auto Increment ๊ฐ€ ์—†๊ณ  Sequence๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์˜ต์…˜์„ ์‚ฌ์šฉํ• ์ˆ˜๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์šฐํšŒ์ ์ธ(?) ๋ฐฉ๋ฒ•์œผ๋กœ ์œ„์™€๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋ณผ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋ชจ๋ธ์ด๋‚˜ java๊ตฌ๋ฌธ์€ ์œ„์™€ ๋™์ผํ•˜๊ณ  xml ์ฟผ๋ฆฌ ๋ถ€๋ถ„๋งŒ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

<insert id="insertStudents" parameterType="Student">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select SEQ_ID.nexyval FROM DUAL
  </selectKey>
  insert into Students
    (id, name , email)
  values
    (#{id}, #{name}, #{email})
</insert>

์œ„์™€๊ฐ™์€ ์ฝ”๋“œ์—์„œ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— id๊ฐ’์— Sequence์— ์˜ํ•ด ๊ฐ’์„ ์…‹ํŒ…ํ•˜๊ฒŒ ๋˜๊ณ , ์ž๋™์ ์œผ๋กœ ํ•ด๋‹น ๊ฐ’์„ Student์˜ id์— setํ•˜๊ฒŒ ๋˜์„œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

ํ•ญ์ƒ ํ…Œ์ด๋ธ”์˜ key๊ฐ’์—๋งŒ ํ•ด๋‹นํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. key๊ฐ’๊ณผ๋Š” ์ „ํ˜€ ์ƒ๊ด€์—†๋Š” ๊ฐ’๋„ selectKey ๊ตฌ๋ฌธ์œผ๋กœ ๋ฆฌํ„ดํ• ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ order์˜ต์…˜์„ AFTER๋กœ ์ฃผ๊ณ  ๋ฆฌํ„ดํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์ž…๋ ฅํ• ์‹œ id๊ฐ’์„ Sequence์—์„œ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ˆ˜๋™์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ณ , ์ž…๋ ฅํ–ˆ๋˜ id์— ๋งž๋Š” regist_date ๊ฐ’์„ ๋ฆฌํ„ด๋ฐ›์•„ ์œ„์—์„œ์ฒ˜๋Ÿผ ๋™์ผํ•˜๊ฒŒ ๊ฐ’๋ฅผ ๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค.

<insert id="insertStudents" parameterType="Student">
  <selectKey keyProperty="regist_date" resultType="java.util.Date" order="AFTER">
    select regist_date FROM students WHERE id = #{id}
  </selectKey>
  insert into Students
    (id, name , email, regist_date)
  values
    (#{id}, #{name}, #{email}, syadate)
</insert>