[항해 취업 리부트 코스] 모듈간 통신에 대하여 FeignClient

2024. 5. 1. 08:31카테고리 없음

이번주 과제 역시 저번주 이상으로 어려웠다.

이제 본격적으로 msa구조로 저번주에 모놀리스 하게 만들었던 프로젝트를 쪼갰는데

쪼개는 과정에서 모듈을 분리하다가 프로젝트가 꼬인 바람에 git stash를 하고 복구하려고 하였으나

 

심하게 꼬인 나머지 git stash한것도 복구를 못하고 많은 코드가 날라가 버렸다....

 

결국 git도 꼬여버려서 그 프로젝트 파일을 버리고 새롭게 아예 프로젝트를 만들어서 애초에 멀티 모듈로

프로젝트를 구성하고 코드를 쪼개서 넣기로 했다.

 

기존에 의존성과 결합을 가지고있던 단일db와 단일 서비스를 쪼개는건 매우 어려운 과정이었다.

각 의존성을 빼는 식으로 엔티티를 수정하고 서비스 코드들역시 수정이 필요했다

아직 보안과 게이트웨이는 시작도 못했다..

 

이번에 추천으로 FeignClient를 사용해서 각 모듈간의 통신을 진행해 보기로 했는데

이게 생각보다 관련 자료를 찾기가 힘들었다!

 

우선 사용하기 위해서는 먼저 각 서비스에 gradle에 의존성 처리를 해주어야 한다.

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:2022.0.5"
    }
}
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

 

우선 의존성을 추가를 마쳤다면 다음으로 api를 호출하려는 클라이언트 클래스를 만들어야 하는데 이곳에서 타 모듈과

연결하여 api를 호출하고 서비스에서 데이터를 받아올 수 있게 만들어 준다.

나의경우 memberFeignClient라고 초기 명을 지었다.

@FeignClient(name = "user-service", url = "http://localhost:8080/api/users")
public interface MemberFeignClient {

    @GetMapping("/{userId}")
    UserInfoResponseDTO getProfile(@PathVariable("userId") Long userId);
}

url에 연결할 모듈의 api를 매핑해 주고 아래는 상속과 비슷하게 해당 api와 똑같이 정의해 주었다.

여기서 신경쓸 점은 UserInfoResponseDTO. 해당 클래스는 User 모듈에있지 order모듈에 있는 dto가 당연히

아니다. 하지만 우린 해당 타입의 dto를 받아와야 데이터를 사용할 수 있으니 똑같은 DTO를 api를 호출시킬 

모듈에서도 만들어주면 된다.

이후 사용은 memberFeignClient를 service에서 일반적인 클래스처럼 사용하면 된다. 

UserInfoResponseDTO userInfoResponseDTO = memberFeignClient.getProfile(userId);

위와같이 사용해주면 목표한 dto를 받아올 수 있다.

생소한 서버간의 통신이기도 했고 이미 모듈과 db분리로 엉망 진창이된 머리속이라

그래도 서버간의 통신을 시작했다에 의의를 두고 게이트웨이와 보안작업은 숙제로 미뤄두었다.. 

 

항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.

https://hanghae99.spartacodingclub.kr/reboot