작성일: 2026.10.02 (금) | 과목: AM(Application Modernization)기반의 MSA 기술
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(실패) |
| Breakpoint | IntelliJ에서 줄 번호 옆 빨간 점. 디버그 모드에서 그 줄에서 멈춤 (에러 아님!) |
@SpringBootApplication
@EnableEurekaServer
public class ServiceDiscoveryApplication { ... }
server:
port: 8761
spring:
application:
name: service-discovery
eureka:
client:
register-with-eureka: false # 서버 자신은 등록 X
fetch-registry: false # 목록도 가져오지 X
@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를 랜덤으로 만들어 인스턴스마다 구분key: value → 콜론 뒤에 반드시 한 칸 띄우기a.b.c=값)과 섞어 쓰면 안 됨spring:과 server:는 둘 다 최상위 → 맨 왼쪽에서 시작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: 테스트 실행 건너뛰기application-{프로파일}.ymlapplication.yml, 활성 프로파일 파일이 덮어씀java -jar app.jar --spring.profiles.active=prod
mvn spring-boot:run -Dspring-boot.run.profiles=dev

@EnableEurekaServer + yml 설정http://localhost:8761 접속 → 대시보드 확인 (처음엔 No instances available)registration status: 204 → 유레카 등록 성공 (204 = 성공, 응답 본문 없음)# 방법 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) 확인 
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 use | IntelliJ에서 띄운 앱이 이미 실행 중 | ■ 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