Spring/기타 / / 2026. 1. 20. 15:30

[Spring Boot] 웹 서비스 전체 실행 흐름 분석 (React, FastAPI, MySQL 연동 아키텍처)

1. 전체 아키텍처 흐름

스프링, 리액트, MySQL, FastAPI를 함께 사용하는 프로젝트의 전체 시퀀스

 

각 기술의 역할

🎨 React (프론트엔드)

  • 역할: 사용자 인터페이스 제공
  • 주요 기능:
    • 컴포넌트 기반 UI 렌더링
    • 사용자 이벤트 처리 (클릭, 입력 등)
    • 상태 관리 (useState, Redux 등)
    • HTTP 요청을 통한 백엔드 통신

🍃 Spring Boot (백엔드 메인)

  • 역할: 핵심 비즈니스 로직 및 데이터 관리
  • 주요 기능:
    • RESTful API 제공
    • 인증/인가 (JWT, Spring Security)
    • 트랜잭션 관리
    • CRUD 작업
    • 외부 API 통합 (FastAPI 호출)

⚡ FastAPI (데이터 분석 서버)

  • 역할: Python 기반 데이터 처리 및 AI/ML 작업
  • 주요 기능:
    • 데이터 분석 (pandas, numpy)
    • 머신러닝 모델 실행
    • 통계 계산
    • 빠른 비동기 처리

🗄️ MySQL (데이터베이스)

  • 역할: 데이터 영속성 보장
  • 주요 기능:
    • 데이터 저장 및 조회
    • ACID 트랜잭션
    • 인덱싱 및 쿼리 최적화
    • 데이터 무결성 보장

 

[구체적인 예시 시퀀스]

ex)  "사용자 데이터 분석 요청"의 경우:

  1. 사용자가 리액트 UI에서 "분석하기" 버튼 클릭
  2. 리액트에서 POST /api/analyze 요청 (스프링으로)
  3. 스프링 Controller가 요청 받아 인증/검증
  4. 스프링 Service가 MySQL에서 사용자 데이터 조회
  5. 스프링이 FastAPI의 /analyze 엔드포인트로 데이터 전송
  6. FastAPI에서 Python으로 데이터 분석 수행
  7. FastAPI가 분석 결과를 스프링으로 반환
  8. 스프링이 결과를 MySQL에 저장
  9. 스프링이 최종 결과를 리액트로 응답
  10. 리액트가 결과를 화면에 표시


[전체 시스템 실행 시퀀스: React ↔ Spring ↔ FastAPI]

[Sequence Diagram] 사용자 요청부터 결과 반환까지의 데이터 흐름

 

단계 레이어상세 수행 작업 (Business Logic & Technical Detail) 데이터 형식
1 React - 사용자의 onClick 핸들러가 동작하여 분석 프로세스 시작
- axios.post('/api/users/analyze', { userId: 1 }) 실행
- 비동기 요청 시작과 함께 로딩 상태(isLoading)를 true로 변경
JSON
2 Controller - 엔드포인트 매핑 및 입력값 검증(@Valid) 수행
- Jackson 라이브러리를 통해 HTTP Body를 AnalyzeRequestDTO 객체로 역직렬화
  (네트워크를 통해 넘어온 문자열 데이터를 자바가 이해할 수 있는 객체(Object)로 변환하는 과정)
- 서비스 계층으로 데이터 전달 및 결과 대기
DTO (Request)
3 Service - Domain Logic 관리: @Transactional 내에서 일관성 유지
- 오케스트레이션: 유저 정보 조회 → 활동 데이터 취합 → FastAPI 호출 순서 제어
  (여러 개의 작업(Task)이나 서비스들이 정해진 순서에 맞게 유기적으로 움직이도록 관리하는 것)
- 데이터 변환: 수집된 Entity 데이터를 FastAPI가 요구하는 포맷으로 가공
Entity ↔ DTO
4-1 Repository - Spring Data JPA: userRepository.findById() 등 인터페이스 실행
- Persistence Context: 영속성 컨텍스트를 통한 데이터 캐싱 및 DB 동기화
- 복잡한 통계 쿼리의 경우 QueryDSL 또는 Native SQL 사용 가능
Entity
4-2 FastAPI - 데이터 사이언스 스택: 전달받은 데이터를 Pandas DataFrame으로 변환
- Inference: 학습된 ML 모델에 데이터를 입력하여 예측값 산출
- 결과 생성: 분석 결과 수치 및 인사이트 메시지 생성
JSON
5 MySQL - Disk I/O: 인덱스를 활용한 데이터 조회 및 분석 결과 기록
- ACID 원칙에 따른 트랜잭션 단위 원자성·무결성 보장
- 분석 이력 로그 저장
Table Record
6 Controller - 서비스 계층에서 반환된 처리 결과를 ResponseEntity에 담음
- HTTP 상태 코드(200 OK)와 함께 결과 DTO를 JSON으로 직렬화하여 반환
JSON
7 React - Promise 완료 후 서버 응답 수신 및 로딩 상태를 false로 변경
- 수신된 JSON 데이터를 상태 관리 도구 또는 useState에 저장
- 데이터 기반 차트 및 분석 결과 컴포넌트 렌더링
JS Object

 

2. 스프링 내부 구조

src/main/java/com/example/myapp/
│
├── controller/              # HTTP 요청/응답 처리
│   ├── UserController.java
│   ├── ActivityController.java
│   └── AnalysisController.java
│
├── service/                # 비즈니스 로직
│   ├── UserService.java
│   ├── ActivityService.java
│   └── AnalysisService.java
│
├── repository/             # DB 접근 (Data Access Layer)
│   ├── UserRepository.java
│   ├── ActivityRepository.java
│   └── AnalysisResultRepository.java
│
├── entity/                 # DB 테이블과 매핑 (또는 domain/, model/)
│   ├── User.java
│   ├── Activity.java
│   └── AnalysisResult.java
│
├── dto/                    # 데이터 전송 객체
│   ├── request/
│   │   ├── UserCreateRequest.java
│   │   ├── AnalysisRequest.java
│   │   └── ActivityRequest.java
│   └── response/
│       ├── UserResponse.java
│       ├── AnalysisResponse.java
│       └── ActivityResponse.java
│
├── config/                 # 설정 파일
│   ├── DatabaseConfig.java
│   ├── SecurityConfig.java
│   └── RestTemplateConfig.java
│
└── exception/              # 예외 처리
    ├── UserNotFoundException.java
    └── GlobalExceptionHandler.java

src/main/resources/
│
├── application.yml         # 설정 파일
└── mapper/                 # MyBatis 사용 시 XML 파일
    └── UserMapper.xml

📂 주요 패키지 역할 요약

  • controller/ (표현 계층): 외부와의 접점. 클라이언트의 요청(URL)을 받고, 적절한 응답 반환.
  • service/ (비즈니스 계층): 실제 핵심 로직이 돌아가는 곳. DB에서 데이터를 가져와 가공하거나 외부 API(FastAPI 등)와 통신.
  • repository/ (데이터 접근 계층): 데이터베이스에 접근하는 인터페이스. 실제 SQL 쿼리를 실행하거나 JPA 메서드 제공.
  • entity/ (도메인 모델): 데이터베이스의 테이블과 1:1로 대응되는 자바 객체. DB의 실제 데이터 구조 정의.
  • dto/ (데이터 전송 객체): 계층 간 데이터를 전달할 때 사용하는 '바구니'. 요청용(request)과 응답용(response)을 분리하여 보안과 유연성을 높임.
  • config/ (설정): 보안(Security), DB 연결, 외부 통신 도구(RestTemplate) 등 앱 전반의 설정 담당.
  • exception/ (예외 처리): 에러 상황을 정의하고, 서버 에러가 났을 때 클라이언트에게 에러 메시지를 보내주는 처리.
  • resources/ (자원): 설정 파일(yml)이나 SQL 쿼리 파일(mapper) 등 소스 코드 외에 필요한 자원 보관.

 

3. Spring Boot 내부 구조 심층 분석

Spring Boot는 관심사의 분리(Separation of Concerns) 원칙에 따라 계층을 나눔.

 

레이어드 아키텍처 (Layered Architecture)

각 계층의 역할과 책임

🧭 Controller Layer

사용자의 입력을 받고, 결과를 전달하는 시스템의 '창구'

항목 설명
역할 HTTP 요청 수신 및 응답 반환
책임 - URL 매핑 (@GetMapping, @PostMapping)
- 요청 파라미터 및 Body 검증 (@Valid)
- JSON ↔ DTO 변환 (Jackson)
- HTTP 상태 코드 설정
사용 금지 - 비즈니스 로직 작성 ❌
- 직접 DB 접근 ❌
- Entity 직접 반환 ❌
주요 어노테이션 @RestController, @RequestMapping, @GetMapping, @PostMapping
핵심 원칙 Controller는 교통정리만 함. 실제 처리는 Service에게 위임

 

🔧 Service Layer

시스템의 핵심 로직이 살아있는 '두뇌'

항목 설명
역할 비즈니스 로직 처리
책임 - 비즈니스 규칙 검증
- 트랜잭션 관리
- 여러 Repository 조합 및 오케스트레이션
- Entity ↔ DTO 변환
- 외부 API / AI / FastAPI 호출
특징 - 재사용 가능한 로직
- 트랜잭션 경계의 중심
- 도메인 핵심 로직 집중
주요 어노테이션 @Service, @Transactional
핵심 원칙 Service는 실제 일을 함.“무엇을 해야 하는가”에 집중

 

💾 Repository Layer

데이터베이스와 대화하는 '통로'

항목 설명
역할 데이터베이스 접근
책임 - SQL 쿼리 정의
- CRUD 작업 수행
- DB 결과를 Entity로 매핑
특징 - 인터페이스만 정의 (구현체 자동 생성)
- 메서드 네이밍 기반 쿼리 생성
- @Query로 커스텀 쿼리 작성
주요 어노테이션 @Repository, @Query
핵심 원칙 Repository는 데이터 저장소의 통로.오직 DB 작업만 담당

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유