Contents
1. Spring 프레임워크의 웹 동작 원리 (필기)0️⃣ 필기1️⃣ 전체 요청 흐름 한눈에 보기2️⃣ HTTP 요청 기본 구조3️⃣ 웹 서버 & 요청 처리 구조4️⃣ 스프링 컨테이너 내부 구조5️⃣ DB 커넥션과 트랜잭션6️⃣ Open-in-View (OSIV)7️⃣ POST 요청 예시 흐름8️⃣ Redirect vs Forward9️⃣ 핵심 요약2. 반드시 알아야 할 핵심 개념 TOP 61️⃣ 스프링 빈(Bean)과 IoC / DI ⭐⭐⭐⭐⭐2️⃣ 필터(Filter) vs 인터셉터(Interceptor) ⭐⭐⭐⭐3️⃣ 예외 처리 흐름 (@ControllerAdvice) ⭐⭐⭐⭐4️⃣ HTTP 상태 코드 & REST 설계 ⭐⭐⭐⭐5️⃣ 스프링부트 자동 설정(Auto Configuration) ⭐⭐⭐6️⃣ 동시성 & 스레드 안전성 ⭐⭐⭐⭐7️⃣ 보너스 : 한 장으로 정리한 “완성 흐름”1. Spring 프레임워크의 웹 동작 원리 (필기)
0️⃣ 필기

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) 트랜잭션 흐름
Controller → Service (@Transactional)
↓
트랜잭션 시작
↓
Repository →DB
↓
정상 종료 →Commit
예외 발생 →Rollback6️⃣ 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=b2) 처리 흐름
브라우저
→ Tomcat
→ DispatcherServlet
→ Controller
→ Service (@Transactional)
→ Repository
→ DB
→ 응답 반환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 → Controller3️⃣ 예외 처리 흐름 (@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️⃣ 보너스 : 한 장으로 정리한 “완성 흐름”
Client
→ Filter
→ DispatcherServlet
→ Interceptor
→ Controller
→ Service (@Transactional)
→ Repository
→ Persistence Context
→ DB
→ ExceptionHandler
→ View / JSON ResponseShare article