Spring Cloud FeignClient 사용기 (Feign Client에서 쿠키가 담아지지 않을 때 대처법)

작성자 : 조회수 :


몇 가지 미리 설정을 마쳐 놓았다고 전제하에 진행하겠습니다.

 

implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

 

Api-GateWay 어플리케이션과 Discovery 어플리케이션 둘 다 등록, 설정이 완료된 상태입니다.

 

 

 

 

일단 라이브러리를 등록해줍니다.





그리고 이미 discovery 어플리케이션에 위와 같이 등록되어 있어

 

@FeignClient를 사용해 interface를 등록해주면 됩니다.

(“auction-userdiscovery에 등록된상태입니다. Gateway도 마찬가지입니다.”)

 

@FeignClient(name = "auction-user")
public interface AuctionUserInterFace {

   
@GetMapping("/user/info/{userid}")
   
ResponseEntity<UserModelFront> findUserModelFront(@RequestHeader("Authorization")String token,
                                                      
@RequestHeader("RefreshToken") String reToken,
                                                     
@PathVariable int userid);

   
@GetMapping("/user/info/{userid}")
   
ResponseEntity<UserModelFront> findUserModelFront(@PathVariable int userid);

   
@GetMapping("/user/info/{userid}")
   
ResponseEntity<UserModelFront> findUserModelFront(@RequestHeader("Cookie") String cookie,
                                                     
@PathVariable int userid);

}

 

헤더를 담는 방법은 간단합니다 위와 같이 RequestHeder에 담아주면 됩니다.

 

Cookie는 문자열로 “name=value” 이런 식으로 담아줘야 합니다. 그냥 “=” 이거 없이 value로 담아서 보내면,

 

다른 어플리케이션이 받을 때는 cookie 이름없이 단순 네임만 받습니다

 

Ex) “cookievalue : “ 이런 식으로 나옵니다 원래라면 “name : value” 이렇게 받아져야 합니다.

 

 

 

만약에 위와 같이 해도 보내지지 않는다면 특별한 설정을 해둬야합니다.

 

FeignClient으로 보내는 쪽과 받는 쪽 둘 다 해주세요.

 

그리고 요청 받는 어플리케이션에 저렇게 엔드 포인트만 만들어주면 됩니다.

 

 

 

import feign.RequestInterceptor;
import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfiguration {

   
@Bean
   
public RequestInterceptor feignCookieInterceptor(CookieStore cookieStore) {
       
return new FeignCookieInterceptor(cookieStore);
    }

   
@Bean
   
public CookieStore cookieStore() {
       
return new BasicCookieStore();
    }
}

 

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.http.client.CookieStore;

import java.util.stream.Collectors;

public class FeignCookieInterceptor implements RequestInterceptor {

   
private final CookieStore cookieStore;

   
public FeignCookieInterceptor(CookieStore cookieStore) {
       
this.cookieStore = cookieStore;
    }

   
@Override
   
public void apply(RequestTemplate template) {
       
if (cookieStore != null && !cookieStore.getCookies().isEmpty()) {
           
String cookies = cookieStore.getCookies().stream()
                    .
map(cookie -> cookie.getName() + "=" + cookie.getValue())
                    .
collect(Collectors.joining("; "));
           
template.header("Cookie", cookies);
        }
    }

}

 

두개의 자바 파일은 만약 기본적으로 FeignClient가 쿠키 값을 담아 보내주지 않을 때, cookie를 헤더에 담아서 보내주는 설정입니다. (원래 Header에 쿠키가 담겨서 보내지긴 한다.)