๐Ÿ›  Spring Boot + Nginx + AWS์—์„œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ ์šฉ๊ณผ ์„ธ์…˜ ์ „๋žต

์—…๋ฐ์ดํŠธ:
1 ๋ถ„ ์†Œ์š”

๐Ÿ›  Spring Boot + Nginx + AWS์—์„œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ ์šฉ๊ณผ ์„ธ์…˜ ์ „๋žต


โœ… ์‹ค๋ฌด ํ™˜๊ฒฝ์—์„œ ์™œ ์„ธ์…˜ ์ „๋žต์ด ์ค‘์š”ํ• ๊นŒ?

์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์ธ ์ƒํƒœ์—์„œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์ด ์œ ์ง€๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ ๐Ÿ˜ฑ

Client โ†’ [Load Balancer] โ†’ Server A (๋กœ๊ทธ์ธ๋จ)
       โ†’ [Load Balancer] โ†’ Server B (์„ธ์…˜ ์—†์Œ โ†’ ๋กœ๊ทธ์•„์›ƒ๋จ)

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์„ค์ •๊ณผ ์„ธ์…˜ ๊ณต์œ  ์ „๋žต์ด ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


1๏ธโƒฃ Spring Boot + Nginx ํ™˜๊ฒฝ ์„ค์ • ์˜ˆ์‹œ

๐Ÿ”น ๊ธฐ๋ณธ ๊ตฌ์กฐ

Nginx (Reverse Proxy, Load Balancer)
  โ†ณ Spring Boot App A
  โ†ณ Spring Boot App B

๐Ÿ”ง Nginx ์„ค์ • (Round Robin + Sticky Session)

upstream backend {
    ip_hash;  # Sticky Session ์œ ์ง€
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

๐Ÿ“Œ ip_hash; ์„ค์ •์ด ํด๋ผ์ด์–ธํŠธ IP ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ ์ • ์„œ๋ฒ„ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ฒŒ ํ•จ (Sticky Session)


2๏ธโƒฃ Spring Boot + Redis (์„ธ์…˜ ๊ณต์œ  ์ „๋žต)

Spring Boot๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ์…˜์„ ๋ฉ”๋ชจ๋ฆฌ(์„œ๋ฒ„ ๋‚ด)์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—
๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ธ์…˜ ๊ณต์œ ๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

โœ… Redis๋กœ ์„ธ์…˜ ์ €์žฅํ•˜๊ธฐ

์˜์กด์„ฑ ์ถ”๊ฐ€ (build.gradle)

implementation 'org.springframework.session:spring-session-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

application.yml

spring:
  session:
    store-type: redis
  redis:
    host: localhost
    port: 6379

์ด์ œ ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ Redis ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•จ โ†’ ์„ธ์…˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ


3๏ธโƒฃ AWS์—์„œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ + ์„ธ์…˜ ์ „๋žต

โœ… AWS ELB ๊ตฌ์„ฑ ์˜ˆ์‹œ

  • ALB (Application Load Balancer) ์‚ฌ์šฉ
  • ํƒ€๊ฒŸ ๊ทธ๋ฃน์— Spring Boot ์„œ๋ฒ„๋“ค์„ ์ถ”๊ฐ€
  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ๊ธฐ๋ณธ์€ Round Robin

๐Ÿ” ์„ธ์…˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • Sticky Session ์‚ฌ์šฉ

    • ALB ์„ค์ •์—์„œ ๊ณ ์ • ์„ธ์…˜(Stickiness) ์˜ต์…˜ ON
    • ์ฟ ํ‚ค ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๊ณ ์ • ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ
  • Redis ์„ธ์…˜ ์ €์žฅ (Spring Session)
    โ†’ EC2 ์—ฌ๋Ÿฌ ๋Œ€, ECS ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‘ ๋™์ผ Redis ์ ‘๊ทผ ๊ฐ€๋Šฅ


โœจ ๋ณด๋„ˆ์Šค: JWT๋ฅผ ํ™œ์šฉํ•œ Stateless ์ธ์ฆ

โœ… ๊ตฌ์กฐ

Client <-> Load Balancer <-> Any Server
          โ†ณ ์„œ๋ฒ„๋Š” ์„ธ์…˜ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Œ
  • ๋ชจ๋“  ์š”์ฒญ์— JWT ํฌํ•จ
  • ์„œ๋ฒ„๋Š” ํ† ํฐ๋งŒ ๊ฒ€์ฆ โ†’ ์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š” ์—†์Œ
  • ์ˆ˜ํ‰ ํ™•์žฅ์— ์ตœ์ 

๐Ÿ“Œ ๋‹จ์ : ํ† ํฐ ํƒˆ์ทจ ์‹œ ์œ„ํ—˜, ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„ ๋ณต์žก


๐Ÿง  ์ƒํ™ฉ๋ณ„ ์ „๋žต ์š”์•ฝ

์ƒํ™ฉ ์ถ”์ฒœ ๋ฐฉ์‹
๋น ๋ฅธ ์ ์šฉ, ์†Œ๊ทœ๋ชจ Sticky Session (Nginx ip_hash or AWS ALB stickiness)
๊ณ ๊ฐ€์šฉ์„ฑ, ์„ธ์…˜ ์œ ์ง€ ํ•„์š” Redis + Spring Session
์™„์ „ Stateless ๊ตฌ์กฐ JWT ์ธ์ฆ ๋ฐฉ์‹

๐Ÿ“š ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์€ ๋„คํŠธ์›Œํฌ ๋ถ„์‚ฐ์˜ ๊ธฐ๋ณธ
  • ์„ธ์…˜์„ ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋กœ๊ทธ์ธ ์œ ์ง€๊ฐ€ ์–ด๋ ค์›€
  • Redis, Sticky, JWT ๋“ฑ ์ƒํ™ฉ์— ๋งž๋Š” ์ „๋žต ์„ ํƒ์ด ์ค‘์š”

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ