스프링 + 마이바티스
스프링 프레임워크에서는 view 페이지를 웹서버에 위치하지 않는다.
스프링 프레임워크에서 view 페이지는
WEB-INF/views/*.jsp
이유는 : 데이터 핸드링을 자유스럽게 하려고 : 깡통 클래스의 property를 편하게 사용하려고
jsp -> servlet 으로 변환한다. jasper.jar : jsp 는 자바 클래스 파일
jsp 는 Server side Script 이지만 : 실제로는 자바 클래스이다.
jsp : ${프로퍼티명} <--> vo : 프로퍼티명
탐캣 :
WEB-INF 기준
WebContent ~ WEB-INF : 웹 서버 위치 : client side script : html, ccs, javascript .....
WEB-INF ~~ : 서블릿 컨테이너 : 자바 클래스
스프링 프레임워크 + 마이바티스 프레임워크
라이브러리 사용하기 위해서 프로젝트에 포팅을 한다.
/sppringStudy2/WEB-INF/lib/.jar
이클립스를 하기 위치에 있는 것을 사용한다.
이 행위는 이클립스에서 자동으로 해 주어야 하는데
만약에 자동으로 않되면
개발자 직접 수동으로 built path 를 잡아 주어야 한다.
좀 더 정확하게 이야기 하면
이클립스에서 다이나믹 웹 프로젝트 빌드 프레임워크를 사용할 때
/sppringStudy2/Java Resources/Libraries/.jar
서버에 컨피그레이션 읽고
tomcat/Servers/servlet.xml : port : 8088
URLEncoding="UTF-8" : GET 방식으로 요청하는 문자열 인코딩
현재 있는 컨텍스트에 모두 적용된다.
Context : path 정하기
tomcat/Servers/web.xml
30
MIME
tomcat/Servers/context.xml
해당하는 컨텍스트 컨피그레이션을 읽는다.
/springStudy2/WebContent/WEB-INF/web.xml
springMybatis3
index.jsp
commons-logging-1.1.2.jar
############################################################
정보: FrameworkServlet 'spring': initialization started
5월 06, 2021 10:08:51 오전 org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh
정보: Refreshing WebApplicationContext for namespace 'spring-servlet': startup date [Thu May 06 10:08:51 KST 2021]; root of context hierarchy
5월 06, 2021 10:08:51 오전 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
정보: Loading XML bean definitions from ServletContext resource [/WEB-INF/framework/spring-servlet.xml]
5월 06, 2021 10:08:52 오전 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
정보: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@599a8e41: defining beans [mvcContentNegotiationManager,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,departmentController,loginController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.web.servlet.view.UrlBasedViewResolver#0,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
5월 06, 2021 10:08:52 오전 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod
정보: Mapped "{[/department_insertForm],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String a.b.c.com.controller.DepartmentController.department_insertForm()
5월 06, 2021 10:08:52 오전 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod
정보: Mapped "{[/department_insert],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String a.b.c.com.controller.DepartmentController.department_insert(a.b.c.com.vo.DeptVO,org.springframework.ui.Model)
5월 06, 2021 10:08:52 오전 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod
정보: Mapped "{[/login],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String a.b.c.com.controller.LoginController.loginForm(org.springframework.ui.Model)
5월 06, 2021 10:08:52 오전 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod
정보: Mapped "{[/loginData],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String a.b.c.com.controller.LoginController.onSubmit111(a.b.c.com.vo.UserVO)
5월 06, 2021 10:08:52 오전 org.springframework.web.servlet.DispatcherServlet initServletBean
정보: FrameworkServlet 'spring': initialization completed in 1021 ms
5월 06, 2021 10:08:55 오전 org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory getObjectInstance
경고: Name = Oracle11g_orclHBE00 Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "100" for "maxActive" property, which is being ignored.
5월 06, 2021 10:08:55 오전 org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory getObjectInstance
경고: Name = Oracle11g_orclHBE00 Property maxWait is not used in DBCP2 , use maxWaitMillis instead. maxWaitMillis default value is -1. You have set value of "10000" for "maxWait" property, which is being ignored.
5월 06, 2021 10:08:55 오전 org.apache.jasper.servlet.TldScanner scanJars
log4j-1.2.17.jar
############################################################
정보: Initializing Spring FrameworkServlet 'spring'
[2021-05-06 10:08:55,546][INFO] (FrameworkServlet.java:457) - FrameworkServlet 'spring': initialization started
[2021-05-06 10:08:55,587][INFO] (AbstractApplicationContext.java:510) - Refreshing WebApplicationContext for namespace 'spring-servlet': startup date [Thu May 06 10:08:55 KST 2021]; root of context hierarchy
[2021-05-06 10:08:55,667][INFO] (XmlBeanDefinitionReader.java:315) - Loading XML bean definitions from ServletContext resource [/WEB-INF/spring-servlet.xml][2021-05-06 10:08:55,912] INFO - Loading XML bean definitions from ServletContext resource [/WEB-INF/servlet-context.xml][2021-05-06 10:08:56,124] INFO - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@38b42ab9: defining beans [mvcContentNegotiationManager,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,empController,empDAOImpl,empServiceImpl,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.web.servlet.view.UrlBasedViewResolver#0,dataSource,sqlSessionFactory,transactionManager,org.mybatis.spring.mapper.MapperScannerConfigurer#0,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,empDAO]; root of factory hierarchy
[2021-05-06 10:08:56,453][INFO] (AbstractHandlerMethodMapping.java:180) - Mapped "{[/empSelectAll],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String a.b.c.com.emp.controller.EmpController.empSelectAll(org.springframework.ui.Model)
[2021-05-06 10:08:56,684][INFO] (FrameworkServlet.java:476) - FrameworkServlet 'spring': initialization completed in 1133 ms
5월 06, 2021 10:08:56 오전 org.apache.coyote.AbstractProtocol start
/springStudy2/WebContent/WEB-INF/web.xml
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
<url-pattern>*.hbe</url-pattern>
<!-- 한글 인코딩 -->
/springStudy2 컨텍스에 들어오는 스트림 중 POST 방식인 스트림을 인코딩한다.
<param-value>/WEB-INF/classes/log4j.properties</param-value>
<!-- 데이터소스 -->
/springStudy2/WebContent/WEB-INF/spring-servlet.xml
1번 : <mvc:annotation-driven />
2번 : <context:component-scan base-package="a.b.c.com.**" />
<!-- @Component, @Controller, @Service, @Repository, @Autowired -->
3번 : <property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
<import resource="servlet-context.xml"/>
/springStudy2/WebContent/WEB-INF/servlet-context.xml
4번 : <property name="jndiName" value="java:comp/env/jdbc/Oracle11g_orclHBE00"></property>
java:comp/env : JNDI 환경변수 메타데이터
jdbc/Oracle11g_orclHBE00 : 데이타 소스 이름
tomcat/Servers/context.xml
<Resource name="jdbc/Oracle11g_orclHBE00"
5번 : <property name="configLocation" value="classpath:/mybatisconfig/mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:/mybatisquery/*.xml"></property>
classpath: : 환경변수 메타 데이터
/sppringStudy2/Java Resources/src/폴더명/*.xml
/springStudy2/WebContent/WEB-INF/classes/폴더명/*.xml
6번 : <bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
7번 : <property name="basePackage"><value>a.b.c.com.**.dao</value></property>
a.b.c.com.emp.controller.EmpController
// 컨트롤러에서 서비스 연결
private EmpService empService;
// 생성자에 @Autowired 어노테이션으로 DI (의존성 주입하기)
@Autowired(required=false)
public EmpController(EmpService empService) {
this.empService = empService;
}
@RequestMapping(value="empSelectAll", method=RequestMethod.GET)
List listAll = empService.empSelectAll();
a.b.c.com.emp.service.EmpService
public List empSelectAll();
a.b.c.com.emp.service.EmpServiceImpl
// 서비스에서 DAO 연결하기
private EmpDAO empDAO;
// 생성자에 @Autowired 어노테이션으로 DI (의존성 주입하기)
@Autowired(required=false)
public EmpServiceImpl(EmpDAO empDAO){
this.empDAO = empDAO;
}
public List empSelectAll() {}
a.b.c.com.emp.dao.EmpDAO
public List empSelectAll();
a.b.c.com.emp.dao.EmpDAOImpl
private SqlSession sqlSession; <--- iBatis : Spring Framework에 lib 가 있다.
public List empSelectAll() {
return sqlSession.selectList("empSelectAll");
}
/springStudy2/Java Resource/src/mybatisquery/emp.xml
"classpath:/mybatisquery/*.xml
: DAO 하고 mapper.xml 연결 고리
: id="empSelectAll" : DAO 하고 mapper.xml 에서 함수 연결 고리
SELECT
A.EMPNO EMPNO
,A.ENAME ENAME
,A.HIREDATE HIREDATE
FROM EMP A
/springStudy2/Java Resource/src/mybatisconfig/mybatis-config.xml
: 타입앨리어스 설정파일
: 깡통클래스(VO) 선언하는 xml
: 이케 선언하면 mapper.xml 에서 깡통클래스를 사용할 수 있다.
단 : 공부할 때는 타입앨리어스 설정 파일을 사용한다.
현업에서는 사용을 금지 한다.
...............
...............
List<EmpVO> listAll = empService.empSelectAll();
int nCnt = listAll.size();
logger.info("EmpController empSelectAll nCnt >>> : " + nCnt);
if (nCnt > 0) {
model.addAttribute("listAll", listAll);
return "emp/empSelectAll";
}
return "emp/empForm";
}
리턴 결과는
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>