프로젝트 Project

MSA 앱 만들기 - 1. 서버 구성

달래dallae 2025. 1. 7. 17:26

서버 구성

 

서버 구성요소

  • Git : 소스/프로파일 관리
  • Config Server : 프로파일/설정 정보
  • Eureka Server: 마이크로서비스 등록/검색
  • API Gateway Server: 마이크로서비스 부하 분산/서비스 라우팅
  • Microservices: 회원, 주문, 상품
  • Queuing System: 마이크로서비스 간 메시지 발행/구독

마이크로서비스 (API) 구성요소

  • 회원 user-service:  사용자 정보 등록, 조회, 사용자정보/주문내역 조회
  • 주문 order-service: 주문 등록, 주문 확인
  • 상품 catalog-service: 상품 목록

 

프로젝트 환경

  • spring boot 3.4.1
  • java 17
  • h2 database, jpa

Eureka + Spring Cloud Gateway

이 둘은 클라우드 네이티브 시스템에서 로드밸런서와 API 게이트웨이 역할을 한다.

 

그 역할은 다음과 같다.

유레카에 Spring cloud gateway 서비스와, 마이크로 서비스들을 등록한다.

마이크로 서비스는 설정한 바에 따라서 (server: port: 0)매번 실행될 때 마다 포트번호가 랜덤으로 지정되는데, api gateway는 routing 기능을 통해 마이크로서비스의 위치를 유레카에서 알아와 포워딩시킬 수 있다.

 

유레카와 스프링 클라우드 게이트웨이의 자세한 설정은 포스팅해둔 해당 글에서 확인할 수 있다.

 

1) Srping cloud gateway 서비스 : application.yml 설정

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args:
            baseMessage: Spring Cloud Gateway Global Filter
            preLogger: true
            postLogger: true
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
              - Path=/user-service/**

eureka와 routes 설정이 필요하다.

클라이언트가 해당 api gateway 서비스의 /user-service/라는 패스로 요청하게되면, 

routes 설정에서 lb(=eureka) 서버의 USER-SERVICE라는 이름을 가진 어플리케이션의 주소로 포워딩한다.

 

‼️주의할 점은, api gateway는 포워딩 할때 path값까지 포함한다는 것이다.

예를들어 http://apigateway주소/user-service/.. 로 호스트가 요청한다면 path까지 전달해 http://마이크로서비스주소/user-service/.. 로 전달하게된다.

따라서 마이크로서비스에서는 path값까지 URI 주소를 맞춰주어야 한다. (아니면 404 not found)

 

이게 싫다면, api gateway에서 설정을 추가해주면 된다.

      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
          	- Path=/user-service/**
            - Method=POST
          filters:
            - RemoveRequestHeader=Cookie
            - RewritePath=/user-service/(?<segment>.*), /\${segment}

RewritePath 설정을 통해 user-service로 들어온 것을 모두 없애서 보낼 수 있다.

즉, 클라이언트에서 http://apigateway주소/user-service/.. 로 보낸 요청을 http://마이크로서비스주소/..로 변경하여 보낸다.


마이크로 서비스 기능

1. 회원 user-service

user-service는 위에서 소개한 것처럼 사용자와 관련된 서비스를 담당한다.

 

DB는 H2 Database를 사용한다.

H2 Database 특징
- 자바로 작성된 오픈소스 RDBMS
- Embedded DB
- Server-client 가능
- JPA 연동 가능

 

spring boot 3점대를 사용할 경우, 버전을 높여서 사용해야 하기 때문에 기본적으로 application.yml에 db설정이 필요하다.

 

1) application.yml

spring:
  application:
    name: user-service
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: update
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console

embedded DB이므로 어플리케이션을 띄울 때 기본으로 사용할 db(여기서는 testdb)를 설정해주어야한다.

 

 

2) dependency (maven - pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.2.224</version>
    <scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

spring boot 3점대에서는 위와 같이 devtools와 jpa, h2 의존성을 알맞게 설정해주어야 한다.

그렇지 않으면 h2가 실행되지 않아 404에러가 뜨거나, testdb 생성되지 않을 수 있다.

 

그리고 lombok의 경우 꼭 버전을 명시해주어야 오류 없이 플러그인을 사용할 수 있다.