Spring boot 없이 Maven 프로젝트에 톰캣, jsp, Spring 얹어 웹 개발하기


1. javaEE로 Maven 프로젝트 생성

(기본아키타입, package war로 변경)

2. 톰캣 web.xml 파일 복사해서 web-inf 경로에 위치

(pom.xml에 톰캣api DI)
(라이브러리 설치 편하게 하기 위해 미리 maven index 리빌드)

3. pom.xml에서 jdk 버전 설정
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

pom.xml에 이러한 에러가 뜰 경우 
1 line : Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer

 

<build>
  <plugins>
    <plugin>
      <artifactId>maven-war-plugin</artifactId>
      <version>3.2.2</version>
    </plugin>
  </plugins>

</build>

빌드에 maven.plugin.war을 넣어준다. (maven update)

4. 프로젝트 설정에서 루트 웹 경로에서 프로젝트명 제거 (/프로젝트 => /)

(이미 서버 실행환경을 구성했다면 서버를 지우고 다시 구성해준다)

5. 프로젝트 설정 리소스 인코딩 방식 utf-8로 변경. Window preference 설정에서 html,css,jsp 파일 인코딩 생성 방식도 모두 변경

6. 실험삼아 webapp에 index.jsp 만들어서 실행(하는 김에 톰캣 서버 실행환경 구축도 해줌)
-브라우저 맘에 안들면 window 탭에서 브라우저 변경

7. Spring web을 DI 해야하는데 Spring web MVC 찾아서 DI 하면 web도 필요해서 알아서 필요한 라이브러리들 다 찾아서 설치해줌

8. 그외 jsp, jstl 등 없으면 필요한거 찾아서 설치해주고 Spring mvc 방식에 따라 주소 맵핑시켜주면 됨



Spring MVC

MVC model2 방식의 변화 : Dispatcher를 집중화 한 후의 모델

View(jsp), Dispatcher(dispatcher-servlet.xml), Controller로 나누기


(POJO : Plain Old Java Object)

-특정한 라이브러리나 프레임워크에 종속되지 않은 순수한 자바 객체 (getter,setter 등만 사용하는)

web.xml에서 모든 url을 dispatcher-servlet로 던져주고 dispatcher-servlet에서 url들을 맵핑시킨다.

(Controller와 View(jsp(url))을 dispatcher-servlet으로 객체화, 부품화 시켜 모듈화 할 수 있게 해주겠다는 것)


먼저 WEB-INF에 dispatcher-servlet.xml 이라는 파일을 만들어준다

https://docs.spring.io/spring-framework/docs/
dispatcher-servlet.xml 작성 레퍼런스 참조 사이트


사용하는 Spring framework 버전을 찾아 ref document 웹페이지를 찾아 들어간다
(버전마다 다르므로 자신이 pom에 더함충한 Spring version을 알아보자)


DI를 하는 부분이므로 Core > Ioc container 관련된 탭을 뒤져서 Configuration Metadata를 뒤적거리면 example을 찾아 볼 수 있다

 

ex)
https://docs.spring.io/spring-framework/docs/5.2.x/spring-framework-reference/core.html#beans-factory-metadata

The following example shows the basic structure of XML-based configuration metadata:
XML을 베이스로 하는 설정 메타데이터 기본 구조 예제를 보여주고 있다

 

기본 구조 예제)
[ dispatcher-servlet.xml ]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

복 to the 붙 필요없는 <bean id="..." class="..."> 이딴건 지우고 XML로 DI 하는 방식으로 쓰면된다

[ example ]
    <bean name="/index" class="com.newlecture.web.controller.IndexController" />
    <bean name="/notice/list" class="com.newlecture.web.controller.notice.ListController">
       <property name="noticeService" ref="noticeService" />
    </bean>
    <bean name="/notice/detail" class="com.newlecture.web.controller.notice.DetailController" />

다른 점은 bean의 name이 객체의 사용하려는 변수가 아닌 바로 url이 됨
class 속성이 class 경로인건 똑같다

아직 톰캣의 web.xml이 url을 받아 처리하고 있으니 spring에서 지원하는 dispatcher로
url을 맵핑 시켜줘야 한다

[ web.xml ]
 <servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>


org.springframework.web.servlet.DispatcherServlet.class
-spring MVC 지원 라이브러리

 

<servlet-name>은 원하는대로 작성해도 된다



원하는 컨트롤러 클레스에 Controller 인터페이스를 implements 한 뒤 ModelAndView 타입의 handleRequest 메소드로 view와 url을 맵핑 시켜줄 때, 일일히 생성자 안에다 /WEB-INF/view/페이지이름.jsp 해주는 건 귀찮으므로 ViewResolver 기능을 사용해주자

(handleRequest는 서블렛에 디스패처 포워드가 합쳐져있다)
(ModelAndView 인스턴스를 만들어 setViewName 메소드로 view 경로를 설정해줘도 되고, 생성자가 오버로드 되어 있으므로 인스턴스 생성시에 생성자 안에 view 경로를 적어줘도 맵핑시켜준다)

인스턴스.addObject(변수, 보낼거)를 하면 쉽게 view로 데이터를 전달할 수 있다 )


- ViewResolver -
[ dispatcher-servlet.xml ]
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/view/"/>
  <property name="suffix" value=".jsp"/>
</bean>


설정이 끝나면 view 파일들을 WEB-INF/view 폴더에 넣어 은닉화 시켜주자
사용자가 view 파일을 직접 요청하여 볼 수 있게 하는 것은 절차상으로 일어나서는 안된다
view는 오로지 controller에 의해서만 랜더링 되고 보여져야 한다

 

번외)

/WEB-INF/view/index.jsp   절대주소

WEB-INF/view/index.jsp   상대주소

dispatcher로 맵핑 되어 있을 때 상대 주소를 쓰면 맵핑된 주소에서 인자로 받은 주소를 추가해서 스캔한다

예를들어 dispatcher에서 /aa/index로 맵핑시켜놨다면 /aa/WEB-INF/view/ 에서 index.jsp를 찾는다

절대 경로로 view 파일을 찾고 싶다면 앞에 / 를 붙여줘야한다

'Development > Java' 카테고리의 다른 글

Tiles #5  (0) 2022.08.28
Spring MVC에서 정적 파일 서비스하기 #4  (0) 2022.08.26
DI, AOP #2  (0) 2022.08.25
Maven 사용법  (0) 2022.08.24
Spring Framework, DI, IoC container #1  (0) 2022.08.23

+ Recent posts