πŸ“Š Java-Service-Tree-Framework-Middle-Proxy ν”„λ‘œμ νŠΈ ꡬ쑰 뢄석 * Spring Security 와 Keycloak 을 μ—°λ™ν•œ 인증 인가 μ‹œμŠ€ν…œ 적용 ( Spring security μ„€μ •κ³Ό λ™μž‘μ„ 뢄리 ) * Spring OAuth2RestTemplate 을 ν™œμš©ν•œ μ—°κ΄€ μ‹œμŠ€ν…œκ°„μ˜ 톡신 적용 μ™„λ£Œ ( μ‚¬μš©μž 베이슀 톡신 λ™μž‘μ„ 뢄리 ) * Docker file 을 μžλ™μœΌλ‘œ κ΅¬μ„±ν•˜λ„λ‘ μ„€μ • * Artifact Version 을 μžλ™μœΌλ‘œ κ΅¬μ„±ν•˜λ„λ‘ μ„€μ • * ZuulProxy λ₯Ό ν™œμš©ν•œ MSA Gateway ꡬ성 * Zipkin 을 ν™œμš©ν•œ Request Flow 좔적 ### Those who support us! ### 0. Nexus 의 Realms 에 Docker Bearer Token 을 Active ν•΄μ•Ό Docker login κ°€λŠ₯ 함. 1. λΉŒλ“œ μ‹œ, Jenkins agent κ°€ λ™μž‘ν•˜λŠ” HOST 에 Docker Login {Nexus}λ₯Ό ν•΄μ•Όλ§Œ 401 없이 push 됨 ---- 둜컬 ꡬ동 ν™˜κ²½: μΈν…”λ¦¬μ œμ΄, Windows 10 이상 λ˜λŠ” Mac 1. μΈν…”λ¦¬μ œμ΄μ—μ„œ ν•΄λ‹Ή ν”„λ‘œμ νŠΈλ₯Ό git clone ν•œ ν›„, 파일 > ν”„λ‘œμ νŠΈ ꡬ쑰(project structure)μ—μ„œ JDKλ₯Ό 17둜 μ„€μ •ν•©λ‹ˆλ‹€. Amazon Corretto 17을 μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€. 2. λΉŒλ“œ > λΉŒλ“œ ν”„λ‘œμ νŠΈ(build project)λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. 3. 우츑 μƒλ‹¨μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ > ꡬ성 νŽΈμ§‘(Edit Configurations)에 λ“€μ–΄κ°€μ„œ Active Profiles μž…λ ₯칸에 dev라고 μž…λ ₯ν•©λ‹ˆλ‹€. 4. ν”„λ‘œμ νŠΈ μ‹€ν–‰λ²„νŠΌμ„ ν΄λ¦­ν•©λ‹ˆλ‹€. Swagger URL = http://127.0.0.1:13131/middle-proxy-api/swagger-ui/ 🎯 ν”„λ‘œμ νŠΈ κ°œμš” ν”„λ‘œμ νŠΈλͺ…: Java-Service-Tree-Framework-Middle-Proxy νƒ€μž…: Spring Cloud Gateway 기반 MSA κ²Œμ΄νŠΈμ›¨μ΄ / 미듀웨어 ν”„λ‘μ‹œ μ—­ν• : λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°„μ˜ λΌμš°νŒ…, 인증/인가, 톡합 관리 πŸ› οΈ 기술 μŠ€νƒ 핡심 ν”„λ ˆμž„μ›Œν¬: Spring Boot 2.6.3 Spring Cloud Gateway Java 17 Gradle 7.6.4 μ£Όμš” 기술: 인증/인가: Keycloak + Spring Security OAuth2 μ„Έμ…˜ 관리: Redis (Spring Session Data Redis) 톡신: OpenFeign (μ„œλΉ„μŠ€ κ°„ 톡신) λͺ¨λ‹ˆν„°λ§: Zipkin (λΆ„μ‚° 좔적), Elastic APM, Actuator λ©”μ‹œμ§•: Kafka API λ¬Έμ„œν™”: Swagger (Springfox 3.0.0) μ•Œλ¦Ό: Slack API μ»¨ν…Œμ΄λ„ˆ: Docker πŸ“ μ£Όμš” 디렉토리 ꡬ쑰 Java-Service-Tree-Framework-Middle-Proxy/ β”‚ β”œβ”€β”€ πŸ“‚ src/ β”‚ └── πŸ“‚ main/ β”‚ β”œβ”€β”€ πŸ“‚ java/com/arms/ β”‚ β”‚ β”œβ”€β”€ πŸ“„ Application.java # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ§„μž…μ  β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ api/ # API μ—”λ“œν¬μΈνŠΈ λ ˆμ΄μ–΄ β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ keycloak/ # Keycloak 연동 API β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ mapping/ # 데이터 λ§€ν•‘ API β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ req/ # μš”μ²­ 처리 API β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ scheduler/ # μŠ€μΌ€μ€„λŸ¬ 관리 β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ user/ # μ‚¬μš©μž 관리 API β”‚ β”‚ β”‚ └── πŸ“‚ util/ # API μœ ν‹Έλ¦¬ν‹° β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ client/ # μ™ΈλΆ€ ν΄λΌμ΄μ–ΈνŠΈ 톡신 β”‚ β”‚ β”‚ └── πŸ“‚ dwr/ # DWR(Direct Web Remoting) ν΄λΌμ΄μ–ΈνŠΈ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ config/ # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ AppConfig.java # κΈ°λ³Έ μ•± μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ KeycloakConfig.java # Keycloak μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ RedisConfig.java # Redis μ„Έμ…˜ μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ KafkaConfig.java # Kafka λ©”μ‹œμ§• μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ OpenFeignConfig.java # Feign ν΄λΌμ΄μ–ΈνŠΈ μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ SlackConfig.java # Slack μ•Œλ¦Ό μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ ThreadPoolConfig.java # μŠ€λ ˆλ“œ ν’€ μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ WebConfig.java # μ›Ή μ„€μ • β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ FeignResponseDecoderConfig.java # Feign 응닡 디코더 β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“„ PropertiesConfiguration.java # ν”„λ‘œνΌν‹° μ„€μ • β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ filter/ # μš”μ²­/응닡 ν•„ν„° β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ handler/ # μ˜ˆμ™Έ/이벀트 ν•Έλ“€λŸ¬ β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ interceptor/ # HTTP 인터셉터 β”‚ β”‚ β”‚ β”œβ”€β”€ πŸ“‚ security/ # λ³΄μ•ˆ μ„€μ • β”‚ β”‚ β”‚ └── πŸ“‚ swagger/ # Swagger API λ¬Έμ„œ μ„€μ • β”‚ β”‚ β”‚ β”‚ β”‚ └── πŸ“‚ util/ # 곡톡 μœ ν‹Έλ¦¬ν‹° β”‚ β”‚ └── πŸ“„ DataSerializer.java # 데이터 직렬화 μœ ν‹Έ β”‚ β”‚ β”‚ └── πŸ“‚ resources/ # λ¦¬μ†ŒμŠ€ 파일 β”‚ β”œβ”€β”€ πŸ“„ application.yml # κΈ°λ³Έ μ„€μ • 파일 β”‚ β”œβ”€β”€ πŸ“„ application-dev.yml # 개발 ν™˜κ²½ μ„€μ • β”‚ β”œβ”€β”€ πŸ“„ application-stg.yml # μŠ€ν…Œμ΄μ§• ν™˜κ²½ μ„€μ • β”‚ β”œβ”€β”€ πŸ“„ application-live.yml # 운영 ν™˜κ²½ μ„€μ • β”‚ β”œβ”€β”€ πŸ“„ banner.txt # μ‹œμž‘ λ°°λ„ˆ β”‚ β”œβ”€β”€ πŸ“„ rebel.xml # JRebel μ„€μ • β”‚ β”‚ β”‚ └── πŸ“‚ logback/ # λ‘œκΉ… μ„€μ • β”‚ β”œβ”€β”€ πŸ“„ console-appender.xml # μ½˜μ†” 둜그 μ„€μ • β”‚ β”œβ”€β”€ πŸ“„ logback-dev.xml # 개발 ν™˜κ²½ 둜그 β”‚ β”œβ”€β”€ πŸ“„ logback-stg.xml # μŠ€ν…Œμ΄μ§• ν™˜κ²½ 둜그 β”‚ └── πŸ“„ logback-live.xml # 운영 ν™˜κ²½ 둜그 β”‚ β”œβ”€β”€ πŸ“‚ certs/ # SSL/TLS μΈμ¦μ„œ β”‚ β”œβ”€β”€ πŸ“‚ 313_co_kr/ # 313.co.kr 도메인 μΈμ¦μ„œ β”‚ β”‚ β”œβ”€β”€ πŸ“„ 313_co_kr.crt # μΈμ¦μ„œ 파일 β”‚ β”‚ β”œβ”€β”€ πŸ“„ 313_co_kr.pfx # PKCS#12 μΈμ¦μ„œ β”‚ β”‚ β”œβ”€β”€ πŸ“„ 313_co_kr_SHA256WITHRSA.key # 개인 ν‚€ β”‚ β”‚ └── πŸ“‚ ChainCA/ # 체인 μΈμ¦μ„œ β”‚ β”‚ β”‚ └── πŸ“‚ a-rms_net/ # a-rms.net 도메인 μΈμ¦μ„œ β”‚ β”œβ”€β”€ πŸ“„ a-rms_net.crt β”‚ β”œβ”€β”€ πŸ“„ a-rms_net.pfx β”‚ β”œβ”€β”€ πŸ“„ a-rms_net_SHA256WITHRSA.key β”‚ └── πŸ“‚ ChainCA/ β”‚ β”œβ”€β”€ πŸ“‚ Redis-x64-3.2.100/ # Redis μ„œλ²„ (Windows용) β”‚ β”œβ”€β”€ πŸ“„ redis-server.exe # Redis μ‹€ν–‰ 파일 β”‚ β”œβ”€β”€ πŸ“„ redis-cli.exe # Redis CLI 도ꡬ β”‚ β”œβ”€β”€ πŸ“„ redis.windows.conf # Redis μ„€μ • 파일 β”‚ └── πŸ“„ redis.windows-service.conf # Windows μ„œλΉ„μŠ€ μ„€μ • β”‚ β”œβ”€β”€ πŸ“‚ gradle/ # Gradle Wrapper β”‚ └── πŸ“‚ wrapper/ β”‚ β”œβ”€β”€ πŸ“„ gradle-wrapper.jar β”‚ └── πŸ“„ gradle-wrapper.properties β”‚ β”œβ”€β”€ πŸ“‚ .github/ # GitHub μ„€μ • β”‚ └── πŸ“‚ workflows/ β”‚ └── πŸ“„ release-drafter.yml # Release μžλ™ν™” β”‚ β”œβ”€β”€ πŸ“‚ .idea/ # IntelliJ IDEA μ„€μ • β”‚ β”œβ”€β”€ πŸ“„ workspace.xml β”‚ β”œβ”€β”€ πŸ“„ compiler.xml β”‚ β”œβ”€β”€ πŸ“„ gradle.xml β”‚ └── πŸ“„ vcs.xml β”‚ β”œβ”€β”€ πŸ“‚ .gradle/ # Gradle μΊμ‹œ β”‚ β”œβ”€β”€ πŸ“„ build.gradle # Gradle λΉŒλ“œ 슀크립트 β”œβ”€β”€ πŸ“„ settings.gradle # Gradle ν”„λ‘œμ νŠΈ μ„€μ • β”œβ”€β”€ πŸ“„ gradlew # Gradle Wrapper (Unix) β”œβ”€β”€ πŸ“„ gradlew.bat # Gradle Wrapper (Windows) β”‚ β”œβ”€β”€ πŸ“„ Dockerfile # Docker 이미지 λΉŒλ“œ β”œβ”€β”€ πŸ“„ docker-entrypoint.sh # Docker μ»¨ν…Œμ΄λ„ˆ μ§„μž…μ  β”‚ β”œβ”€β”€ πŸ“„ elastic-a βš™οΈ μ£Όμš” μ„€μ • 및 κΈ°λŠ₯ 1. 인증/인가 μ‹œμŠ€ν…œ Keycloak 톡합 Spring Security OAuth2 (Resource Server + Client) JWT 토큰 기반 인증 Redis 기반 μ„Έμ…˜ 관리 2. Gateway κΈ°λŠ₯ Spring Cloud Gatewayλ₯Ό ν†΅ν•œ λΌμš°νŒ… μš”μ²­/응닡 필터링 λΆ€ν•˜ λΆ„μ‚° 3. 톡합 κΈ°λŠ₯ OpenFeign을 ν†΅ν•œ μ„œλΉ„μŠ€ κ°„ 톡신 Kafka λ©”μ‹œμ§€ 브둜컀 톡합 Slack μ•Œλ¦Ό 톡합 4. λͺ¨λ‹ˆν„°λ§ & 좔적 Zipkin을 ν†΅ν•œ λΆ„μ‚° 좔적 Elastic APM μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ Spring Cloud Sleuth Actuator Health Check 5. λΉŒλ“œ & 배포 μžλ™ 버전 관리 (Nexusμ—μ„œ 메타데이터 μ‘°νšŒν•˜μ—¬ μžλ™ 증가) Docker 이미지 μžλ™ 생성 Maven Nexus 배포 μžλ™ν™” SonarQube μ½”λ“œ ν’ˆμ§ˆ 뢄석 πŸ” λ³΄μ•ˆ μ„€μ • SSL/TLS μΈμ¦μ„œ 관리 (313.co.kr, a-rms.net) Keycloak 기반 쀑앙 인증 OAuth2 Resource Server 🌐 ν™˜κ²½λ³„ μ„€μ • dev: 개발 ν™˜κ²½ stg: μŠ€ν…Œμ΄μ§• ν™˜κ²½ live: 운영 ν™˜κ²½ πŸ“¦ 버전 관리 ν˜„μž¬ 버전: 25.10.x (μžλ™ 증가) Nexus Repository: http://www.313.co.kr/nexus/repository/ple-releases/ Docker Registry: 313.co.kr:5550 πŸŽͺ νŠΉμ§• λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ²Œμ΄νŠΈμ›¨μ΄: λͺ¨λ“  μš”μ²­μ˜ μ§„μž…μ  μ—­ν•  쀑앙 인증: Keycloak 기반 SSO (Single Sign-On) 톡합 λΌμš°νŒ…: μ—¬λŸ¬ λ°±μ—”λ“œ μ„œλΉ„μŠ€λ‘œ μš”μ²­ λΌμš°νŒ… λΆ„μ‚° 좔적: Zipkin으둜 μ„œλΉ„μŠ€ κ°„ 호좜 좔적 μžλ™ν™” λΉŒλ“œ: 버전 μžλ™ 증가 및 Docker 이미지 μžλ™ 생성 이 ν”„λ‘œμ νŠΈλŠ” A-RMS μ‹œμŠ€ν…œμ˜ API Gateway이자 인증 ν”„λ‘μ‹œ 역할을 ν•˜λŠ” 핡심 λ―Έλ“€μ›¨μ–΄λ‘œ λ³΄μž…λ‹ˆλ‹€. λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ 이 κ²Œμ΄νŠΈμ›¨μ΄λ₯Ό ν†΅κ³Όν•˜μ—¬ 각 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ‘œ λΌμš°νŒ…λ˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.