2023.11.01
Day53 세 줄 요약
Spring Legacy Project : Spring Boot를 사용하지 않는 Spring 프레임워크 기반 프로젝트
프로젝트의 최상위 패키지 경로는 관습적으로 'com.소속.어플리케이션이름' 과 같은 naming rule에 따라 설정
Spring 프레임워크를 사용하기 위한 초기설정이 다소 복잡
Spring Legacy Project
Spring Legacy Project
Spring Boot를 사용하지 않는 스프링 프레임워크 기반의 프로젝트
현재는 Spring에서 STS3의 지원을 공식적으로 중단했기 때문에 추천되지 않는(매우 오래된) 프로젝트 타입
" 낡은(오래된) 기술이지만 현대까지도 남아 쓰이거나,
더 이상 쓰이지 않더라도 현대의 기술에 영향을 주는 경우
'레거시 (legacy)' 라는 표현을 사용 "
MVC 프로젝트 초기 설정
* 아래 설정은 jdk11 기준이나 java version 외엔 동일
1) spring legacy project 생성
- File → New → spring legacy project(MVC) → package-path : com.회사명.프로젝트명
- ex) com.icia.board
2) Preferences 설정
- Window → Preferences → Web
- CSS Files, HTML Files, JSP Files 모두 Encoding 방식을 아래와 같이 변경
3) Project Properties 설정
- 프로젝트 우클릭 → Properties
- Java Build Path → Libraries → JRE System Library : Workspace default JRE (jdk-11) → Apply
- Java Compiler → Use compliance from execution ... : 11
- Project Facets → Dynamic Web Module : 4.0 → Java : 11 → 오른쪽 section에서 Runtimes : Apache Tomcat v9.0
* 여기까지 잘 진행했다면 실행 시 아래와 같은 화면 출력
- 프로젝트 우클릭 → Run As → Run on Server
4) pom.xml 설정
pom.xml 파일은 Maven의 빌드 정보를 담고있다.
- pom : Project Object Model
- Maven : 자바 프로젝트를 관리하는 툴
- xml 파일을 읽어 dependency 라이브러리를 자동으로 다운로드 하고, 프로젝트를 빌드하는 역할
- 각 dependency들은 http://mvnrepository.com 에서 검색해서 복붙해도 됨
* <version> 태그(10번째 줄) 아래부터 밑에 있는 내용 복붙
<!-- 여기부터 복사 -->
<properties>
<java-version>11</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- Oracle Repository -->
<repositories>
<repository>
<id>Oracle</id>
<name>Oracle JDBC Repository</name>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
<!-- Dependencies 중요!! -->
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<!-- artifactId : servlet-api에서 javax.servlet-api로 변경 -->
<!-- version : 2.5에서 4.0.1로 변경 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- Srping-JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- tomcat-dbcp -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>9.0.31</version>
</dependency>
<!-- mybatis : DB Framework -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mybatis : spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.5.0.0</version>
</dependency>
<!-- 프로젝트 저장경로 한글깨짐 방지 -->
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.9.1</version>
</dependency>
<!-- 파일 업로드 -->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
<!-- 롬복(lombok) -->
<!-- @Setter, @Getter, @ToString 과 같이 annotation으로 자동 생성 -->
<!-- 전부 가져올 때는 @Data -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.14.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- 비밀번호 암호화 -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.7.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.7.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
5) web.xml 설정
web.xml 파일은 '배포 설명자(Deployment Descriptor)'라고도 불리는 웹 어플리케이션의 설정파일이다.
아래 내용에 대한 설정 정보가 담김
- DispatcherServlet
- 클라이언트의 요청 처리
- ContextLoaderListener
- 웹 어플리케이션의 context 단위의 설정을 로드
- 모든 서블릿과 필터들이 공유하는 스프링 컨테이너 생성
- Filter
- 클라이언트의 요청이 DispatcherServlet을 가기 전에 거치는 필터
- 인증처리, 인코딩 등 선 수행 작업(필터링)을 거치게 됨
* 아래 내용 전체 복붙
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 한글깨짐 관련 : UTF-8 파라미터 설정 -->
<filter>
<filter-name>encodingFilterUTF8</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilterUTF8</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- bean 관련 설정 -->
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.liveBeansView.mbeanDomain</param-name>
<param-value>dev</param-value>
</context-param>
</web-app>
6) root-context.xml 설정
root-context.xml : 모든 서블릿이 공유할 수 있는 공통 Bean 관련 설정 파일
View와 밀접하지 않은 정보를 기술하는 xml 파일
- DB connect, SqlSessionTemplate 객체 등
* 아래 내용 전체 복붙 후 mapper 경로 설정
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- 데이터베이스 연결 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
<property name="username" value="ICIA" />
<property name="password" value="1111" />
</bean>
<!-- mapperLocation 확인 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
<!-- package 경로 설정 -->
<property name="mapperLocations" value="classpath:com/icia/bs/dao/mapper/*.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 비밀번호 암호화 : spring security -->
<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
7) servlet-context 설정
servlet-context.xml : 각각의 서블릿에 대한 Bean 설정 파일
클라이언트(브라우저)의 요청을 받기 위한 context 설정으로 요청과 관련된 객체를 정의
- 어노테이션(annotation-driven), URL 관련 설정 등
* 아래 내용 전체 복붙
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.icia.*" />
<context:component-scan base-package="com.icia.board.controller" />
</beans:beans>
8) HomeController.java 및 home.jsp 삭제
처음 실행 시 해당 Controller에 의해 home.jsp View로 이동
- 패키지 최상위 경로인 "/" 를 핸들러 매핑 value로 받고, home.jsp를 리턴하는 컨트롤러
- home.jsp와 짝꿍이므로 사용하지 않는다면 같이 삭제하는 게 좋다.
9) package 구성
src/main/java에서 아래와 같이 4개의 package, class, folder, xml 파일 구성
package = (p), folder = (f), class = (c), xml = (x)
* [중요!] 각 클래스에 해당 어노테이션 붙이기
- Controller : @Controller
- Service : @Service
- DAO : @Repository
- Controller
- com.icia.board.controller(p)
- com.icia.board.controller.BoardController(c)
@Controller
public class BoardController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
return "index";
}
}
- Service
- com.icia.board.service(p)
- com.icia.board.service.BoardService(c)
@Service
public class BoardService{
}
- DTO
- com.icia.board.dto(p)
- com.icia.board.dto.BoardDTO(c)
- DAO
- com.icia.board.dao(p)
- com.icia.board.dao.BoardDAO(c)
@Repository
public class BoardDAO{
}
- Mapper
- com.icia.board.dao.mapper(f)
- com.icia.board.dao.mapper.bMapper(x)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Board">
</mapper>
- Mybatis
- src.main.resource.mybatis-config(x)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.icia.board.dto.BoardDTO" alias="board"/>
</typeAliases>
</configuration>
10) index.jsp 파일 생성
src.main.webapp.WEB-INF.views 해당 경로에 아래와 같이 index.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>index.jsp</h1>
</body>
</html>
11) 실행
프로젝트 우클릭 → Run As → Run on Server 클릭
'index.jsp' 문장 출력 시 설정 완료!
* refs
https://tlatmsrud.tistory.com/35
https://coding-hyeok.tistory.com/47
'Spring-Java > Spring' 카테고리의 다른 글
@RequestParam (feat.@ResponseBody) (0) | 2023.12.15 |
---|---|
Day55_HTTP 요청/응답 사이클 (1) | 2023.12.14 |
Day51_MVC Architecture (2) | 2023.12.06 |
Day48_STS, Tomcat Server 설치 및 환경 설정 (0) | 2023.10.27 |
Day47_Apache Tomcat (0) | 2023.10.26 |