๐Ÿ“… 2024.04.15 85์ผ์ฐจ

  • ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋Œ€์ฒด

๐Ÿ“… 2024. 04. 16 86์ผ์ฐจ


๐ŸŽฌ chat_app_24_04

๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๊ณ„์† ํ˜ธ์ถœํ•œ๋‹ค.

์™œ? ๋‹ค๋ฅธ์ชฝ์—์„œ ์ฑ„ํŒ…์„ ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ ๊ณ„์† ์ฐ์–ด๋ณด๋Š”๊ฑฐ๋‹ค.

๊ทธ๋Ÿผ ์ฑ„ํŒ…์„ ํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋ฉด ๋ ๊นŒ?

  • sse์„ ์ด์šฉํ•ด๋ณด์ž
const sse = new EventSource("/sse/connent");

sse.addEventListener('chat_messageAdded', e => {
  Chat__loadMore();
  }
)
  • ์–ด๋–ค ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ~~๊ฒŒ ์‹คํ–‰ํ•ด!!

SSE ๋ฐฑ์—”๋“œ ์ž‘์—…

JPA OSIV์˜ ๋ฌธ์ œ์  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•


์˜ค๋Š˜์˜ ๊ฐœ๋…

sse๋ž€?

SSE : Server-Sent-Event์˜ ์•ฝ์ž๋กœ, ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์›น ๊ธฐ์ˆ .

  • sse ํ†ต์‹ ๋ฐฉ์‹

OSIV(Open Session In View)๋ž€?

OSIV๋ž€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„ธ์…˜ ๊ด€๋ฆฌ ์ „๋žต ์ค‘ ํ•˜๋‚˜๋กœ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ ๊ฐ’์ด True๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.

  • sse๋ž‘ OSIV๋ž‘ ๊ถํ•ฉ x

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ HTTP ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ(Connection)์ด ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ด์— ๋”ฐ๋ผ ๋งŽ์€ ์ˆ˜์˜ DB ์ปค๋„ฅ์…˜์ด ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ OSIV ์˜ต์…˜์„ True๋กœ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘์ฒ˜๋Ÿผ ์ตœ์ดˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ์‹œ์ž‘ ์‹œ์ ๋ถ€ํ„ฐ API ์‘๋‹ต์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ์œ ์ง€ํ•œ๋‹ค.

์žฅ์ 

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

๋‹จ์ 

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ API๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ 10์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด, 10์ดˆ ๋™์•ˆ ์ปค๋„ฅ์…˜์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
    ์ฆ‰, ๋„ˆ๋ฌด ์˜ค๋žœ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ, ์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค์ผ ๊ฒฝ์šฐ ์ปค๋„ฅ์…˜์ด ๋ถ€์กฑํ•ด ์‹œ์Šคํ…œ ์žฅ์• ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

OSIV๋ฅผ ๋„๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•  ๋•Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹ซ๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜๋„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์žฅ์ 

  • ์ปค๋„ฅ์…˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹จ์ 

  • ์ง€์—ฐ ๋กœ๋”ฉ์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ด์•„ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ซํ˜”๊ธฐ ๋•Œ๋ฌธ์—ย ๋ชจ๋“  ์ง€์—ฐ๋กœ๋”ฉ์„ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    ์ง€์—ฐ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ์—์„œ OSIV๋ฅผ ๋„๊ณ  ์‹คํ–‰ํ•˜๋ฉด LazyInitializationException ์ด ๋ฐœ์ƒํ•œ๋‹ค.

  • ์ด ๊ฒฝ์šฐย ์ง€์—ฐ ๋กœ๋”ฉ ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, fetch join์„ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

OSIV๊ฐ€ true๋ฉด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํŽธ๋ฆฌํ•˜๊ณ , false๋ฉด ์ปค๋„ฅ์…˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋˜์ง€๋งŒ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
๊ทธ๋Ÿผ ์–ธ์ œ OSIV๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?
์š”์ฒญ์ด ๋งŽ์ง€ ์•Š์€ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋‚˜ ์ปค๋„ฅ์…˜์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ณณ์—์„œ๋Š” true
๊ณ ๊ฐ ์„œ๋น„์Šค ์‹ค์‹œ๊ฐ„ API๋Š” false (ex: ์ฑ„ํŒ… ๊ธฐ๋Šฅ)


์Šคํ”„๋ง ๋ฐฐ์น˜(Spring Batch)๋ž€?

์Šคํ”„๋ง ๋ฐฐ์น˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์˜ ๊ฐ•๋ ฅํ•œ ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๋ฐฐ์น˜ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

  • ์Šคํ”„๋ง๋ฐฐ์น˜ ๊ฐœ์š”

์Šคํ”„๋ง ๋ฐฐ์น˜๋Š” ๋กœ๊น…/์ถ”์ , ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ์ž‘์—… ์ฒ˜๋ฆฌ ํ†ต๊ณ„, ์ž‘์—… ์žฌ์‹œ์ž‘, ๊ฑด๋„ˆ๋›ฐ๊ธฐ, ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ๋“ฑ ๋Œ€์šฉ๋Ÿ‰ ๋ ˆ์ฝ”๋“œ ์ฒ˜๋ฆฌ์— ํ•„์ˆ˜์ ์ธ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋˜ํ•œ ์ตœ์ ํ™” ๋ฐ ํŒŒํ‹ฐ์…”๋‹ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ๋Œ€์šฉ๋Ÿ‰ ๋ฐ ๊ณ ์„ฑ๋Šฅ ์ผ๊ด„ ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ณ ๊ธ‰ ๊ธฐ์ˆ  ์„œ๋น„์Šค ๋ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋‹จ์ˆœํ•˜๊ณ  ๋ณต์žกํ•œ ๋Œ€์šฉ๋Ÿ‰ ์ผ๊ด„ ์ž‘์—…์€ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ ๋ฐฉ์‹์œผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒ๋‹นํ•œ ์–‘์˜ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ => ๊ธฐ์ค€

์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ๊ฐ€
-> ์˜ˆ => ์ผ๋ฐ˜ ์›น ์•ฑ
-> ์•„๋‹ˆ์š” => ๋ฐฐ์น˜(์ผ๊ด„์ฒ˜๋ฆฌ) ์•ฑ

ํšŒ์›๊ฐ€์ž…

  • ์ผ๋ฐ˜ or ๋ฐฐ์น˜

์ฃผ์— ํ•œ ๋ฒˆ์”ฉ ์ „์ฒด ํšŒ์›๋“ค์—๊ฒŒ ๊ด‘๊ณ  ๋ฉ”์ผ์„ ๋ฐœ์†ก (๋ฐฐ์น˜)

ํšŒ์›๊ฐ€์ž… ํ›„ ๊ฐ€์ž…์ธ์‚ฌ๋ฅผ ๋ฉ”์ผ๋กœ ๋ฐœ์†ก (์ผ๋ฐ˜)

Batch (๋‹จ์œ„๊ฐ€ ํฐ, ์‹คํ–‰์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋” ๊ฑธ๋ฆฌ๋Š”)

GET /member/join -> ํšŒ์›๊ฐ€์ž… ํ’ˆ
GET /member/sendWebZineToAllMember < ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜๊ฑธ๋ฆผ

batch ์‚ฌ์šฉ
GET /batch/member/sendWebZineToAllMember


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