Spring

[스프링부트] 컨트롤러

아윤_ 2023. 11. 5. 00:14

 

컨트롤러란, MVC 디자인 패턴에서 C에 해당한다. 컨트롤러는 사용자의 요청을 처리하는데 사용된다.

 

스프링부트에서 컨트롤러를 사용하는 방법에 대해 간단히 알아보도록 하자. 그 전에, 스프링부트 서버를 띄우고, 브라우저에 http://localhost:8080 URL로 페이지를 요청하면, 다음과 같은 오류가 발생한다.

 

 

 

다음과 같이 Not Found (404)라는 오류가 발생하는데,  404는 HTTP 오류 코드 중 하나로 브라우저가 요청한 페이지를 찾을 수 없을 경우에 발생한다.

 

이는 요청한 URL(http://localhost:8080)을 스프링부트 서버가 해석할 수 없기 때문이다. 오류를 해결하기 위해서는 컨트롤러를 작성하고 URL에 대한 매핑을 추가해야 한다. 

 

 

컨트롤러

 

"HelloController.java" 파일을 생성하고, URL 매핑을 추가해 보자.

 

package practice.hello;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public void hello() {
        System.out.println("hello");
    }
}

 

@Controller 애노테이션을 적용한 클래스는 스프링부트의 컨트롤러가 된다. 즉, HelloController 클래스는 스프링부트의 컨트롤러이다.

 

@GetMapping 애노테이션은 요청된 URL과의 매핑을 담당한다. "http://localhost:8080/hello" URL 요청이 서버에 발생하면 스프링부트는 요청 페이지와 매핑되는 메서드를 컨트롤러를 대상으로 찾는다.

참고로 도메인명과 포트는 서버 설정에 따라 변하기 때문에 @GetMapping에 적지 않아도 된다. 

 

 

하지만, http://localhost:8080/hello 라는 URL을 호출해 보면, 다음과 같은 오류가 발생한다.

 

 

 

아까와는 다르게 404가 아닌 500 오류 코드가 발생하였다. 콘솔을 확인해보면, "hello" 문자열이 출력된 것을 확인할 수 있다. 505 오류 코드의 경우 URL 호출 시 컨트롤러와 매핑된 메서드는 호출되었지만, 매핑된 함수가 결과 값을 아무것도 리턴하지 않아 발생한 것이다. 즉, 클라이언트(브라우저)로 응답을 리턴해야 한다.

 

응답을 리턴하도록 다시 컨트롤러를 수정해 보자.

 

package practice.hello;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello";
    }
}

 

메서드의 반환 값을 String으로 바꾸고 문자열 "hello"를 리턴하도록 하였다. @ResponseBody 애노테이션을 통해 URL 요청에 대한 응답으로 문자열 자체를 리턴한다. @ResponseBody 애노테이션을 생략할 경우, "hello" 라는 이름의 템플릿 파일을 찾게 된다.

 

다시 http://localhost:8080/hello URL을 호출하면, 브라우저에 hello가 출력되는 것을 확인할 수 있다.

 

 

템플릿 설정하기

 

위에서는 "hello"라는 문자열을 직접 자바 코드로 작성하여 브라우저에 리턴했지만, 일반적으로 많이 사용하는 방식은 템플릿 방식이다.

템플릿은 자바 코드를 삽입할 수 있는 HTML 형식의 파일이다.

 

스프링부트에서 사용할 수 있는 템플릿 엔진은 다양하지만, 여기서는 타임리프(Thymeleaf)를 사용해 볼 것이다.

 

타임리프를 사용하기 위해서는 build.gradle 파일에 다음 내용을 추가해야 한다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
}

 

 

템플릿 사용하기

 

로컬 서버를 재시작하고, 다음과 같이 hello.html이라는 템플릿 파일을 templates 폴더 아래에 추가하고 코드를 작성해보자.

 

 

<!doctype html>
<html lang="ko">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <h1>hello spring!</h1>
    </body>
</html>

 

그다음에 HelloController를 다음과 같이 수정하자.

package practice.hello;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

 

@ResponseBody 애노테이션을 제거하고, 템플릿 파일의 이름인 "hello"를 리턴하도록 코드를 변경하였다.

 

http://localhost:8080/hello에 접속해 보면 다음과 같이 <h1> 태그에 작성하였던 내용이 정상적으로 출력된다.