본문 바로가기

SPRING/Spring

[스프링| 스프링 입문 | 코드로 배우는 스프링] MVC와 템플릿엔진

@GetMapping("hello-mvc")
    public String hellowMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);  // 'name'이라는 이름으로 모델에 파라미터 값을 추가함
        return "hello-template";  // View 이름을 'hello-template'으로 지정하여 반환함
    }

이 메서드는 Spring MVC에서 HTTP GET 요청을 처리합니다. URL의 경로가 "hello-mvc"로 끝나는 GET 요청이 이 메서드에 매핑됩니다. 사용자는 URL을 통해 'name'이라는 이름의 파라미터 값을 전달할 수 있습니다. 이 값은 메서드의 인자로 전달되며, Model 객체에 추가되어 View에 전달됩니다. 마지막으로, 이 메서드는 View의 이름인 "hello-template"을 반환하여, 해당 View가 렌더링될 수 있도록 합니다.

MVC 모델 설명

MVC (Model-View-Controller) 모델은 애플리케이션을 세 가지 주요 구성 요소로 나누는 소프트웨어 디자인 패턴입니다:

  1. Model (모델): 데이터와 비즈니스 로직을 처리합니다. 애플리케이션의 동작에 관련된 데이터의 접근 및 관리를 담당하며, 일반적으로 데이터베이스와의 통신을 포함합니다.
  2. View (뷰): 사용자에게 보이는 UI 부분입니다. 사용자가 보는 페이지의 구조와 레이아웃을 결정하며, 모델로부터 받은 데이터를 기반으로 사용자에게 정보를 표시합니다.
  3. Controller (컨트롤러): 사용자의 입력을 받고 처리합니다. 컨트롤러는 사용자의 입력을 모델로 전달하여 데이터를 업데이트하거나 조회한 뒤, 그 결과를 뷰에 전달하여 적절한 응답을 생성합니다.

위 코드에서 컨트롤러는 @GetMapping 어노테이션을 사용하여 특정 HTTP GET 요청을 받아 처리합니다. 사용자로부터 받은 입력('name' 파라미터)을 모델에 저장하고, 모델은 이 데이터를 View로 전달하여 사용자에게 표시할 수 있도록 합니다. 이 과정을 통해 MVC 패턴이 웹 애플리케이션의 구조를 명확하게 분리하여 각 구성 요소의 독립성을 유지하면서도 효과적으로 협력할 수 있도록 돕습니다.

 

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Welcome to Spring Boot</title>
    <meta http-equiv="Content-Type" content="text/html; charset-UTF-8"/>
</head>
<body>
<p th:text="'안녕하세요.' + ${name}" > 안녕하세요. 손님 </p>
</body>
</html>

<p th:text="'안녕하세요.' + ${name}">안녕하세요. 손님</p>: p 태그는 페이지에 텍스트를 표시하는 데 사용됩니다. th:text 속성은 Thymeleaf의 표현식을 사용하여 동적인 내용을 생성합니다. 여기서는 "안녕하세요." + ${name} 표현식을 사용하여, 서버로부터 받은 name 변수의 값에 따라 사용자에게 표시할 메시지가 결정됩니다. ${name}은 컨트롤러에서 모델에 추가된 name 속성의 값을 참조합니다. 만약 name 값이 없다면 기본적으로 "안녕하세요. 손님"이 표시됩니다.


파라미터 바인딩의 기본 개념

Spring MVC에서는 클라이언트로부터 들어오는 HTTP 요청을 처리할 때, 요청 데이터(쿼리 파라미터, 경로 변수, 헤더, 본문 등)를 컨트롤러 메서드의 매개변수에 자동으로 바인딩합니다. 이때 어노테이션을 사용하여 어떤 방식으로 데이터를 바인딩할지 지정할 수 있습니다.

 

자동 바인딩 (Implicit Binding)

Spring MVC는 메서드 파라미터의 이름과 요청 파라미터의 이름이 일치할 경우, 어노테이션 없이도 자동으로 바인딩할 수 있습니다. 하지만 이는 명확성을 떨어뜨릴 수 있으며, 특히 복잡한 요청이나 API에서는 명시적인 어노테이션 사용이 권장됩니다.

명시적 바인딩 (Explicit Binding): @RequestParm

각 어노테이션을 사용하여 바인딩 소스를 명확하게 지정합니다. 이는 코드의 가독성을 높이고, 예상치 못한 바인딩 오류를 줄이는 데 도움이 됩니다.

주요 바인딩 소스:

  • 쿼리 파라미터(Query Parameters): URL의 ?key=value 형태로 전달되는 데이터.
  • 경로 변수(Path Variables): URL 경로의 일부로 포함된 변수.
  • 요청 본문(Request Body): POST, PUT 요청 시 전송되는 데이터(주로 JSON, XML).
  • 헤더(Header): HTTP 요청의 헤더 정보.
  • 폼 데이터(Form Data): 주로 HTML 폼에서 전송되는 데이터.

@PathVariable

@PathVariable은 URL 경로의 일부를 변수로 추출하여 매개변수로 바인딩할 때 사용됩니다. RESTful API에서 자원(Resource)을 식별하는 데 주로 사용됩니다.

@GetMapping("/api/articles/{id}")
public ResponseEntity<Article> getArticle(
    @PathVariable("id") Long articleId
) {
    Article article = articleService.getArticleById(articleId);
    return ResponseEntity.ok(article);
}

@RequestBody

@RequestBody요청 본문에 포함된 데이터를 객체로 매핑하여 매개변수로 바인딩할 때 사용됩니다. 주로 JSON 또는 XML 데이터를 처리할 때 사용됩니다.

@PostMapping("/api/articles")
public ResponseEntity<Article> createArticle(
    @RequestBody ArticleRequest articleRequest
) {
    Article article = articleService.createArticle(articleRequest);
    return ResponseEntity.status(HttpStatus.CREATED).body(article);
}