https://spring.io/guides/gs/spring-cloud-loadbalancer/
곧 계획 예정 중인 MSA 프로젝트를 혼자서 연습해 보기 위해
Spring Doc 의 Client-Side Load-Balancing
예제 프로젝트를 진행하던 와중이었습니다.
사실 와중도 아니었죠. 시작부터 에러가 났으니...!
You will build a microservice application that uses Spring Cloud LoadBalancer to provide client-side load-balancing in calls to another microservice.
다른 마이크로서비스에 대한 호출에서 클라이언트 측 로드 밸런싱을 제공하기 위해
Spring Cloud LoadBalancer를 사용하는 마이크로서비스 애플리케이션을 빌드합니다.
말이 좀 어렵죠? 쉽게 풀어쓰자면
이 프로젝트는 여러 작은 컴퓨터 프로그램(마이크로서비스라고 불림)이
서로 어떻게 효율적으로 대화할 수 있을지를 연구하는 것입니다.
마이크로서비스: 큰 프로그램을 작은 부분으로 나눈 것입니다. 각각은 독립적으로 작동하고, 서로 통신해서 큰 일을 처리합니다.
로드 밸런싱: 여러 대의 컴퓨터가 있을 때, 어떤 컴퓨터에 얼마나 많은 일을 시킬지를 잘 분배하는 것입니다.
클라이언트 측: 사용자의 컴퓨터에서 일어나는 작업을 말합니다.
Spring Cloud LoadBalancer: 이것은 로드 밸런싱을 쉽게 해주는 도구입니다.
결론적으로, 이 프로젝트는 여러 작은 프로그램이
서로 효율적으로 대화하도록 도와주는 도구를 만드는 것입니다.
이 도구는 사용자의 컴퓨터에서 작동하며, 'Spring Cloud LoadBalancer'라는 기술을 사용하는 것이죠!
그리고 이를 간단히 폴더구조로 보여드리자면
. # Root Project
├── build.gradle # 빈 gradle, intelliJ 가 root project 임을 알려주기 위함
├── gradle
│ └── wrapper
├── gradlew
├── gradlew.bat
├── say-hello # 작은 프로그램 1
│ ├── HELP.md
│ ├── build.gradle
│ ├── gradle
│ ├── gradlew
│ ├── gradlew.bat
│ ├── settings.gradle
│ └── src
├── settings.gradle
└── user # 작은 프로그램 2
├── HELP.md
├── build.gradle
├── gradle
├── gradlew
├── gradlew.bat
├── settings.gradle
└── srcCopy
멋지게 설명은 드렸지만
현실은 시작부터 설정 꼬여서 개고생을 해, 시작도 못했습니다!
그냥 돌리면 되는 데 이걸 못해?
[원문]
Spring Boot 3.0 will require Java 17,
but you don’t need to wait until that release to upgrade to the latest LTS Java version.**[번역]
Spring Boot 3.0 은 Java 17 요구할꺼야~
[링크]
https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0
**
맨 위에 걸려있는 예제의 환경은 Spring Boot 3.x 와 Java 17을 요구합니다.
start.spring.io 에서 작은 프로젝트 2개를 가져오고,
intelliJ로 열었더니 다음과 같은 에러가 나왔습니다.
No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.1 was found. The consumer was configured to find a runtime of a library compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6' but:
- Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '7.6')
- Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a runtime of a component, and its dependencies declared externally:
- Incompatible because this component declares documentation and the consumer needed a library
- Other compatible attributes:
- Doesn't say anything about its target Java version (required compatibility with Java 11)
- Doesn't say anything about its elements (required them packaged as a jar)
- Doesn't say anything about org.gradle.plugin.api-version (required '7.6')
- Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.1 declares a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '7.6')
- Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.1 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '7.6')
- Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '7.6')
- Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a runtime of a component, and its dependencies declared externally:
- Incompatible because this component declares documentation and the consumer needed a library
- Other compatible attributes:
- Doesn't say anything about its target Java version (required compatibility with Java 11)
- Doesn't say anything about its elements (required them packaged as a jar)
- Doesn't say anything about org.gradle.plugin.api-version (required '7.6')Copy
뭐지...? 했다가
Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11
현재 제가 JDK11을 사용했기 때문에 이런 문제가 있다고 확인했습니다.
그래서 해결책을
https://jojoldu.tistory.com/698
개발바닥의 향로님 블로그를 찾아 잘 해결했습니다.
향로님의 제시해 주신 솔루션 중에 다음 방법으로 해결을 잘했습니다.
- IntelliJ
결국 이 프로젝트를 실행하는 IntelliJ가 프로젝트를 Java 17로 실행해야만 한다.
그래서 아래 설정들을 따라 Java 17 이상으로 IntelliJ를 설정한다.
다만 헤맨 부분은 왜 내 터미널에서는 JDK 버전이 17로 나오는 데
프로젝트는 여전히 오류를 낼 까였습니다.
이에 대한 답은 아래 링크에서 낼 수 있었는 데
https://intellij-support.jetbrains.com/hc/en-us/community/posts/206968365-JDK-settings-per-module-
저희는 이를 활용합니다. 대부분의 프로젝트가 1.4.2를 사용하지만
필요에 따라 1.1, 1.2 또는 1.4를 사용하는 하위 모듈(주로 애플릿)이 있는 단일 프로젝트가 있습니다.
즉, 여러 프로젝트를 하나의 컴퓨터에서 사용해야 할 경우가 많은 데
이때 컴퓨터의 default JDK 버전으로만 맞춰진다면
매 프로젝트마다 수동으로 JDK 버전을 고쳐하게 되고, 이는 정말... 귀찮은 일이겠죠!
그래서 intelliJ는 프로젝트 별로
JDK 세팅을 다르게 하도록 하는 기능을 넣었다고 볼 수 있죠!
제가 intelliJ를 쓰기 때문에 intelliJ 를 예시로 들었지만
사실 이 기능은 intelliJ 뿐만 아니라 다른 IDE에서도 지원하는 기능입니다!
위에서 말씀드린 이유과 같은 이유로요!
IDE는 프로젝트 별로 다른 SDK 버전을 적용시켜
프로젝트를 실행시킬 수 있다!