지난 시간에는 Spring Cloud 를 사용하여 msa 의 기본적인 개념과 동작 과정을 설명했다. 이번에는 위 사진과 같이 프로젝트를 구성해보겠다.
Requirement
- SpringBoot 3.3.2
- Java17
- gradle
msa 아키텍쳐를 생각하며 각각의 서비스를 생성할 때, 아래와 같은 디렉토리 구조로 생성하면 인텔리제이에서 보기가 수월하다.
나는 spring-initializer 사이트를 통해 각각의 프로젝트를 생성해서 같은 폴더 안에 모아두었다. 생성 후 생기는 프로젝트 패키지 이름을 변경하여 Eureka Server 와 Client 의 역할이 구분될 수 있도록 하였다.
만약 생성 시 package name 을 auth 로 정한다면 생성되는 폴더 이름이 auth 로 돼 있을 것이다. 이걸 Group 과 Artifact 명이 다 나오도록 수정하면 된다.
만약 Eureka Server 역할을 하는 server 프로젝트를 인텔리제이로 열었을 때는 위와 같이 안 보일 것이다.(당연)
프로젝트를 생성하고 각각의 서비스에 필요한 의존성을 설치한다.
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
ext {
set('springCloudVersion', "2023.0.3")
set('querydslVersion', "5.0.0")
}
dependencies {
// JPA 와 querydsl 관련 의존성 설치
implementation "com.querydsl:querydsl-jpa:${querydslVersion}:jakarta"
annotationProcessor "com.querydsl:querydsl-apt:${querydslVersion}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// hsqldb : 내장 db 로 실행 시 마다 초기화
runtimeOnly 'org.hsqldb:hsqldb'
// JWT
implementation 'io.jsonwebtoken:jjwt:0.12.6'
//Spring Security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
// 유레카 클라이언트
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation 'io.projectreactor:reactor-test'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
build.gradle 에서는 ${querydslVersion} 과 같이 버전을 아래와 같이 정의할 수있다.
ext { set('springCloudVersion', "2023.0.3") set('querydslVersion', "5.0.0") }
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
Order : Product 와 동일
Gateway
해당 프로젝트에서는 spring cloud gateway 를 사용할 것이다.
gateway 도 마찬가지로 유레카 클라이언트로 등록해준다.
dependencies {
// Auth Filter 에서 사용하기 위한 JWT 의존성
implementation 'io.jsonwebtoken:jjwt:0.12.6'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
각 서비스에 대한 스프링부트 프로젝트를 생성하고 필요한 의존성을 설치했다. 다음 글에서는 아래에 대한 내용을 볼 것이다.
1. 서비스의 연결을 위한 설정파일
2. 게이트웨이 설정
3. 서비스 로직에 필요한 주요 코드
각 서비스 프로젝트를 생성하고 Server
프로젝트를 기준으로 다른 서비스와 gradle로 연결하면서, 실수로 인해 한 서비스를 unlink 하고 싶을 때, 인텔리제이에서 빌드가 오류가 나거나, 어떤 서비스가 실행이 안될 때가 있다. 이럴 때는 아래와 같이 해보자.
Server 프로젝트를 열고 다른 서비스들을 gradle 로 추가하다보면 위와 같이 .idea
폴더가 생성될 수 있다.
위와 같은 파일들은 인텔리제이 gradle tool 탭에서 서비스를 unlink 해도 안 바뀔 수 있다. 그렇기 때문에 이미 생성되고 gradle 로 연결된 프로젝트를 지울 때는 시원하게
.idea
폴더도 삭제해주자!