MyBatis

세모네모동굴배이·2021년 5월 6일
0
post-custom-banner

스프링 + 마이바티스

스프링 프레임워크에서는 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

  1. index.jsp : wellcom 파일을 불러온다.

서버에 컨피그레이션 읽고
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

  1. index.jsp 에서
    emp 조회 테스트
    : 링크를 클릭하면

/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>
  1. 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();

  2. 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() {}

  3. 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");
    }

  4. /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

  5. /springStudy2/Java Resource/src/mybatisconfig/mybatis-config.xml
    : 타입앨리어스 설정파일
    : 깡통클래스(VO) 선언하는 xml
    : 이케 선언하면 mapper.xml 에서 깡통클래스를 사용할 수 있다.

    단 : 공부할 때는 타입앨리어스 설정 파일을 사용한다.
    현업에서는 사용을 금지 한다.

...............
...............

  1. a.b.c.com.emp.controller.EmpController
    @RequestMapping(value="empSelectAll", method=RequestMethod.GET)
    public String empSelectAll(Model model) {
    logger.info("EmpController memSelectAll 함수 진입 >>> : ");
	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>
  1. DispatcherServlet
    "emp/empSelectAll" 페이지에 html 결과만 클라이언트에게 응답한다.
post-custom-banner

0개의 댓글