개발 공부/백엔드

스프링 웹 개발 기초: 3가지 방식으로 웹 요청 처리하기

baby-t 2025. 9. 14. 11:37

https://www.inflearn.com/

 

인프런 - 라이프타임 커리어 플랫폼

프로그래밍, 인공지능, 데이터, 마케팅, 디자인등 입문부터 실전까지 업계 최고 선배들에게 배울 수 있는 곳.

www.inflearn.com

인프런 사이트의 김영한님의 강의를 보면서 작성한 글입니다.

 

Spring Boot를 사용하면 웹 요청을 처리하고 사용자에게 콘텐츠를 보여주는 여러 가지 방식을 활용할 수 있습니다. 이번 글에서는 가장 대표적인 세 가지 방법인 정적 콘텐츠, MVC와 템플릿 엔진, 그리고 API 방식에 대해 알아보겠습니다.

### 📜 시작하기 전에: 웹 개발 기술의 변천사

과거부터 현재까지 웹 페이지를 동적으로 만드는 기술은 계속 발전해왔습니다.

  • JSP (JavaServer Pages): HTML 문서 안에 Java 코드를 넣어 동적인 웹 페이지를 만들던 기술입니다.
  • PHP: JSP와 유사하지만, 서버 측 스크립트 언어로 웹 개발 시장에서 오랫동안 널리 사용되었습니다.
  • ASP (Active Server Pages): 마이크로소프트사에서 개발한 기술로, JSP/PHP와 비슷한 역할을 합니다.

이러한 기술들은 서버에서 프로그래밍을 통해 HTML을 동적으로 생성한다는 공통점이 있습니다. Spring Boot는 이 개념을 더욱 발전시켜 세련된 방식으로 제공합니다.


### 방식 1. 정적 콘텐츠 🖼️

정적 콘텐츠는 서버에서 별도의 가공 없이, 있는 파일 그대로를 클라이언트(웹 브라우저)에게 전달하는 방식입니다. 주로 변경이 없는 HTML, CSS, JavaScript, 이미지 파일 등을 서빙할 때 사용합니다.

#### 동작 원리

  1. src/main/resources/static 폴더에 mystatic.html 같은 파일을 생성합니다.
  2. 웹 브라우저에서 http://localhost:8080/mystatic.html로 접속합니다.
  3. Spring은 요청을 받고, 먼저 이 경로에 매핑된 컨트롤러가 있는지 확인합니다.
  4. 해당하는 컨트롤러가 없다면, resources/static 폴더에서 mystatic.html 파일이 있는지 찾습니다.
  5. 파일이 존재하면 그 내용을 그대로 브라우저에 반환하여 보여줍니다.

### 방식 2. MVC와 템플릿 엔진 ⚙️

**MVC(Model-View-Controller)**는 서버에서 프로그래밍을 통해 HTML을 동적으로 변경하여 사용자에게 보여주는 방식입니다. 사용자의 요청에 따라 다른 내용이 담긴 페이지를 보여줄 수 있습니다.

#### Controller 코드 예시

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

위 코드는 hello-mvc라는 경로로 요청이 들어올 때, name이라는 파라미터를 받아 모델에 담은 후, hello-template.html이라는 뷰를 렌더링하라는 의미입니다.

⚠️ 잠깐! @RequestParam과 파라미터 @RequestParam("name")은 외부에서 name이라는 키로 넘어온 값을 String name 변수에 저장하라는 뜻입니다. 만약 이 파라미터 없이 http://localhost:8080/hello-mvc로만 접속하면, 필수 값인 name이 없기 때문에 오류가 발생합니다.

이때 웹 브라우저 주소창에 GET방식을 사용하여 ?를 통해 파라미터를 전달했습니다. http://localhost:8080/hello-mvc?name=spring!

이렇게 요청하면, hello-template.html 파일이 name 값으로 "spring!"을 전달받아 동적인 페이지를 완성하게 됩니다.

#### GET 방식 vs POST 방식

웹 요청에는 여러 방식이 있지만 가장 대표적인 것은 GET과 POST입니다.

구분 GET POST
데이터 전달 위치 URL 주소 뒤에 붙여서 전달 (e.g., ?name=spring) HTTP Body에 담아서 전달 (URL에 보이지 않음)
주된 용도 데이터 조회(Read) 데이터 생성 또는 변경(Create, Update)
보안 URL에 데이터가 노출되어 보안에 취약 GET 방식에 비해 상대적으로 안전

 


### 방식 3. API (Application Programming Interface) 🤖

API 방식은 웹 페이지(HTML)를 반환하는 것이 아니라, **데이터 자체(주로 JSON 형식)**를 반환하는 방식입니다. 이렇게 전달된 데이터는 웹 브라우저의 JavaScript나 다른 서버에서 사용됩니다.

#### 문자열 반환 API

@ResponseBody 어노테이션을 사용하면 뷰를 거치지 않고, 반환하는 문자열을 HTTP 응답 Body에 직접 넣어 전달합니다.

Java
 
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
    return "hello " + name; // 이 문자열이 그대로 화면에 출력됨
}

http://localhost:8080/hello-string?name=spring으로 접속하면, 웹 페이지 소스에는 hello spring이라는 텍스트만 존재하게 됩니다.

#### JSON 데이터 반환 API

실무에서는 문자열보다 객체를 JSON 형태로 반환하는 방식을 훨씬 많이 사용합니다.

Java
 
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello();
    hello.setName(name);
    return hello; // 객체를 반환
}

static class Hello {
    private String name;
    // Getter, Setter ...
}

http://localhost:8080/hello-api?name=spring으로 접속하면 아래와 같은 JSON 데이터가 화면에 나타납니다.

JSON
 

#### @ResponseBody의 동작 원리

@ResponseBody는 반환 값의 종류에 따라 다르게 동작합니다.

  1. 반환 값이 문자열(String)이면: StringHttpMessageConverter가 동작하여 데이터를 텍스트 형식으로 그대로 전달합니다.
  2. 반환 값이 객체(Object)이면: MappingJackson2HttpMessageConverter가 동작하여 객체를 JSON 형식의 문자열로 변환한 후 전달합니다.

이러한 변환 과정 덕분에 우리는 복잡한 설정 없이 객체를 반환하는 것만으로 손쉽게 JSON API를 만들 수 있습니다.

 

사진 출처:

https://velog.io/@geon-2/Spring-ResponseBody%EC%9D%98-%EC%97%AD%ED%95%A0