국비학원/수업기록

국비 지원 개발자 과정_Day66

루팽 2023. 3. 3. 22:45

순제어

A클래스가 B, C를 인스턴스화(A클래스 내부에서 이루어짐)

 

java → 어노테이션

xml → beans(빈의 다른 말은 클래스)

 

라이프사이클 → init() - service() - destroy()

  →우리가 작성하는 service()에 들어감(스크립틀릿 <%%> 안의 코드는 모두 지역변수이다)

 

어노테이션 기반 코드설정 → 자바에 작성하고, 자바는 컴파일하기에 버전관리 불편

xml → 버전관리 상관없음. 서버에 등록해 놓으면 기억 계속 유지가능

  id는 인스턴스 변수

  class이름은 풀네임으로

  ref는 참조하는 레퍼런스 주소번지

  스프링부터는 어노테이션 기반 설정으로함

 

<스프링 log4설정 - log4j.xml>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d] [%p] (%13F:%L) %3x - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com.example.demo">
		<level value="info" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="debug" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

 

MultiActionController

deprecated, 어노테이션(@Controller)때문에 차후 쓰지 않음(어노테이션은 상속받지 않기 때문에!)

요청에 대한 컨트롤러의 메소드마다 요청, 응답객체 받을 수 있음(pojo에선 할 수 없음)

 

<스프링4 - BoardController.java>

package com.example.demo.controller;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.example.demo.logic.BoardLogic;

public class BoardController extends MultiActionController {
	private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
	private BoardLogic boardLogic = null;
	
	// setter 객체 주입법 - 자바코드에서 객체주입을 처리할때 사용함
	public void setBoardLogic(BoardLogic boardLogic) {
		this.boardLogic = boardLogic;
	}
	/*
	 	원래 톰캣주입 -> void doGet(req, res)
	 	pojo step1 -> ActionForward execute(req, res)
	 	pojo step2 -> String execute(req, res) 스프링에 가깝게
	 	pojo step3 -> String XXXX(req, res) 최대한 스프링같이
	 */

	public ModelAndView boardList (HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardList 호출");
		List<Map<String, Object>> bList = null;
		bList = boardLogic.boardList();
		ModelAndView mav = new ModelAndView();
		mav.setViewName("board/boardList");
		mav.addObject("bList", bList);
		return mav;
	}
}

 

<스프링4 - BoardLogic.java>

package com.example.demo.logic;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.example.demo.dao.BoardDao;

public class BoardLogic {
	private static final Logger logger = LoggerFactory.getLogger(BoardLogic.class);
	// @Autowired
	// 아래 코드는 자바코드(내부)에서 직접 인스턴스화하지 않는다 - 제어역전이 아니다
	private BoardDao boardDao = null;
	// 직접 인스턴스화하는 것 대신에 해야할 일이 있다 - 생성자객체주입법과 setter객체주입법이 있다
	// 생성자 객체주입은 xml에서 하고 setter객체주입은 자바에서함
	// 양이 줄어드는 건 아니지만 대신에 객체 라이프사이클 관리받는다 - 제어역전 IoC
	public void setBoardDao(BoardDao boardDao) {
		this.boardDao = boardDao;
	}

	public List<Map<String, Object>> boardList() {
		logger.info("boardList");
		List<Map<String, Object>> bList = new ArrayList<>();
		bList = boardDao.boardList();
		return bList;
	}
}

 

<스프링4 - BoardDao.java>

package com.example.demo.dao;

import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.example.demo.logic.BoardLogic;

public class BoardDao {
	private static final Logger logger = LoggerFactory.getLogger(BoardDao.class);
	private SqlSessionTemplate sqlSessionTemplate = null;
	public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
		this.sqlSessionTemplate = sqlSessionTemplate;
	}
	
	public List<Map<String, Object>> boardList() {
		logger.info("boardList 호출");
		List<Map<String, Object>> bList = null;
		bList = sqlSessionTemplate.selectList("boardList", null);
		logger.info(bList.toString());
		return bList;
	}
}

 

<스프링4 - boardList.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.util.List, java.util.Map"%>
<%
	List<Map<String, Object>> bList = (List) request.getAttribute("bList");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 구현</title>
</head>
<body>
	<h3>게시글 목록</h3>
	<table border="1" width="300px">
		<tr>
			<th>글번호</th>
			<th>글제목</th>
			<th>작성자</th>
		</tr>
		<%
			for(int i = 0; i < bList.size(); i++){
				Map<String, Object> rMap = bList.get(i);
		%>
		<tr>
			<th><%=rMap.get("BM_NO") %></th>
			<th><%=rMap.get("BM_TITLE") %></th>
			<th><%=rMap.get("BM_WRITER") %></th>
		</tr>	
		<%
			} // end of for
		%>
	</table>
</body>
</html>

 

<스프링4 - board.xml>

<?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="com.mybatis.mapper.BoardMapper">
	<!-- 게시글목록 가져오는 쿼리문 -->
	<select id="boardList" parameterType="java.util.HashMap"
		resultType="map">
		SELECT bm.bm_no,
		bm.bm_title,
		bm.bm_writer,
		bs.bs_file,
		bm.bm_hit,
		bm.bm_pos,
		bm.bm_step
		FROM board_master_t bm, board_sub_t bs
		WHERE bm.bm_no =
		bs.bm_no(+)
		<!-- 글번호로 검색 -->
		<if test= 'bm_no  > 0' >
		 		AND bm_no = #{bm_no}
		 </if>
	  <!-- 글제목으로 검색 -->
		<if test= 'cb_search!=null  and cb_search.equals("bm_title")' >
		 		AND bm_title LIKE '%'||#{keyword}||'%'
		 </if>
	  <!-- 글내용으로 검색 -->
		<if test= 'cb_search!=null  and cb_search.equals("bm_content")' >
		 		AND bm_content LIKE '%'||#{keyword}||'%'
		 </if>
	  <!-- 작성자로 검색 -->
		<if test= 'cb_search!=null  and cb_search.equals("bm_writer")' >
		 		AND bm_writer LIKE '%'||#{keyword}||'%'
		 </if>
		ORDER BY bm.bm_group DESC, bm.bm_step ASC
	</select>
  
	<!-- board Master에 인서트 -->
	<!-- pos와 step은 원글이면 0, 댓글이면 read.jsp에서 가진 값에 1을 더한 값으로 결정됨
			 조회수는 0(새글이니까), 날짜는 시스템 날짜정보로 등록 -->
	<insert id="boardMInsert" parameterType="map">
		INSERT INTO
		board_master_t(bm_no, bm_title, bm_writer, bm_reg, bm_hit,
		bm_group, bm_pos, bm_step)
		VALUES(seq_board_no.nextval, #{bm_title}, #{bm_writer},
		to_char(sysdate, 'YYYY-MM-DD'), 0, #{bm_group},
		#{bm_pos}, #{bm_step})
	</insert>
	
		<!-- board Sub에 인서트 -->
		<!-- 첨부파일을 추가하는 경우에만 실행됨, 없으면 해당없음
				 글번호는 새글쓰기에서 결정된 값이 대입되어야함, 새로채번하면 안됨! -->
	<insert id="boardSInsert" parameterType="map">
		INSERT INTO
		board_sub_t(bm_no, bs_seq, bs_file, bs_size)
		VALUES(#{bm_no}, 1, #{bs_file}, #{bs_size})
	</insert>
	
		<!-- board Master에 Step 업데이트 -->
		<!-- 내가 쓰는 댓글 뒤에 댓글이 존재하는 경우만 실행됨
				 조건절에 들어오는 그룹번호와 step은 상세보기 화면에서 가져온 값이 대입됨 -->
	<update id="bmStepUpdate" parameterType="map">
		UPDATE board_master_t
		SET bm_step = bm_step + 1
		WHERE bm_group = #{bm_group}
		AND bm_step > #{bm_step}
	</update>
</mapper>

 

servlet-context.xml에 base-package를 com.example.demo로 설정했기에 무조건 그 패키지 밑에 작성해야 함!

SimpleUrlHandlerMapping → url패턴과 아이디(bean, 클래스 식별 아이디, 인스턴스변수)

 

<스프링4 - servlet-context.xml>

<?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 />

	<beans:bean id="url-mapping"
			class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
			<beans:property name="mappings">
				<beans:props>
					<beans:prop key="/board/boardList.sp">board-controller</beans:prop>
				</beans:props>
			</beans:property>
	</beans:bean>
  	<beans:bean id="board-controller" class="com.example.demo.controller.BoardController">
  		<beans:property name="boardLogic" ref="board-logic" />
		</beans:bean>

	<!-- 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.example.demo" />
	
	
	
</beans:beans>

 

<스프링4 - spring-service.xml>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	   xmlns:aop="http://www.springframework.org/schema/aop" 
	   xmlns:tx="http://www.springframework.org/schema/tx" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
>
	<bean id="message-source" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="messages_ko_KR"/>
	</bean>
	<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
	    <property name="defaultLocale" value="ko">
	</property></bean>
	<bean id="board-logic" class="com.example.demo.logic.BoardLogic">
		<property name="boardDao" ref="board-dao" />
	</bean>
</beans>

 

<스프링4 - spring-data.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 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
	<bean id="data-source-target" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>oracle.jdbc.driver.OracleDriver</value>
		</property>
		<property name="url">
			<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl11</value>
		</property>
		<property name="username">
			<value>scott</value>
		</property>
		<property name="password">
			<value>tiger</value>
		</property>
	</bean>
    <!-- Transaction manager for a single JDBC DataSource	 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="data-source-target"/>
	</bean>

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="WEB-INF/mybatis-config.xml"/>
 		<property name="dataSource" ref="data-source-target"/> 
	</bean>
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory"/>
	</bean>		
	<bean id="board-dao" class="com.example.demo.dao.BoardDao">
		<property name="sqlSessionTemplate" ref="sqlSessionTemplate" />
	</bean>
</beans>

 

<스프링4 - mybatis-config.xml>

<?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 alias="BMVO" type="com.example.demo.vo.BoardMasterVO"/>
	</typeAliases>
	<mappers>
		<mapper resource="com/mybatis/mapper/board.xml" />
	</mappers>
</configuration>

 

<스프링4 - web.xml>

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.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/spring-service.xml,
		/WEB-INF/spring/spring-data.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>*.sp</url-pattern>
	</servlet-mapping>
</web-app>

 

pom.xml에 mybatis-spring만 넣어주니 못 찾아서 mybatis 추가하고 톰캣 서버에 mybatis-spring 1.3.3 jar파일을 넣어줌

 

<스프링4 -pom.xml>

<?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>com.example</groupId>
	<artifactId>demo</artifactId>
	<name>dev_spring4</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>11</java-version>
		<org.springframework-version>4.3.30.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<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>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>4.3.30.RELEASE</version>
		</dependency>
				<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.4.5</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.3.3</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>servlet-api</artifactId>
			<version>2.5</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>
	
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</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.6</source>
                    <target>1.6</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>

 

pojo step3

1) ActionSupport ← 요청이 .sp3으로 끝나면 DispatcherServlet이 받음

  HttpServlet(표준서블릿)상속받음(pojo1은 FrontMVC1과 Action Servlet)

 

2) HandlerMapping

  메소드 이름(req, res) → 스프링 4.3.30 방식

 

3) BoardController

 servlet-context.xml에 등록

 bean태그 안에 우리가 사용할 클래스들을 선언해 둠(id필요, 인스턴스변수)

 

4) BoardLogic

  spring-service.xml에 등록

 

5) BoardDao

  spring-data.xml에 등록

 

~여기까진 자바~

~여기부턴 MyBatis~

 

6) SqlSessionFactoryBean / SqlSessionTemplate

  myBatis-config.xml → 오라클 드라이버 클래스, 서버 아이피주소, 포트번호, SID, 계정아이디, 계정비밀번호 들어있음

  오라클서버와 연결통로 확보

  스프링 컨테이너가 읽어야 함 → bean으로 등록

  SqlSessionFactoryBean이 있어야 SqlSessionTemplate을 메모리에 올림 → DML(insert, update, delete, selectList, selectMap, selectOne)

 

7) 오라클 DB

 

다시 6 → 5 → 4 가다가 3번 BoardController에서

 

8) ModelAndView

 

9) XXX.jsp

  응답페이지

 

<pojo step3 - HandlerMapping.java>

package com.pojo.step3;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

public class HandlerMapping {
	static Logger logger = Logger.getLogger(HandlerMapping.class);
	
	/***************************************
	 * @param upmu[](upmu[0]=업무명,폴더명 | upmu[1]=메소드명, 기능명, 페이지이름)
	 * @param request -> 1-1, 1-2와는 다르게 인터페이스를 implements하지 않는다
	 * @param response -> HttpServlet
	 * Q. 어디서 받아오는가?
	 * @return Object
	 ***************************************/
	
	public static Object getController(String[] upmu, HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info(upmu[0]+", "+upmu[1]);
		Controller3 controller = null;
		String path = null;
		ModelAndView mav = null;
		return null;
	}
}

 

<pojo step3 - Controller3.java>

package com.pojo.step3;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Controller3 {
	public Object boardList(HttpServletRequest req, HttpServletResponse res);
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res);
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res);
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res);
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res);
}

 

<pojo step3 - Board3Controller.java>

package com.pojo.step3;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

public class Board3Controller implements Controller3 {
	Logger logger = Logger.getLogger(Board3Controller.class);
	Board3Logic boardLogic = new Board3Logic();

	@Override
	public ModelAndView boardList(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardList 호출");
		List<Map<String, Object>> bList = null;
		bList = boardLogic.boardList(); 
		return null;
	}

	@Override
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardDetail 호출");
		return null;
	}

	@Override
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardInsert 호출");
		return null;
	}

	@Override
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardUpdate 호출");
		return null;
	}

	@Override
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res) {
		logger.info("boardDelete 호출");
		return null;
	}
}

 

<pojo step3 - ModelAndView.java>

package com.pojo.step3;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

/*
 * spring4에서 제공되던 ModelAndView 흉내내기
 * ModelAndView
 * 1) scope가 request이다
 * 2) 화면 이름을 정해준다
 */
public class ModelAndView {
	Logger logger = Logger.getLogger(ModelAndView.class);
	HttpServletRequest req = null;
	// 캡슐화 코드는 반드시 getter/setter가 필요하다 -> 스프링부트는 Lombok대체
	private String viewName = null;
	List<Map<String, Object>> reqList = new ArrayList<>();
	
	public ModelAndView() {
	}

	public ModelAndView(HttpServletRequest req) {
		this.req = req;
	}

	public void addObject(String name, String obj) {
		req.setAttribute(name, obj);
		Map<String, Object> pMap = new HashMap<>();
		pMap.put(name, obj);
		reqList.add(pMap);
	}
	
	public String getViewName() {
		return viewName;
	}

	public void setViewName(String viewName) {
		this.viewName = viewName;
	}
}

 

<pojo step3 - Board3Logic.java>

package com.pojo.step3;

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

public class Board3Logic {
	Logger logger = Logger.getLogger(Board3Logic.class);
	Board3Dao boardDao = new Board3Dao();
	
	public List<Map<String, Object>> boardList() {
		logger.info("boardList 호출");
		List<Map<String, Object>> bList = null;
		bList = boardDao.boardList();
		return bList;
	}
}

 

<pojo step3 - Board3Dao.java>

package com.pojo.step3;

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

public class Board3Dao {
	Logger logger = Logger.getLogger(Board3Dao.class);

	public List<Map<String, Object>> boardList() {
		logger.info("boardList 호출");
		return null;
	}
}

 

<pojo step3 - ActionSupport.java>

package com.pojo.step3;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.pojo.step2.Board2Controller;

public class ActionSupport extends HttpServlet {
	Logger logger = Logger.getLogger(ActionSupport.class);

	protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("doService 호출");
		String uri = req.getRequestURI();
		logger.info(uri); // /board/boardList.st2가 찍힘

		String context = req.getContextPath();
		logger.info(context); // "/" -> server.xml에 들어있음

		String command = uri.substring(context.length() + 1);
		System.out.println(command); // board/boardList.st2

		int end = command.lastIndexOf(".");
		System.out.println(end); // 15(board의 경우)

		command = command.substring(0, end);
		System.out.println(command); // board/boardList

		String upmu[] = null; // upmu[0]=업무명(폴더명), upmu[1]=요청기능이름(메소드명)
		upmu = command.split("/"); // /기준으로 문자열 잘라서 upmu 배열에 담기
		logger.info(upmu[0] + ", " + upmu[1]);
		// upmu req에 담기
		req.setAttribute("upmu", upmu);
		Object obj = ""; // null이 맞지만 String이 들어온다는 전제로 ""

		try {
			obj = HandlerMapping.getController(upmu, req, res);
		} catch (Exception e) {
			logger.info("Exception: " + e.toString());
		}

		// 페이지 이동처리 공통코드
		// obj 형식 예시 -> redirect:XXX.jsp or forward:XXX.jsp
		if (obj != null) {
			String pageMove[] = null;
			ModelAndView mav = null;

			// obj가 String인 경우
			if (obj instanceof String) {
				// obj에 :이 포함된 경우
				if (((String) obj).contains(":")) {
					logger.info(": 포함되어 있음");
					pageMove = obj.toString().split(":");
				}
				// obj에 :이 포함되지 않은 경우
				else {
					logger.info(": 포함되어 있지 않음");
					pageMove = obj.toString().split("/");
				}
				logger.info("페이지이동 => " + pageMove[0] + ", " + pageMove[1]);
			}
			// obj가 ModelAndView인 경우
			else if (obj instanceof ModelAndView) {
				mav = (ModelAndView) obj;
				pageMove = new String[2];
				pageMove[0] = "forward";
				pageMove[1] = mav.getViewName();
			}
			
			// pageMove가 null이 아닐 경우 각 방식으로 페이지 이동처리
			if (pageMove != null) {
				// pageMove[0] = redirect or forward
				// pageMove[1] = XXX.jsp
				String path = pageMove[1];
				// pageMove[0]이 redirect
				if ("redirect".equals(pageMove[0])) {
					res.sendRedirect(path);
				}
				// pageMove[0]이 forward
				else if ("forward".equals(pageMove[0])) {
					RequestDispatcher view = req.getRequestDispatcher("/" + path + ".jsp");
					view.forward(req, res);
				}
				// 그외 forward 처리
				else {
					path = pageMove[0] + "/" + pageMove[1];
					RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/view" + path + ".jsp");
					view.forward(req, res);
				}
			}
		} // end of 페이지 이동처리 공통코드
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("doGet호출");
		doService(req, res);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("doPost호출");
		doService(req, res);
	}
}

 

<pojo step3 - web.xml>

	<servlet>
		<servlet-name>FrontController3</servlet-name>
		<servlet-class>com.pojo.step3.ActionSupport</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>FrontController3</servlet-name>
		<url-pattern>*.st3</url-pattern>
	</servlet-mapping>