프로젝트
대규모 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를 날리고 해서 테스트하기 복잡했다.
- 여러 기술들을 설정해 놓고 사용해보지 못한 점이 아쉽다.
- 그래도 여러 기술들을 적용하는데의 두려움은 덜어낸 것 같다.
- 이후 프로젝트에 얼른 적용하고 사용까지 해보고 싶다.