[항해99 취업 리부트 코스 학습일지] Week 7

pintor·2024년 5월 6일
0

이번 주 항해 취업 리부트코스에서 내가 구현한 기능은 무엇인가요?

  • 서버 간 통신에서 인증/인가, 클라이언트 진입 시 인증/인가 member module에서 담당하도록 변경
  • API Gateway 도입해서 인증/인가 전담하도록 변경
  • Eureka 서버 도입해서 discovery service 구현

해당 기능을 구현하기 위해, 어떤 기술적 의사결정을 거쳤나요?

서버 간 인증/인가

기존 구조

  • 각 모듈에서 Authorization 헤더에 토큰이 담겨있는 경우, member module에 요청을 보내 검증 후 받은 응답 정보로 UserDetails 할당
  • Internal 요청 시에 서버 간 요청인지 확인하지 않음. 필터 여러 번 거침

변경 사항

  • 인증 필요한 요청인 경우
    • member module에서는 authService에 검증을 요청한다.
    • 다른 module에서는 member module로 확인 요청을 보낸다.
      → 최종적으로 authService로 접근
  • 서버 간 요청(/api/internal/**)인 경우 redis에 저장된 토큰과 값을 비교하는 방식으로 검증한다.
  • 서버 간 요청 인증 토큰은 주기적으로 member module에서 스케쥴러를 동작시켜 갱신한다.
  • 성공 응답인 경우, request에 id를 담아서 컨트롤러로 전달한다.

API Gateway 도입

  • 현재 프로젝트에서는 각 모듈마다 보유한 엔드포인트가 있고, 각 모듈에서 보유한 필터를 통해 엔드포인트 별 접근 제어를 진행
  • 인증/인가를 위해 접근마다 지속적으로 member module을 호출하는 중이라 상당 부하 예상
  • 필터 로직 분리 + 인증/인가 전용 서버 필요

기존 구조

  • 각 모듈마다 필터가 있어서, 인증/인가 로직 처리
  • 인증/인가를 위해 member module에 요청을 지속적으로 보냄

변경 사항

  • API Gateway 모듈을 도입해, 여기서 요청 필터, 인증/인가 처리하도록 변경

Eureka 서버 도입

  • 클라우드의 경우에 인스턴스는 동적으로 할당되므로, IP 주소, 포트정보가 바뀔 수 있음
  • 오토스케일링 등 변화가 생길 때 네트워크 위치가 계속 바뀜
  • 클라이언트나 API 게이트웨이가 호출할 서비스를 찾는 매커니즘 필요
    (service discovery)
  • Disaster Recovery를 구성을 위해 사용
    • 서버 로드 분산
    • 서버 동작 여부 체크

이번 주 겪은 트러블 슈팅이 있다면 무엇인가요?

상속 제외

  • 상위 모듈 공통 의존성 때문에 auto configure 되어야 하는 부분들 제외
  • API Gateway의 경우 JPA, DB, Eureka Server의 경우 JPA, DB, Security 설정이 필요하지 않다
  • application.properties 에 아래 구문 추가해서 제거 가능
    # EXCLUDE
    ## 중복 적용 시 각 요소 ','로 구분 필요
    ## jpa, db 설정 제거
    spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
    ## security 설정 제거
    spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
      org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration

Invalid Host

  • API Gateway에서 underscore( _ )를 인식하지 못해서 spring.application.name 설정 시 underscore( _ )가 포함되면 Invalid Host 문제 발생
  • hyphen( - )으로 모두 변경 → 앞으로 default

FeignClient name 중복

  • Eureka 이용 시 도메인 단위로 나눈 FeignClient의 name이 중복되는 문제가 발생한다.
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    The bean 'PRODUCT-MODULE.FeignClientSpecification' could not be registered. A bean with that name has already been defined and overriding is disabled.
    
    Action:
    
    Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
  • 이 때, contextId 를 설정해주면 중복 문제를 방지할 수 있다.
    변경 전,
    @FeignClient(name = "productClient", url = "http://localhost:8082/api/internal/products")
    public interface ProductClient {
    
        @GetMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
        ProductResponse getProduct(@PathVariable(value = "id") Long id);
    }
    
    @FeignClient(name = "stockClient", url = "http://localhost:8082/api/internal/stocks")
    public interface StockClient {
    
        @PostMapping(value = "/decrease/all", consumes = MediaType.APPLICATION_JSON_VALUE)
        void decreaseAllStock(StockAllRequest request);
        
        @PostMapping(value = "/increase/all", consumes = MediaType.APPLICATION_JSON_VALUE)
        void increaseAllStock(StockAllRequest request);
    }
    변경 후,
    @FeignClient(name = "PRODUCT-MODULE", contextId = "productClient", path = "/api/internal/products")
    public interface ProductClient {
    
        @GetMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
        ProductResponse getProduct(@PathVariable(value = "id") Long id);
    }
    
    @FeignClient(name = "PRODUCT-MODULE", contextId = "stockClient", path = "/api/internal/stocks")
    public interface StockClient {
    
        @PostMapping(value = "/decrease/all", consumes = MediaType.APPLICATION_JSON_VALUE)
        void decreaseAllStock(StockAllRequest request);
        @PostMapping(value = "/increase/all", consumes = MediaType.APPLICATION_JSON_VALUE)
        void increaseAllStock(StockAllRequest request);
    }

이번 주 진행된 개인 프로젝트에서 얻은 인사이트는 무엇인가요?

  • 2주차 구현 부분 때문에 많이 밀리긴 했지만, 많이 배운 지점이 많았다.
항해99 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
#개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
profile
pintor.dev

0개의 댓글