포스트

Spring Cloud Gateway 프로젝트 만들기

프로젝트 생성하기

Spring Cloud Gateway 프로젝트를 생성하기 위해 Spring Initializr에서 다음과 같이 설정하였습니다.:

프로젝트 메타데이터

  • Project: Gradle - Groovy
  • Language: Java
  • Spring Boot: 3.5.6
  • Java: 17
  • Packaging: Jar

프로젝트 정보

  • Group: com.cloud
  • Artifact: gateway
  • Name: gateway
  • Package name: com.cloud.gateway

기본 Dependencies

  • Spring Reactive Web (WebFlux)
  • Spring Cloud Gateway
  • Spring Cloud Consul Discovery
  • Spring Boot Actuator
  • Spring Security

build.gralde 수정

프로젝트 생성 후 swagger, jaspyt등 다른 의존성 추가 후 모습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// dependencies 만 추가하고 나머지 생략
dependencies {
    // ===================================
    // 핵심 Spring Cloud Gateway 의존성
    // ===================================

    // 1. WebFlux (리액티브 웹 스택)
    implementation 'org.springframework.boot:spring-boot-starter-webflux'

    // 2. Spring Cloud Gateway (WebFlux 기반)
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway-server-webflux'

    // 3. Consul Service Discovery
    implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery'

    // 4. Spring Security (인증/인가)
    implementation 'org.springframework.boot:spring-boot-starter-security'

    // 5. Actuator (모니터링/헬스체크)
    implementation 'org.springframework.boot:spring-boot-starter-actuator:3.5.6'

    // ===================================
    // Circuit Breaker (Resilience4j)
    // ===================================
    implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'

    // ===================================
    // 추가 기능 의존성
    // ===================================

    // Database
    implementation 'org.postgresql:postgresql'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5'
    implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

    // JWT 토큰
    implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
    implementation 'io.jsonwebtoken:jjwt-impl:0.11.2'
    implementation 'io.jsonwebtoken:jjwt-jackson:0.11.2'

    // Error Handling (Problem Details for HTTP APIs)
    implementation 'org.zalando:problem-spring-webflux:0.29.1'
    implementation 'org.zalando:jackson-datatype-problem:0.27.1'

    // Jasypt (속성 암호화)
    implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'

    // Swagger UI (API 문서화)
    implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.8.9'

    // Email
    implementation 'org.springframework.boot:spring-boot-starter-mail:3.4.1'
    implementation 'org.springframework:spring-context-support:6.2.1'
    implementation 'com.sun.mail:jakarta.mail:2.0.1'

    // Lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    // Logging
    implementation 'org.codehaus.janino:janino:3.1.12'

    // ===================================
    // 테스트 의존성
    // ===================================
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
    testImplementation 'org.springframework.security:spring-security-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

Consul과의 연결

디렉토리 구조

1
2
3
4
5
6
7
8
gateway/
└── src/
    └── main/
        └── resources/
            └── config/
                ├── application.properties          # 기본 설정
                └── local/
                    └── app.properties             # 환경별 설정

application.properties (기본 설정)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 애플리케이션 이름 (Consul에 등록될 서비스명)
spring.application.name=gateway-service

# 서버 포트
server.port=8080

# 프로파일 설정
spring.profiles.active=local

# 환경별 설정 파일 임포트
spring.config.import=classpath:config/${spring.profiles.active}/app.properties

# MyBatis 설정
mybatis.config-location=mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:sql/postgres/*.xml

# 로그 설정
logging.config=classpath:config/logback-spring.xml

Consul과의 연결을 위한 설정 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ===================================
# Consul Discovery 설정
# ===================================

# Consul 서버 호스트
spring.cloud.consul.host=localhost

# Consul 서버 포트
spring.cloud.consul.port=9800

# Consul 연결 실패 시 애플리케이션 시작 실패 여부
# true: Consul 연결 실패 시 즉시 실패 (개발 환경 권장)
# false: Consul 연결 실패해도 애플리케이션 시작 (운영 환경 고려)
spring.cloud.consul.fail-fast=true

# Consul 기능 활성화
spring.cloud.consul.enabled=true

# Service Discovery 활성화
spring.cloud.consul.discovery.enabled=true

# Consul Config 비활성화 (필요시 활성화)
spring.cloud.consul.config.enabled=false

설정 항목에 대한 설명

속성설명권장값
spring.cloud.consul.hostConsul 서버 호스트 주소localhost (개발), 실제 호스트 (운영)
spring.cloud.consul.portConsul 서버 포트8500 (기본), 9800 (커스텀)
spring.cloud.consul.fail-fast연결 실패 시 즉시 실패 여부true (개발), false (운영)
spring.cloud.consul.enabledConsul 전체 기능 활성화true
spring.cloud.consul.discovery.enabledService Discovery 활성화true
spring.cloud.consul.config.enabledConsul Config 활성화false (Config Server 사용 시)

Consul 연결 확인

먼저 consul은 따로 다운로드가 필요하다. Download Consul </br></br> consul 다운로드 후 실행하기(테스트 환경)

1
./consul agent -dev -ui -client 127.0.0.1 -http-port 8500

Discovery Client 설정

GatewayApplication.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.cloud.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient  // Discovery Client 활성화
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

}

참고 자료

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.