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) "사용자 데이터 분석 요청"의 경우:
- 사용자가 리액트 UI에서 "분석하기" 버튼 클릭
- 리액트에서 POST /api/analyze 요청 (스프링으로)
- 스프링 Controller가 요청 받아 인증/검증
- 스프링 Service가 MySQL에서 사용자 데이터 조회
- 스프링이 FastAPI의 /analyze 엔드포인트로 데이터 전송
- FastAPI에서 Python으로 데이터 분석 수행
- FastAPI가 분석 결과를 스프링으로 반환
- 스프링이 결과를 MySQL에 저장
- 스프링이 최종 결과를 리액트로 응답
- 리액트가 결과를 화면에 표시
[전체 시스템 실행 시퀀스: React ↔ Spring ↔ FastAPI]

| 단계 | 레이어상세 | 수행 작업 (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) 원칙에 따라 계층을 나눔.

각 계층의 역할과 책임
🧭 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 작업만 담당 |
'Spring > 기타' 카테고리의 다른 글
| [Spring Boot] MVC 패턴 정리 (0) | 2026.01.22 |
|---|---|
| [Spring Boot] 프로젝트 구조 이해: Todo API로 배우는 5단계 아키텍처 (1) | 2026.01.22 |

