๐ INDEX
- Spring Cloud OpenFeign ์ฌ์ฉํ๊ธฐ
- OpenFeign ์ฃผ์ ํน์ง
- Spring Boot ๋ฒ์ ๋ณ Spring Cloud OpenFeign ํธํ์ฑ
- OpenFeign ์ ์ฉํ๊ธฐ
- ๊ฐ๋ฐ ํ๊ฒฝ
Spring Cloud OpenFeign
OpenFeign์ Java ๊ธฐ๋ฐ์ HTTP ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ ์ธ์ ์น ์๋น์ค ํด๋ผ์ด์ธํธ์ ๋๋ค. Spring Cloud์ ์ผ๋ถ๋ก ์ ๊ณต๋๋ฉฐ, RESTful API ์์ ํต์ ์ ๊ฐ์ํํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
OpenFeign์ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ์ฌ, API ํธ์ถ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ํฉ๋๋ค.
OpenFeign ์ฃผ์ ํน์ง
- ์ ์ธ์ API ํธ์ถ:
- OpenFeign์ ์ฌ์ฉํ๋ฉด ์ธํฐํ์ด์ค์ ์ ๋ํ ์ด์ ์ ํตํด HTTP ์์ฒญ์ ์ ์ธ์ ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๋์์ง๋๋ค.
- ์๋ํ๋ HTTP ์์ฒญ:
- OpenFeign์ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๋ฅผ ์ธํฐํ์ด์ค ๋ฉ์๋์ ๋งคํํ์ฌ, ๋ณต์กํ HTTP ์์ฒญ์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ํตํฉ๊ณผ ํ์ฅ์ฑ:
- Spring Cloud์ ํตํฉ๋์ด, Eureka์ ๊ฐ์ ์๋น์ค ๋ฑ๋ก ๋ฐ ๋ฐ๊ฒฌ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํํฐ, ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ, ์ธ์ฝ๋ ๋ฐ ๋์ฝ๋ ๋ฑ์ ํตํด ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค.
- ์ ์ฐํ ๊ตฌ์ฑ:
- ๋ค์ํ ๊ตฌ์ฑ ์ต์ ์ ์ ๊ณตํ์ฌ, ํ์์์, ๋ฆฌํธ๋ผ์ด ์ ์ฑ , ๋ก๊น ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
- REST API ๋ฌธ์ํ:
- OpenFeign์ Swagger์ ๊ฐ์ ๋๊ตฌ์ ํตํฉํ์ฌ API ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
Spring Boot ๋ฒ์ ๋ณ Spring Cloud OpenFeign ํธํ์ฑ
๋ฒ์ ๋ณ ํธํ์ฑ์ ์๋์ ๊ฐ์ต๋๋ค.
- Spring Boot 2.1.x
- Spring Cloud 2.1.x (OpenFeign 2.1.x)
- Spring Cloud 2.2.x (OpenFeign 2.2.x)
- Spring Boot 2.2.x
- Spring Cloud 2.2.x (OpenFeign 2.2.x)
- Spring Cloud 2.3.x (OpenFeign 2.3.x)
- Spring Boot 2.3.x
- Spring Cloud 2.3.x (OpenFeign 2.3.x)
- Spring Cloud 2.4.x (OpenFeign 2.4.x)
- Spring Boot 2.4.x
- Spring Cloud 2020.0.x (OpenFeign 3.0.x)
- Spring Cloud 2021.x (OpenFeign 3.1.x)
- Spring Boot 2.5.x
- Spring Cloud 2020.0.x (OpenFeign 3.0.x)
- Spring Cloud 2021.x (OpenFeign 3.1.x)
- Spring Boot 2.6.x
- Spring Cloud 2021.x (OpenFeign 3.1.x)
- Spring Boot 3.x
- Spring Cloud 2022.x (OpenFeign 4.x)
https://spring.io/projects/spring-cloud#overview
Spring Cloud ํํ์ด์ง์์ ๊ฐ ๋ฆด๋ฆฌ์ฆ ๋ณ ํธํ์ฑ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign
๋ฉ์ด๋ธ ๋ ํฌ์งํ ๋ฆฌ ํํ์ด์ง์์ ๋ฒ์ ์ ๋ง๋ ์์กด์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
OpenFeign ์ ์ฉํ๊ธฐ
์์กด์ฑ ์ถ๊ฐ
// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '4.0.0'
์ ๋ Gradle ์ ์ฌ์ฉํ๊ณ ์์ด, build.gradle ํ์ผ์ ์์กด์ฑ์ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.
Spring Boot 3.2.2 ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ด OpenFeign 4.0 ๋ฒ์ ์ ์์กด์ฑ์ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.
OpenFeign ํ์ฑํ (@EnableFeignClients ์ด๋ ธํ ์ด์ ์ถ๊ฐ)
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@SpringBootApplication
public class LiyoApplication {
public static void main(String[] args) {
SpringApplication.run(LiyoApplication.class, args);
}
}
main ํด๋์ค์ @EnableFeignClients ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํด ์ค๋๋ค.
์์กด์ฑ ์ถ๊ฐ ํ JAVA Clean ํน์ ์ฌ๋น๋ ํ์ง ์์ผ๋ฉด import ๊ฐ ์ ๋๋ก ๋์ง ์์ ์ ์์ต๋๋ค.
๋นจ๊ฐ ์ค์ด ๋จ๊ณ ์ด๋ ธํ ์ด์ ์ถ๊ฐ ๋ฐ import ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์๋ฐ ํด๋ฆฐ ์งํํด ์ฃผ์ธ์.
ํ๊ฒฝ ์ค์ ( url ์ธํ )
application.property ํน์ application.yml ํ์ผ์ ํ๊ฒฝ ์ค์ ์ ๋ณด๋ฅผ ์ธํ ํฉ๋๋ค.
spring:
cloud:
openfeign:
client:
config:
liyoServiceClient: # ํด๋ผ์ด์ธํธ ์ด๋ฆ
url: http://liyo-service-url.com
anotherLiyoServiceClient:
url: http://anotherLiyo-service-url.com
๊ธฐ๋ณธ์ ์ธ url ๋ถํฐ ํ์์ ๋ฐ๋ผ Timeout, loggerLevel ๋ฑ ๋ค์ํ ์ค์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
FeignClient ๊ตฌํํ๊ธฐ
์ธํฐํ์ด์ค์ @FeignClient ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ API ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํด ์ค๋๋ค.
์ ๋ liyoService ์ anotherLiyoService ์ด 2๊ฐ์ API ๋ฅผ ์ธํ ํด์ฃผ์์ผ๋ฏ๋ก, 2 ๊ฐ์ FeignCilent ํ์ผ์ ์์ฑํด ์ค ๊ฒ๋๋ค.
client ํด๋๋ฅผ ์์ฑํ์ฌ, FeignClient ํ์ผ์ ์์ฑํด ์ฃผ์์ต๋๋ค.
์ด๋ฏธ์ง์๋ Service ๋ผ๊ณ ๋์ด์์ง๋ง, ์ค์ Service ํด๋์ค๋ฅผ ์์ฑํ ๋ ์ด๋ฆ์ด ๊ฒน์ณ ์ค์ ์ฝ๋์๋ Client ๋ฅผ ๋ถ์ฌ์ฃผ์์ต๋๋ค.
package com.liyo.exemple.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import com.liyo.exemple.dto.fireSafety.LiyoServiceResponse;
@FeignClient(name = "liyoServiceClient", url = "${spring.cloud.openfeign.client.config.liyoServiceClient.url}")
public interface LiyoServiceClient {
@GetMapping("/some-endpoint/{id}") // ์ค์ ์๋ํฌ์ธํธ์ ๋ง๊ฒ ์์
LiyoServiceResponse getLiyoServiceData(@PathVariable("id") String id);
}
๋์ผํ ์์์ผ๋ก ํด๋ผ์ด์ธํธ ๊ฐ์๋งํผ ์์ฑํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
์๋ต DTO ํด๋์ค ์์ฑํ๊ธฐ
package com.liyo.example.dto.fireSafety;
public class LiyoServiceResponse {
}
๊ฐ API์ ์๋ต์ ๋ฐ์ DTO ํด๋์ค๋ฅผ ์์ฑํด ์ค๋๋ค.
FeignConfig ์์ฑํ๊ธฐ
Feign ํด๋ผ์ด์ธํธ์ ์ค์ ์ ์ง์ ํ ์ ์๋ Config ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
ํด๋น Config ๊ฐ ์ ์ฉ๋๋ FeginClient ์ ๊ณตํต์ผ๋ก ๋ก๊น ์ด๋ ํ์์์ ์ค์ ๋ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
package com.liyo.example.config;
import feign.Logger;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeginConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; // ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์ ๋ก๊น
}
@Bean
public RequestInterceptor requestInterceptor() {
return requestTemplate -> {
requestTemplate.header("Content-Type", "application/json");
requestTemplate.header("Accept", "application/json");
};
}
}
RequestInterceptor
- ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ header๋ฅผ ์ค์ ํฉ๋๋ค.
Log์ค์
- NONE : ๋ก๊น ํ์ง ์์ต๋๋ค.(DEFAULT)
- BASIC : Request Method์ URL, Reponse ์ํ ์ฝ๋ ๋ฐ ์คํ ์๊ฐ์ ๋ก๊น ํฉ๋๋ค.
- HEADERS : Request, Response Header + BASIC ์ ๋ณด๋ฅผ ๋ก๊น ํฉ๋๋ค,
- FULL : Request, Response์ Header, Body, ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ก๊น ํฉ๋๋ค.
Service ํด๋์ค์์ ์ฌ์ฉํ๊ธฐ
FeignClient ๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ ์๋น์ค ํด๋์ค๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
package com.liyo.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ebab.lsdtgl.client.EabFireSafetyClient;
import com.ebab.lsdtgl.dto.fireSafety.FireSafetyResponse;
@Service
public class LiyoService {
@Autowired
private LiyoServiceClient liyoServiceClient;
public LiyoServiceResponse getLiyoServiceData(String id) {
return liyoServiceClient.getLiyoServiceData(id);
}
}
๊ฐ๋ฐ ํ๊ฒฝ
- Frontend
- Framework: Vue 3
- Build Tool: Vite
- Backend
- Framework: Spring Boot 3.2.2
- Language: Java
- Gateway: Spring Cloud Gateway
- Database
- DBMS: MS SQL Server
- Container: Docker
- Development Tools
- IDE: Visual Studio Code (VSCode)
'Java > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] ResourceCloseHelper Class ์์ฑ - ๋ฆฌ์์ค ๊ด๋ฆฌ (0) | 2024.11.16 |
---|---|
[Spring Boot] WebUtil Class ์์ฑ - XSS, SQL injection ๋ณด์ ์ทจ์ฝ์ ๋ฐฉ์ง (3) | 2024.11.14 |
[Spring Boot] StringUtilClass (0) | 2024.09.29 |
[Spring Boot] FTP Server ๊ตฌํํ๊ธฐ (2) | 2024.09.28 |
[SpringBoot] 3.x ๋ฒ์ ๋ง์ด๊ทธ๋ ์ด์ RestTemplate ์ค๋ฅ ํด๊ฒฐ (1) | 2024.08.05 |