Загружаем каталог…
Загружаем каталог…
2026.10.02 수업 복습 📌 오늘 배운 내용 오늘은 먼저 IntelliJ IDEA에서 Spring Boot 프로젝트를 만들고 실행하는 기본 과정을 다시 확인했다. 프로젝트 생성 옵션, Maven과 Gradle의 차이, pom.xml , 의존성, 프로젝트 폴더 구조, Maven 생명주기, JAR 패키징, 터미널 실행 방법까지 살펴봤다. 이후 MSA에서 서비스의 위치를 관리하기 위해 사용하는 Service Discovery 를 배우고, Spring Cloud Netflix Eureka로 Registry Server와 Client를 직접 구성했다. Eureka Server를 실행한 뒤 user-service 를 등록했고, 같은 서비스를 여러 개 실행하여 Scale-out도 실습했다. 고정 포트로 여러 인스턴스를 실행할 때 발생하는 포트 충돌, 실행 옵션으로 포트를 덮어쓰는 방법, 운영체제가 포트를 자동으로 배정하는 랜덤 포트, 여러 인스턴스를 구분하기 위한 고유한 instance-id까지 연결해서 확인했다. 수업 후반에는 다음 차시의 API Gateway 실습을 위해 first-service 와 second-service 의 구조를 확인했다. Gateway가 단일 진입점에서 라우팅을 담당하고, Eureka에서 받아 온 서비스 목록을 이용해 실제 인스턴스를 찾으며, 여러 인스턴스에는 라운드 로빈 방식으로 요청을 분산할 수 있다는 흐름도 미리 배웠다. 오늘의 핵심은 “서비스 주소를 코드에 직접 저장하지 않고 Eureka에 등록하며, Gateway는 서비스명으로 대상을 찾아 요청을 전달한다”는 구조를 이해하는 것이었다. 🧭 오늘의 학습 키워드 키워드 오늘 배운 의미 Spring Initializr Spring Boot 프로젝트의 기본 구조와 의존성을 만들어 주는 도구 Maven 빌드, 테스트, 패키징, 의존성 관리를 담당하는 빌드 도구 pom.xml Maven 프로젝트의 버전, 속성, 의존성, 플러그인 등을 관리하는 설정 파일 Gradle build.gradle 을 사용하는 빌드 도구 Starter 관련 의존성을 묶어 제공하는 의존성 묶음 YAML 들여쓰기로 계층 구조를 표현하는 설정 형식 JAR Java 클래스와 리소스를 묶은 실행·배포 가능한 아카이브 WAR 외부 WAS에 배포하는 웹 애플리케이션 아카이브 Embedded Tomcat Spring Boot 애플리케이션 내부에 포함된 Tomcat Service Registry 실행 중인 서비스의 이름, IP, 포트 등을 등록하는 기능 Service Discovery 등록된 서비스의 현재 위치를 찾아 제공하는 기능 Eureka Server 서비스 정보를 등록하고 제공하는 Registry Server Eureka Client 자신의 위치를 등록하거나 다른 서비스 목록을 가져오는 애플리케이션 Scale-up 한 서버의 CPU·메모리 등 사양을 높이는 확장 방식 Scale-out 같은 서비스 인스턴스를 여러 개 실행하는 확장 방식 Instance ID Eureka가 각 서비스 인스턴스를 구분하는 고유 식별자 Random Port server.port: 0 으로 설정해 사용 가능한 포트를 자동 할당받는 방식 API Gateway 클라이언트 요청을 받는 단일 진입점이자 라우터 Load Balancing 여러 인스턴스에 요청을 나누어 전달하는 부하 분산 Round Robin 인스턴스에 요청을 순서대로 한 번씩 보내는 방식 Multi-module 하나의 상위 프로젝트에서 여러 하위 프로젝트를 모듈로 관리하는 구조 ✍️ 1. IntelliJ에서 Spring Boot 프로젝트 만들기 IntelliJ 안에서 프로젝트를 만들 수 없는 경우 과거 IntelliJ IDEA는 무료 Community Edition과 유료 Ultimate Edition이 분리되어 있었고, Community Edition에서는 Spring Boot 프로젝트 생성 메뉴를 바로 사용할 수 없었다. 현재 수업에서 사용한 IntelliJ는 버전이 통합되어 무료 사용자도 IDE 안에서 Spring Boot 프로젝트를 만들 수 있었다. 다만 설치된 버전이나 환경에 따라 Spring Boot 메뉴가 잠겨 있거나 보이지 않을 수 있다. 그때는 IDE 문제로 실습을 멈출 필요 없이 Spring Initializr 에서 같은 설정으로 프로젝트를 만든 뒤 다음 순서로 사용하면 된다. start.spring.io에서 옵션 선택 ↓ Generate로 ZIP 다운로드 ↓ 압축 해제 ↓ IntelliJ에서 프로젝트 열기 IntelliJ 내부의 Spring Boot 프로젝트 생성도 결국 Spring Initializr 서버를 이용하는 것이므로 결과에는 큰 차이가 없다. Hello World 프로젝트에서 선택한 항목 수업 초반에는 IDE 사용법을 익히기 위해 helloworld 프로젝트를 만들었다. Name: helloworld Language: Java Build tool: Maven JDK와 Java: 설치된 버전에 맞춰 동일하게 지정 Packaging: JAR Configuration: YAML Dependency: Spring Web Git repository: 이번 간단한 실습에서는 별도로 만들지 않음 저장 위치는 강사와 같을 필요가 없으며, 자신이 찾기 쉬운 폴더를 선택하면 된다. 프로젝트를 처음 열면 IntelliJ 오른쪽 아래에 진행 표시가 나타나며 플러그인과 Maven 의존성을 내려받는다. 이 작업이 끝나야 프로젝트 구성이 정상적으로 완료된다. Windows Defender가 프로젝트를 열 때마다 파일을 검사해 느려지는 경우 IntelliJ가 프로젝트 폴더 제외 여부를 물을 수 있는데, 수업에서는 실습 폴더를 제외하도록 선택했다. 보안 정책이 있는 환경에서는 임의로 제외하지 말고 해당 정책을 따라야 한다. Maven과 Gradle Maven은 pom.xml 이라는 XML 파일로 설정과 의존성을 관리한다. Gradle은 보통 build.gradle 파일을 사용한다. XML은 태그가 반복되기 때문에 설정이 길어질수록 가독성이 떨어질 수 있다. 그래서 최근 Spring Boot 프로젝트에서는 Gradle을 선택하는 경우도 많지만, 어느 한쪽이 무조건 더 좋은 것은 아니다. 익숙한 도구와 프로젝트 환경에 맞춰 선택하면 된다. 이번 수업에서는 이후 터미널에서 Maven 명령을 사용하므로 Maven으로 통일했다. Group, Artifact, Package Group ID: 회사나 조직의 도메인을 역순으로 적는 것이 일반적이다. 예를 들어 lg.com 이라면 com.lg 처럼 작성한다. Artifact ID: 만들어질 프로젝트 또는 결과물의 고유한 이름이다. Package name: Group ID와 Artifact ID를 조합해 자동 생성된다. Java 이름 규칙에 맞지 않는 하이픈은 제거된다. artifact 는 결과물이라는 의미이며, Maven으로 패키징한 JAR 이름에도 Artifact ID와 Version이 사용된다. JDK와 Java 버전 프로젝트 생성 화면에서 지정하는 JDK와 Java 버전은 설치된 JDK에 맞춰 동일하게 설정하는 것이 안전하다. 예를 들어 프로젝트는 Java 21을 요구하는데 PC에는 Java 17만 설치되어 있으면 컴파일이나 실행 과정에서 버전 오류가 발생할 수 있다. 공유받은 프로젝트가 Java 21로 되어 있는데 수강생 환경이 Java 17이라면 pom.xml 의 java.version 을 실제 설치 버전에 맞게 바꿔야 한다. 선택한 JDK가 PC에 없으면 IntelliJ가 JDK를 찾을 수 없다는 오류를 표시할 수 있다. 이때 IDE의 Download JDK 기능으로 필요한 버전을 설치하거나, 이미 설치된 JDK를 Project SDK로 지정한다. 안정 버전 선택 Spring Boot 버전 뒤에 SNAPSHOT , M1 , M2 같은 표기가 붙은 버전은 정식 안정 릴리스가 아니라 개발 또는 마일스톤 단계일 수 있다. 특별한 이유가 없다면 이러한 표기가 없는 안정 버전을 선택한다. ✍️ 2. Properties와 YAML의 차이 Properties 파일은 키와 값을 한 줄로 연결한다. spring.application.name=helloworld server.port=8080 YAML은 들여쓰기를 이용해 계층 구조로 표현한다. spring: application: name: helloworld server: port: 8080 계층이 눈에 보이기 때문에 복잡한 설정에서는 YAML의 가독성이 좋다. YAML에서 가장 중요한 것은 들여쓰기 다. 들여쓰기가 달라지면 서로 다른 계층으로 해석되거나 값을 읽지 못해 애플리케이션 실행에 실패할 수 있다. 확장자는 .yml 과 .yaml 을 모두 사용할 수 있다. 같은 형식이며, 과거 일부 운영체제의 확장자 길이 제한 때문에 세 글자인 .yml 도 사용하게 되었다는 설명을 들었다. IntelliJ는 기본적으로 자동 저장을 사용하므로 입력한 내용이 바로 저장된다. 다만 설정이나 코드를 바꾼 뒤 실행 중인 애플리케이션에 적용하려면 재시작이 필요하다. ✍️ 3. pom.xml 에서 확인해야 하는 것 새 프로젝트를 만들면 가장 먼저 pom.xml 을 열어 생성 옵션이 제대로 반영되었는지 확인한다. 주요 확인 항목은 다음과 같다. Spring Boot 버전 Group ID, Artifact ID, Version 프로젝트 이름과 설명 Java 버전 추가한 의존성 Spring Cloud 버전 빌드 플러그인 pom.xml 을 수정한 뒤에는 Sync가 필요하다 Maven이나 Gradle 설정 파일을 수정하고 파일만 저장하면 IDE가 새 의존성과 설정을 즉시 반영하지 못할 수 있다. Maven: 오른쪽 상단의 Maven Sync 버튼 Gradle: 코끼리 모양의 Gradle Sync 버튼 설정 파일을 수정한 뒤에는 Sync를 실행해 프로젝트 모델과 의존성을 다시 불러와야 한다. Properties로 버전 관리하기 Maven의 <properties> 에는 반복해서 사용할 값을 변수처럼 정의할 수 있다. <properties> <java.version>21</java.version> <spring-cloud.version>2025.0.0</spring-cloud.version> </properties> 정의한 값은 다음처럼 가져온다. <version>${spring-cloud.version}</version> 값을 여러 곳에 직접 하드코딩하는 것보다 한 곳에서 관리할 수 있다는 장점이 있다. Spring Boot와 Spring Cloud 버전 호환성 Spring Cloud는 Eureka를 포함한 여러 하위 프로젝트를 묶어 제공한다. 각 하위 프로젝트의 개별 버전보다 중요한 것은 사용하는 Spring Boot와 Spring Cloud 릴리스 트레인이 서로 호환되는지 확인하는 것이다. PDF 화면에는 Spring Boot 3.5.0 , Spring Cloud 2025.0.0 이 사용되어 있다. 실제 강의 중 새 프로젝트 생성 화면에서는 더 새로운 버전이 선택되기도 했다. 따라서 숫자를 그대로 외우기보다 프로젝트 생성 시점의 공식 호환표와 생성된 pom.xml 을 확인해야 한다. 강의 중 새 프로젝트 화면에서는 Spring Boot 4.1.1 과 Spring Cloud 2025.1.x 계열이 자동 선택된 장면도 있었고, 공유받은 new-toy-msa 상위 프로젝트는 Spring Boot 3.5.0 을 사용했다. PDF, 새 프로젝트, 공유 코드의 버전이 서로 다를 수 있으므로 한 프로젝트 안에서는 호환되는 조합으로 통일해야 한다. ✍️ 4. 의존성과 Starter 이해하기 빌드 도구는 소스 코드를 빌드하는 역할뿐 아니라 라이브러리 의존성을 관리하는 역할도 한다. Spring Initializr에서 Spring Web 하나만 선택해도 External Libraries에는 많은 라이브러리가 들어온다. Spring Boot Starter 하나가 웹 애플리케이션에 필요한 여러 의존성을 묶고 있고, 그 의존성이 다시 다른 의존성을 가져오기 때문이다. spring-boot-starter-web ├── Spring MVC ├── Embedded Tomcat ├── JSON 처리 라이브러리 └── 각 라이브러리가 필요로 하는 하위 의존성 수업에서 말한 “의존성”은 쉽게 말하면 프로젝트에서 사용하는 라이브러리다. Maven으로 받은 의존성은 Windows 기준 사용자 폴더 아래의 .m2/repository 에 저장된다. 예전에는 다운로드가 꼬이면 .m2 를 지우고 다시 받기도 했지만, 최근에는 먼저 IntelliJ의 File > Invalidate Caches 를 실행하고 재시작하는 방식으로 해결되는 경우가 많다. 레거시 Spring에서는 Maven Repository에서 의존성 좌표를 찾아 pom.xml 에 직접 추가하는 일이 많았다. Spring Boot는 프로젝트 생성 시 필요한 Starter를 클릭해 추가할 수 있어 초기 구성이 편리하다. 프로젝트 생성 이후 새 의존성이 필요하면 여전히 pom.xml 또는 build.gradle 에 직접 추가할 수 있다. ✍️ 5. Spring Boot 프로젝트 구조 기본 프로젝트 구조에서 각 폴더의 역할을 확인했다. src ├── main │ ├── java │ │ └── 애플리케이션 패키지와 Java 코드 │ └── resources │ ├── application.yml │ ├── static │ └── templates └── test └── 테스트 코드 src/main/java : 애플리케이션의 Java 소스 코드 메인 클래스: Java 프로그램의 진입점인 main() 메서드 포함 src/main/resources/application.yml : 환경 설정 static : 이미지, CSS, JavaScript, 정적 HTML 같은 파일 templates : 서버에서 렌더링할 UI 템플릿 src/test : 기능을 검증하는 테스트 코드 기능을 하나 만들 때 해당 기능의 단위 테스트도 함께 작성하는 것이 권장된다. Maven의 package 나 전체 빌드 과정에서는 테스트도 함께 실행된다. ✍️ 6. IntelliJ 화면과 편의 기능 강사가 IntelliJ의 주요 도구 창을 하나씩 설명했다. 도구 창 역할 Project 프로젝트의 파일과 폴더 구조 확인 Structure 현재 클래스 안의 필드와 메서드 구조 확인 Commit IDE 안에서 Git add, commit, push 작업 수행 TODO 코드에 작성한 TODO 주석을 모아서 확인 Build 빌드 로그 확인 Services 여러 애플리케이션의 실행 상태와 로그 관리 Terminal 외부 창을 열지 않고 IDE 내부에서 명령 실행 Version Control Git 이력과 변경 사항 확인 Notifications IDE 알림 확인 AI Assistant IDE의 AI 지원 기능 Database IDE에서 DB에 연결해 조회·관리 Maven/Gradle 빌드 생명주기를 클릭으로 실행 TODO 기능은 다음처럼 아직 끝내지 않은 작업을 코드에 남긴 뒤 한 화면에서 모아 보는 기능이다. // TODO 회원 조회 테스트 작성 VS Code에서는 Todo Tree 같은 확장 기능을 사용할 수 있고, Eclipse에도 비슷한 기능이 내장되어 있다. 설정과 화면 확대 Settings에서 테마, 글꼴, 화면 확대 비율을 변경할 수 있다. Change font size with Ctrl + Mouse Wheel 옵션을 켜면 Ctrl 키를 누른 상태에서 마우스 휠로 편집기 글자 크기를 바꿀 수 있다. 설정을 찾을 때는 메뉴를 하나씩 찾기보다 Settings 검색창을 사용하는 것이 빠르다. Keymap과 자주 사용한 단축키 Keymap에 따라 단축키가 달라진다. 다른 IDE에서 사용하던 키가 익숙하면 Eclipse, VS Code 등과 비슷한 Keymap을 불러올 수도 있다. 기본 Keymap에서는 Ctrl+Y가 Redo가 아니라 현재 줄 삭제로 동작할 수 있다. 이 경우 Redo는 Ctrl+Shift+Z 를 사용한다. Ctrl+Z/Ctrl+Y 방식이 익숙하면 다른 Windows Keymap을 선택할 수 있다. 기능 수업에서 확인한 단축키 전체 검색 Shift를 빠르게 두 번 현재 줄 복제 Ctrl+D 한 줄 위·아래 이동 Alt+Shift+↑/↓ 코드 블록 위·아래 이동 Ctrl+Shift+↑/↓ 다음 같은 단어 다중 선택 Alt+J 자유로운 다중 커서 Alt+Shift 를 누른 채 클릭 또는 드래그 IntelliJ Terminal 열기 Alt+F12 Keymap이 다르면 같은 단축키가 다르게 동작할 수 있으므로 현재 설정을 먼저 확인해야 한다. ✍️ 7. Spring Boot가 실행되는 구조 Java 프로그램을 실행하면 main() 메서드가 진입점이 된다. @SpringBootApplication public class HelloworldApplication { public static void main(String[] args) { SpringApplication.run(HelloworldApplication.class, args); } } SpringApplication.run() 이 실행되면 Spring Boot 애플리케이션이 초기화되고, Web 의존성이 있는 프로젝트에서는 내부에 포함된 Embedded Tomcat도 함께 시작된다. main() 실행 ↓ SpringApplication.run() ↓ Spring Context 초기화 ↓ Embedded Tomcat 실행 ↓ 지정된 포트에서 요청 대기 포트를 지정하지 않으면 기본값은 8080이다. server: port: 8080 IntelliJ에서는 다음 방법으로 실행할 수 있다. 메인 클래스 또는 main() 옆의 실행 버튼 파일을 우클릭한 뒤 Run 단축키 한 번 실행한 뒤 상단 Run Configuration에서 다시 실행 상단 메뉴에서는 Stop, Rerun, Debug도 사용할 수 있다. Debug 모드에서는 원하는 줄에 Breakpoint를 찍고 값과 실행 흐름을 단계별로 확인할 수 있다. ✍️ 8. JAR와 WAR, Embedded Tomcat의 차이 JAR JAR는 Java Archive의 약자다. Java 클래스와 리소스를 묶은 아카이브이며, Spring Boot의 실행 가능한 JAR에는 애플리케이션과 필요한 의존성, Embedded Tomcat 구성이 포함될 수 있다. 따라서 별도의 Tomcat을 설치하지 않아도 다음처럼 실행할 수 있다. java -jar helloworld-1.0.jar WAR WAR는 Web Application Archive의 약자다. 레거시 Spring에서는 프로젝트 안에 Tomcat이 포함되지 않았기 때문에 외부 WAS를 설치한 뒤 WAR를 배포하는 방식이 일반적이었다. 외부 Tomcat의 webapps 폴더에 여러 WAR를 넣고 실행하면 하나의 Tomcat에서 여러 웹 애플리케이션을 서로 다른 Context Path로 운영할 수 있었다. 레거시 Spring과 Spring Boot 레거시 Spring WAR 생성 → 외부 Tomcat 설치 → webapps에 배포 Spring Boot 프로젝트마다 Embedded Tomcat 포함 → 실행 가능한 JAR 자체로 기동 Spring Boot 애플리케이션 하나마다 독립된 Embedded Tomcat이 포함되는 구조이므로, 각 서비스를 독립적으로 실행하기 쉽다. ✍️ 9. Maven 생명주기와 빌드 산출물 Maven 프로젝트는 빌드 산출물을 target 폴더에 만든다. Gradle 프로젝트는 일반적으로 build 폴더를 사용한다. 수업에서는 IntelliJ 오른쪽 Maven 창의 Lifecycle에서 다음 작업을 직접 실행했다. clean mvn clean 이전 컴파일 및 패키징 결과가 들어 있는 target 폴더를 정리한다. compile mvn compile .java 소스를 JVM이 실행할 수 있는 .class 바이트코드로 컴파일한다. 실행 후 target 폴더가 다시 만들어진다. package mvn package 컴파일 결과를 배포할 수 있는 JAR 또는 WAR로 패키징한다. 과정 중 테스트도 실행된다. JAR 이름은 일반적으로 Artifact ID와 Version의 조합으로 생성된다. artifactId: helloworld version: 1.0 결과: helloworld-1.0.jar IntelliJ
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[TIL] Spring Boot 실행 구조부터 Netflix Eureka Service Discovery와 Scale-out. 2026.10.02 수업 복습 📌 오늘 배운 내용 오늘은 먼저 IntelliJ IDEA에서 Spring Boot 프로젝트를 만들고 실행하는 기본 과정을 다시 확인했다. 프로젝트 생성 옵션, Maven과 Gradle의 차이, pom.xml , 의존성, 프로젝트 폴더 구조, Maven 생명주기, JAR 패키징, 터미널 실행 방법까지 살펴봤다. 이후 MSA에서 서비스의 위치를 관리하기 위해 사용하는 Service Discovery 를 배우고, Spring Cloud Netflix Eureka로 Registry Server와 Client를 직접 구성했다. Eureka Server를…
Открыть источник