#[LG CNS AM Inspire Camp 6기] Day 32 TIL : MSA | Service Discovery

SUN A·5일 전

MSA

목록 보기
2/3

작성일: 2026.10.02 (금) | 과목: AM(Application Modernization)기반의 MSA 기술

📌 오늘 배운 내용

  • Service Discovery : MSA- IP/포트 오토스케일링·재시작 마다 바뀜
    → 주소를 하드코딩하지 않고 서비스 레지스트리에 등록·조회하는 방식
  • Spring Cloud Netflix Eureka
    디스커버리 서버(8761)→ user-service→Eureka Client등록
  • Scaling : 포트 지정 / 랜덤 포트
  • 빌드 & 실행 흐름: mvn clean package → target에 jar 생성 → java -jar로 실행
  • 설정 파일: application.properties ↔ application.yml, 프로파일(application-dev.yml, application-prod.yml)

📖 용어 정리

용어뜻
Service Discovery서비스가 서로의 위치(IP:포트)를 자동으로 찾는 메커니즘
Service Registry서비스 이름과 주소 목록을 저장하는 저장소 (= Eureka Server)
Eureka Server레지스트리 역할 서버. @EnableEurekaServer, 기본 포트 8761
Eureka Client레지스트리에 자기 정보를 등록하고 다른 서비스 정보를 조회하는 쪽
Heartbeat클라이언트가 30초마다 "살아있음"을 알리는 신호
Self-Preservation하트비트가 기대치보다 적으면 인스턴스를 함부로 지우지 않는 유레카 보호 모드 (대시보드의 빨간 EMERGENCY 문구)
Scaling같은 서비스를 여러 인스턴스로 늘려 띄우는 것
Load Balancer여러 인스턴스에 요청을 나눠 보내는 것
API Gateway모든 요청이 들어오는 단일 입구, 경로를 보고 서비스로 라우팅
Service Mesh사이드카 프록시로 서비스 간 통신을 인프라 레벨에서 처리 (Istio 등). Eureka와는 다른 층의 해결 방식
Profile환경별(dev/prod) 설정을 나눠 쓰는 기능
Maven Wrapper (mvnw)Maven 설치 없이 프로젝트에 포함된 Maven으로 빌드
로그 레벨TRACE < DEBUG < INFO < WARN(경고, 실행은 계속) < ERROR(실패)
BreakpointIntelliJ에서 줄 번호 옆 빨간 점. 디버그 모드에서 그 줄에서 멈춤 (에러 아님!)

〽️ 문법

1. Eureka Server

@SpringBootApplication
@EnableEurekaServer
public class ServiceDiscoveryApplication { ... }
server:
  port: 8761

spring:
  application:
    name: service-discovery

eureka:
  client:
    register-with-eureka: false   # 서버 자신은 등록 X
    fetch-registry: false         # 목록도 가져오지 X

2. Eureka Client (user-service)

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication { ... }
server:
  port: 0   # 랜덤 포트

spring:
  application:
    name: user-service

eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
  • port: 0만 쓰면 유레카에 user-service:0 하나로만 등록됨 → instance-id를 랜덤으로 만들어 인스턴스마다 구분

3. yml 문법 주의

  • 들여쓰기는 스페이스로, 계층은 2칸씩
  • key: value → 콜론 뒤에 반드시 한 칸 띄우기
  • properties 문법(a.b.c=값)과 섞어 쓰면 안 됨
  • spring:과 server:는 둘 다 최상위 → 맨 왼쪽에서 시작

4. Maven / 실행 명령어

mvn clean package -DskipTests      # target 비우고 → 컴파일 → jar 생성, 테스트 생략
                                   # (package가 compile을 포함해서 compile은 생략 가능)
mvn spring-boot:run                # 바로 실행 (pom.xml 있는 폴더에서!)
java -jar ./target/xxx.jar         # 빌드된 jar 실행
  • clean: target 삭제 / compile: .class 생성 / package: jar로 묶기
  • -DskipTests: 테스트 실행 건너뛰기

5. Profile

  • 파일명은 반드시 application-{프로파일}.yml
  • 공통은 application.yml, 활성 프로파일 파일이 덮어씀
java -jar app.jar --spring.profiles.active=prod
mvn spring-boot:run -Dspring-boot.run.profiles=dev

💻 실습/적용

Project 기본 설정

Eureka 서버 띄우기

  • start.spring.io → Dependencies에 Eureka Server 추가 → @EnableEurekaServer + yml 설정
  • http://localhost:8761 접속 → 대시보드 확인 (처음엔 No instances available)

user-service 등록

  • Dependencies: Eureka Discovery Client, Spring Web
  • 실행 로그에서 registration status: 204 → 유레카 등록 성공 (204 = 성공, 응답 본문 없음)

Scaling: 같은 서비스 여러 개 띄우기

# 방법 1) IntelliJ Run Configuration 복사 → VM options에 -Dserver.port=60001

# 방법 2) Maven으로
mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=60002'

# 방법 3) jar로 (PowerShell은 -D 옵션을 따옴표로 감싸기)
mvn clean package -DskipTests
java "-Dserver.port=60003" -jar .\target\user-service-0.0.1-SNAPSHOT.jar
  • 랜덤 포트 + instance-id 설정 후 터미널 2개로 실행 → 대시보드에 UP (2) 확인
  • IntelliJ에서 Run을 여러 번 하려면 Edit Configurations → Modify options → Allow multiple instances

pom.xml 저장 -> Sync

jar 파일 생성 명령어

mvn clean compile package -DskipTests=true

사이트

spring
localhost- eureka
second
first

트러블슈팅

증상원인해결
cd.\target\ 인식 안 됨cd와 경로 사이 띄어쓰기 누락cd .\target\
Unable to access jarfile현재 위치에 jar가 없음 (jar는 target 안).\target\파일명.jar로 경로 지정
Port 8080 was already in useIntelliJ에서 띄운 앱이 이미 실행 중■ Stop / netstat -ano \| findstr :8080 → taskkill /PID 번호 /F / 다른 포트로 실행
mvn 인식 안 됨Maven 미설치 또는 Path 미반영.\mvnw 사용 or Maven 설치 + Path 등록 후 IntelliJ 완전 종료(File → Exit) 후 재시작
터미널에 >>만 계속 뜸로그를 터미널에 잘못 붙여넣음 (우클릭 = 붙여넣기)Ctrl + C로 빠져나오기
랜덤 포트인데 인스턴스 1개만 보임실제로 하나만 실행 중새 터미널에서 하나 더 실행
대시보드 빨간 EMERGENCY 문구Self-Preservation 모드 (껐다 켰다 반복 시)실습에선 무시 가능. 개발용으로 eureka.server.enable-self-preservation: false
랜덤 포트(port: 0) 인스턴스가 하나로 덮어써지는 문제--instance-id에 ${random.value}를 붙여 해결

→ 강사님 : Spring Boot 3.5.0 / Java 21 ME : Spring Boot 4.1.1 / Java 17


🪄 오늘의 한마디

주소를 외우지 말고, 이름으로.
Port 8080 was already in use

profile
시각적 감각 • • • 기술적 논리 교차점

0개의 댓글