9. Spring 프레임워크의 웹 동작 원리

박은서's avatar
Feb 05, 2026
9. Spring 프레임워크의 웹 동작 원리

1. Spring 프레임워크의 웹 동작 원리 (필기)

0️⃣ 필기

notion image

1️⃣ 전체 요청 흐름 한눈에 보기

브라우저 ↓ (HTTP 요청) 웹서버(Tomcat,8080) ↓ DispatcherServlet (DS) ↓ Controller (C) ↓ Service (S) ↓ Repository (R) ↓ Persistence Context (PC) ↓ Database (DB)
  • 모든 HTTP 요청은 DispatcherServlet이 진입점
  • 스프링 컨테이너 안에서 계층별 역할이 분리됨

2️⃣ HTTP 요청 기본 구조

1) 요청(Request)

  • Header
  • Body
  • Method (GET, POST 등)
  • URL

2) 응답(Response)

  • Status Code (200, 302 등)
  • Header
  • Body

3️⃣ 웹 서버 & 요청 처리 구조

1) 웹 서버(Tomcat)

  • 포트: 8080
  • 역할
    • HTTP 요청 수신
    • 요청/응답 객체 생성
    • 스레드 할당

2) 요청 풀(Request Pool)

  • 동시에 여러 요청 처리
  • 요청마다 스레드 하나 생성
  • 예: 최대 50개 요청 동시 처리

4️⃣ 스프링 컨테이너 내부 구조

1) DispatcherServlet (DS)

  • Front Controller
  • 모든 요청의 시작과 끝
  • 역할
    • 요청 URL 매핑
    • Controller 호출
    • View 반환 처리

2) Controller (C)

  • 사용자 요청 진입 지점
  • 역할
    • URL 매핑 (@GetMapping, @PostMapping)
    • 요청 파라미터 처리
    • Service 호출
  • ❌ 비즈니스 로직 직접 처리 X

3) Service (S)

  • 비즈니스 로직 담당
  • 역할
    • 트랜잭션 관리 (@Transactional)
    • 여러 Repository 조합
  • 핵심 계층

4) Repository (R)

  • DB 접근 계층
  • 역할
    • CRUD
    • SQL / JPA 쿼리 실행
  • 보통 JPA Repository 사용

5) Persistence Context (PC)

  • 영속성 컨텍스트
  • 1차 캐시
  • 변경 감지(Dirty Checking)
  • 트랜잭션 종료 시 DB 반영

6) Database (DB)

  • 실제 데이터 저장소

5️⃣ DB 커넥션과 트랜잭션

1) DB 커넥션 풀 (DBCP)

  • 미리 생성된 DB 연결 관리
  • 예: 최대 20개 커넥션
  • 요청 시:
    • 커넥션 대여 → 사용 → 반납

2) 트랜잭션 흐름

ControllerService (@Transactional) ↓ 트랜잭션 시작 ↓ RepositoryDB ↓ 정상 종료 →Commit 예외 발생 →Rollback

6️⃣ Open-in-View (OSIV)

1) 개념

  • DB 커넥션 유지 범위 설정

2) 설정값

  • true (기본값)
    • DB 커넥션이 응답 끝까지 유지
  • false
    • 트랜잭션 종료 시 DB 커넥션 종료
    • 성능·안정성 ↑

7️⃣ POST 요청 예시 흐름

1) 예시 요청

POST /boards/save Content-Type: x-www-form-urlencoded title=a&content=b

2) 처리 흐름

브라우저 → TomcatDispatcherServletControllerService (@Transactional) → RepositoryDB → 응답 반환

8️⃣ Redirect vs Forward

1) Redirect

return "redirect:/boards";
  • HTTP 상태코드: 302
  • Location 헤더로 URL 재요청
  • 클라이언트가 다시 요청
  • 주소창 변경 O
📌 사용 목적
  • POST → GET (PRG 패턴)
  • 중복 제출 방지

2) Forward

return "viewName";
  • 서버 내부 이동
  • DispatcherServlet에서 View 렌더링
  • 주소창 변경 X
📌 사용 목적
  • 단순 화면 이동
  • 요청 유지 필요 시

9️⃣ 핵심 요약

  • 모든 요청의 시작은 DispatcherServlet
  • 비즈니스 로직은 Service
  • DB 접근은 Repository
  • 트랜잭션은 Service 계층
  • DB 커넥션은 DBCP에서 관리
  • OSIV는 DB 커넥션 범위 설정
  • POST 후에는 Redirect 권장

2. 반드시 알아야 할 핵심 개념 TOP 6

1️⃣ 스프링 빈(Bean)과 IoC / DI ⭐⭐⭐⭐⭐

스프링의 정체성

1) 꼭 알아야 할 포인트

  • 스프링 컨테이너가 객체를 생성·관리
  • 개발자는 new 하지 않음
  • 의존성 주입(DI)으로 객체 연결
@Service public class BoardService { private final BoardRepository repository; public BoardService(BoardRepository repository) { this.repository = repository; } }

2️⃣ 필터(Filter) vs 인터셉터(Interceptor) ⭐⭐⭐⭐

⚠️ DS 이전·이후에서 무슨 일이 일어나는지도 중요함

1) Filter

  • 서블릿 스펙
  • DispatcherServlet 이전
  • 예: 인코딩, CORS, 보안

2) Interceptor

  • 스프링 MVC
  • Controller 전/후
  • 예: 로그인 체크, 권한 검사
📌 요청 흐름 보완 버전
Filter → DispatcherServlet → Interceptor → Controller

3️⃣ 예외 처리 흐름 (@ControllerAdvice) ⭐⭐⭐⭐

1) 꼭 알아야 하는 이유

  • 실무에서 예외는 항상 발생

2) 핵심 개념

  • Controller에서 예외 발생
  • @ControllerAdvice가 전역 처리
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<?> handle(Exception e) { return ResponseEntity.badRequest().body("error"); } }
📌 단골 질문:
  • “예외는 어디서 처리하나요?”

4️⃣ HTTP 상태 코드 & REST 설계 ⭐⭐⭐⭐

1) 꼭 알아야 할 상태 코드

  • 200 OK
  • 201 Created
  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 500 Internal Server Error

2) REST 응답 예시

return ResponseEntity .status(HttpStatus.CREATED) .body(result);

5️⃣ 스프링부트 자동 설정(Auto Configuration) ⭐⭐⭐

1) 핵심 개념

  • @SpringBootApplication
    • @EnableAutoConfiguration
    • @ComponentScan
    • @Configuration
➡️ 의존성 있으면 자동으로 Bean 등록
(ex: JPA 있으면 EntityManager 자동 생성)
📌 질문:
  • “스프링부트가 편한 이유는?”

6️⃣ 동시성 & 스레드 안전성 ⭐⭐⭐⭐

1) 꼭 알아야 할 사실

  • Controller / Service / Repository는 싱글톤
  • 여러 스레드가 동시에 접근

2) 주의할 점

  • 필드에 상태 저장 ❌
// 위험 @Service public class TestService { private int count; }
📌 단골 질문:
  • “싱글톤 빈은 스레드 안전한가요?”

7️⃣ 보너스 : 한 장으로 정리한 “완성 흐름”

ClientFilterDispatcherServletInterceptorControllerService (@Transactional) → RepositoryPersistence ContextDBExceptionHandlerView / JSON Response
Share article