본문 바로가기

STUDY/Spring

Spring Boot | MyBatis 연동

저번엔 Spring Framwork에 연동을 해봤고.. 이번엔 부트에... 해보자... 아자아자...

 

1. 라이브러리 추가

원하는 버전으로다가 넣어주십쇼

// Maven

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


// Gradle
dependencies {
  compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4")
}

 

2. MyBatis 사용 설정

yaml에서 설정한 dataSource를 등록..

setMapperLocations는 말그대로 매퍼 위치 지정

setTypeAliasePackage는 패키지 좌라라락 적는 것을 생략할 수 있게 해준다.

@Configuration
public class MyBatisConfig {

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath*:mappers/*.xml"));
        sqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.dto");
        
        return sqlSessionFactoryBean.getObject();
    }
    
    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
SqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다. SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 한다. SqlSessionTemplate은 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유할수 있다.
SqlSessionTemplate은 마이바티스의 디폴트 구현체인 DefaultSqlSession 대신 항상 사용된다. 왜냐하면 템플릿은 스프링 트랜잭션의 일부처럼 사용될 수 있고 여러개 주입된 매퍼 클래스에 의해 사용되도록 쓰레드에 안전하다. 동일한 애플리케이션에서 두개의 클래스간의 전환은 데이터 무결성 이슈를 야기할수 있다.

출처: https://mybatis.org/spring/ko/sqlsession.html

3. 매퍼 작성

위에서 설정한 경로에 xml매퍼를 작성

namespace는 그냥 식별자로 적어도 되고, 아래처럼 적으면 @Mapper 어노테이션으로 불러서 사용할 수 있다.

<?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.example.demo.Board.service.BoardMapper">
    <select id="getBoardList" resultType="Board">
        select * from board
    </select>
</mapper>

 

바로 이렇게..

@Mapper
public interface BoardMapper {

    public List<Board> getBoardList();

}

 

그리고 서비스에서 불러준다. @AllArgsConstructor는 생성자로 불러올 수 있게 해주는... 어노테이션...

@Service
@AllArgsConstructor
public class BoardService implements BoardMapper{

    private BoardMapper mapper;

    @Override
    public List<Board> getBoardList() {
        return mapper.getBoardList();
    }

}

 

4. 컨트롤러에서 뿌려보긔

테스트만 할거라 따로 컨트롤러를 만들진 않았다.

@Slf4j
@AllArgsConstructor
@RestController
public class WebRestController {

    private BoardService boardService;

    @GetMapping("/hello")
    public ResponseEntity<?> hello() {
        Map<String, Object> resultMap = new HashMap<>();
        List<Board> list = boardService.getBoardList();
        resultMap.put("list", list);
        log.info("리스트 결과" + list.toString());
        return new ResponseEntity<>(resultMap, HttpStatus.OK);
    }
}

 

잊고있었던 데이터... 이제 올라디포는 인디애나가 아니다...