| 항목 | Spring Framework | Spring Boot |
|---|---|---|
| 목적 | 유연하고 확장성 높은 프레임워크 제공 | 설정 없이 빠르게 개발 가능하게 지원 |
| 설정 | XML 또는 Java Config로 수많은 설정 필요 | 자동 설정 제공 (@SpringBootApplication) |
| 웹 서버 | 외부 톰캣 필요 (war 파일 배포) | 내장 웹 서버 포함 (jar 실행만으로 동작) |
| 의존성 | 개발자가 직접 필요한 의존성을 조합 | 스타터(Starter)로 의존성 묶음 자동 제공 |
| 예시 | Spring + 외부 Tomcat + web.xml 등 | java -jar로 실행만 하면 서버 실행됨 |
즉, Spring은 유연하지만 설정이 복잡하고 Spring Boot는 내장톰켓 + 자동설정으로 빠른 개발이 가능하다.
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
1️⃣ 애플리케이션 시작
2️⃣ SpringApplication 객체 초기화
3️⃣ @SpringBootApplication 스캔
4️⃣ Environment 생성 및 초기화
5️⃣ ApplicationContext 생성 및 구성
6️⃣ Auto Configuration 수행
→ DispatcherServlet, Tomcat, Jackson 등이 자동으로 설정됨
7️⃣ ApplicationRunner / CommandLineRunner 실행
@Component
public class TestRunner implements CommandLineRunner {
public void run(String... args) {
System.out.println("애플리케이션 실행 후 초기 작업 수행!");
}
}
8️⃣ 내장 웹 서버 실행
9️⃣ 애플리케이션 실행 완료
🔁 간단히 도식으로 요약
main()
↓
SpringApplication.run()
↓
SpringApplication 초기화
↓
@Configuration, @ComponentScan, @EnableAutoConfiguration
↓
Environment 설정
↓
ApplicationContext 생성
↓
빈 등록 및 Auto Configuration
↓
웹 서버 실행 (Tomcat 등)
↓
요청 대기 및 서비스 시작

🧭 전체 흐름 개요
[Client] → [TCP/IP Layer] → [HTTP Layer] → [Tomcat] → [Servlet] → [Spring DispatcherServlet] → [Controller]
🧩 1. 클라이언트가 요청을 보냄
브라우저나 Postman에서 예를 들어 다음과 같이 요청했다고 하자:
GET /hello HTTP/1.1
Host: myserver.com
User-Agent: Chrome
🧩 2. TCP/IP 계층 (OS 레벨)
🧱 클라이언트 → 서버로 TCP 연결 시도
SYN → SYN-ACK → ACK
🧱 서버 (Spring Boot 애플리케이션 실행 중)
🧩 3. HTTP Layer (Tomcat 처리)
🧾 HTTP 요청은 사실 TCP 바이트 스트림 속에 들어있음
예: 아래처럼 raw byte 데이터가 도착
GET /hello HTTP/1.1\r\n
Host: myserver.com\r\n
User-Agent: Chrome\r\n
\r\n
🧰 톰캣의 Http11InputBuffer가 이 바이트들을 읽고 → HTTP 요청 객체 생성
🧩 4. 톰캣이 서블릿으로 전달
🌟 즉, 흐름은 다음과 같아:
Tomcat → DispatcherServlet.service(request, response)
🧩 5. DispatcherServlet 처리
DispatcherServlet은 내부에서 다음과 같은 작업 수행:
@GetMapping("/hello")
public String hello() { ... }
🧩 6. Controller까지 도달
Spring이 매핑된 메서드를 호출:
@GetMapping("/hello")
public String hello() {
return "Hello from Spring!";
}
→ 결과는 HttpServletResponse 객체에 담겨
→ 톰캣이 다시 이걸 HTTP 응답 → TCP 응답으로 만들어 클라이언트로 전송해줘
🔄 요약: 요청에서 컨트롤러까지 흐름
[브라우저/클라이언트]
│
└── HTTP 요청 (TCP 위에 올림)
↓
[서버의 TCP 계층]
└── 커널이 포트 8080에서 리스닝 중인 Tomcat에게 전달
↓
[Tomcat]
└── 바이트 스트림 → HttpServletRequest/Response 객체 생성
↓
[DispatcherServlet (Spring)]
└── HandlerMapping → Controller 메서드 실행
↓
[Controller]
└── 응답 반환
↓
[Tomcat]
└── 응답을 HTTP 메시지 → TCP 전송
↓
[클라이언트가 응답 수신]


MVC (Model-View-Controller) 패턴은 웹 애플리케이션에서 로직을 세 부분으로 나누는 설계 패턴
| 구성 요소 | 역할 |
|---|---|
| Model | 데이터 및 비즈니스 로직 (ex. DB에서 데이터 가져오기, 계산 처리 등) |
| View | 사용자에게 보여지는 화면 (HTML, JSP, Thymeleaf 등) |
| Controller | 사용자 입력/요청 처리, Model과 View 연결 |
Spring MVC의 핵심 중앙 컨트롤러(Front Controller) 역할을 하는 서블릿이야.
핵심 역할
| 순서 | 기능 |
|---|---|
| 1 | 클라이언트의 요청을 받는다 |
| 2 | HandlerMapping에게 어떤 컨트롤러가 처리할지 물어본다 |
| 3 | HandlerAdapter를 통해 실제 컨트롤러 호출 |
| 4 | 컨트롤러 로직 실행 → 결과 객체 (ModelAndView) 반환 |
| 5 | ViewResolver를 통해 어떤 뷰를 보여줄지 결정 |
| 6 | 최종적으로 뷰 렌더링 후 클라이언트에게 응답 |
🔄 요청 처리 전체 흐름 (Spring Context 포함)
[클라이언트 요청]
↓
[내장 톰캣 (WAS)]
↓
[DispatcherServlet (Front Controller)]
↓
[HandlerMapping] ← 어떤 컨트롤러로?
↓
[HandlerAdapter] ← 실제 컨트롤러 실행 도와줌
↓
[Controller (비즈니스 로직)]
↓
[ModelAndView 반환]
↓
[ViewResolver] ← 어떤 화면(View) 보여줄까?
↓
[View (ex. Thymeleaf, JSP)]
↓
[DispatcherServlet이 최종 렌더링]
↓
[클라이언트에게 응답]
🧠 DispatcherServlet은 언제 등록되냐?
📌 예시 코드 흐름
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "Hello!");
return "helloPage"; // View 이름
}