spring boot 내장 톰캣과 Bean

Jihye Gim·2026년 3월 23일

Codeit SB11

목록 보기
9/22

Q1.웹 서버(Web Server)와 WAS(Web Application Server)의 차이를 설명하고, Spring Boot의 내장 톰캣이 이 둘 중 어디에 해당하는지 설명해주세요.

1. 웹 서버(Web Server)란?

역할: 정적인 리소스(HTML, CSS, JS, 이미지 파일 등)를 클라이언트(브라우저)에 전달하는 서버.
대표 예시: Apache HTTP Server, Nginx 등
특징
HTTP 프로토콜 기반으로 클라이언트(주로 웹 브라우저) 요청을 처리
정적 파일을 빠르게 전송
웹 애플리케이션(동적 로직) 실행 기능이 없음

2. WAS(Web Application Server)란?

역할: 동적인 웹 애플리케이션(비즈니스 로직/프로그램 코드)을 실행하는 서버.
대표 예시: Tomcat, JBoss, Jetty, WebLogic 등
특징
Java Servlet/JSP 등의 실행 환경 제공
클라이언트 요청 시, 자바 코드(컨트롤러, 서비스 등)를 실행해서 동적 응답을 생성하고 반환
HTTP 요청을 직접 받을 수도 있고, 웹 서버와 연동할 수도 있음

3. 웹 서버와 WAS의 차이

웹 서버 WAS (Web Application Server)
처리 대상 정적 리소스(HTML, 이미지 등) 동적 리소스(서블릿, JSP, 비즈니스 로직 등)
기능 파일 전송 프로그램 코드/비즈니스 로직 실행, 동적 생성
예시 Apache, Nginx Tomcat, Jetty, JBoss, WebLogic 등
연동 방식 단독 또는 WAS와 연동 단독 또는 웹서버와 연동

4. Spring Boot의 내장 톰캣의 정체!

Spring Boot 프로젝트를 만들면 톰캣(Tomcat) 서버가 내장되어 있어요.

이 내장 톰캣은 "WAS(Web Application Server)" 에 해당한다.

톰캣은 서블릿 컨테이너이면서 WAS 역할을 수행함
Spring Boot는 기본적으로 정적 리소스도 직접 서빙할 수 있지만, 애플리케이션의 비즈니스 로직(컨트롤러, 서비스 등)은 톰캣 위에서 동적으로 처리됨
별도의 "웹 서버"(예: Nginx, Apache HTTPD)가 없어도 톰캣만으로 바로 동작 가능
요약
웹 서버: 정적 파일 전용 서버 (ex. Apache, Nginx)
WAS: 동적 프로그램 실행 서버 (ex. Tomcat, Spring Boot 내장 톰캣 등)
Spring Boot의 내장 톰캣: WAS에 해당한다!

Q2.Spring Boot에서 사용되는 다양한 Bean 등록 방법들에 대해 설명하고, 각각의 장단점을 비교하세요.

1. Spring MVC 요청 처리 기본 흐름 (공통)

클라이언트(브라우저, 앱 등)가 HTTP 요청을 보냄
DispatcherServlet이 요청을 받아 적절한 컨트롤러에 전달
컨트롤러에서 요청을 처리하고 결과를 반환
DispatcherServlet이 컨트롤러의 반환값을 해석하여 응답 생성
클라이언트에 응답 전송

2. @Controller 처리 과정과 특징

처리 흐름
@Controller가 붙은 클래스의 메소드(핸들러)가 호출됨
메소드가 반환하는 값(주로 String)은 "뷰(View)의 이름"으로 해석됨
예) "hello"를 반환하면, templates/hello.html 같은 파일을 찾아서 렌더링함
데이터를 넘기고 싶으면 Model에 담아서 전달함
템플릿 엔진(Thymeleaf, JSP 등)이 실제 HTML 등으로 변환해서 응답 전달
특징
동적 웹 페이지(HTML) 응답에 최적화

REST API보다는 웹사이트, 화면 UI에 많이 사용

리턴 타입이 문자열이면 '뷰 이름'으로 동작

뷰(View)와 모델(Model)을 분리하여 처리

예시

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("name", "Codeit");
        return "hello"; // hello.html이라는 뷰 이름으로 해석됨
    }
}

3. @RestController 처리 과정과 특징

처리 흐름
@RestController는 내부적으로 @Controller + @ResponseBody가 합쳐진 것
메소드의 리턴값(객체, 문자열 등)을 HTTP 응답 본문(body)에 그대로 담음
(뷰를 렌더링하지 않고 JSON, XML, String 그대로 반환)
주로 REST API 구현에 사용
특징
JSON, XML 등 데이터 응답에 최적화(RESTful API)

반환 값이 자동으로 직렬화(예: 객체 → JSON)

별도의 @ResponseBody를 메소드마다 붙일 필요 없음

화면 HTML이 아니라 데이터(주로 JSON, XML)를 반환

예시

@RestController
public class HelloApiController {
    @GetMapping("/api/hello")
    public Map<String, String> hello() {
        Map<String, String> result = new HashMap<>();
        result.put("name", "Codeit");
        return result; // JSON 응답 {"name": "Codeit"}
    }
}

4. @Controller vs @RestController 요약표

구분 @Controller @RestController
주요 목적 웹 화면(HTML) 응답 데이터(JSON, XML 등) 응답
응답 처리 방식 뷰 이름 반환 → 템플릿 엔진이 HTML 렌더링 리턴값을 HTTP body에 그대로 반환
REST API 지원 @ResponseBody 필요 (@RestController 사용 권장) 자동 지원
사용 예시 웹사이트, 화면 UI 컨트롤러 REST API 서버, 모바일용 백엔드 등

5. 결론

웹 페이지 반환이 목적이면 @Controller 사용
REST API(데이터 응답)가 목적이면 @RestController 사용
둘 다 DispatcherServlet이 요청을 받아 컨트롤러에 전달하지만, 반환값 처리 방식에서 차이가 크다는 점이 핵심이에요!

profile
Rookie

0개의 댓글