memo6759 님의 블로그
전체 백엔드 흐름 본문
리액트 -> 스프링 -> 서비스 -> DAO/Repository -> DB -> 다시 리액트
React(Front)
↓ HTTP 요청
Controller (Spring)
↓
Service
↓
DAO / Repository
↓
JPA(EntityManager) → JDBC Driver → DB
↓
Service
↓
Controller
↓
React(JSON 응답)
스프링 MVC 내부 흐름
리액트가 /dept/insert 같은 URL로 요청을 보내면 스프링이 내부적으로 어떻게 처리하는지 정리
1. Front-End -> DispatcherServlet
React가 /write 또는 /insert 요청을 보냄
- 하나의 HttpServlet 서블릿 컨테이너가 HTTP 요청을 전달하면, service() 메서드를 타고 내부적으로 doGet, doPost 등이 실행Spring MVC 이 로직을 doDispatch() 내부에 집중시켜 관리
|
스프링 DispatcherServlet이 모든 요청을 가로챔
- 스프링 MVC의 프론트 컨트롤러
2. HandlerMapping
DispathcerServlet이 URL 분석
- /write, /insert, /list 같은 path를 보고
- 이걸 처리할 Controller 메소드를 찾음
3. HandlerAdapter
Controller 메소드를 실행하기 위한 어댑터
컨트롤러를 실행하는데 필요한 조건을 체크하고, 어떻게 실행할지를 결정합니다.
출처: https://bcuts.tistory.com/431 [Back to the Basics:티스토리]
- 실행 방식을 결정하는 인터페이스. 단순히 핸들러를 찾는 것에서 끝나는 것이 아니라 실제로 그 (Controller)를 실행하는 로직은 이 어댑터에 위임
- @RequestMapping 기반 컨트롤러 실행
- @GetMapping
- @RestController 등도 등장
4. Controller 실행
@RestController 메소드가 실행됨
컨트롤러는 보통 서비스에 넘김:
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "안녕하세요!");
return "hello"; // hello.html을 의미
}
}
출처: https://bcuts.tistory.com/431 [Back to the Basics:티스토리]
5. Service 실행
비즈니스 로직 처리
DAO/Repository 호출
6. DAO or Repository 실행
여기가 DB와 직접 연결되는 영역
7. JPA 내부 흐름
JPA를 사용하는 경우 다음 순서로 진행:
Repository
↓
EntityManager
↓
JPQL → SQL 변환
↓
JDBC Driver
↓
DBMS(MySQL, Oracle 등)
DB에서 데이터를 가져오거나 Insert/Update/Delete 실행
8. 결과 반환
Repository -> Service -> Controller -> HandlerAdapter -> DispatcherServlet
컨트롤러가 @RestController이면
ViewResolver로 가지 않고
JSON 변환 후 React로 응답
만약 화면을 보여주는 컨트롤러라면:
ViewResolver -> JSP
엔티티/DTO/DAO/Repository 레이어 역할 정리
Entity
- 테이블을 자바 객체로 표현
- DB테이블을 모델링한 클래스
- JPA가 관리함
- JDBC -> JdbcTemplate 사용
DTO (Data Transfer Object)
- 레이어 간 데이터 전달용
- Controller ↔ Service ↔ Front-end 간 데이터를 안전하게 주고받음
- 민감 데이터 숨기기 가능(password 등)
DAO (JDBC / MyBatis 사용 시)
- SQL을 직접 실행하는 계층
- 규모가 작으면 제거하기도 함 (Service → Repository 바로 연결)
Repository (JPA)
- 엔티티 기반 CRUD를 자동 처리
- SQL 직접 작성할 필요 없음
- JPA에서는 DAO 대신 Repository 사용
4. 정리: 프론트~백엔드 전체 흐름 (심플 + 내부 흐름 포함)
React → Controller
HTTP 요청 도착
↓
DispatcherServlet → HandlerMapping → HandlerAdapter
↓
컨트롤러 메소드 실행
Controller → Service
- 비즈니스 로직 위임
- DTO를 파라미터로 전달(엔티티 직접 X)
Service → DAO/Repository
- DB 작업 요청
- 자바 객체(Entity)를 이용한 작업 수행
DAO/Repository → JPA EntityManager
- JPQL → SQL 변환
- JDBC 드라이버 통해 DB 동작
DB → JPA → Service → Controller
- 결과를 다시 레이어로 반환
- Controller는 JSON 응답 반환
Controller → Front-End(JSON)
React가 이 JSON을 받아 화면을 구성함
1.Stream API 사용 이유
- List, Map, 배열 등 자료구조를 조작할 때
- for문 대신 더 선언적으로 처리 가능
예:
list.stream()
.filter(item -> item.getScore() > 90)
.collect(Collectors.toList());
React → Controller → Service → DAO/Repository → JPA(EntityManager) → DB
DB → JPA → Service → Controller → React(JSON)
-------------
스프링 내부:
DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → Service → Repository
-------------
역할:
Entity = 테이블 모델링
DTO = 레이어간 데이터 전달
Repository = JPA DB 접근
DAO = SQL 직접 접근
Service = 비즈니스 로직
Controller = 요청/응답 처리'HDC 학습일지' 카테고리의 다른 글
| 2025-12-05(스프링 시큐리티) (0) | 2025.12.06 |
|---|---|
| 2025-12-03(Stream APi, 리액트 -> 스프링 -> DB(insert)) (1) | 2025.12.05 |
| 2025-12-02(웹 mqtt) (1) | 2025.12.02 |
| 2025-11-25(카메라 센서 - react MQTT) (0) | 2025.12.02 |
| 2025-11-24(리액트 state, props) (0) | 2025.11.27 |