[면접 회고] part. Apache/Tomcat

falsovsveritas·2025년 4월 1일

기술면접

목록 보기
8/10
  • Servelet의 대표적인 메서드
  • http 메서드 종류 - get, post, put
  • Spring과 아파치톰캣 기반으로 어플리케이션 작성 시, controller annotation 쓸 때 각각의 controller에게 요청을 전달하는 Spring 객체 - dispatcher

아파치 톰캣(Apache Tomcat) 기본 설명

Apache Tomcat은 Java Servlet, JSP(JavaServer Pages), WebSocket 등을 실행할 수 있는 오픈 소스 웹 서버 및 서블릿 컨테이너이다.
주로 Java 기반 웹 애플리케이션을 실행하는 데 사용되며, HTTP 요청을 받아 서블릿 및 JSP를 처리한 후 클라이언트에게 응답을 반환하는 역할을 한다.


서블릿 컨테이너의 역할

서블릿 컨테이너(Apache Tomcat 등)는 클라이언트 요청을 받아서 서블릿을 실행하고 응답을 반환하는 역할을 한다. 주요 처리 과정은 다음과 같다.

  1. 클라이언트 요청 수신

    • 클라이언트가 URL을 통해 요청을 보낸다.
    • 서블릿 컨테이너가 HTTP 요청을 수신한다.
  2. 서블릿 매핑 및 인스턴스 관리

    • 요청된 URL이 어떤 서블릿과 매핑되는지 확인한다.
    • 서블릿이 로드되지 않았다면 서블릿 클래스를 로드하고 객체를 생성한다(최초 요청 시 init() 호출).
  3. 요청 처리 (service() 호출)

    • service(HttpServletRequest req, HttpServletResponse res) 메서드를 호출한다.
    • 요청 방식에 따라 doGet(), doPost() 등을 실행하여 동적 컨텐츠를 생성한다.
  4. 응답 반환

    • 서블릿이 생성한 HTML, JSON 등의 데이터를 HTTP 응답으로 클라이언트에게 전송한다.
  5. 리소스 정리 (destroy() 호출 - 종료 시)

    • 서버 종료 시 서블릿 인스턴스를 제거한다.

서블릿 자체가 직접 요청을 처리하는 것이 아니라, 서블릿 컨테이너가 요청을 받아 서블릿을 실행하는 방식으로 동적 컨텐츠가 생성된다.


Servlet의 대표적인 메서드

Servlet은 HttpServlet 클래스를 상속하여 구현하는 경우가 많으며, 대표적인 메서드는 다음과 같다.

  1. init(ServletConfig config)

    • 서블릿이 최초 요청을 받을 때 한 번만 실행되는 초기화 메서드
    • 서블릿 컨테이너가 서블릿 인스턴스를 생성한 후 호출
  2. doGet(HttpServletRequest request, HttpServletResponse response)

    • HTTP GET 요청을 처리
  3. doPost(HttpServletRequest request, HttpServletResponse response)

    • HTTP POST 요청을 처리
  4. doPut(HttpServletRequest request, HttpServletResponse response)

    • HTTP PUT 요청을 처리
  5. doDelete(HttpServletRequest request, HttpServletResponse response)

    • HTTP DELETE 요청을 처리
  6. destroy()

    • 서블릿이 제거될 때 호출되며, 리소스 해제 등의 작업을 수행

HTTP 메서드 종류

  1. GET

    • 데이터를 요청하는 메서드
    • URL을 통해 데이터를 전달하며, 쿼리 스트링을 사용 (?key=value)
    • 브라우저 캐싱이 가능하고, 주로 조회(Read) 작업에 사용
  2. POST

    • 데이터를 서버로 전송하는 메서드
    • 요청 본문(Body)에 데이터를 포함하여 전송
    • 보안이 강화되며, 주로 생성(Create) 작업에 사용
  3. PUT

    • 리소스를 수정(업데이트)하는 메서드
    • 요청 본문에 데이터를 포함하며, 기존 데이터를 덮어씀

DispatcherServlet

DispatcherServlet은 Spring MVC의 핵심 프론트 컨트롤러(Front Controller)로, 클라이언트의 모든 요청을 중앙에서 받아 적절한 컨트롤러로 전달하고, 최종적으로 응답을 반환하는 역할을 한다.

✅ DispatcherServlet의 동작 과정(요청 처리 흐름)

  1. 클라이언트 요청 수신

    • 사용자가 브라우저에서 HTTP 요청을 보낸다.
    • 요청이 DispatcherServlet에 도달한다.
  2. Handler Mapping을 통해 적절한 컨트롤러를 찾아 요청을 위임

    • DispatcherServletHandlerMapping을 사용하여 해당 요청을 처리할 적절한 컨트롤러(@Controller, @RestController 등)를 찾는다.
  3. 컨트롤러 실행

    • 찾은 컨트롤러가 서비스를 호출하여 메서드를 실행해 비즈니스 로직을 처리한 후, 컨트롤러로 반환한다.
    • DispatcherServlet이 컨트롤러의 메서드를 실행한다._(1)
    • 컨트롤러는 필요하면 서비스(Service)를 호출하여 비즈니스 로직을 처리한 후 결과를 반환한다._(2)
  4. 컨트롤러의 실행 결과를 DispatcherServlet에 반환

    • 컨트롤러는 서비스에서 받은 데이터를 적절한 형태로 가공하여 DispatcherServlet에 반환한다.
    • @Controller의 경우, ViewResolver를 사용하여 JSP, Thymeleaf 등의 뷰를 렌더링한다.
    • @RestController의 경우, 데이터를 JSON 또는 XML 형식으로 반환한다.
  5. 클라이언트로 응답 전송

    • 최종적으로 처리된 결과를 클라이언트에게 반환한다.

(1)📍컨트롤러가 서비스를 호출하지 않는 경우 (단순 요청 처리)

@Controller
@RequestMapping("/home")
public class HomeController {
    @GetMapping
    public String home() {
        return "home"; // View name 반환 (home.jsp, home.html 등)
    }
}

흐름 정리
1. 클라이언트가 GET /home 요청을 보냄.
2. DispatcherServlet이 요청을 HomeController#home()에 전달.
3. 컨트롤러가 직접 "home"이라는 뷰 이름을 반환.
4. DispatcherServletViewResolver를 통해 "home.jsp" 또는 "home.html"을 렌더링.
5. 클라이언트에 HTML 응답 반환.

👉 이 경우 서비스 호출이 필요 없으며, 컨트롤러가 직접 뷰 이름을 반환한다.

(2)📍컨트롤러가 서비스를 호출하는 일반적인 경우

@RestController
@RequestMapping("/user")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        User user = userService.getUserById(id); // ① 서비스 호출
        return ResponseEntity.ok(user); // ② 실행 결과 반환
    }
}
@Service
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUserById(Long id) {
        return userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException("User not found"));
    }
}

흐름 정리
1. 클라이언트가 GET /user/{id} 요청을 보냄.
2. DispatcherServlet이 요청을 UserController#getUserById()에 전달.
3. 컨트롤러가 userService.getUserById(id)를 호출 -> 서비스에서 데이터 조회.
4. 서비스가 결과를 컨트롤러에 반환.
5. 컨트롤러가 ResponseEntity로 감싸서 DispatcherServlet에 반환.
6. DispatcherServlet이 최종적으로 JSON 형식으로 변환하여 클라이언트에 응답.

일반적으로 컨트롤러는 서비스를 호출하여 비즈니스 로직을 처리한다.
하지만 단순한 경우에는 서비스 호출 없이 컨트롤러가 직접 데이터를 반환하거나 뷰를 지정할 수도 있다.
컨트롤러의 본질적인 역할은 "요청을 처리하고 응답을 반환하는 것"이지, 반드시 서비스를 호출하는 것이 아니다.


✅ DispatcherServlet의 주요 컴포넌트

  1. HandlerMapping: 요청을 적절한 컨트롤러와 매핑하는 역할.
  2. HandlerAdapter: 컨트롤러를 실행하고 결과를 반환하는 역할.
  3. ViewResolver: 컨트롤러가 반환한 뷰 이름을 실제 뷰 파일(JSP, Thymeleaf 등)로 변환.
  4. ExceptionResolver: 컨트롤러에서 발생한 예외를 처리하는 역할.

✅ DispatcherServlet 설정

Spring Boot에서는 기본적으로 DispatcherServlet이 자동으로 설정되지만, XML 기반 설정에서는 다음과 같이 명시적으로 설정할 수도 있다.

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Spring Boot 환경에서는 @SpringBootApplication을 사용하면 자동으로 DispatcherServlet이 설정되므로 컨트롤러만 작성하면 된다.


✅ DispatcherServlet과 @Controller의 관계

  • DispatcherServlet@RequestMapping, @GetMapping 등이 적용된 컨트롤러 메서드를 찾아서 실행한다.
  • 컨트롤러는 ModelAndView, JSON 데이터 등을 반환할 수 있으며, DispatcherServlet이 이를 처리하여 적절한 응답을 생성한다.

✅ 주요 어노테이션

  • @Controller: Spring MVC의 컨트롤러를 정의
  • @RestController: JSON/XML 응답을 처리하는 컨트롤러
  • @RequestMapping: 특정 URL 요청을 해당 컨트롤러 메서드와 매핑
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping: HTTP 메서드에 맞는 요청을 처리

0개의 댓글