Spring에서 웹 개발에 필요한 3가지

Nogglee·2026년 1월 26일

SpringBoot 맥락 읽기

목록 보기
5/5

웹 애플리케이션 응답 유형

Spring Boot에서 웹 애플리케이션은 크게 3가지 방식으로 응답을 제공한다.

  1. 정적 컨텐츠
    서버 로직 없이 이미 만들어진 파일을 웹 브라우저에 그대로 내려주는 방식이다. 대표적으로 Welcome Paege가 이에 해당한다.
  2. MVC와 템플릿 엔진
    과거에는 JSP, PHP와 같은 방식으로 View와 Controller가 분리되지 않은 구조(Model 1)를 사용했다.
    현재는 HTML에 동적인 요소를 추가하기 위해 Model, View, Controller로 분리하여 동적으로 HTML을 생성한다.
  3. API
    클라이언트와 통신할 때 사용하는 방식으로, JSON 형태의 데이터를 주로 반환한다. 웹 프론트엔드 뿐만 아니라 서버 간 통신에서도 많이 사용된다.

각 유형별 상세한 동작방식을 알아보자!


정적 컨텐츠

Spring Boot는 정적 컨텐츠 제공 기능을 기본으로 지원한다.
지난 포스팅에서 작성한 Welcome Page와 같은 정적 컨텐츠를 실행하는 과정은 아래와 같다.

  1. 웹 브라우저에서 URL을 입력하면 요청이 내장 Tomcat으로 전달된다.
  2. Spring MVC의 DispatcherServlet이 해당 요청 경로에 매핑된 Controller가 있는지 먼저 확인한다.
  3. Controller가 존재하지 않을 경우, static 폴더 (/resources/static)에서 동일한 이름의 파일이 있는지 탐색한다.
  4. 파일이 존재하면 서버 로직 없이 그대로 브라우저에 반환된다.

즉, Spring Boot는 항상 Controller를 먼저 탐색하고, 없을 경우 정적 리소스로 fallback하는 구조를 가진다.


MVC와 템플릿 엔진

MVC란 Model, View, Controller의 약자이다.

과거에는 View와 Controller가 분리되지 않은 구조를 사용했으며, 화면과 로직이 뒤섞이는 문제가 있었다.

이후 역할과 책임을 분리하기 위해 MVC 패턴이 등장했고, 아래와 같이 사용되고있다.

  • View는 화면을 그리는데 집중
  • Controller는 비즈니스로직 처리
  • Model은 View에 전달할 데이터 담당

Controller 예시

@Controller
pulic class HelloController
{
	@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model)
    {
    	model.addAttribute("name", name);
        return "hello-template";
    }
}

View 예시

resources/template/hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
  <body>
    <p th:text="'hello' + ${name}">hello! empty</p>
  </body>
</html>

Model은 View에서 필요로하는 것들을 담아서 전달해준다.

http://localhost:8080/hello-mvc?name=nogglee로 접근하면:
1. name 파라미터가 Controller 메서드의 name 변수에 저장된다.
2. 해당 값이 Model에 담긴다.
3. Thymeleaf 템플릿에서 ${name} 표현식을 통해 Model 값을 꺼내 HTML을 완성한다.

Controller와 View의 흐름을 정리하면 아래와 같다.
1. 웹브라우저가 URL 요청
2. 요청한 URL이 내장된 톰캣에 전달됨
3. 톰캣 서버는 해당 경로로 매핑된 컨트롤러가 있는지 확인
4. 매핑된 컨트롤러는 Model에 데이터를 담고 View 이름을 반환
5. ViewResolver가 템플릿 파일을 찾음
6. Thymeleaf가 HTML을 렌더링
7. 완성된 HTML이 브라우저로 반환됨


API

API 방식은 별도의 View 없이 데이터를 직접 반환한다.

Controller 예시

// 해당 클래스는 Getter와 
static class Hello
{
    private String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name)
{
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

@ResponseBody는 return 값을 View가 아닌 HTTP Body에 직접 실어 보내겠다는 의미이다.

API에서 ResponseBody 동작 방식

  1. 웹브라우저가 URL 요청
  2. 요청한 URL이 내장된 톰캣에 전달됨
  3. 톰캣 서버는 해당 경로로 매핑된 컨트롤러가 있는지 확인4. @ResponseBody가 존재하면 ViewResolver를 거치지 않음
  4. HttpMessageConverter가 Controller의 반환 타입을 확인
    1) 반환 값이 객체이면 JSONConverter 동작 (결과값을 JSON으로 변환)
    2) 반환 값이 문자열이면 StringConverter를 동작
  5. 결과를 HTTP응답으로 반환
profile
Product-minded Engineer

0개의 댓글