스프링 공식 문서 뿌수기(2), Spring MVC의 Annotated Controllers - 1

2023. 4. 17. 18:31자바/스프링

728x90
반응형

지난주 금요일 우테코 레벨 2 피드백 강의 시간에 브리가 각 미션마다 크루들이 공부했으면 하는 커리큘럼에 대해 알려줬다. 그 내용을 하나씩 정리해보려고 한다. 우선 스프링의 가장 기본적인 내용인 MVC의 Annotated Controller를 먼저 정리해보면서 공부하려 한다.

 

 

Spring MVC

 

 

우선 스프링의 웹 MVC가 무엇인지 먼저 알아보자.

 

 

Spring Web MVC는 Servlet API를 기반으로 구축된 최초의 웹 프레임워크라고 한다. Servlet은 이전 포스팅에도 올렸듯이 Java EE에 포함되어있던 기존의 기능 중 하나였는데 스프링이 이를 그대로 반영했다고 알고 있다. Servlet이 무엇인지 아직은 정확히 모르지만 차근차근 공부를 해가야겠다.

 

 

아무튼 Spring Web MVC는 웹 프레임워크이다. 다시 말해서 웹을 만들 때 사용하는 도구로 생각하면 될 것 같다.

 

 

 

Annotated Controller

스프링은 MVC를 구성하는 구성요소들을 어노테이션을 사용해서 표현한다. 

 

위와 같이 Controller의 경우에는 @Controller라는 어노테이션을 붙여서 해당 클래스가 MVC 중 컨트롤러의 역할을 맡는다는 것을 알려준다. 컨트롤러를 제외하고도 다른 MVC의 구성요소도 어노테이션으로 처리가 가능하다.

 

위와 같이 어노테이션을 사용하는 경우에는 유연한 메서드 시그니처를 가지기에 기본 클래스를 확장하거나 특정 인터페이스를 구현할 필요가 없어진다.

 

Declaration

 

Servlet의 WebApplicationContext에 기초한 standard Spring bean definition을 사용해 controller beans를 정의할 수 있다고 한다. 여기서 설명하는 WebApplicationContext가 무엇인지 궁금해서 이 또한 간단하게 찾아봤다. 


 

ApplicationContext

 

 

WebApplicationContext을 설명하기에 앞서 ApplicationContext의 개념부터 먼저 짚고 가야한다. 스프링에서의 ApplicationContext는 스프링이 관리하는 빈들이 담겨 있는 컨테이너라고 생각하면 된다. ApplicationContext는 인터페이스이고, 웹 상에서 ApplicationContext를 사용하기 위해 이를 확장한 것이 WebApplicationContext이다. 

 

ApplicationContext 인터페이스 내에서도 Spring Bean에 대해 이야기하고 있다.

 

 

WebApplicationContext

 

WebApplicationContext은 ApplicationContext에 더불어 getServletContext() 메서드가 추가된 인터페이스이다. 이때 getServletContext() 메서드를 호출하게 되면 Servlet Context를 반환하게 된다. 

 

Servlet Context라... 지금 이 또한 공부를 하게되면 너무 깊게 파고 우선순위가 급한 내용을 공부하기는 어려울 것 같기에 일단은 이정도에서 마무리하면 될 것 같다. 어차피 서블릿은 두번째 미션 때 진행할 예정이니 말이다!

 

 

 

메서드의 이름에서도 알 수 있긴 하지만 ServlerContext를 반환하는 것을 알 수 있다. 참고로 Spring을 사용하는 경우에는 getter의 메서드 명을 사용할 때 get을 붙여서 사용하는 것 같다! 정확하지는 않지만 학습테스트를 진행할 때 get이라는 메서드명을 붙이지 않고 사용한 클래스에 대해서 JdcbTemplate으로 자동 매핑을 할 때 문제가 발생했던 것으로 기억한다. 이것도 나중에 한번 더 정리하도록 하겠다!


The @Controller stereotype allows for auto-detection, aligned with Spring general support for detecting @Component classes in the classpath and auto-registering bean definitions for them.

 

다시 돌아와서 WebApplicationContext에 기초했다는 의미는 애플리케이션 컨텍스트로 관리하는 빈에 대한 몇가지 규칙이 있는데, 이를 지키면 빈을 정의할 수 있다는 의미인 것 같다. 다시 말해 개발자가 이 규칙을 지켜서 빈을 설정하면 WebApplicationContext에서 이를 관리할 수 있다는 의미가 아닐까싶다.

 

Controller는 auto-detection이 가능하다고 설명하고 있다. 이게 가능한 이유는 Controller 어노테이션은 Component라는 어노테이션을 포함하고 있기 때문이다.

 

 

Controller

 

Component 어노테이션은 다음과 같은 역할을 하고 있다.

Component

 

위에 글을 읽어보면 Component는 말 그대로 `Component`의 역할을 하는데, 이 어노테이션을 사용하면 해당 클래스를 auto-detection이 가능하도록 돕는다. 

 

즉 Controller는 Component 어노테이션이 있기 때문에 auto-detection이 가능한 것이다.

 

이때 auto-detection이 가능하도록 하기 위해서는 아래와 같이 ComponentScan을 추가해서 Java Configuration을 설정해줄 수 있다.

 

WebConfiguration

 

ComponentScan 어노테이션에 class-path를 설정해주면 그 위치에 있는 컴포넌트들을 자동으로 식별해서 이를 WebApplicationContext에 추가하는 것이다. Configuration 어노테이션을 사용하면 Bean 설정 파일(원래는 XML 파일을 사용)을 대체한다는 것을 의미한다. 

 

공식문서에 따르면 Configuration 어노테이션을 사용하지 않는 경우에는 아래와 같은 XML 파일을 만들어야한다고 한다.

 

XML 파일

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="racingcar"/>

    <!-- ... -->

</beans>
 

 

 

 

 

 

 

출처: https://docs.spring.io/spring-framework/docs/5.1.0.RELEASE/spring-framework-reference/web.html#mvc-servlet

 

Web on Servlet Stack

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more com

docs.spring.io

 

728x90
반응형