Spring 개발환경 설정하기(4) - Spring + MyBatis 설계(Mapper, DAO)

2017년 3월 7일


Spring 개발환경 설정하기(1) - 프로젝트 생성하기~톰캣 설정
Spring 개발환경 설정하기(2) - 라이브러리 다운로드~DB연동
Spring 개발환경 설정하기(3) - Spring+MyBatis 연동하기

오늘은 Spring 개발환경 설정하기 포스팅을 마무리 지으려고 합니다.
XML을 이용하여 간단한 SQL문을 작성하고, DAO에서 이를 호출하는 방식을 사용합니다.

1. src/main/resources에 mappers 폴더를 생성하고, timeMapper.xml 파일을 만듭니다.



2. timeMapper.xml에 DTD를 추가하고 SQL문을 작성합니다.
테스트 목적으로 만드는 Mapper이기 때문에 간단하게 현재 날짜와 시간을 출력하는 SQL문을 사용합니다.
<?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">
cs

<mapper namespace="com.lsy0318.mapper.TimeMapper">
    <select id="getTime" resultType="java.lang.String">
        select sysdate()
    </select>
</mapper>
cs

XML Mapper에서 namespace는 mapper들을 구분하는 식별자로 매우 중요합니다.
클래스에서는 패키지와 같은 역할로 MyBatis 내에서 원하는 SQL문을 찾아서 실행할 때 동작합니다.

위의 코드는 com.lsy0318.mapper.TimeMapper 네임스페이스에서 getTime 매핑 구문을 정의하고 있습니다.
이는 DAO에서 com.lsy0318.mapper.TimeMapper.getTime 형태로 실제 명시하게 됩니다.


3. root-context.xml의 sqlSessionFactory bean에 아래의 코드를 추가합니다.
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
cs

mappers 폴더 내부에 있는, 파일의 이름이 Mapper.xml로 끝나는 파일을 자동으로 인식하도록 설정해주는 코드입니다.


4. src/main/java 폴더에 persistence 패키지를 생성하고 TimeDAO 인터페이스를 만듭니다.
public interface TimeDAO {
    public String getTime();
}
cs


5. TimeDAO의 구현 클래스로 TimeDAOImpl 클래스를 만듭니다.
@Repository
public class TimeDAOImpl implements TimeDAO {
    @Inject
    private SqlSession sqlSession;
    private static final String NAMESPACE = "com.lsy0318.mapper.TimeMapper.";
    @Override
    public String getTime() {
        return sqlSession.selectOne(NAMESPACE + "getTime");
    }
}
cs

@Repository는 특정 클래스를 DAO로 표시하여 해당 역할을 명확히 해주는 주석입니다.


6. persistence 패키지를 Spring에 bean으로 등록합니다.
root-context.xml에 아래의 코드를 추가하면 Spring에서 persistence 패키지를 스캔하게 됩니다 :)
<context:component-scan base-package="com.lsy0318.persistence" />
cs


7. src/test/java 폴더에 있는 패키지에 TimeDAOTester 클래스를 만듭니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml" })
public class TimeDAOTester {
    @Inject
    private TimeDAO dao;
    
    @Test
    public void testTime() throws Exception{
        System.out.println(dao.getTime());
    }
}
cs

JUnit Test를 실행하면 콘솔에 현재 날짜와 시간이 출력됩니다.


8. 기존의 컨트롤러를 이용하여 웹 화면에서 호출해봅니다.
@Controller
public class HomeController {
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    @Inject
    private TimeDAO dao;
    @GetMapping("/")
    public String home(Model model) {
        logger.info("Welcome home!");
        model.addAttribute("serverTime", dao.getTime());
        return "home";
    }
}
cs

서버를 켜고 http://localhost:8080/web에 접속하면 현재 날짜와 시간이 출력됩니다.



Share:

1 개의 댓글