2018년 4월 4일 수요일

패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 10일차(DispatcherSerlvet, Tomcat, Maven)

  • maven dependency를 보고 의존관계를 이해하자



  • @Import
    • 외부에 있는 config 파일을 사용한다.
  • @ImportResource
    • 외부에 있는 설정파일을 사용한다.
  • jsp
    • 결과를 출력 JSTL & EL(WAS에 있다)
    • was에 올라갈때만 실행된다.
    • jstl 사용하려면 라이브러리를 지정해줘야 한다.
  •  POM.xml
    • <scope>provided</scope>
      컴파일 할때만 사용하고 배포할때는 사용하지 말라는 뜻
    • maven-compiler-plugin플러그인이 지정안되어 있다면 maven프로젝트는 JDK 1.5를 사용
    • org.apache.tomcat.maven : maven에서 tomcat을 실행한다.
 <build>
  <finalName>mvcexam</finalName>
  <plugins>
   <!-- 해당 플러그인이 지정안되어 있다면 maven프로젝트는 JDK 1.5를 사용 -->
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration>
     <source>1.8</source>
     <target>1.8</target>
    </configuration>
   </plugin>

   <!-- maven에서 tomcat을 실행한다. -->
   <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.1</version>
    <configuration>
     <charset>UTF-8</charset>
     <uriEncoding>UTF-8</uriEncoding>
     <port>8080</port>
    </configuration>
   </plugin>
  </plugins>
 </build>
  • DispatcherSerlvet 을 FrontController로 설정하기
    • 1.WAS는 배포시 처음에 web.xml을 찾는다.(서블릿)
      2. 3.0부터는 javax.servlet.ServletContainerInitializer을 web.xml 을 대신하여 사용할수 있다(서블릿) -> 구현한게 없으면 WebApplicationInitializer 를 찾는다.
      3. org.springframework.web.WebApplicationInitializer 인터페이스를 구현해서 사용한다 (스프링MVC)(스프링은 이미 ServletContainerInitializer 구현한 클래스를 가지고 있다. )
      -> classPath에서 WebApplicationInitializer를 구현한 것을 찾는다.
    • POM.xml에 설정 기반으로 classPath에 라이브러리를 넣어준다.(scope 설정에따라 classpath에 따라 라이브러리가 안들어갈수 있다.)
      -> 로컬에서는 IDE tool 이 maven을 통해 배포한다면 maven이 해준다.
    • 모든 설정은 스프링을 통해서 하라는 의도가 있다.(하지만 그렇게 안해도 된다.)
    • DispatcherSerlvet는 설정파일을 읽어서 메모리에 올려준다.
    • 내부적으로 InternalResourceViewResolver을 호출하는 부분이 있다.
    • 아래의 그림에서 보라색 부분이 개발자가 만드는 부분이다.

  • DispatcherSerlvet
    • web.xml 에 <url-pattern>/</url-pattern> 으로 설정이 되어있으면 context root 이하의 모든 요청을 처리하는것을 의미하며 Font Controller이라 부른다.
    • client에서 request하는 content-type 또는 path의 정보의 전략에 따라서 분석을 하여 실행한다.
    • DispatcherSerlvet이  @Controller이 붙어 있는 클래스에서 @GetMapping, @PostMapping, @RequestMapping 어노테이션을 읽어서 Handler Mapping이라는 객체를 만든다. 설정된 어노테이션에따라 객체가 생긴다. (같은 어노테이션끼리는 같은 path를 가지면 안된다.)
    • Handler Adapter 선택한 Handler Mapping객체를 실행하고 view name을 리턴한다. (스프링은 view를 꼭 jsp 만 쓰는것은 아니다.)
    • View Resolver는 여러개 생길수 있다. context-type에 담긴 형식에 따라서 맞는 view객체를 찾아서 응답해준다.
      ex) client에서 content-type 를 text/hml형식으로 요청했다면InternalResourceViewResolver( jsp를 처리하는 View Resolver )를 사용한다.
  • Web.xml (서블릿 스펙이다. 어떤 WAS든 설정은 같다.)
    • context root설정은 WAS마다 다르다.
    • <url-pattern>/</url-pattern> 은 context root 경로 이하인 경로 설정이다.
    • 스프링 웹 MVC 대한 대부분의 설정이 자동으로 되는 것이 많다.
    • @Configuration를 선언할때 사용
  • WebMvcConfigurerAdapter
    • https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html
    • Deprecated. as of 5.0 WebMvcConfigurer has default methods (made possible by a Java 8 baseline) and can be implemented directly without the need for this adapter
    • 스프링 5.0 부터는 WebMvcConfigurerAdapter를 사용하지 않는다. 
    • DispatcherSerlvet는 자동으로 WebMvcConfigurer를 읽는다. 그래서 WebMvcConfigurerAdapter 클래스를 구현하고 사용자는 Adapter를 상속받아서 오버라이딩해서 원하는 메소드만 구현한다.
    • 스프링 5.0부터는 JDK 1.8부터 가능하다. WebMvcConfigurer를 바로 구현해서 사용한다.(인터페이스에 default 메소드를 가질수 있어서)
  • SPRING MVC
    • MVC의 흐름을 외우자
  • Tomcat 과 웹어플리케이션
    • context root는 웹 어플리케이션마다 유일한 값을 가져야 한다. 
    • WAS마다 설정방법이 다르다. (Tomcat, Weblogic 등에 따라 다르다.) 
    • tomcat은 ROOT 라는 이름의 웹어플리케이션은 / 로 인식을 한다. 나머지는 보통 폴더이름이 context root가 된다.
    • http://localhost:8080/hello.jsp (ROOT 웹어플리케이션의 hello.jsp) http://localhost:8080/manager/hello.jsp (manager 웹 어플리케이션의 hello.jsp)

    • 예를들어 게시판 웹 어플리케이션(board)가 있다고 가정해보자
      board폴더 안의 내용을 jar로 묶어서 하나의 파일로 만든다. board.war 로 만든다. 
    • tomcat에 배포하려면 어떻게 해야할까?
      webapps폴더에 복사를 하고 tomcat을 실행한다. tomcat이 실행되면서 board.war의 압축을 해제한다. webapps ---- board ---- war파일의 내용이 묶인것이 풀린다.
      http://localhost:8080/board/list.jsp 이런식으로 호출을 할 수 있다.
    • 웹어플리케이션 구조를 가지고 있다면 war파일로 묶지 않아도 구동될수 있다. war파일은 전달하기 편하기 위해 사용.


  • intellij 에서 Tomcat
    • target폴더만들어서 배포 시킨후 실행한다.
    • maven프로젝트 인것을 intellij가 자동으로 인식한다.
    •  intellij에서 tomcat local로 실행하도록 설정하고 프로젝트 이름이 mvcexam 일 경우에 intellij가 관리하는 tomcat에 IntelliJ가 board.war파일을 만들어서 배포한다.(deploy)
  • Maven
    • 라이프 사이클의 하나의 단위 명령을 goal이라고 한다. (clean, compile , package등등)


    • maven-compiler-plugin이 지정안되어 있으면 Jdk 1.5를 사용한다.
    • mvn plugin 설정을 활용하면 GUI환경을 사용하지않고 JAVA와 MAVEN만 있으면 실행할 수 있다.
    • maven에서 tomcat plugin 을 추가하여 톰캣을 구동할 수 있다.
      콘솔에서 : mvn tomcat7:run (톰캣실행)
    • <finalName>mvcexam</finalName> 이름이 context path(application path, Context root)가 된다. http://localhost:8080/mvcexam 로 접속
<!-- maven에서 tomcat을 실행한다. -->
<build>
<finalName>mvcexam</finalName>
<plugins>
    <!-- 해당 플러그인이 지정안되어 있다면 maven프로젝트는 JDK 1.5를 사용 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>

    <!-- maven에서 tomcat을 실행한다. -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
            <charset>UTF-8</charset>
            <uriEncoding>UTF-8</uriEncoding>
            <port>8080</port>
        </configuration>
    </plugin>
</plugins>
</build>
    • <path>/</path> 설정을 추가하면 http://localhost:8080/ 로 접속
<plugin>
 <groupId>org.apache.tomcat.maven</groupId>
 <artifactId>tomcat7-maven-plugin</artifactId>
 <version>2.1</version>
 <configuration>
  <charset>UTF-8</charset>
  <uriEncoding>UTF-8</uriEncoding>
  <port>8080</port>
  <path>/</path>
 </configuration>
</plugin>
Share:

0 개의 댓글:

댓글 쓰기