웹은 데이터베이스를 이용하는 사람들이 많기 때문에 직접연결하기보다 데이터 풀을 만들어서 이용하는데, 이 데이터 풀은 현재 시점으로 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
- 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;
}
}
'SpringBoot' 카테고리의 다른 글
Consider defining a bean of type 'package' in your configuration [Spring-Boot] 해결 (0) | 2020.07.17 |
---|---|
Spring-Boot Blog Project 1. 기본 세팅 (0) | 2020.07.17 |
스프링부트에서 jsp 파일 만들기 (0) | 2020.07.13 |
스프링부트 viewresolver와 Mustache (0) | 2020.07.13 |
SpringBoot의 어노테이션, 스프링 컨텍스트 (0) | 2020.07.10 |