Mingyum-Kim / Iamhere

😉 국내 거주 외국인 매칭 서비스 "I-am-here" 😉
1 stars 0 forks source link

[Feature/#25] 회원과 게시글 모듈 간의 API 호출을 위해 OpenFeign 적용 #26

Closed Mingyum-Kim closed 1 year ago

Mingyum-Kim commented 1 year ago

⭐ 기능 설명

25 회원과 게시글의 연동을 위해 OpenFeign을 이용해 API를 호출한다.

😎 작업 내용

🌈 추가 검토할 사항

애플리케이션 이름으로 OpenFeign Client를 등록하기 위해 Eureka 에 애플리케이션을 등록해야하는 것으로 보인다.

그리고, FeignClient는 과연 member 모듈과 post 모듈 중 어디에 선언되어야 하는 것인가 ? -> post 모듈에 작성하는 게 맞는 것 같다. 왜냐하면, post 모듈의 PostService에서 호출되는 인터페이스이므로 OpenFeign의 목적에 맞게 Post 모듈에 생성해야 한다.

Mingyum-Kim commented 1 year ago

Post 모듈에서는 MemberApiClient (Feign Client) 부분의 의존성과 관련한 에러가, Member 모듈에서는 MemberController에서 사용한 HttpServletRequest의 의존성과 관련한 에러가 각각 뜨고 있어서 Eureka Client의 테스트가 불가능한 상황이다.

Description:

Parameter 2 of constructor in com.personal.member.controller.MemberController required a bean of type 'javax.servlet.http.HttpServletRequest' that could not be found.

Action:

Consider defining a bean of type 'javax.servlet.http.HttpServletRequest' in your configuration.
Description:

Parameter 1 of constructor in com.personal.post.service.PostService required a bean of type 'com.personal.post.client.MemberApiClient' that could not be found.

Action:

Consider defining a bean of type 'com.personal.post.client.MemberApiClient' in your configuration.

해결하시오 !

Mingyum-Kim commented 1 year ago

그리고, 여러 환경에서 Eureka Server를 공유하기 위해서 AWS에 서버를 띄워야 합니다. https://github.com/Mingyum-Kim/Eureka-Server-for-Iamhere 여기에 서버를 올렸고, AWS에 git clone하여 서버를 실행하였습니다.

Mingyum-Kim commented 1 year ago

Post 모듈에서는 MemberApiClient (Feign Client) 부분의 의존성과 관련한 에러가, Member 모듈에서는 MemberController에서 사용한 HttpServletRequest의 의존성과 관련한 에러가 각각 뜨고 있어서 Eureka Client의 테스트가 불가능한 상황이다.

Description:

Parameter 2 of constructor in com.personal.member.controller.MemberController required a bean of type 'javax.servlet.http.HttpServletRequest' that could not be found.

Action:

Consider defining a bean of type 'javax.servlet.http.HttpServletRequest' in your configuration.
Description:

Parameter 1 of constructor in com.personal.post.service.PostService required a bean of type 'com.personal.post.client.MemberApiClient' that could not be found.

Action:

Consider defining a bean of type 'com.personal.post.client.MemberApiClient' in your configuration.

해결하시오 !

public class MemberApiClientImpl implements MemberApiClient{
    @Override
    public String getNickname(Long id) {
        return null;
    }
}

MemberApiClient의 구현체를 임의로 만들어서 AppConfig에서 직접 설정을 하여 해결하였습니다. 인터페이스는 구현체가 없이는 빈 등록이 안되는 걸까요?

@Configuration
public class AppConfig {
    @Bean
    public MemberApiClient memberApiClient() {
        return new MemberApiClientImpl();
    }
}
Mingyum-Kim commented 1 year ago

Post 모듈에서는 MemberApiClient (Feign Client) 부분의 의존성과 관련한 에러가, Member 모듈에서는 MemberController에서 사용한 HttpServletRequest의 의존성과 관련한 에러가 각각 뜨고 있어서 Eureka Client의 테스트가 불가능한 상황이다.

Description:

Parameter 2 of constructor in com.personal.member.controller.MemberController required a bean of type 'javax.servlet.http.HttpServletRequest' that could not be found.

Action:

Consider defining a bean of type 'javax.servlet.http.HttpServletRequest' in your configuration.

Member 단의 오류에 대해서, private final HttpServletRequest request와 같이 의존성 주입을 하는 것이 아니라, request 혹은 response를 불러오고 싶은 메소드에 @RequestAttribute를 사용해서 매개변수로 넣는 것입니다. 아래와 같이!

    @PostMapping("/join/confirm")
    @ResponseBody
    public ResponseEntity<String> confirmMail(@RequestParam("mail") String mail,
                                              **@RequestAttribute HttpServletResponse response**) throws Exception {
        String code = mailService.sendSimpleMessage(mail);
        Cookie verificationCookie = new Cookie("verificationCode", code);
        verificationCookie.setMaxAge(180);
        response.addCookie(verificationCookie);
        return ResponseEntity.ok(code);
    }

추가로, 위의 confirmMail에 대한 테스트 코드로 아래와 같이 작성하였는데, response가 addCookie를 수행하는 것을 Mocking하지 않아 에러가 발생하였습니다. 이를 해결 후 커밋하였습니다.

Mingyum-Kim commented 1 year ago

securityConfig 설정 탓에 많이 돌아왔다. 정리하자면, requsetMatchers를 이용해 URI의 접근을 허용하였음에도 403에러가 계속 떴다. confirm, verity 에서만 떴었는데 HttpServletReqeuset, HttpServletResponse를 javax 가 아닌 jarkata로 설정했어야 해서 에러가 생겼다.