[Spring/WebSocket] WebSocket + STOMP + DOCKER 실습 : 여러 서버 띄우기

·2025년 6월 19일

Spring

목록 보기
21/26
post-thumbnail

이전 포스트들과 이어집니다
1. [Spring/WebSocket] 순수 WebSocket으로 채팅방 만들기
2. [Spring/WebSocket] WebSocket + STOMP으로 귓속말 가능한 채팅방 만들기

[WebSocket + STOMP + DOCKER 실습 : 여러 서버 띄우기]

이전 WebSocket + STOMP 실습 파일을 가지고 Docker compose를 이용해 이미지와 컨테이너 생성 후 서버를 띄워보자. (로드밸런싱)

1. 설정 파일 및 코드 수정

1. 실습1에서 만든 도커 컨테이너인 database 삭제

2. application.properties 수정

spring.application.name=backendProject

spring.datasource.url=jdbc:mysql://database:3306/backend?serverTimezone=Asia/Seoul&characterEncoding=UTF-8&rewriteBatchedStatements=true
spring.datasource.username=root	
spring.datasource.password=1234

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update

3. docker-compose.yml 수정

services:


  database:
    image: mysql:8
    container_name: database
    ports:
      - "3307:3306"
    environment:
      MYSQL_DATABASE: backend
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      - ./volumes/mysql-data:/var/lib/mysql #내가 지정한 경로
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD']
      timeout: 20s
      retries: 10


  backend1:  # 서비스 이름은 컨테이너간 통신하기 위한 이름
    image: backend
    container_name: backend1
    environment:
      PROJECT_NAME: 백앤드 서버1
    depends_on:
      database:
        condition: service_healthy

  backend2:  # 서비스 이름은 컨테이너간 통신하기 위한 이름
    image: backend
    container_name: backend2
    environment:
      PROJECT_NAME: 백앤드 서버2
    depends_on:
      database:
        condition: service_healthy
      
  backend3:  # 서비스 이름은 컨테이너간 통신하기 위한 이름
    image: backend
    container_name: backend3
    environment:
      PROJECT_NAME: 백앤드 서버3
    depends_on:
      database:
        condition: service_healthy

  nginx:
    image: nginx:1.25
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - backend1
      - backend2
      - backend3

4. nginx.conf의 proxy_pass 매핑 주소 변경

location /ws-chat {
            proxy_pass http://spring_backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

5. ChatController.java에 코드 추가

    @Value("${PROJECT_NAME:web server}")
    private String instansName;

            template.convertAndSend("/topic/"+message.getRoomId(), instansName + " " + message);

2. 명령어 실행

1. bootjar 생성

  • Gradle -> Tasks -> build -> bootJar

2. 이미지 생성 : docker build -t backend .

  • dockerFile이 있는 경로에서 실행할 것.

3. 컨테이너 생성 : docker compose up -d

  • docker-compose.yml 파일이 있는 경로에서 실행할 것

3. 웹에서 확인

1. localhost 접속

2. 설정한 서버(백엔드1, 백엔드2, 백엔드3)들로 나눠짐

3. 같은 서버에 있으면 채팅과 귓속말 가능

profile
배우고 기록하며 성장하는 백엔드 개발자입니다!

0개의 댓글