spring : spring mybatis 사용방법

2018. 1. 15. 19:12BACK/spring

* mybatis를 사용하는 이유? + ibatis 와의 차이점

- 는 JDBC에서 개발자가 직접 처리하는 PreparedStatement의 '?' 물음표 처리를 지원하고

ResultSet을 이용한 처리가 이루어지기 때문에 기존 방식에 비해 생산성이 증대 됩니다.

- mybatis의 이전 버전인 ibatis에서는 sql을 xml에 작성하고 DAO 클래스로 해당 sql 문을 호출하는 방식이었습니다.

- mybatis는 어노테이션을 지원하여 인터페이스와 어노테이션이 달린 자바 클래스에서 sql을 작성하고 처리할 수 있는 형태로 발전했습니다.


* 실질적인 사용 방법은?

- ibatis 때 처럼 xml 에 sql 문을 정의하여 호출하는 방법과 어노테이션을 설정하여 자바 클래스로 하는 방법이 있으나,

  여러 예제들이나 관련 문서, 듣는 이야기 등을 종합한 결과 개발자에 따라 다르긴 하지만 대체로 xml로 sql문을 작성하여

  별도의 DAO를 만들어 분리해 관리하는 것이 다수입니다. 향후 sql문의 변경이 일어날 때, 대처가 수월하다는데 개인차가 있을 수 있겠습니다.



1. 가장 먼저 할 작업은 테이블을 만들어야 합니다.

예제 작업을 위해 Member 테이블 생성

CREATE TABLE `member` (
	`member_no` INT(11) NOT NULL AUTO_INCREMENT,
	`userid` VARCHAR(255) NOT NULL,
	`userpw` VARCHAR(255) NOT NULL,
	`username` VARCHAR(255) NOT NULL,
	`email` VARCHAR(255) NOT NULL,
	`regdate` DATETIME NOT NULL,
	`update` DATETIME NOT NULL,
	PRIMARY KEY (`member_no`),
	UNIQUE INDEX `userid` (`userid`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


2. MemberDTO.java 작성

public class MemberDTO {
	private String userid;
	private String userpw;
	private String username;
	private String email;
	private Date regdate;
	private Date updatedate;

        + getter / setter / toString()
}


3. MemberDAO.interface 작성

- insert 동작을 할 메서드를 생성했습니다.

import com.juunx.dto.MemberDTO;

public interface MemberDAO {
	public void insertMember(MemberDTO dto);
}


4. XML Mapper 를 작성하기 전에 mapper를 인식하기 위해서 root-context.xml에 location 정보를 등록한다.

- root-context.xml 수정 : 기존의 sqlSessionFactory bean의 내용을 수정합니다~~


		
		
		
	



5. XML Mapper 작성

잘 보시면 경로는 기존의 resources에 /mappers 를 추가했습니다.

파일명을 정확히 쓰신후 finish!




	
		insert into member (userid, userpw, username, email)
		values(#{userid}, #{userpw}, #{username}, #{email})
		


6. SqlSessionTemplate 설정

- DAO에서 가장 번거로운 작업은 DB와의 연결을 맺고 완료 후 다시 close하는 작업입니다.

  물론 1분조차 안걸릴 수 있는 작업이지만 티끌 모아 태산입니다! 좋은 방법이 있다면 사용합시다!

  다행스럽게도 pom.xml에 추가했던 mybatis-spring 라이브러리 안에는 이것을 대신 처리해주는 SqlSessionTemplate 클래스를 제공합니다.

- root-context.xml 의 sqlSessionFactory를 ref로 삼는 sqlSession bean을 생성합니다!


	


7. MemberDAOImpl.java 작성


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 com.juunx.dao.MemberDAO;
import com.juunx.dto.MemberDTO;

@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 testInsertMember() throws Exception {
		MemberDTO dto = new MemberDTO();
		dto.setUserid("juunx");
		dto.setUserpw("1234");
		dto.setEmail("dogfoot-note.tistory.com");
		
		dao.insertMember(dto);
	}
}import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.juunx.dto.MemberDTO;

@Repository
public class MemberDAOImpl implements MemberDAO {	
	@Inject
	private SqlSession sqlSession;
	private static final String namespace = "com.juunx.mapper.MemberMapper";

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


8. MemberDAOImpl.java 의 @Repository 어노테이션을 인식하기 위한 작업

- root-context.xml 수정


- 수정하고 저장을 누르게 되면 MemberDAOImpl.java 왼쪽 아이콘에 'S'가 새겨집니다. 빈으로 등록되었다는 뜻이죠 !


9. 이제 jUnit을 통해 작성된 코드를 테스트 하겠습니다.

- test용 클래스를 만듭니다.


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 com.juunx.dao.MemberDAO;
import com.juunx.dto.MemberDTO;

@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 testInsertMember() throws Exception {
		MemberDTO dto = new MemberDTO();
		dto.setUserid("juunx");
		dto.setUserpw("1234");
		dto.setEmail("dogfoot-note.tistory.com");
		
		dao.insertMember(dto);
	}
}


실행 해보고 jUnit에 별다른 에러가 뜨지 않는다면 성공 !! 


직접 사용할 Controller에서 DTO에 담아 DAO를 @Inject 받고 똑같이 사용하면 END