[Java/Spring-framework] - Spring Project 스프링 프로젝트 시작하기 - JDBC ,mysql,mybatis(1)
위의 포스팅에서는 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()메서드를 통해 한개가 더 추가 된 것을 볼 수 있습니다~!
'Old Branch' 카테고리의 다른 글
Spring MVC 예제 - 직원 관리 프로그램 (2) | 2019.07.15 |
---|---|
Spring Project 스프링 프로젝트 시작하기 - Spring Boot JPA (0) | 2019.07.13 |
Spring Project 스프링 프로젝트 시작하기 - JDBC ,mysql,mybatis(1) (0) | 2019.07.11 |
Spring Project 스프링 프로젝트 시작하기 - Spring MVC 사용하기 (0) | 2019.07.10 |
Spring Project 스프링 프로젝트 시작하기 - Spring MVC (7) | 2019.07.09 |