스프링과 스프링 부트 비교
J2EE 웹 애플리케이션
서블릿 2.4 명세와 메이븐 아키타입을 응용해서 J2EE 웹 애플리케이션을 작성
mvn archetype:generate -DgroupId=com.apress.j2ee -DartifactId=simple-web-app -DarchetypeArtifactId=maven-archetype-webapp
simple-web-app 폴더 구조가 생성
simple-web-app
---pom.xml
---src
---main
---resources
---webapp
---WEB-INF
---web.xml
---index.jsp
pom.xml
<groupId>com.apress.j2ee</groupId> <artifactId>simple-web-app</artifactId> <package>war</package> <version>1.0-SNAPSHOT</version> <name>simple-web-app Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> <dependency> </dependencies> <build> <finalName>simple-web-app</finalName> </build> |
서블릿 클래스를 작성할 때 꼭 필요한 servlet-api 의존체
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <scope>provided</scope> </dependency> |
이 프로젝트를 웹 아카이브, 즉 WAR 파일로 배포할거란 사실을 메이븐에 알리는 <package>태그
SimpleServlet 클래스
public class SimpleServelt extends HttpServlet {
protected void service(HttpServeltRequest request, HttpServeltResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>간단한 자바 웹 애플리케이션</h1>"); out.println("</body>"); out.println("</html>"); } } |
SimpleServlet 클래스의 service 메서드는 PrintWriter 클래스로 응답 메시지를 준비한다.
어떤 URL 패턴을 이 서블릿 클래스로 보낼지는 WEB-INF 폴더에 위치한 web.xml 파일에 적는다.
web.xml
<web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>SimpleServlet</servlet-name> <display-name>SimpleServlet</display-name> <description>간단한 서블리</description> <servlet-class>com.apress.j2ee.SimpleServlet</servlet-class> </servlet> <servlert-mapping> <servlet-name>SimpleServlet</servlet-name> <url-pattern>/SimpleServlet</url-pattern> </servlet-mapping> </web-app> |
<servlet> 태그에 서블릿명을 선언하고 <servlet-mapping> 태그에서 요청끝점(endpoint)에 해당하는 URL로 서블릿을 매핑한다.
mvn clean package
target/ 폴더에 simple-web-app.war 파일이 생성된다.
앱 실행 결과는 간단히 피포탈tc 서버나 톰캣 에서 확인 할수 있다.
WAR 파일을 톰캣/webapps/에 올려놓고 서버를 실행한다.
startup.sh 스크립트를 실행
http://localhost:8080/simple-web-app/SimpleServlet에 접속하면
간단한 자바 웹 애플리케이션
나온다
서블릿 탄생 이후 자바서버페이지 JSP가 고안됐고 그 이후로 J2EE는 더욱 진화했다.
서블릿3 명세부터는 web.xml 없이 @WebServlet 애노테이션을 붙이는 구성 지양성(configuration-less) 웹 애플리케이션을 개발 할수 있게 발전했다.
스프링 MVC 애플리케이션
스프링 프레임워크는 설정 및 사용이 간편한 MVC(모델 뷰 컨트롤러) 패턴을 도입하였다.
MVC 패턴은 이미 스프링이 탄생하기 훨씬 전인 1970년대에 고안되어 다른 프레임워크와 프로그래밍 언어에 모델링해서 적용한 바 있지만, 스프링 개발팀은 놀랍게도 이 패턴의 기능을 단순화하여 모든 웹 애플리케이션의 베이스 모델로 굳히는데 성공했다.
mvn archetype:generate -DgroupId=com.apress.spring -DartifactId=simple-web-spring -DarchetypeArtifactId=maven-archetype-webapp
서블릿 2.5명세를 사용하려면 web.xml 버전을 2.3 -> 2.5로 바꿔야 한다.
pom.xml
<modelVersion>4.0.0</modelVersion> <groupId>org.springframework.sample.service.service</groupId> <artifactId>simple-web-spring-app</artifactId> <version>0.0.1-SNAPSHOT</version> <package>war</package> <properties> <!-- 일반 프로퍼티 --> <java.version>1.8</java.version> <!-- 웹 --> <jsp.version>2.2</jsp.version> <jstl.version>1.2</jstl.version> <servlet.version>2.5</servlet.version> <!-- 스프링 --> <spring-framework.version>3.2.3.RELEASE</spring-framework.version> </properties> <dependencies> <!-- 스프링 MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- 기타 웹 의존체 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> <dependency> </dependencies> <build> <finalName>simple-web-spring-app</finalName> </build> |
스프링 MVC 3.2.3.RELEASE 버전과 태그라이브러리 등 관련 의존체가 포함되었다.
web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/<url-pattern> </servlet-mapping> </web-app> |
서블릿엔진 버전이 2.5로 변경
서블릿 클래스를 메인 디스패처로 추가해서 MVC패턴을 걸었다.
<init-param> 태그에서 contextConfigLocation 파리미터 값으로 지정한 WEB-INF/mvc-cofing.xml은 스프링이 찾는 XML 구성파일로
스프링 컨텍스트를 구성하는 파일이다.
mvc-config.xml
<bean name="/showMessage.html" class="com.apress.spring.SimpleController" /> <bean class="org.springframework.web.servlet.view.InternalRessourceViewResolver"> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> |
컨테이너에 초기화할 스프링 빈(POJO)을 정의하는 전형적인 스프링 구성 파일이다.
이름이 /showMessage.html인 빈을 com.apress.spring.SimpleController라는 자바클래스와 엮었다.
클라이언트가 /showMessage.html URL로 요청하면 이 클래스를 실행하는 의미이다.
InternalResourceViewResolver 클래스로 뷰 리졸버를 선언 한다.
모든 뷰 파일이 /WEB-INF/view에 있고 각 페이지엔 .jsp 확장를 붙인다.
이렇게 하면 악의적인 사용자가 루트 폴더에 접근하거나 다른 페이지를 빼낼 도리가 없으므로 보안 측면에 좋다.
SimpleController 클래스
public class SimpleController extends AbstractController {
@Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView model = new ModelAndView("showMessage"); model.addObject("message", "스프링 MVC 웹 애플리케이션"); return model; } } |
SimpleController는 요청(/showMessage.html)을 처리하는 로직이 모두 담긴 추상 클래스 AbstarctController를 확장한 클래스이다.
handleRequestInternal 메소드를 재정의해서 화면에 표시할 뷰 정보가 담긴 ModelAndView 인스턴스를 반환한것으로 클라이언트에 응답한다.
이 인스턴스는 message 변수에 "스프링 MVC 웹 애플리케이션"이라는 문자열을 담는다.
ModelAndView model = new ModelAndView("showMessage");
스프링 MVC는 실제로 렌더링할 뷰가 showMessage라고 인식한다.
이 뷰가 바로 /WEB-INF/view/showMessage.jsp파일이고 페이지를 보여주는 일은 InternalResourceViewResolver 클래스 몫이다.
showMessage.jsp
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <html> <head> <meta charset="uft-8"> <title>환영합니다<title> <head> <body> <h2>${message}</h2> </body> </html> |
<h2> 태그의 ${message}는 컨트롤러 코드에서 세팅한 값으로 채워진다.
model.addObject("message", "스프링 MVC 웹 애플리케이션");
스프링 MVC 웹 애플리케이션
이라는 문자열로 바뀐다.
mvn clean package
target/simple-web-spring-app.war 파일이 생성
서버에 배포후
http://localhost:8080/simple-web-spring-app/showMessage.html 접속하면
"스프링 MVC 웹 애플리케이션"이 보인다.
스프링 2.5, 3, 4 버전 부터는 다른 클래스를 상속하거나 한 클래스에 여러 가지를 매핑하지 않아도 애노테이션만 붙여 개발이 가능하다.
@Controller @RequestMapping("/showMessage.html") public class HelloWorldController {
@RequestMapping(method=RequestMethod.GET) public ModelAndView helloWorld() { ModelAndView model = new ModelAndView("showMessage"); model.addObejct("message", "애노테이션을 사용한 스프링 MVC 웹 애플리케이션"); } } |
애노테이션을 쓰면 XML 구성 파일을 간단하게 사용할수 있다.
mvc-config.xml
<context:component-scan base-package="comp.apress.spring" /> <bean class="org.springframework.web.servlet.view.InternalRessourceViewResolver"> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> |
<context:component-scan> 태그는 스프링으로 하여금 com.apress.spring 패키지 레벨(하위 패키지 레벨)에서 애노테이션으로 표시한 클래스를 찾게 한다.
스프링 부트 웹 애플리케이션
@RestController @SpringBootApplication public class WebApp {
@RequstMapping("/showMessage.html") public String greetings() { return "스프링 부트 MVC"; } public static void main(String[] args) { SpringApplication.run(WebApp.class, args); } } |
spring run Webapp.java
mkdir simple-web-spring-boot
cd simple-web-spring-boot
spring init -d=web -g=com.apress.spring -a=simple-web-spring-boot --package-name=com.apress.spring -name=simple-web-spring-boot -x
-d=web 웹관련 의존체(spring-boot-starter-web)를 포함
-g=com.apress.spring 그룹ID
-a=simple-web-spring-boot 아티팩트 ID
--package-name=com.apress.spring 패키지명
-name=simple-web-spring-boot 애플리케이션명
-x 현재 폴더에 템플릿 압축 파일을 푼다. 이옵션을 빼면 simple-web-spring-boot.zip 파일만 생김
스프링 부트 구조
mvnw
mvnw.cmd
pom.xml
src
---main
---java
---com
---apress
---spring
---SimpleWebSpringBootApplication.java
---resources
---application.properties
---static
---templates
---test
---java
---com
---apress
---spring
---SimpleWebSpringBootApplicationTests.java
@RestController @SpringBootApplication public class SimpleWebSpringBootApplicaton{
@RequestMapping("/showMessage.html") public String index() { return "스프링 부트 시작"; } public static void main(String[] args) { SpringApplicaton.run(SimpleWebSpringBootApplicaton.class, args); } } |
SimpleWebSpringBootApplication 클래스 @RestController 애노테이션을 붙여 웹 REST 컨트롤을 설정하고
/showMessage.html 요청하면 index 메소드가 처하게 @RequestMapping으로 매핑했다.
@SpringBootApplication은 SpringApplication.run 메소드로 앱을 실행하는 main 메소드와 클래스패스를 기반으로 자동구성한다.
앱이 실행하면 내장 톰캣 서버도 함께 실행되고 8080 포트를 리스닝한다.
./mvnw spring-boot:run
메이븐이 설치되어 있는 환경에서는
mvn spring-boot:run
실행해도 된다.
'JAVA > Spring Boot' 카테고리의 다른 글
Spring Data JPA (0) | 2018.04.02 |
---|---|
스프링 부트 데이터 액세스 (0) | 2018.02.12 |
스프링 부트 테스트 (0) | 2018.02.09 |
스프링부트에서 스프링 (0) | 2018.02.09 |
스프링 부트 작동원리 (0) | 2018.02.06 |