본문 바로가기
개발/스프링(Spring)

(Spring <-> Mybatis) Spring / Mybatis 설정 or 동작 원리 / 순서

by kakk789 2022. 6. 9.

Mybatis란

  • 자바 객체와 데이터베이스 테이블을 맵핑을 해줌
  • VO를 이용한 getter/setter 작업을 덜어 줌.
  • DAO를 사용하기 대신에 xml 을 이용할 것임 (BookMapper.xml)
  • xml이 매핑 파일에 의해 관리될 것임 (sqlMapConfig.xml)

Spring / Mybatis 설정 or 동작 원리 / 순서

1. web.xml

  • 기존과 동일하게 DispactcherServlet / HandlerMapping 을 동일하게 선언
  <servlet>
  	<servlet-name>gaebal</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>gaebal</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

2. xxx-servlet.xml

  • web.xml에서 설정한 servlet-name을 접두어로 하는 xml 생성
  • servlet-name이 xxx라면 xxx-servlet.xml
  • viewResolver 선언
  • 각종 Bean 선언

3. DB.properties (일반 파일로 만들 것)

  • DB 연동을 위한 변수 선언 (Driver, URL, USER, PASSWORD 선언)
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@ip주소:포트주소:해당DB서비스
username=ID입력
password=비밀번호

4. DB연동Config.xml

  • DB.properties 파일 선언
<properties resource="com/sist/db/db.props" />
  • VO 알리아스 선언 (필수 아님)
<typeAliases>
	<typeAlias type="com.sist.vo.BookVO" alias="bookVO"/>
</typeAliases>

  • DB.properties를 기반으로 DB Connection 할 xml
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  • mapper의 위치 선언
  <mappers>
    <mapper resource="com/sist/db/BookMapper.xml"/>
  </mappers>

5. Mapper.xml

  1. SQL 문이 담긴 Mapper 
    1.1 실행 결과의 값이 담겨 있을 속성은 resultType   --> select 시 필요
    1.2 실행에 필요한 매개변수가 담길 속성 parameterType --> insert/update/delete 시 필요
  2. namespace를 선언하는 게 좋음 (DB연동Config.xml 사용 될 것임)

아래 코드는  DBManager.java 에서

book.findAll(), book.inserBook(vo) 식으로 호출 될 것임

<mapper namespace="book">
  <select id="findAll" resultType="bookVO">
    select * from book order by bookid asc
  </select>
  
  <insert id="insertBook" parameterType="bookVO">
  	insert into book values(#{bookid}, #{bookname}, #{publisher}, #{price})
  </insert>
</mapper>

6. controller

  • @Controller 클래스 선언
@Controller
  • DAO 객체 생성 ( 실제 객체는 xxx-servlet.xml 에서 선언 ) - byName, byType, contstruct
private BookDAO dao;

	//예시는 setter에 의한 dao
	public void setDao(BookDAO dao) {
		this.dao = dao;
	}
  • dao의 함수 실행 후  result ModelAndView 리턴
	@RequestMapping(value="/xxx.do", method=RequestMethod.GET)
	public ModelAndView nonono() {
		ModelAndView mav = new ModelAndView();
		return mav;
	}

7. dao

  • @Repository 선언 필수
  • 실제 DAO의 역할은 8번에서 할 것임
@Repository
  • DBManaer에서 함수 실행 결과 return (해당 함수 return만 있고 DBmanaer에서 실제 함수 정의)
	public int insertBook(BookVO vo) {
		return DBManager.insertBook(vo);
	}

8. DBManager  ( 일전의 DAO 역할을 하는 녀석 )

- 4번의 DB연동Config.xml 과 연동 필요

  • DB연동Config.xml 위치를 InputStream타입으로 저장 (Resources.getResourceAsStream)
  • InputStream을 SqlSessionFactory 타입의 객체 생성후 Build(InputStream)
	String dbContentPath = "com/sist/db/sqlMapConfig.xml";
	InputStream inputStream = Resources.getResourceAsStream(dbContentPath);
	sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

- session open 후 SQL 명령어 실행

  • session오픈 (sqlSessionFactory.openSession())
  • 해당 session을 이용하여 DB쿼리문 실행 (mapper에 담겨있는 DB 쿼리문을 실행할 것임)
  • 만약 insert/delete/update 라면 commit 까지 해줘야함
  • 아래 예시의 insert는 실제 insert 함수임 (session의 기본 함수임)
  • book.insertBook은 mapper.xml에 정의 한 sql 을 호출 하는 것임
	static public int insertBook(BookVO vo) {
		int re=1;
		SqlSession session = sqlSessionFactory.openSession();
		re = session.insert("book.insertBook", vo);
		session.commit();
		session.close();
		return re;
	}

 

반응형

댓글