본문 바로가기
카테고리 없음

MyBatis 동작흐름 및 구조

by 융기융 2024. 9. 5.
반응형

 

 

MyBatis란?

데이터의 입력, 조회, 수정, 삭제(CRUD)를 보다 편하게 하기위해 xml로 구조화한 Mapper 설정파일을 통해서 JDBC를 구현한 영속성 프레임워크

기존에 JDBC를 통해 구현했던 상당 부분의 코드와 파라미터 설정 및 결과 매핑 xml 설정을 통해 쉽게 구현할 수 있다

 

MyBatis 동작 흐름

 

 

MyBatis 내부 동작구조

 

 

DB연결하기

HiKariCP(Hikari Connection Pool)란?

 

 

DBConfig

package edu.kh.demo.common.config;

 

import javax.sql.DataSource;

 

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.mybatis.spring.SqlSessionTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

 

import com.zaxxer.hikari.HikariConfig;

import com.zaxxer.hikari.HikariDataSource;

 

/* @Configuration 어노테이션

* - 서버 실행 시 자동으로 객체로 만들어져

* 내부에 작성된 메서드를 모두 실행하게함

*

* @Bean 어노테이션

* - 메서드 수행 결과로 반환 객체들을 bean으로 등록함

* + 메서드 내부 코드 == bean 설정 코드

*

* @PropertySource : properties 파일의 내용을 이용하겠다는 어노테이션

*/

 

@Configuration

@PropertySource("classpath:/config.properties")

public class DBConfig {

 

@Autowired

private ApplicationContext applicationContext;

 

// @Bean

// - 개발자가 수동으로 bean을 등록하는 어노테이션

// - @Bean 어노테이션이 작성된 메서드에서 반환된 객체는

// Spring Container가 관리함(IOC)

 

@Bean

// @ConfigurationProperties(prefix = "spring.datasource.hikari")

// properties 파일의 내용을 이용해서 생성되는 bean을 설정하는 어노테이션

// prefix를 지정하여 spring.datasource.hikari으로 시작하는 설정을 모두 적용

@ConfigurationProperties(prefix = "spring.datasource.hikari")

public HikariConfig hikariConfig() {

return new HikariConfig();

}

 

@Bean

public DataSource dataSource(HikariConfig config) {

DataSource dataSource = new HikariDataSource(config);

return dataSource;

}

 

////////////////////////////Mybatis 설정 추가 ////////////////////////////

 

// SqlSessionFactory : SqlSession을 만드는 객체

@Bean

public SqlSessionFactory sessionFactory(DataSource dataSource) throws Exception {

SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();

 

sessionFactoryBean.setDataSource(dataSource);

 

// 매퍼 파일이 모여있는 경로 지정

sessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**.xml"));

 

// 별칭을 지정해야하는 DTO가 모여있는 패키지 지정

// -> 해당 패키지에 있는 모든 클래스가 클래스명으로 별칭이 지정됨

sessionFactoryBean.setTypeAliasesPackage("edu.kh.demo");

 

// 별칭 지정 전 -> edu.kh.demo.dto.User 라고 작성

// 별칭 지정 후 -> User 라고만 작성

 

 

// 마이바티스 설정 파일 경로 지정

sessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));

 

// SqlSession 객체 반환

return sessionFactoryBean.getObject();

}

 

// SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 처리

@Bean

public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sessionFactory) {

return new SqlSessionTemplate(sessionFactory);

}

 

// DataSourceTransactionManager : 트랜잭션 매니저

@Bean

public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {

return new DataSourceTransactionManager(dataSource);

}

 

}

 

UserController

package edu.kh.demo.controller;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

 

import edu.kh.demo.service.UserService;

import edu.kh.demo.service.UserServieceImpl;

 

@Controller // Controller 역할 명시 및 + bean 등록

@RequestMapping("user") // /user로 시작하는 요청 매핑

public class UserController {

 

// 필드

 

// 서비스 객체 DI(의존성 주입)

@Autowired

private UserService service;

 

/** 사용자 번호를 입력받아 일치하는 사용자의 이름조회

* @param userNo : 제출된 파라미터 중 key값이 "userNo"인 값

* @param model : Spring에서 사용하는 데이터 전달용 객체(request scope)

* @return

*/

@GetMapping("test1")

public String selectUserName(

@RequestParam("userNo") int userNo,

Model model

) {

 

// 사용자 이름조회 서비스 호출 후 결과 반환받기

String userName = service.selectUserName(userNo);

 

// 조회 결과를 model에 추가

model.addAttribute("userName", userName);

 

// classpath:/templates/user/searchName.html 요청 위임하기

return "user/searchName";

}

 

}

TestMapper

package edu.kh.demo.mapper;

 

import org.apache.ibatis.annotations.Mapper;

 

/* @Mapper

* - 마이바티스 mapper와 연결된 인터페이스임을 명시

* - 자동으로 해당 인터페이스를 상속받은 클래스를 만들어

* Bean으로 등록함

*/

@Mapper

public interface TestMapper {

 

/** 사용자 이름조회

* @param userNo

* @return userName

*/

String selectUserName(int userNo);

// -> 해당 메서드가 호출된 경우

// 연결되어져있는 mapper.xml파일에서

// id 속성 값이

// 메서드명과 같은 sql 태그가 수행된다!

 

 

 

}

 

package edu.kh.demo.service;

 

public interface UserService {

 

/** 사용자 이름 조회

* @param userNo

* @return userName

*/

String selectUserName(int userNo);

 

}

 

package edu.kh.demo.service;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

 

import edu.kh.demo.mapper.TestMapper;

 

// @Service

// - Service 역할(비즈니스 로직)임 명시

// - Bean 등록( == Spring이 관리하는 객체 == IOC )

 

@Service

public class UserServieceImpl implements UserService{

 

/* @Autowired

* - 등록된 Bean 중에서

* 자료형이 같은 Bean을 얻어와 필드에 대입

* == DI(의존성 주입)

*/

@Autowired

private TestMapper mapper;

 

// 사용자 이름 조회

@Override

public String selectUserName(int userNo) {

 

return mapper.selectUserName(userNo);

}

 

}

반응형