본문 바로가기
JAVA/Spring

Spring MVC: @Controller 사용법

by GangDev 2024. 3. 22.

@Controller는 Spring MVC에서 사용하는 주요 어노테이션 중에 하나로, 컨트롤러 역할을 하는 클래스에 지정하면 해당 클래스가 Spring MVC에서 컨트롤러 역할을 한다는 것을 나타낸다.
컨트롤러는 클라이언트의 요청(HTTP) 처리 및 비즈니스 로직(Service)을 호출하며, 데이터를 모델(Model)에 저장하고, 해당 데이터를 적절한 뷰(View)에 전달하는 역할을 한다.
즉, @Controller의 역할은 화면과 비즈니스 로직을 연결시키는 다리 역할인 것이다.
(/주소 로 요청하면 적합한 길로 연결시켜준다)

---

<<@Controller이 나오기 전의 방식 >>


원래는 컨트롤러가 기본 클래스를 확장하거나 특정 인터페이스를 구현해야 했다.
Spring MVC에서 컨트롤러를 구현하기 위해 XML 기반의 설정이나 특정한 인터페이스의 구현 클래스를 작성하는 방식이 주로 사용되었다.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <mvc:annotation-driven />
    <bean id="myController" class="com.example.MyController"/>
</beans>

컨트롤러 클래스는 특정 인터페이스를 구현하고, 메서드를 Override하여 요청을 처리하는 방식이었다.

public class MyController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String name = request.getParameter("name");
        String greeting = "Hello, " + (name != null ? name : "Guest") + "!";
        return new ModelAndView("helloPage", "greeting", greeting);
    }
}

** 코드 내 식으로 정리하기

XML 파일에서는 URL과 컨트롤러를 매핑해야 했다.

<!-- applicationContext.xml -->
<beans>
    <!-- ... -->
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.htm">MyController</prop>
            </props>
        </property>
    </bean>
    <!-- ... -->
</beans>

이런 방식은 XML 파일에 설정을 해야 하고, 컨트롤러가 특정 인터페이스를 구현해야 했기에 상대적으로 번거로웠다.
그래서 나온 것이 '@Controller' 어노테이션이다.
이전 방식의 복잡한 설정과 구현 패턴을 단순화하여, 더 간결하고 직관적인 방식으로 컨트롤러를 정의할 수 있게 되었다.

---

<@Controller 어노테이션 사용법>

@Controller
public class GreetingController {

    @RequestMapping("/greeting")
    public String greeting(Model model) {
        model.addAttribute("name", "World");
        return "greeting"; // /WEB-INF/views/greeting.jsp로 매핑될 수 있음
    }
}

@RequestMapping 이나 다른 HTTP 매핑 어노테이션(@GetMapping, @PostMapping 등)을 메서드에 적용하여 특정 URL에 대한 요청(URL, HTTP 메소드)을 해당 메서드에 매핑할 수 있다. Spring MVC의 frontController(DispatcherServlet)는 이 매핑 정보를 사용하여 들어오는 요청을 적절한 메서드에 전달한다.

@Controller의 메서드는 대부분 뷰의 이름을 문자열로 반환한다.
Spring은 이 뷰 이름을 사용하여 뷰 리졸버(View Resolver)를 통해 실제 뷰(JSP, Thymeleaf 등)를 찾고, 응답을 생성한다.

@Controller 메서드는 'Model' 객체를 매개변수로 받아서 뷰에 전달할 데이터를 추가할 수 있는데, 모델 바인딩이라고 한다.

@ResponseBody 어노테이션을 사용하면 반환값을 HTTP 응답 본문(예시에서는 '/greeting')으로 직접 보낼 수 있고, 이 경우엔 뷰 리졸버는 사용되지 않는다.

RESTful 구현할 때는 '@RestController' 어노테이션을 사용하자.
@RestController는 @Controller 와 @ResponseBody 를 합친 것으로, JSON이나 XML 형식의 데이터를 HTTP 응답 본문으로 직접 반환하는 데에 적합하다.

@Controller이 지정된 클래스를 스프링의 빈으로 등록하려면 일반적으로 @ComponentScan 어노테이션을 사용한다.
Spring은 @ComponentScan을 통해, @Controller 어노테이션이 적용된 클래스를 자동으로 검색하여 Spring의 application-context.xml 에 빈으로 등록한다.

 

---

23년 12월 7일 작성된 글입니다