프로젝트

대규모 AI 시스템 설계 프로젝트 회고

개발공명 2024. 9. 25. 23:42

프로젝트 소개

물류 관리 및 배송 시스템을 위한 MSA 기반 플랫폼 개발 프로젝트

 

나의 개발 파트

  • Eureka 서버 설정
  • Gateway 서버 구현
  • Auth 서버 구현
  • User 서비스 구현
  • AI & Slack 서비스 구현
  • MSA에서 Spring Security & JWT로 회원가입/로그인 로직 구현

 

백엔드 아키텍처

 

Liked

  • MSA에서 인증, 인가 구현 경험
  • 모니터링, 분산 추적, 서킷브레이커 설정 해보는 경험
  • MSA 환경 설정FeignClient로 통신하는 경험
  • Docker 및 Docker Compose 활용 경험

 

Lacked

  • AI 및 Slack 부분 구현하지 못한 것
  • 모니터링, 서킷브레이커 적용 및 사용 못한 것
  • 좀 더 세밀한 공통화 및 예외 처리, fallback 로직 등 적용하지 못한 것
  • 동시성 및 보상 트랜잭션 등 데이터 무결성 유지에 대한 것 고민해보지 못한 것

 

Learned

  • MSA 구성 및 설정, 진행 등 전반적인 경험
  • MSA에서 인증, 인가 구현 경험
  • Spring Cloud Gateway와 FeignClient 사용 시 문제점
    • Spring Cloud Gateway가 비동기로 동작
    • Spring Security, FeignClient 등 동기적으로 동작하는 것들과 함께 사용할 때 문제점 발생
  • FeignClient의 헤더 관련
    • 다른 서비스로 FeignClient로 요청 보낼 때 필요한 Header 넣어줘야 함을 알게됨
  • 모니터링, 분산 추적 등 다양한 도구 설정 방법
    • Prometheus, Grafana, Zipkin, Resilience4j 등
    • dependency 추가 및 yml 작성에 관한 것
  • Docker 및 Docker Compose 활용법
  • JpaAuditing, 공통 응답, 예외 처리 적용해보기
    • 정확한 메커니즘, 방법 이해할 필요가 있음
  • GitHub Issue 사용 경험

 

Longed for

  • AI 및 Slack 부분 구현
  • 좀 더 세밀한 공통 처리 및 예외 처리 (ex: fallback 로직, 공통 모듈 or 라이브러리 (FeignClient의 dto 등))
  • 동시성, 트랜잭션 등 MSA에서 DB 여러 개 쓸 때의 문제점에 대해 고민해보고 프로젝트에 적용해보기
  • 직접 필요한 Docker 파일이나 Docker Compose 파일 작성해보기

 

피드백

  • static 문자열은 별도의 Constant 클래스에 모아두자.
  • 외부 연동 값은 설정으로 분리하자. 
  • String 연결 관련
    • Java 버전이 올라가면서 StringBuilder 사용보다는 그냥 String으로 연결해도 된다. 
  • DTO의 @Data annotation
    • @Data는 많은 annotation 포함해 필요한 annotation만 골라서 사용하자. 
  • ResonseEntity 타입 관련
    • ResponseEntity<?> 이렇게 말고 타입 지정이 가능한 경우 타입 지정을 꼭 하자.
  • Entity 반환 관련
    • Entity를 직접 Service에서 반환하는 것은 좋지 않다. 
    • Entity를 DTO로 변환해 반환하자. 
  • DB의 비즈니스 로직
    • COALESCE 활용하면 null 여부 판단을 DB에 의존하게 됨.
    • 요즘은 비즈니스 로직을 DB보다는 애플리케이션으로 가져오는 설계 많이 함.
    • Optional 반환하게 해 애플리케이션에서 null 처리하는 것이 좋다. 
  • Entity 변환 관련
    • Entity의 메서드가 DTO를 받아 Entity를 수정하는 것은 DDD의 안티 패턴 중 하나. 
    • 저수준 자원인 Entity가 고수준 자원인 DTO를 아는 것은 좋지 않다. 
    • 따라서 필드로 인자를 받거나 너무 긴 경우 Builder 패턴이나 중간 DTO를 만들어 처리하자. 
  • 공통 응답 관련
    • Controller에서 ResponseEntity를 매번 wrapping 하고 있음.
    • @RestControllerAdvice와 ResponseBodyAdvice로 공통 응답 구현해보자. 
    • @RestControllerAdvice 사용하면 Exception handling 가능.

 

느낀 점

  • Monolithic으로 프로젝트 진행할 때와 MSA로 진행할 때 굉장히 다르다는 것을 느꼈다. 
  • MSA에서의 인증 인가에 대해 배우게 되어 좋았다. 
    • 그냥 Spring Security를 사용하는 것이 아니였다. 
    • Gateway에서는 JWT 검증하고 Auth에서는 JWT 생성하고 등등..
  • 중간에 연휴 이슈
    • 연휴 기간에 조금 나태했던 것 같다. 
    • 연휴가 있어 MSA에서의 인증 인가를 구현할 때 어려움이 있어도 질문하지 못해 시간을 많이 빼았겼다. 
    • AI 와 Slack 관련된 부분은 추후 다시 구현해보고 싶다. 
  • 다른 팀원이 구현한 API와 연동해서 테스트할 때 직접 값을 넣고 API를 날리고 해서 테스트하기 복잡했다. 
  • 여러 기술들을 설정해 놓고 사용해보지 못한 점이 아쉽다. 
    • 그래도 여러 기술들을 적용하는데의 두려움은 덜어낸 것 같다. 
    • 이후 프로젝트에 얼른 적용하고 사용까지 해보고 싶다.