Old Branch

Spring Project 스프링 프로젝트 시작하기 - JDBC,mysql,mybatis(2)

woolbro 2019. 7. 12. 11:22
반응형

[Java/Spring-framework] - Spring Project 스프링 프로젝트 시작하기 - JDBC ,mysql,mybatis(1)

 

Spring Project 스프링 프로젝트 시작하기 - JDBC ,mysql,mybatis(1)

[Java/Spring-framework] - Spring Project 스프링 프로젝트 시작하기 - Spring MVC 사용하기 Spring Project 스프링 프로젝트 시작하기 - Spring MVC 사용하기 이번 포스팅은, 이전의 MVC 모델을 설명했던 포스팅..

woolbro.tistory.com

 

위의 포스팅에서는  DAO 사용해서 데이터를 다루어 보았습니다. 

 

위와같이 JDBC만 사용하더라도 원하는 대부분의 결과를 얻으실수 있을실겁니다. 하지만 DAO JAVA파일에 직접적으로 SQL문을 작성하고 파라미터를 하나씩 직접 매핑시켜주는 등 편리성이 떨어지는데, MyBatis는 이를 편하게 해주기 위해 사용하는 라이브러리 입니다. 위 프로젝트에 MyBatis까지 연동해 보도록 하겠습니다. 

 


Mybatis를 사용하여 읽기와 삽입을 해 보려고 하는데요, Dependency 추가 -> Mapper 등록 -> Source Edit의 순으로 진행 하도록 하겠습니다.

 

Dependency 추가

우선, mybatis 사용을 위해 pom.xml에 아래와 같이 Dependency를 추가하고 maven update를 해 줍니다.

 

<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
 </dependency>

 

 

Mapper 등록

mapper를 등록 해 주어야 합니다.  sql문을 저장할 sql.xml도 만들어 주어야 합니다.

 

mapper의 위치 등록은 application.properties에서 하게 됩니다. 아래와 같이 작성하면 됩니다.

 

#mybatis setting
mybatis.mapper-locations = /mybatis/mapper/*-sql.xml

 

mybatis.mapper-locations 는,  실행 할 mybatis의 mapper가 어디있는지 경로를 설정 해 주는 구문입니다.

해당 경로는, src/main/resource 하위에 mybatis/mapper 폴더를 생성 한 후, 최 하위에  -sql.xml로 끝나는 모든 문서에 대해서 적용한다 라는 뜻 입니다.

 

 

경로를 설정 해 주었으니, 해당한 경로에 xml을 작성 해 줍니다.

 

News-sql.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="news">

    <select id="getMainNews" parameterType="java.util.Map" resultType="java.util.Map" statementType="CALLABLE" >
    SELECT     *
    FROM    T_NEWS
    </select>
    
    <insert id="setMainNews" parameterType="java.util.Map">
    INSERT
	INTO
		`T_NEWS` (`title`,
		`contents`,
		`date`,
		`author`,
		`type`)
	VALUES
	(
		#{title},
		#{contents},
		#{date},
		#{author},
		#{type}
	)
    </insert>
</mapper>

 

select 문과 insert문이 있는 sql.xml 파일입니다.

 

select문은 T_NEWS 테이블을 전부 읽어오는 형태이고,

insert문은 #{title} , #{contents} , #{date}, #{author}, #{type} 와 같은 이름을 가진 변수들을 insert해 주는 구문입니다.

 

 

SessionFactory설정

이제 위에서 작성한 매퍼들을 DAO와 연결시켜 사용해 주어야합니다. MyBatis에서는 query 스트링으로 질의하는 JDBC Template 대신 객체로써 질의를 할 수 있도록 SqlSessionTemplate을 사용하는데, 이에대한 설정은 위에서 Datasource설정 기반으로 자동으로 설정이 됩니다.

 

원래 쿼리문이 들어있었던 DAO파일을 수정 해 주도록 하겠습니다.

 

NewsDaoImpl.java

 

package com.woolbro.dev.dao.Impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.woolbro.dev.dao.NewsDao;
import com.woolbro.dev.vo.News;

@Repository
public class NewsDaoImpl implements NewsDao {

	@Autowired
	private SqlSessionTemplate sqlSession;
	
	@Override
	public List<News> getNews() {
		return sqlSession.selectList("news.getMainNews");
	}

	@Override
	public void setNews() {
		Map<String, String> mainNews = new HashMap<>();
		//title, contents, date, author,type
		mainNews.put("title", "wooldev blog tilte!");
		mainNews.put("contents", "woolbro dev blog Spring boooooooooots!");
		mainNews.put("date", "2019-01-01 11:30");
		mainNews.put("author", "woolbro");
		mainNews.put("type", "posting");
		
		sqlSession.insert("news.setMainNews",mainNews);
	}
	
	
	
}

 

저는, 컨트롤러에서 setNews()를 호출 할 수 있도록 작성했습니다. 

 

컨트롤러 -> 서비스 -> Dao 의 순서로 호출하는 형태입니다. 아래는 Controller와 Service의 코드입니다.

 

 

ViewController.java

package com.woolbro.dev.controller;

import org.springframework.beans.factory.annotation.Autowired;
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 com.woolbro.dev.service.Impl.NewsServiceImpl;

@Controller
public class ViewController {

    @Autowired
    NewsServiceImpl newsService;

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String index(Model model) {

        model.addAttribute("newsData", newsService.getNews());
        return "index";
    }
    
    @RequestMapping(value="/input", method = RequestMethod.GET)
    public void insertpost() {

    	this.newsService.setNews();
    }
}

 

위의 컨트롤러를 사용하면, localhost:8080 은 index 페이지가 나오고, localhost:8080/input을 사용하면  setNews() 메서드를 호출하네요 :) 

 

호출하는 setNews() 메서드는 newsService에서 작성했는데 구현을 해 보겠습니다.

 

NewsService.java

package com.woolbro.dev.service;

import java.util.List;

import com.woolbro.dev.vo.News;

public interface NewsService {

    public List<News> getNews();
    
    public void setNews();

}

NewsServiceImpl.java

package com.woolbro.dev.service.Impl;

import java.util.ArrayList;
import java.util.List;

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

import com.woolbro.dev.dao.Impl.NewsDaoImpl;
import com.woolbro.dev.service.NewsService;
import com.woolbro.dev.vo.News;

@Service
public class NewsServiceImpl implements NewsService{

	@Autowired
	NewsDaoImpl newsDao;
	
	@Override
	public List<News> getNews() {
		List mainNews = new ArrayList<>();
		mainNews = newsDao.getNews();
        return mainNews;
	}

	@Override
	public void setNews() {
		newsDao.setNews();
	}
	
}

 

위의 Service의 setNews() 메서드는 newsDao의 setNews() 메서드를 호출 해 주고 있습니다.

 

즉, Controller -> Service -> ServiceImpl -> DAO 의 순이 되겠네요 :)

 

 

실행

 

접속 순서는 

1. localhost:8080/   

2. localhost:8080/input

3. localhost:8080 

이렇게 순서대로 진행하면 됩니다.

 

기존의 DB에 3개의 항목이 있었는데, setNews()메서드를 통해 한개가 더 추가 된 것을 볼 수 있습니다~!