본문 바로가기
프로그래밍/SpringBoot

[스프링 부트 게시판] Mysql, Mybatis 적용하기

by 소소로드 2019. 12. 1.

 

Mysql, Mybatis 적용하기


스프링과는 좀 달라서 전에 정말 애를 먹었던 부분(한숨)

그래도 반복하다보면 또 익숙해지더라.

 

 

1. Mysql, Mybatis 부분 주석 풀기

아까 pom.xml에서 주석해주던 부분을 풀어준다.

 

2.  SqlSessionFactory 설정하기

처음에 프로젝트를 만들 때 기본적으로 생성되는 클래스 파일이 존재하는데

스프링부트는 스프링과는 달리 내장 톰캣을 지니고 있어서

빠르고 쉬운 설정이 가능하다. 프로젝트이름Applicaion 이런 식으로 되어있다.

이 부분을 설정하고 프로젝트를 올리면 콘솔에서 촤라락 올라가면서 

매퍼도 스캔하고 연동된 다른 컨피그 파일들도 연결된다.

 

즉, sqlSessionFactory 객체 안에 jdbc의 datasource 객체를 넣어주고
Factory에게 mapper가 어디에 있는지에 대해 알려주며

매퍼 폴더의 매퍼 파일이 ~Mapper.xml 이런식으로 끝나야 매퍼 파일로 확인하게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26


@SpringBootApplication
@MapperScan(value= {"com.helloproject.mapper"})
public class HelloprojectApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(HelloprojectApplication.class, args);
    }
    
    /*
     * SqlSessionFactory 설정 
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        Resource configLocation = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
 
        sessionFactory.setConfigLocation(configLocation);
        return sessionFactory.getObject();
    }
    
    // @Bean : 스프링에 필요한 객체를 생성할 때 사용
    // sessionFactory에 dataSource를 주입하여 Bean으로 사용한다는 의미

// 만약 프로퍼티스에서도 jsp관련 매핑이 안될경우
/* @Bean
public InternalResourceViewResolver setupViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();

resolver.setPrefix("WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}*/
}
cs

@MapperScan : 이름 그대로 해당 위치의 매퍼를 스캔할 거라고 명시하는 어노테이션

getResource("classpath:mybatis-config.xml") : 컨피그 파일의 위치를 알려준다.


 

3-1. application.properties에 mysql / mybatis 관련 설정 추가

#mysql부분은 DB와 스프링을 연결하는 구간이라고 생각하면 된다.

#mybatis부분은 mybatis관련 설정을 하는 곳의 위치를 명시하기 위해 쓴다.

 

1
2
3
4
5
6
7
8
#mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://해당호스트명/db아이디
spring.datasource.username=db아이디
spring.datasource.password=db비밀번호
 
#mybatis
mybatis.config-location=classpath:mybatis-config.xml
cs

 

3-2. mapper 만들기

src/main/resources안에 mapper폴더를 생성 하고, 그 밑에 BoardMapper.xml 파일 만들기

 

3-3. mybatis-config 만들기

src/main/resource에 mybatis-config.xml 파일생성
목적은 mapper 작성시 일일히 전체 문장을 써주는 번거로움을 없애기 위한 것인데

스프링과 똑같이 했다가 영고(영원히 고통)할 뻔 했다.

다행히 어떤 분의 글을 발견하고 살았다는 그런 이야기...

이 부분에 대한 언급은 게시판에서 매퍼를 사용할 때 하는 것으로.. 일단 이렇게 설정해두자.

 

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
    <typeAliases>
        <package name="com.helloproject.vo"/> //패키지 이름
    </typeAliases>
    <mappers>
        <mapper resource="mapper/BoardMapper.xml"/> //매퍼 위치
    </mappers>
</configuration>
cs

typeAliases를 이렇게 써두면 mapper작성시

resultType="com.helloproject.vo.BoardVO"라고 쓰던 것을

resultType="BoardVO" 라고 줄여서 쓸 수 있다.

아직 vo를 사용하지 않아도 일단 만들어둔다.

 

패키지 말고 클래스 별로 설정할 수 있는데 나는 이게 편하다.

 

 

4. MYSQL 테스트

controller - service - mapper(repository = dao) -  mapper - JSP

 

프로젝트 구조

src/man/java
ㄴcontroller - BoardController (클래스)
ㄴmapper - BoardMapper (인터페이스)
ㄴservice - BoardService (클래스)

src/man/resources

mapper - BoardMapper.xml
src~views - now.jsp

 

BoardController 

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class BoardController {
 
@Autowired
BoardService boardService;
 
    // MYSQL test
    @RequestMapping(value="/now")
    public String now(Model model) throws Exception {
        
        model.addAttribute("now", boardService.now());
        return "now";
    }
}
cs

 

BoardService 

1
2
3
4
5
6
7
8
9
10
@Service
public class BoardService {
 
    @Autowired
    BoardMapper boardMapper;
    
    public String now() throws Exception {
        return boardMapper.now();
    }
}
cs

 

BoardMapper 

1
2
3
4
5
@Repository
public interface BoardMapper {
    
    public String now() throws Exception;
}    
cs

 

BoardMapper

1
2
3
4
5
6
7
8
9
<?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="com.helloproject.mapper.BoardMapper">
    <select id="now" resultType="string">
      SELECT NOW() FROM DUAL;
    </select>
</mapper>
cs

 

 

now.jsp

1
2
3
4
5
6
7
8
9
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
</head>
<body>
    현재의 날짜 및 시각은 ${now} 입니다.
</body>
</html>
cs

 

http://localhost:7070/now를 띄웠을 때

화면에 현재의 날짜 및 시각은 현재시간입니다.  라고 떴다면 연결이 잘 된 것이다.

 

1.
mapper(DAO)의 BoardMapper 이름과 
mapper의 BoardMapper 이름 반드시 일치

2.
mapper(DAO)의 BoardMapper의 함수이름과 (now())
mapper의 BoardMapper의 Id 이름 반드시 일치

틀리면 Invalid bound statement (not found): 오류가 난다.