#4_[spring boot] mybatis 연결하기(gradle)_MVC 구축 :: 개발/일상_Mr.lee

#4_[spring boot] mybatis 연결하기(gradle)_MVC 구축

Posted by Mr.mandu.
2017. 11. 10. 01:30 개발/spring boot, gradle, mybatis Project

이전 포스팅에서는 

Contoller를 통해 jsp 페이지로 이동하는 모듈을 작성했습니다.

이번에는 DB를 연결하여 데이터를 가져오는 작업을 하겠습니다.

이전에 ibatis를 사용해왔으니 이번에는 새롭게 mybatis를 사용해보도록 마음 먹었습니다.


일단 먼저 

build.gradle 를 수정하겠습니다.


mybatis repository

compile "org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1" 


그리고 DB연결할 repository도 연결하겠습니다.

현재 저는 oracle을 사용중입니다.

그런데 바로 repository에서 연결하려고 하니 라이브러리가 받아지지 않더군요....

삽질...몇시간 하다 결국 라이센스 문제라는 것을 알았습니다.

그래서 저는 ojdbc14.jar를 직접 받아 프로젝트에 첨부했습니다.



이렇게 프로젝트에 직접 추가를하고 


compile fileTree(dir: '/webapp/WEB-INF/lib', include: ['*.jar'])


라이브러리파일을 가져갈수 있도록 문장을 추가하였습니다.



다음은 application.Properties를 수정하겠습니다.


DB접속정보와 mybatis의 xml 파일 위치를 지정해주고 있습니다.


기존 스프링에서는 bean객체를 xml에 만들고 이를 가져오는 작업을 했어햐 했지만

스프링 부트에서는 손쉽게 된다는게 신기합니다.


#oracle set

spring.datasource.driver-class-name= oracle.jdbc.driver.OracleDriver

spring.datasource.url=jdbc:oracle:thin:

spring.datasource.username= 

spring.datasource.password=


mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml


접속정보는 각자 다르기때문에 지워두었습니다.

그리고 mybatis에 사용할 xml을 생성했습니다.



src/main/resources 밑에

mybatis 폴더를만들고 다시 mapper 폴더를 만들었습니다.





main.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="lee.main.dao.MainMapper"> 

	<select id="getUsr" resultType="lee.domain.UsrVO"> 
		SELECT
			usr_id,  usr_nm
		FROM
			ck_usr
		WHERE
			usr_id = '1'
	 </select> 
	

 </mapper>


상단에 mybatis를 사용한다는 점과

네임스페이스가 있습니다. 이를 꼭 맞춰주셔야 합니다.

<mapper namespace="lee.main.dao.MainMapper"> 이 의미는

lee.main.dao.MainMapper 와 연결하는 작업입니다.

쿼리문은 테스트용으로 만들었습니다.


그리고 이제 MVC를 구축할 java 파일들을 생성하겠습니다.



프로젝트 구조는 다음과 같습니다.

이전에 Index.java 파일은 만들어 두었습니다.

다소...다른 패키지들이 많은데 빨간색 네모 표시만 보시면 됩니다.


먼저

lee.main.dao 패키지의 MainMapper.java 입니다.

interface로 생성하였습니다.


MainMapper.java

package lee.main.dao;

import lee.domain.UsrVO;

public interface MainMapper {
	UsrVO getUsr();
}

getUsr()라는 함수만 선언되어있습니다.

이 메소드명과 xml의 id값이 일치되어 쿼리를 실행시켜 결과값을 가져오게 됩니다.


그다음

lee.main.service의 MainService.java를 만들겠습니다.

이것도 interface 입니다.


MainService.java


package lee.main.service;

import lee.domain.UsrVO;


public interface MainService {
	UsrVO getUsr();
}

MainMapper와 MainService가 똑같죠?

약간 이상할 수도 있는데 MainService는 공통의 기능을 나열한 것입니다.

그리고 이를 구현해서 비지니스 로직을 구현하는데 활용될 것이므로 MainMpper와는 개념이 다릅니다.

MainMpper는 하나의 테이블에 대한 쿼리수행을 하기위한 매개체 라고 생각합니다.


이제 MainService를 구현할 파일을 생성하겠습니다.


MainServiceImpl.java


package lee.main.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import lee.domain.UsrVO;
import lee.main.dao.MainMapper;
import lee.main.service.MainService;

@Service("mainservice")
public class MainServiceImpl implements MainService{
	@Autowired
	MainMapper mainRepository;
	
	public UsrVO getUsr() {
		return mainRepository.getUsr();
	}
}


클래서 상단에 Service 명을 입력해주었습니다.

기본적으로 @Service로만 주어도되는데 나중에 이름으로 구분지을때 사용될까봐 이름을 지정하였습니다.

(하나의 인터페이스를 다수의 클래스가 구현할때)


현재 Impl 클래스에는 별다른 로직이 없습니다.

하나의 UsrVO를 가져오는데 왜이렇게 파일이 많으냐고....귀찮아하실수도 있는데

나중에 도움이 됩니다.


이제 마지막으로 MainContoller를 수정해보겠습니다.


MainController.java


package lee.main.controller;

import java.util.Locale;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import lee.domain.UsrVO;
import lee.main.service.MainService;

@Controller
public class MainController {

	@Resource(name="mainservice")
	MainService mainService;
	
 	@RequestMapping(value = "/", method = RequestMethod.GET)
    public String main(Locale locale, Model model) {
        
        UsrVO usrVO = mainService.getUsr() ;
        System.out.println("###id=" + usrVO.getUsr_id());
        model.addAttribute("usr", usrVO );

        return "index";
    }

}

이 클래스가 컨트롤러임을 명시하는 @Controller

그리고 @Resource 어노테이션을 이용해 name값을 설정하여 빈 설정한 모습입니다.



MainMapper 소스 입니다. 

interface로 만드시면 됩니다.


package lee.main.dao;

import lee.domain.UsrVO;

public interface MainMapper {
	UsrVO getUsr();
}




결과 :###id=1 

가 출력되는 모습을 활인 할 수 있었습니다.