IT/Live Coding

Spring Cloud Gateway + API 서버 연동 예제 🚀 (테스트 영상 & 소스코드 포함)

어흥꼬비 2025. 4. 1.

Spring Cloud Gateway + API 서버 연동 예제 🚀 (테스트 영상 & 소스코드 포함)

Spring Boot에서 Spring Cloud Gateway를 활용해 API 서버와 연동하는 간단한 예제입니다.

이번에도 small make 방식으로 구현했습니다.

이 예제에서는 Gateway 서버가 클라이언트의 요청을 받아 특정 경로에 따라 API 서버로 라우팅하는 방법을 다룹니다. 🚀


동영상 🎬

소스 💻

gateway

application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: user
          uri: http://localhost:8081
          predicates:
            - Path=/user/**
        - id: product
          uri: http://localhost:8082
          predicates:
            - Path=/prod/**
server:
  port: 80

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.10'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.lsy'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2023.0.5")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

api 1번(User Micro Service 역할)

application.yml

server:
  port: 8081
  servlet:
    context-path: /
    encoding:
      charset: UTF-8
      enabled: true
      force: true

spring:
  application:
    name: user
  devtools:
    livereload.enabled: true
    restart.enabled: true

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.10'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.lsy'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}

main method

package com.lsy.api1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Api1Application {

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

}

RestApiController

package com.lsy.api1.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequiredArgsConstructor
@Slf4j
public class RestApiController {

    @GetMapping("")
    public String index() {
        return "api server 1 request~~~";
    }

    // user api
    @GetMapping("/user")
    public List<String> ms1() {
        log.info("user server~~~~~~~~~~~~~~~~");
        ArrayList<String> list = new ArrayList<>();
        list.add("user server");
        list.add("홍길동");
        list.add("임꺽정");
        return list;
    }
}

api 2번(Product Micro Service 역할)

application.yml

server:
  port: 8082
  servlet:
    context-path: /
    encoding:
      charset: UTF-8
      enabled: true
      force: true

spring:
  devtools:
    livereload.enabled: true
    restart.enabled: true

build.gradle

server:
  port: 8082
  servlet:
    context-path: /
    encoding:
      charset: UTF-8
      enabled: true
      force: true

spring:
  devtools:
    livereload.enabled: true
    restart.enabled: true

RestApiController

package com.lsy.api2.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequiredArgsConstructor
@Slf4j
public class RestApiController {

    @GetMapping("")
    public String index() {
        return "api server 2 request~~~";
    }


    // product server
    @GetMapping("/prod")
    public List<String> ms2() {
        log.info("product server~~~~~~~~~~~~~~~~");
        ArrayList<String> list = new ArrayList<>();
        list.add("product server");
        list.add("간장");
        list.add("마늘");
        return list;
    }
}

개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.

틀린 점 있을 경우 댓글 부탁드립니다.

 

Spring Boot + Redis로 세션 공유하기 (테스트 영상 & 소스 코드 포함)

Redis를 활용한 애플리케이션 간 세션 공유 실험! (짧고 간단한 영상)레디스를 공부한지 얼마 안되어서 까먹기 싫어 기록으로 남긴다.동영상소스application.ymlserver: port: 9090 servlet: context-path: / encodin...

yaga.tistory.com

 

Spring Boot + JWT로 인증 시스템 구현 (테스트 영상 & 소스 코드 포함)

springBoot와 JWT를 이용한 인증 서버를 간단히 구축해봤다.메타코딩님의 "스프링부트 시큐리티 - JWT"를 보고, 이를 바탕으로 스스로 복기하며 학습한 내용을 기록으로 남긴다.동영상 🎬 JwtAuthorizati...

yaga.tistory.com

 

[AWS] 서버 및 DB 구축/배포 기본 가이드: 무경험자도 쉽게 시작하기

이 포스팅은 AWS 회원가입부터 EC2/RDS 인스턴스 생성 및 웹서버와 연동한 기본 가이드입니다.2025년 2월15일 07:40 기준 아키텍처 버전1은 완료된 상태입니다. 😄2025년 2월17일 22:12 기준 아키텍처 버...

yaga.tistory.com