본문 바로가기

개발중/Spring

[ 스프링 ] DispatcherServlet ?

728x90
반응형

DispatcherServlet

 

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

 

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

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

 

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

 

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

 

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

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

 


 

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

 

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>​

 

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

 

그리고 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 이 스프링 부트 애플리케이션을 실행 할 수 없기 때문이다.

 

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

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

 

<bilid>
	<fileName>binsoo</fileName>
	<plugins>
    	<plugin>
        	<groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

 


 

이제 다음 명령어로 애플리케이션이 시작되면 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
반응형