프로젝트 실행 객체 생성과 요청 실행 절차
Controller
컨트롤러는 2가지 형태가 있다.
- Front Controller servlet - 1개
- Controller ( pojo ) - 업무 단위로 만들 수 있음 : 게시판 / 상품/ 회원관리 !
Spring Container
개발자를 대신해 Bean을 생성하고 관리하고 제거하는 역할
📑 wep.xml
톰켓 서버에 접속하면 가장 먼저 web.xml 파일을 읽는다.
wep.xml은 < 스프링 컨테이너 >라는 메모리안에 객체를 준비시킨다.
-한글 인코딩 설정 UTF-8
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 데이터 베이스 연결 객체 root-context.xml 생성과 이벤트 핸들러 생성 ContextLoaderListener
* <listener>는 특정 이벤트가 발생되기를 기다렸다가 발생시 실행되는 메서드
<!-- 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>
- 프론트 컨트롤러 생성
DispatcherServlet (프론트 컨트롤러)를 만들고 프론트 컨트롤러로 servlet-context.xml를 읽는다.
<!-- 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 xml을 통해 맵핑할 경우 사용할 수 있다.
xml 또는 @어노테이션을 통해 uri 경로를 맵핑한다.
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
📑 servlet-context.xml
- VeiwResolver 생성
servlet-context.xml 을 실행할때 <bean> 으로 뷰 리저버(VeiwResolver)가 생성된다.
클라이언트에게 요청된 @RequestMapping( ) 메서드 실행 결과 ( View 파일 이름 : boardList )가 뷰 리저버에게 전달 된다.
뷰 리저버는 해당 리턴 값에 정확한 위치를 붙혀 프론트 컨트롤러에게 전달해준다. > /WEB/Views/boardList.jsp
프론트 컨트롤러는 해당 파일에 포워딩하여 전달하고, view에게 전달받은 화면을 클라이언트에게 다시 전달한다.
<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="kr.board.controller" />
scan 을 통해서 해당 위치의 @controller 라는 어노테이션을 찾아서 자동으로 객체(POJO) 생성을 하여 메모리에 올려준다.
POJO들이 메모리에 올라오게 되면, HandlerMapping & HandlerAdapter (스프링 내부에서 자동으로 만들어지는 객체)가 '요청이 왔을때 어떤 메서드가 동작이 되는지' 관리하고 클라이언트로부터 요청이 왔을때 @RequestMapping("/boardList.do") '해당 메서드를 찾아서 실행' 하게 된다.
📑 root-context.xml
root-context.xml에서는 DB연결을 위한 Connection Pool을 만들어준다.
커넥션 풀은 데이터 베이스 성능을 개선시키는 역할을 한다.
미리 데이터베이스와 연결된 커넥션을 많이 만들어 놓고, 클라이언트의 요청이 오면 connection을 빌려주고 처리가 끝나면 다시 반납 받아 pool에 저장해두어 대기 상태를 만들어준다.
- 데이터베이스 정보 저장
HikariCP , Connection pool Api 를 사용하여 HikariConfig에서 데이터 베이스 정보를 저장해둔다.
<!-- API Hikaricp -->
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- bean : 객체를 생성하는 태그 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<!-- jdbcUrl버전에 따라 jdbc:mysql://localhost:3306/com?serverTimezone=UTC -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/com?serverTimezone=UTC"/>
<property name="username" value="com"/>
<property name="password" value="com01"/>
</bean>
- Connection Pool 생성
HikariDataSource에서 hikariConfig를 참조하여 커넥션 풀을 만들어준다.
커넥션 사용 후 자동으로 반납을 할 수 있게 destroy-method="close" 되어있다.
<!-- HikariDataSource(Connection POOL을 만드는 역할을 한다) -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
- Mybatis Api로 경로에 있는 @mapper를 확인 및 실행
mpper들을 Scan 해서 일괄적으로 메모리에 올린다. 사용 시 SqlSessionFactoryBean 구현채를 사용해 SQL 문을 실행해준다.
<mybatis-spring:scan base-package="kr.board.mapper"/>
<!-- BoardMapper interface의 구현클래스 생성
SqlSessionFactoryBean(SQL을 실행하는 API) -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
📑 pom.xml
pom.xml은 Maven의 정보를 담고 있는 파일이다.
※ Maven : 자바 프로젝트 관리도구로 라이브러리를 자동으로 다운하거나 빌드해주는 역할을한다.
내용을 확인해보면 사용하고있는 스프링 버전 부터, 데이터베이스와 버전, 스프링 프레임워크들이 들어있다.
더 다양한 내용은 아래 링크를 통해 확인할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.board</groupId>
<artifactId>controller</artifactId>
<name>SpringMVC01</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>5.0.2.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!--
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://www.datanucleus.org/downloads/maven2/</url>
</repository>
</repositories>
-->
<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 변경 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- oracle driver -->
<!-- <dependency>
<groupId>oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency> -->
<!-- MySQL driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<!-- <version>5.1.42</version> -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 롬복 설치 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</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>1.8</source>
<target>1.8</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>
'BackEnd > Spring Boot' 카테고리의 다른 글
[ Spring ] MySQL - (2) Mybatis Api 사용 (0) | 2023.02.28 |
---|---|
[ Spring ] MySQL - (1) 이클립스 세팅 및 실행 (1) | 2023.02.28 |
[ Spring ] eGovframe 이클립스 설치 (0) | 2023.02.26 |
[ Spring / SpringBoot ] 스프링 웹 개발 기초 : 정적 컨텐츠 / MVC / API (0) | 2023.02.25 |
[ Spring / SpringBoot ] View 환경설정 (0) | 2023.02.24 |