SSE ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ฐœ์„ ๊ธฐ

2025. 9. 2. 23:05ยทProject

๋ฌธ์ œ ์ƒํ™ฉ

์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด SSE๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์•Œ๋ฆผ ์ „์†ก ๋กœ์ง์€ Spring Event๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 1000๋ช…์ด ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ 1000๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ 10๋งŒ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ, ์‘๋‹ต ์‹œ๊ฐ„์— ์‹ฌ๊ฐํ•œ ์ง€์—ฐ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์•Œ๋ฆผ ๋ฉ”์„ธ์ง€ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ์›๋ณธ ํŠธ๋žœ์žญ์…˜๊นŒ์ง€ ๋กค๋ฐฑ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

 

๋ฌธ์ œ ๋ถ„์„

HikariCP Connection Pool (Pending ๋˜๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์Œ)

๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฐ๊ณผ, ๋ถ€ํ•˜ ๋ฐœ์ƒ ์‹œ HikariCP์˜ Active ์ปค๋„ฅ์…˜ ์ˆ˜์น˜๊ฐ€ ์ตœ๋Œ€์น˜์— ๋„๋‹ฌํ•˜๊ณ , DB ์ปค๋„ฅ์…˜์„ ํ• ๋‹น๋ฐ›๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๋Š” Pending ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜๋Š” ํ˜„์ƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” DB ์ปค๋„ฅ์…˜์ด ์žฅ๊ธฐ๊ฐ„ ์ ์œ ๋˜์–ด ํ›„์† ์š”์ฒญ๋“ค์ด ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ฒช๊ณ  ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

๊ทผ๋ณธ ์›์ธ

๋ฌธ์ œ์˜ ํ•ต์‹ฌ ์›์ธ์€ Spring Event์˜ ๋™๊ธฐ์  ์‹คํ–‰ ๋ฐฉ์‹๊ณผ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

@Component
@RequiredArgsConstructor
public class NotificationEventListener {
	
	private final NotificationService notificationService;
	private final SseService sseService;
	
	@EventListener
	public void handleNotificationEvent(NotificationEvent event) {
		notificationService.createNotification(event);
		sseService.send(event);
	}
	
}

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

 

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋•Œ๋ฌธ์—, ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋กœ์ง(SSE ์•Œ๋ฆผ ์ „์†ก, ์•Œ๋ฆผ ์ €์žฅ)์ด ์™„๋ฃŒ ๋ ๋•Œ๊นŒ์ง€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  DB ์ปค๋„ฅ์…˜์„ ๊ณ„์† ์ ์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ปค๋„ฅ์…˜์˜ ์ ์œ  ์‹œ๊ฐ„์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ธธ์–ด์ง€๋ฉด์„œ, ์ปค๋„ฅ์…˜ ํ’€ ๊ณ ๊ฐˆ์„ ์ดˆ๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

๊ฒฐ๊ณผ์ ์œผ๋กœ, ํ›„์† ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค์ด ์ปค๋„ฅ์…˜์„ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ธ‰์ฆํ•˜์—ฌ, ์‘๋‹ต ์ง€์—ฐ๊ณผ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

๊ฐœ์„  ๋ฐฉ์•ˆ

1์ฐจ ๊ฐœ์„ 

@Component
@RequiredArgsConstructor
public class NotificationEventListener {
	
	private final NotificationService notificationService;
	private final SseService sseService;
	
	@Async("notificationExecutor")
	@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
	public void handleNotificationEvent(NotificationEvent event) {
		notificationService.createNotification(event);
		sseService.send(event);
	}
	
}

์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด @EventListener๋ฅผ @TransactionalEventListener(phase = AFTER_COMMIT)์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ, ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ปค๋ฐ‹๋œ ์ดํ›„์—๋งŒ ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•˜์˜€๊ณ  @Async ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ ํ’€์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

1์ฐจ ๊ฐœ์„  ๊ฒฐ๊ณผ

1์ฐจ ๊ฐœ์„ ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง๊ณผ ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ๋กœ์ง์˜ ์Šค๋ ˆ๋“œ์™€ ํŠธ๋žœ์žญ์…˜์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ DB ์ปค๋„ฅ์…˜์„ ์ ์œ ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ค„์—ฌ API ์‘๋‹ต ์‹œ๊ฐ„์€ ๊ฐœ์„ ๋˜์—ˆ์ง€๋งŒ, ์ด๋Š” ๋ฌธ์ œ์˜ ์ผ๋ถ€๋งŒ์„ ํ•ด๊ฒฐํ–ˆ์„ ๋ฟ์ด๋ฉฐ, ์—ฌ์ „ํžˆ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์ด ๋‚จ์•„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

1์ฐจ ๊ฐœ์„  ๋ฌธ์ œ์ 

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

 

1000๋ช…์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ 1000๋ช…์ด API๋ฅผ ์š”์ฒญํ•œ ์ƒํ™ฉ

๋˜ํ•œ, SSE ์—ฐ๊ฒฐ์€ API ์„œ๋ฒ„์˜ Tomcat ์ปค๋„ฅ์…˜์„ ์žฅ๊ธฐ๊ฐ„ ์ ์œ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ๋‹ค์ˆ˜์˜ SSE ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์„ ๋•Œ, ๊ทธ ๋งŒํผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋„ฅ์…˜์ด ์ค„์–ด๋“ค๊ฒŒ ๋˜๊ณ , ๋น„๋™๊ธฐ ์•Œ๋ฆผ ์ฒ˜๋ฆฌ๊นŒ์ง€ ์ฆ๊ฐ€ํ•œ๋‹ค๋ฉด, ๊ฐ€์šฉ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณ ๊ฐˆ๋˜์–ด ์ƒˆ๋กœ์šด API ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์žฅ์• ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

2์ฐจ ๊ฐœ์„ 

1์ฐจ ๊ฐœ์„ ์œผ๋กœ API ์‘๋‹ต ์†๋„๋Š” ๊ฐœ์„ ํ–ˆ์ง€๋งŒ, ์„œ๋ฒ„์˜ CPU ๋ฐ ์Šค๋ ˆ๋“œ ๊ณ ๊ฐˆ์— ๋Œ€ํ•œ ์œ„ํ—˜์€ ์—ฌ์ „ํžˆ ๋‚จ์•„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์„ API ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ณ€๊ฒฝ์„ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

๋‘ ์‹œ์Šคํ…œ์„ ์•ˆ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ์ˆ ๋กœ ๋ฉ”์„ธ์ง€ ํ๋ฅผ ๋„์ž…ํ–ˆ๊ณ , ์—ฌ๋Ÿฌ ์„ ํƒ์ง€ ์ค‘ RabbitMQ๋ฅผ ์ตœ์ข… ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

 

RabbitMQ๋ฅผ ์„ ํƒํ•œ ์ด์œ 

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

 

RabbitMQ๋Š” Smart Broker ๋ชจ๋ธ๋กœ, ๋ธŒ๋กœ์ปค๊ฐ€ ๋ฉ”์„ธ์ง€ ์ปจ์Šˆ๋จธ์—๊ฒŒ ์ ๊ทน์ ์œผ๋กœ ๋ฐ€์–ด์ฃผ๋Š” Push ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๋ถ€ํ•ฉํ–ˆ์ง€๋งŒ, Kafka๋Š” Dumb Broker ๋ชจ๋ธ๋กœ, ์ปจ์Šˆ๋จธ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ธŒ๋กœ์ปค์—๊ฒŒ ์ƒˆ ๋ฉ”์„ธ์ง€๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•˜๋Š” Pull ๋ฐฉ์‹์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ์— ๋” ์ตœ์ ํ™”๋œ ๋ชจ๋ธ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

๊ฒฐ๋ก ์ ์œผ๋กœ ์ง€์—ฐ ์‹œ๊ฐ„์ด ํ•ต์‹ฌ์ธ SSE์—๋Š” RabbitMQ๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

์•„ํ‚คํ…์ฒ˜

API ์„œ๋ฒ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ํ›„, ์•Œ๋ฆผ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ Spring Event๋กœ ๋„˜๊ธฐ๊ณ  ์•Œ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ํ›„ RabbitMQ๋กœ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. SSE ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น ํ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์ €์žฅ๋œ ๋ฉ”์„ธ์ง€๊ฐ€ ํ์— ์ „์†ก๋˜๊ฒŒ ๋˜๋ฉด, ์ด๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ ํ›„, ํ•ด๋‹น ์‚ฌ์šฉ์ž์—๊ฒŒ SSE ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์•Œ๋ฆผ์„ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

๊ฐœ์„  ๊ฒฐ๊ณผ

  • RPS: 697 → 951 (36.4% ์ฆ๊ฐ€)
  • ์‘๋‹ต ์‹œ๊ฐ„ (median): 910.49ms → 56.32ms (93.8% ๊ฐ์†Œ)
  • ์‘๋‹ต ์‹œ๊ฐ„ (mean): 1.08s → 83.73ms (92.2% ๊ฐ์†Œ)
  • ์‘๋‹ต ์‹œ๊ฐ„ (p90): 1.83s → 104.47ms (94.3% ๊ฐ์†Œ)
  • ์‘๋‹ต ์‹œ๊ฐ„ (p95): 2.60s → 159.16ms (93.9% ๊ฐ์†Œ)

์ด๋ฒˆ ๊ฐœ์„ ์„ ํ†ตํ•ด SSE ์•Œ๋ฆผ ๊ธฐ๋Šฅ์ด ์ „์ฒด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ๋ถ€๋‹ด์„ ๊ทผ๋ณธ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์•ˆ์ •์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ API ์„œ๋ฒ„์™€ SSE ์„œ๋ฒ„๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ SSE์— ๋Œ€ํ•œ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์ด ๋งˆ๋ จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

'Project' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋กœ ์ธํ•œ API ์„ฑ๋Šฅ ๋ฌธ์ œ ํ•ด๊ฒฐ: ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ๋ฐ ์ธ๋ฑ์Šค ํŠœ๋‹์„ ํ†ตํ•œ ์ตœ์ ํ™”  (1) 2025.05.29
GitHub Actions + Docker + NGINX๋ฅผ ํ™œ์šฉํ•œ Blue/Green ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•  (1) 2025.05.04
์ฑ„ํŒ… ๋ฉ”์„ธ์ง€ ์ฝ์Œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ๊ตฌ์กฐ ๊ฐœ์„ ๊ธฐ  (0) 2024.12.18
Embedded Mongo/Redis ์ ์šฉํ•˜๊ธฐ  (0) 2024.11.26
๋ณ„์  ์ค‘๋ณต ์ƒ์„ฑ ๋™์‹œ์„ฑ ์ด์Šˆ ํ•ด๊ฒฐ  (0) 2024.10.27
'Project' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋กœ ์ธํ•œ API ์„ฑ๋Šฅ ๋ฌธ์ œ ํ•ด๊ฒฐ: ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ๋ฐ ์ธ๋ฑ์Šค ํŠœ๋‹์„ ํ†ตํ•œ ์ตœ์ ํ™”
  • GitHub Actions + Docker + NGINX๋ฅผ ํ™œ์šฉํ•œ Blue/Green ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • ์ฑ„ํŒ… ๋ฉ”์„ธ์ง€ ์ฝ์Œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ๊ตฌ์กฐ ๊ฐœ์„ ๊ธฐ
  • Embedded Mongo/Redis ์ ์šฉํ•˜๊ธฐ
jwooo๐ŸŒฑ
jwooo๐ŸŒฑ
jwooo's log ์ž…๋‹ˆ๋‹ค.
  • jwooo๐ŸŒฑ
    jwooo's log
    jwooo๐ŸŒฑ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (13)
      • Java (4)
      • Project (7)
      • Computer Science (2)
        • Network (1)
        • Security (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
jwooo๐ŸŒฑ
SSE ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ฐœ์„ ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”