[ 스프링 ] DispatcherServlet ?

[ 스프링 ] DispatcherServlet ?

728x90

반응형

DispatcherServlet

스프링 MVC 를 사용하면 서블릿을 생성할 필요가 없다.

클래스를 생성해 @Controller 어노테이션을 추가하고

@RequestMapping 어노테이션으로 특정 URL 패턴에 매칭할 수 있다.

규약에 따르면 클래스 이름은 보통 Controller 로 끝난다.

스프링은 요청을 받기 위해 핵심 서블릿인 DispatcherServlet 를 활용한다.

이 DispatcherServlet 은 모든 요청을 처리할 수 있게 설정되야 하며

@RequestMapping 어노테이션에 지정된 URL 패턴에 따라 스프링 요청을 처리할 패턴에 맞는 컨트롤러를 찾는다.

HTTP 요청을 만들 컨트롤러를 추가하고자 한다면 pom.xml 에 스프링 부트 의존성을 추가해야 한다.

org.springframework.boot spring-boot-starter-parent 2.0.0.RELEASE org.springframework.boot spring-boot-starter-web ​

태그는 스프링 부트의 부모 스타터로부터 프로젝트 아키팩트를 상속 받는다.

그리고 spring-boot-starter-web 의존성은 앞서 사용한 spring-boot 모듈을 포함한다.

이제 mvn install 을 실행하면 메이븐이 스프링 부트가 필요로 하는 의존성을 내려받는 것을 확인할 수 있다.

그리고 java -jar target/messages-jar-with-dependensies.jar 명령어를 실행하면 스프링 프로젝트가 구동이 된다.

아직 웹 애플리케이션으로써 동작 하는 것은 아니기에

스프링 부트 웹 애플리케이션 파일을 만들어야 한다.

나는 Application.java 파일을 스프링 부트 웹 애플리케이션으로 변경 하였다.

pakage com.bin.soo; import org.springframework.boot.Springapplication; import org.springframework.boot.autoconfigure.Springbootapplication; @SpringBootApplication public class Application{ public static void main ( Spring[] args ){ SpringApplication.run(Application.class, args); } }

@SpringBootApplication 어노테이션을 Application class 에 적용하여서

스프링이 마법의 자동설정 (autoconfiguration) 을 수행 할 수 있는 상태가 되었다.

그리고 SpringApplication.run() 으로 애플리케이션을 실행하면 스프링 컨테이너가 구동된다.

이제 HTTP 요청을 받는 Controller 를 생성할 것이다.

내 개인 정보와 관련된 모든 요청을 이 컨트롤러에서 다룰것이므로 BinsooController 로 이름을 정한다.

package com.bin.soo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/binsoo") public class BinsooController(){ @GetMapping("/info") public String binsooInfo(){ return "Binsoo is Name Soobin"; } }

@Controller 어노테이션을 적용해 실제 MVC 컨트롤러를 만든다.

@RequestMapping 어노테이션으로 URL 패턴 "binsoo" 와 일치하는 요청을 처리할 수 있도록 컨트롤러를 매핑한다.

@GetMapping 어노테이션으로

URL 패턴 "binsoo/info" 와 일치하는 요청을 처리하는 binsooInfo() 핸들러 메소드를 매핑한다.

@GetMapping 어노테이션은 HTTP GET 요청을 매핑하는 @RequestMapping 의 축약 형태이다.

이를 @RequestMapping( value = "/info", method = RequestMethod.GET ) 으로 대체할 수 있다.

하지만 @GetMapping 이 훨씬 간단명료하다.

이제 mvn install 을 실행한 뒤

java -jar targer/binsoo-jar-with-dependencies.jar 명령어를 실행하면 동작하지 않으면서

Application run failed 라는 에러가 표시 된다.

이는 maven-assembly-plugin 이 스프링 부트 애플리케이션을 실행 할 수 없기 때문이다.

섹션에서 maven-assembly-plugin 을 제거하고

메이븐으로 스프링 부트 애플리케이션을 실행 할 수 있게 spring-boot-maven-plugin 을 추가한다.

binsoo org.springframework.boot spring-boot-maven-plugin

이제 다음 명령어로 애플리케이션이 시작되면 mvn install 명령어를 실행할 필요가 없다.

mvn spring-boot:run

애플리케이션이 시작되면 다음 메세지를 확인 할 수 있다.

... Mappd "{[/binsoo/info], methods=[GET]}" onto public java.lang.String com.bin.soo.BinsooController.binsooInfo() ... Tomcat started on port(s) : 8080 (http) with context path ''

이는 스프링이 binsooInfo() 핸들러에 HTTP GET 요청에 대한 "/binsoo/info" 경로를 등록 했음을 의미 한다.

그리고 톰캣 서버가 시작되어 8080 포트로 들어오는 HTTP 요청을 수신한다.''

이제 웹 어플리케이션을 실행 시키고 아래 URL 을 호출시키면 404 Not Found 가 발생한다.

http://localhost:8080/binsoo/info

404 Not Found 가 발생한 이유는

"/binsoo/info" 에 반환 값인 "Binsoo is Name Soobin" 으로 무엇을 할지 알려주지 않았기 때문이다.

스프링은 기본적으로 별다른 설정이 없으면 String Type 의 반환 값을

요청을 내부적으로 전달해야 하는 경로라고 간주한다.

여기서는 존재하지 않는 "/Binsoo is Name Soobin" 경로를 핸들러를 통해서 찾으려고 노력중이었던 것이다.

@ResponseBode 어노테이션으로 스프링은 반환 값을 HTTP 응답의 본문으로 처리하고

이에 대응하는 HttpBinsooConverter 를 찾아 응답에 값을 쓴다.

package com.bin.soo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/binsoo") public class BinsooController(){ @GetMapping("/info") @ResponseBody public String binsooInfo(){ return "Binsoo is Name Soobin"; } }

또한 이 클래스의 모든 메소드에 어노테이션을 적용하는 것과 같은 효과를 얻기위해

BinsooController Class 에 이 어노테이션을 적용할 수 도 있다.

package com.bin.soo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody; @Controller @ResponseBody @RequestMapping("/binsoo") public class BinsooController(){ @GetMapping("/info") public String binsooInfo(){ return "Binsoo is Name Soobin"; } }

이제 다시 아래 명령어로 다시 실행하면 정상적으로 실행하는 것을 확인 할 수 있다,

mvn spring-boot:run

@RestController 어노테이션

Restful API 를 만들기 위해 컨트롤러에 @RestController 어노테이션을 적용할 수도 있다.

@RestController 어노테이션은 @Controller 와 @ResponseBody 의 조합이다.

728x90

반응형

from http://soobindeveloper8.tistory.com/598 by ccl(A) rewrite - 2021-12-03 09:27:22