본문 바로가기

JAVA/Spring Boot

스프링과 스프링 부트 비교

반응형

스프링과 스프링 부트 비교


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