Spring 개발일지

[대규모 AI 시스템 프로젝트] 트러블슈팅(2) + 발표자료 준비

김둘리 2026. 4. 10. 10:00

1. JwtAuthenticationFilter Bean 등록 문제

문제 상황

애플리케이션 실행 시 다음과 같은 에러가 발생했다.

Parameter 0 of constructor in SecurityConfig required a bean of type 
'JwtAuthenticationFilter' that could not be found

원인

  • JwtAuthenticationFilter에 @Component가 없음
  • 해당 클래스가 Bean으로 등록되지 않아 주입 실패
  • 게다가 생성자에서 JwtUtil을 요구하고 있어 수동 생성도 불가능한 상태

해결 방법

공통 모듈(common)은 수정할 수 없는 상황이었기 때문에
SecurityConfig에서 직접 Bean을 생성하는 방식으로 해결

@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter(JwtUtil jwtUtil) {
    return new JwtAuthenticationFilter(jwtUtil);
}

그리고 SecurityFilterChain에서 주입받아 사용하도록 변경하였다.


2. 멀티모듈 의존성 문제 (CI 빌드 실패)

문제 상황 (PR에서 발생)

GitHub Actions 빌드 중 아래와 같은 에러 발생

package com.qpang.common.entity does not exist
cannot find symbol: BaseUserEntity

원인

  • hub 모듈에서 common 모듈의 클래스를 사용 중
  • 하지만 build.gradle에 의존성 추가가 되어 있지 않음

로컬에서는 IntelliJ 설정 때문에 동작했지만 CI 환경에서는 Gradle 기준으로 빌드되어 실패


 해결 방법

hub/build.gradle에 의존성 추가

implementation project(':common')

 3. Git push 충돌 (diverged branch)

 문제 상황

! [rejected] (fetch first)

원인

  • 원격 브랜치에 다른 팀원의 커밋이 먼저 올라간 상태
  • 로컬과 원격 브랜치가 서로 다른 히스토리를 가지게 됨

 해결 방법 (Rebase 사용)

git pull --rebase origin feat/domain-refactoring
git push origin feat/domain-refactoring

불필요한 merge commit 없이 히스토리를 깔끔하게 유지할 수 있었다.


4. 유스케이스 다이어그램 리팩토링

초기에는 모든 기능을 나열하면서 다이어그램이 지나치게 복잡해졌다.

문제점

  • CRUD 단위로 기능이 너무 세분화됨
  • 가로로 길어져 PPT에 담기 어려움
  • 핵심 흐름이 보이지 않음

 개선 방향

1. 도메인 중심으로 그룹화

  • 회원 / 상품 / 주문 / 배송 / 허브 / 업체 / 슬랙

2. 기능 단순화

  • “상품 생성/수정/삭제” → “상품 관리”로 통합

3. 핵심 흐름 유지

주문 생성 → 배송 생성 → 경로 생성 → 담당자 배정

 

4. 색상으로 가독성 개선


 최종 다이어그램

flowchart TB

    User((사용자))

    subgraph System[물류 관리 시스템]

        subgraph Auth[회원/인증]
            UC1(회원가입)
            UC2(로그인)
        end
        
        subgraph Slacka[슬랙메세지]
            UC13(슬랙메세지 발송)
        end

        subgraph Company[업체]
            UC4(업체 관리)
        end

        subgraph Product[상품]
            UC3(상품 관리)
        end

        subgraph Order[주문]
            UC5(주문 생성)
            UC6(주문 조회)
            UC12(주문목록 조회)
        end

        subgraph Hub[허브]
            UC7(허브 관리)
        end

        subgraph Delivery[배송]
            UC8(배송 경로 생성)
            UC9(배송 생성)
            UC11(배송담당자 배정)
        end

    end

    User --> UC1
    User --> UC2
    User --> UC3
    User --> UC4
    User --> UC5
    User --> UC6
    User --> UC7
    User --> UC13

    UC6 --> UC12

    UC5 --> UC9
    UC9 --> UC8
    UC9 --> UC11

 

 

오늘은 단순히 기능 구현이 아니라
구조를 이해하고 정리하는 과정이었던 것 같다.

  • Spring에서는 Bean 등록이 얼마나 중요한지
  • 멀티모듈에서는 의존성 관리가 얼마나 중요한지
  • Git에서는 협업 흐름을 이해하는 것이 핵심이라는 점

을 직접 경험할 수 있었다.