강의

Spring Lec03

IT새내기IM 2023. 4. 28. 09:05

bean,VO은 모델파일

 

@modelAttribute("str")String str 을 쓰면 index.jsp에 넘겨줌

@RequestMapping("doF")
	 public String dofGet(String str,Model model) {
		 logger.info("doF======"+str);
		 
		 model.addAttribute("str",str);
		 return "index";
		 //위에서 doF로 redirect하면서 밑의 doF를 만나면서 아래에서 doF.jsp로 보냄.
	 }
     
     @RequestMapping("doB")
	 public String doBget(@ModelAttribute("msg") String a, Model model) {
		 
		 //ModelAttribute로 변수에 파라미터값(String a)을 index.jsp로전달  즉 풀어쓰면 String a = request.getParameter("msg") 와 비슷
		 logger.info("msg="+a);
		 
		 //String msg = request.getParameter("msg"); 이것과동일
		 
		 model.addAttribute("mmm",a); //내부적으로 모델클래스 만들어진거를 땡겨와서 쓰는것
		 model.addAttribute("id","1111");
		 return "index";
	 }

◆ 스프링 + MyBatis ( 설명 )

1. MyBatis는 JDBC에서 개발자가 직접 처리하는 PreparedStatement의 '?'에 대한 설정이나 ResultSet을 이용한 처리가 이루어지기 때문에 기존 방식에 비해 개발 생산성이 좋아진다.

 

2. MyBatis의 이전 버전인 iBatis는 개발자가 모든 SQL을 XML로 작성하고, SQL 문을 사용하는 DAO클래스를 설계해서 SQL문을 호출하는 방식의 코드를 작성.

 

3. 더 발전된 형태인 MyBatis는 에노테이션을 지원하고, 인터페이스와 에노테이션을 통해서 SQL문을 설정하고 처리할 수 있는 형태로 발전.

 

MyBatis를 이용할 때 SQL문을 사용하는 방식
 1. XML만을 이용해서 SQL문을 설정, DAO에서는 XML을 찾아서 실행하는 코드를 작성하는 방식
 장점 : SQL문은 별도의 XML로 작성되기 때문에 SQL문의 수정이나 유지보수에 적합
 단점 : 개발 시 코드의 양이 많아지고, 복잡성이 증가
 2. 에노테이션과 인테페이스만을 이용해서 SQL문을 설정
 장점 : 별도의 DAO없이도 개발이 가능하기 때문에 생산성이 크게 증가
 단점 : SQL문을 에노테이션으로 작성하므로, 매번 수정이 일어나는 경우 다시 컴파일
 3. 인터페이스와 XML로 작성된 SQL문의 활용
 장점 : 간단한 SQL문은 에노테이션으로, 복잡한 SQL문은 XML로 처리 하므로, 상황에 따라 유연하게 처리
 단점 : 개발자에 따라 개발 방식의 차이가 있을 수 있기 때문에, 유지보수가 중요한 프로젝트의 경우 부적합

 

국내의 대부분 프로젝트는 XML만을 이용해서 SQL문을 작성하고, 별도의 DAO를 만드는 방식을 선호한다.

이 방식의 최대 장점은 SQL문을 온전히 분리해서 처리하기 때문에, 향후에 SQL문의 변경이 일어날 때, 대처가 수월하다는 점이다.

 

 

 MyBatis를 XML을 사용해서 작성하는 경우 코딩의 순서
 1. 테이블 생성 및 개발 준비
 2. 테이블 생성 및 기타 데이터베이스 관련 설정
 3. 도메인 객체의 설계 및 클래스 작성
 4. DAO 인터페이스 작성
 5. 실행해야 하는 기능을 인터페이스로 정의
 6. XML Mapper의 생성과 SQL문 작성
 7. XML 작성 및 SQL 작성
 8. MyBatis에서 작성된 XML Mapper를 인식하도록 설정
 9. DAO 구현
 10. DAO 인터페이스를 구현한 클래스 작성
 11. 스프링상에 DAO 등록 및 테스트

memberMapper.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="org.zerock.mapper.MemberMapper">

 

<select id="getTime" resultType="string">

select now()

</select>

 

<insert id="insertMember">

insert into tbl_member (userid, userpw, username, email) values 

(#{userid},#{userpw},#{username},#{email})

</insert>

 

</mapper>

== 설명 ==

1. DAO 클래스가 작성 되었다면 이를 사용하는 SQL 문을 작성해야 한다.

2. MyBatis에서는 SQL 문을 저장하는 존재를 Mapper라는 용어로 표현한다.

3. Mapper는 XML과 인터페이스를 이용할 수 있는데, XML을 사용하는 경우는 위와 같이 진행한다.

 

※ MyBatis의 경우 작성된 XML Mapper는 상단의 파일에서 사용하는 태그들에 대한 정보가 기록된 DTD를 추가해야 한다.

 


▣ root-context.xml ( 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:context="http://www.springframework.org/schema/context"

xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"

xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.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-4.3.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.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="com.mysql.jdbc.Driver"></property>

<property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"></property>

<property name="username" value="root"></property>

<property name="password" value="1111"></property>

</bean>

 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"></property>

<property name="configLocation" value="classpath:/mybatis-config.xml"></property>

<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>

</bean>

 

</beans>

 


▣ root-context.xml ( SqlSessionTemplate 설정 )

<?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:context="http://www.springframework.org/schema/context"

xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"

xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.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-4.3.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.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="com.mysql.jdbc.Driver"></property>

<property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"></property>

<property name="username" value="root"></property>

<property name="password" value="1111"></property>

</bean>

 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"></property>

<property name="configLocation" value="classpath:/mybatis-config.xml"></property>

<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>

</bean>

 

<!-- sql 실제 구문 연동 -->

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">

<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>

</bean>

 

</beans>

== 설명 ==
DAO 인터페이스와 Mapper의 작성이 완료됐다면 실제 이를 구현하는 구현 클래스를 작성해야 한다.
DAO의 작업에서 가장 번거로운 작업은 데이터베이스와 연결을 맺고, 작업이 완료된 후에 연결을 close()하는 작업이다.
 
mybatis-spring 라이브러리에는 이것을 처리할 수 있는 SqlSessionTemplate 이라는 클래스를 제공하므로, 이를 이용하면 개발자들이 직접 연결을 맺고, 종료하는 작업을 줄일 수 있다.
 
mybatis-spring에서 제공하는 SqlSessionTemplate은 MyBatis의 sqlSession 인터페이스를 구현한 클래스로 기본적인 트랜잭션의 관리나 쓰레드 처리의 안정성 등을 보장해 주고, 데이터베이스의 연결과 종료를 책임집니다. 
 
해서 SqlSessionTemplate은 SqlSessionFactory를 생성자로 주입해서 설정합니다.

MemberDAOImpl  ,  (상속받는놈은 @Repository 꼭 작성)

package org.zerock.persistence;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.zerock.domain.MemberVO;

// DAO 를 스프링에 인식시켜 주기 위해서 사용된다. 

@Repository 

public class MemberDAOImpl implements MemberDAO {

	@Inject
	private SqlSession sqlSession;
	private static final String namespace = "org.zerock.mapper.MemberMapper";

	@Override

	public String getTime() {
		return sqlSession.selectOne(namespace+".getTime");
	}

	@Override
	public void insertMember(MemberVO vo) {
		sqlSession.insert(namespace+".insertMember",vo);
	}

}

▣ root-context.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"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"

xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.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-4.3.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.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="com.mysql.jdbc.Driver"></property>

<property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"></property>

<property name="username" value="root"></property>

<property name="password" value="1111"></property>

</bean>

 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"></property>

<property name="configLocation" value="classpath:/mybatis-config.xml"></property>

<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>

</bean>

 

<!-- sql 실제 구문 연동 -->

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">

<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>

</bean>

 

<context:component-scan base-package="org.zerock.persistence"></context:component-scan>

</beans>

 
== 설명 ==
MemberDAOImpl.java에서 @Repository 에노테이션이 설정되더라도 스프링에서 해당 패키지를 스캔하지 않으면 제대로 스프링의 빈으로 등록되지 못한다.
위와 같이 설정을 추가해 준다.

▲ MemberDAOTest.java

package org.zerock.web;

 

import javax.inject.Inject;

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import org.zerock.domain.MemberVO;

import org.zerock.persistence.MemberDAO;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})

public class MemberDAOTest {

 

@Inject

private MemberDAO dao;

 

@Test

public void testTime() throws Exception{

System.out.println(dao.getTime());

}

 

@Test

public void testInsertMember() throws Exception{

MemberVO vo = new MemberVO();

 

vo.setUserid("3333");

vo.setUserpw("3333");

vo.setUsername("park");

vo.setEmail("dancepkt@nate.com");

 

dao.insertMember(vo); //회원가입 - 데이타베이스 확인

}

}