IntelliJ SpringBoot + Vue 프로젝트, 소켓 + 카프카 프로젝트 세팅 방법

AIDT 실시간 퀴즈 프로젝트를 인수인계 받아 세팅하는 과정을 정리하였습니다.


IntelliJ SpringBoot + Vue 프로젝트 세팅

Java 17 설치 및 설정

https://0songha0.github.io/tool/2024-05-29-1
위 글을 참고하여 JAVA 설치 및 환경변수 설정을 완료하면 됩니다.
현재 프로젝트를 잠시 열어서 Java 버전 확인하고 맞게 설치하는 것이 좋습니다.
IDE가 아닌 터미널에서 SpringBoot Gradle/Maven 빌드 또는 Kafka 실행 시에는
JDK 경로가 필요하므로 JAVA_HOME 환경변수 설정이 필수입니다.

Node 20.13.0 설치 및 설정

https://0songha0.github.io/web-dev/2023-03-17-1
위 글을 참고하여 Node.js 설치 및 버전 설정을 완료하면 됩니다.
Vue 실행 시 node.js가 사용되므로 반드시 설치해야 합니다.
터미널이 아닌 IntelliJ에서 Vue 실행 시에도 node, npm 명령어가 환경변수에 잡혀 있어야 하지만,
보통 노드 설치 및 버전 설정 시 자동 설정되므로 별도의 수동 등록은 필요하지 않습니다.

IntelliJ에서 프로젝트 열기

IntelliJ 실행 > Projects > Open
프로젝트를 파일로 전달받아 아직 Git으로 관리하지 않으므로, Get from VCS가 아니라 Open으로 열었습니다.

프로젝트 JDK 및 Gradle 빌드 설정

https://0songha0.github.io/tool/2022-05-27-1
위 글을 참고하여 프로젝트 JDK 설정, Gradle 빌드 설정을 완료하면 됩니다.

프로젝트 빌드 설정 및 실행

https://0songha0.github.io/tool/2022-05-25-1
위 글을 참고하여 백엔드 SpringBoot 프로젝트 빌드 및 실행을 위한 내장 톰캣을 추가합니다.
프론트 Vue 프로젝트 npm 구성도 추가하고, 각각 실행하면 URL로 접근할 수 있습니다.


IntelliJ 소켓 + 카프카 프로젝트 세팅

윈도우 도커 설치 방법

https://www.docker.com
위 링크에서 Download Docker Desktop > Download for Windows - AMD64 선택하여 다운로드 합니다.
Use WSL 2 instead of Hyper-V (recommended), Add shortcut to desktop 체크 후 설치하면 됩니다.

도커 실행 방법

프로젝트 폴더 내 docker-compose.yml 파일 우클릭 > Run ‘프로젝트명…’
또는
cmd 창에서 프로젝트 폴더로 이동 > docker-compose up -d 입력 (-d : 로그 출력 없이 백그라운드 실행)

docker-compose.yml 파일에 정의된 kafka 이미지를 도커 허브에서 다운로드 받고,
로컬에 설치된 도커 엔진을 통해 테스트용 kafka 가상 컨테이너를 실행하는 방식입니다.
로컬 도커 동작 시, docker.desktop 프로그램에서 상태를 확인할 수 있습니다.

운영에서는 도커를 사용하지 않고, 독립적인 카프카 서버를 구축하여 사용해도 됩니다.

docker-compose.yml 파일 예시

services:
  broker:
    image: apache/kafka:3.9.0-rc3
    hostname: ck_draw
    container_name: ck_draw_container
    ports:
      - '9092:9092'
    environment:
      # 노드 ID: Kafka 클러스터 내에서 이 브로커의 ID를 1로 설정.
      KAFKA_NODE_ID: 1
      # 리스너 보안 프로토콜 매핑: 각 리스너가 어떤 보안 프로토콜을 사용할지 정의합니다.
      # 여기서는 모든 리스너가 PLAINTEXT(암호화되지 않은 통신) 프로토콜을 사용하도록 설정합니다.
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
      # 광고되는 리스너: Kafka가 외부 클라이언트에게 노출할 주소를 정의합니다.
      # localhost:9092는 로컬 클라이언트를 위한 것이고, ck_draw:19092는 컨테이너 내부 통신을 위한 주소입니다.
      # KAFKA_ADVERTISED_LISTENERS = 외부 클라이언트가 Kafka 브로커에 접근하기 위한 주소 ★
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT_HOST://localhost:9092,PLAINTEXT://ck_draw:19092'
      # 프로세스 역할: 이 노드가 브로커(ck_draw)와 컨트롤러(controller)의 역할을 수행함을 정의합니다.
      KAFKA_PROCESS_ROLES: 'broker,controller'
      # 컨트롤러 투표자: 컨트롤러 선출 과정에서 투표할 수 있는 노드를 정의합니다. 여기서는 ID 1번 노드가 ck_draw:29093 포트에서 투표할 수 있습니다.
      KAFKA_CONTROLLER_QUORUM_VOTERS: '1@ck_draw:29093'
      # 리스너: 브로커가 수신할 연결에 대한 프로토콜과 포트를 정의합니다.
      # CONTROLLER://:29093는 컨트롤러 리스너,
      # PLAINTEXT_HOST://:9092는 호스트용 PLAINTEXT 리스너,
      # PLAINTEXT://:19092는 브로커 간 통신용 리스너입니다.
      KAFKA_LISTENERS: 'CONTROLLER://:29093,PLAINTEXT_HOST://:9092,PLAINTEXT://:19092'
      # 브로커 간 통신 리스너 이름: 브로커 간 통신을 PLAINTEXT 프로토콜을 사용하도록 지정합니다.
      KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
      # 컨트롤러 리스너 이름: 컨트롤러가 사용할 리스너 이름을 정의합니다. 여기서는 CONTROLLER 리스너가 사용됩니다.
      KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
      # 클러스터 ID: 이 Kafka 클러스터의 고유 ID입니다. 클러스터를 식별하는 데 사용됩니다.
      CLUSTER_ID: '4L6g3nShT-eMCtK--X86sw'
      # 오프셋 토픽 복제 계수: __consumer_offsets 토픽에 대한 복제 계수를 1로 설정합니다(복제본이 없고, 단일 브로커에서만 저장됨).
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      # 초기 리밸런스 지연: 새로운 소비자 그룹이 초기화될 때 리밸런스가 지연되는 시간을 0ms로 설정하여 즉시 리밸런스를 시작합니다.
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      # 트랜잭션 상태 로그 최소 ISR: 트랜잭션 상태 로그에 대해 필요한 최소 복제본의 수를 1로 설정합니다.
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      # 트랜잭션 상태 로그 복제 계수: 트랜잭션 상태 로그의 복제 계수를 1로 설정합니다(복제본이 없음을 의미).
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      # 로그 디렉터리: Kafka 데이터 로그 파일을 저장할 디렉터리를 설정합니다.
      KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
      # 파티션 개수 설정
      # kafka 브로커 기본 파티션 수. 새로 생성되는 토픽에 파티션 수를 지정하지 않을 경우 적용됩니다.
      KAFKA_NUM_PARTITIONS: 30

로컬에서 카프카 가상 컨테이너를 실행할 수 있는 도커 설정 파일 예시입니다.
카프카 이미지명 및 기타 설정들이 작성되어 있습니다.

도커 프로세스 확인

docker ps

윈도우 cmd 창에서 명령어를 통해 도커 프로세스를 확인할 수 있습니다.

도커 컨테이너 접속 명령어

docker exec -it ck_draw_container bash

cmd 창에서 위 명령어를 통해 컨테이너 내부로 접근하는 것도 가능합니다.

도커 내 kafka 로그 확인

docker logs -f 컨테이너명

해당 컨테이너에서 발생하는 로그를 실시간으로 출력합니다.
컨테이너 실행 상태, 연결 및 설정 에러 메시지, Kafka 브로커가 정상적으로 클러스터에 참여했는지, 토픽을 처리 중인지 등을 확인할 수 있습니다.

카프카 사용 이유

이중화 서버에서 소켓 사용 시 서버간 동기화를 위해 메시지 브로커 역할을 하는 카프카가 필요합니다.
단일 서버에서 소켓 사용 시에는 카프카가 필요하지 않습니다.

Leave a comment