본문 바로가기
SpringBoot

SpringBoot에서 MySQl, MyBatis 연결하기

by 김마리님 2020. 7. 13.

 

웹은 데이터베이스를 이용하는 사람들이 많기 때문에 직접연결하기보다 데이터 풀을 만들어서 이용하는데, 이 데이터 풀은 현재 시점으로 yml에서 만드는 것이 제일 이상적이다.

 

yml에 다음과 같이 만들어보자.

spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp    

  datasource:
    url: jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
    username: spring
    password: bitc5600
    driver-class-name: com.mysql.cj.jdbc.Driver       

보다시피 datasource는 spring 아래에 위치해야함을 주의한다.

 

다음 config 폴더를 메인 컨텍스트 내부에 위치하게 만들어 설정 파일을 넣는다.

 

내부에 다음과 같은 설정파일을 만든다.

 

- DataAccessConfig.java

package com.mary.demo.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = "com.cos.demo.repository")
public class DataAccessConfig {

    @Bean //강제로 함수를 실행시켜 결과값을 컨테이너에 가져감
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(
        		new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

 

sqlSessionFactory가 받는 변수를 보면 dataSource이다. 즉, sqlSession은 dataSource에서 결과값을 받아온다는 것을 알 수 있다.

 

이 결과값을 받아 repository로 getObject로 리턴하는걸 볼 수 있다. 즉, 오브젝트 형태로 저장소로 리턴한다.

sessionFactory는 두 파라메터를 받는데, 하나는 데이터 소스, 하나는 리소스 파일을 받는다. 이 두 값을 통해서 오브젝트를 도출하는 것이다.

 

즉, 이 결과값을 얻기 위해서 리소스가 필요한데, 그 리소스를 가진 mapper 파일을 만든다. 이 리소스 파일은 src의 resource 파일을 참조한다. 즉, resource 폴더에 mapper 폴더를 만들고, 그 내부에 있는 모든 xml(*.xml)을 참조하겠다는 의미이다.

 

- member.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="com.mary.demo.repository.MemberRepository">
  
  <select id="findById" resultType="com.mary.demo.model.Member">
    select * from Member where id = #{id}
  </select>
  
  <select id="findAll" resultType="com.mary.demo.model.Member">
    select * from Member
  </select>
</mapper>

이렇게 xml 파일에 SQL 쿼리문을 저장해두고 id를 통해 불러내는 형태가 MyBatis이다.

이렇게 매핑하는 구문은 MyBatis 홈페이지에서 예시구문을 볼 수 있다.

https://mybatis.org/mybatis-3/ko/getting-started.html

 

MyBatis – 마이바티스 3 | 시작하기

이제부터 다룰 스코프와 생명주기에 대해서 이해하는 것은 매우 중요하다. 스코프와 생명주기를 잘못 사용하는 것은 다양한 동시성 문제를 야기할 수 있다. 의존성 삽입 프레임워크는 쓰레드에

mybatis.org

 

 

- DataSourceConfig.java

package com.mary.demo.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataSourceConfig {

	@ConfigurationProperties(prefix="spring.datasource")
	public DataSource dataSource(){
    	return DataSourceBuilder.create().build();
	}
}

이 DataSource 파일은 MySQL 데이터베이스와 직접 jdbc를 통해 연결된다.

 

이제 사용할 Member의 데이터 모델을 만든다.

 

-Member.java

package com.mary.demo.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Member {
	private int id;
	private String username;
	private String phone;
}

 

이제 DataAccessConfig가 참조할 Repository를 참조할 파일을 만든다(폴더 따로 만들기)

- MemberRepository.java

package com.mary.demo.repository;

import java.util.List;

import com.mary.demo.model.Member;

public interface MemberRepository {
	public Member findById(int id);
	public List<Member> findAll();

}

이 때, 이름은 member.xml 파일의 id와 일치하도록 만든다.

 

이제, 이 저장소의 이름을 파일로 도출해보자.

 

- MyBatisController.java

 

package com.mary.demo;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

import com.mary.demo.model.Member;
import com.mary.demo.repository.MemberRepository;

@Controller
public class MyBatisController {
	@Autowired
	private MemberRepository memberRepository;
	
	@GetMapping("/member/{id}")
	public @ResponseBody Member findById(@PathVariable int id) {
		Member member=memberRepository.findById(id);
		return member;
	}
	
	@GetMapping("/member")
	public @ResponseBody List<Member> findAll() {
		List<Member> members=memberRepository.findAll();
		return members;
	}
}

 

반응형