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 의 조합이다.
'개발중 > Spring' 카테고리의 다른 글
@Transactional 어노테이션 적용 시 롤백이 안되는 경우 (2) | 2022.01.13 |
---|---|
스프링 부트 port 가져오기 (0) | 2021.12.14 |
[ 스프링 ] Java EE Servlet ? (0) | 2021.12.02 |
[ 스프링 ] 의존성 주입 방법 ? (0) | 2021.12.02 |
스프링 대용량 엑셀 (excel) 업로드 (0) | 2021.11.08 |