Spring day02 MyBatis๐Ÿฆ

alert("april");ยท2023๋…„ 7์›” 30์ผ
0

spring

๋ชฉ๋ก ๋ณด๊ธฐ
2/4
post-thumbnail

MyBatis

์ถœ์ฒ˜ https://jason-moon.tistory.com/130

MyBatis๋Š” ํ”ํžˆ SQL ๋งคํ•‘(mapping) ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋ถ„๋ฅ˜๋˜๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž๋“ค์€ JDBC ์ฝ”๋“œ์˜ ๋ณต์žฅํ•˜๊ณ  ์ง€๋ฃจํ•œ ์ž‘์—…์„ ํ”ผํ•˜๋Š” ์šฉ๋„๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ „ํ†ต์ ์ธ JDBC ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ตฌ์กฐ์™€ ๋น„๊ตํ•ด๋ณด๋ฉด, MyBatis๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๋‹ค.

MyBatis ์žฅ์ 

  • ์ž๋™์œผ๋กœ Connection close() ํ•˜๋Š” ๊ธฐ๋Šฅ
  • MyBatis ๋‚ด๋ถ€์ ์œผ๋กœ PreparedStatement ์ฒ˜๋ฆฌ
  • #[prop]์™€ ๊ฐ™์ด ์†์„ฑ์„ ์ง€์ •ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ž๋™ ์ฒ˜๋ฆฌ
  • ๋ฆฌํ„ด ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ResultSet ์ฒ˜๋ฆฌ

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค๊ณผ์˜ ์—ฐ๋™์„ ์‰ฝ๊ฒŒ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Mybatis ์—ญ์‹œ mybatis-spring์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฐ๋™ ๋ฐฉ๋ฒ•

1) build.gradle

๊ธฐ์กด๊บผ ์‚ญ์ œํ›„ ๋ณต๋ถ™ + ์ฝ”๋ผ๋ฆฌ ๋ˆ„๋ฅด๊ธฐ๐Ÿ˜

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.5'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.app'
version = '1.0'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-web-services'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

2) resources์— ์žˆ๋˜๊ฑฐ ์ง€์šฐ๊ณ  javaํŒŒ์ผ์—ด์–ด์„œ ํŒจํ‚ค์ง€ ํ•˜๋‚˜ ๋งŒ๋“ค๊ธฐ

@Configuration ์„ค์ •ํ•˜๋Š” ๊ฑฐ์•ผ ํ•˜๊ณ  Spring์—๊ฒŒ ์•Œ๋ ค์คŒ

ApplicationContext ์™ธ๋ถ€์— ์žˆ๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ์œ„ํ•ด์„œ(๊ทธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋งŒ ๋”ฑ ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ)
์˜คํƒ€ ๋‚˜๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ ๋ณต๋ถ™ํ•ด์„œ ์จ๋ผ!!

3) MyBatisConfiguaration.java ํŒŒ์ผ ๋งŒ๋“ค๊ณ  ๋ณต๋ถ™

package com.app.mybatis.config;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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 javax.sql.DataSource;
import java.io.IOException;

@Configuration
@RequiredArgsConstructor
public class MyBatisConfiguration {
    private final ApplicationContext applicationContext;

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public HikariConfig hikariConfig(){
        return new HikariConfig();
    }

    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(hikariConfig());
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws IOException {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath*:/mapper/*.xml"));
        sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:/config/config.xml"));
        try {
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
            sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
            return sqlSessionFactory;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

4) resources์— config, mapper directoryํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

5) config.xml ํŒŒ์ผ ๋งŒ๋“ค๊ณ  ๋ณต๋ถ™

<?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">

6) TimeMapper.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">

7) application.yml ์— ์ด๊ฑฐ ๊ธฐ์ž…ํ•˜๊ธฐ

server:
  port: 10000

#MyBatis
spring:
  datasource:
    hikari:
      driver-class-name: oracle.jdbc.OracleDriver
      jdbc-url: jdbc:oracle:thin:@//localhost:1521/XE
      username: hr
      password: hr

8) DBMS - oracle ํ”„๋กœ๊ทธ๋žจ ์ผœ๊ธฐ

mybatis ํด๋” ์ƒ์„ฑ
Connections > localhost ๋กœ ์—ฐ๊ฒฐ(Driver์—์„œ jarํŒŒ์ผ ์žˆ๋‚˜ ํ™•์ธํ•˜๊ณ  connect ํ•˜๊ธฐ)

9) mapper ํŒŒ์ผ ๋งŒ๋“ค๊ณ  TimeMapper ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ๋“ค๊ธฐ

์‹ค์ œ๋กœ ํ…Œ์ด๋ธ” ๋งŒ๋“ค์–ด์„œ ์กฐํšŒ ํ•ด๋ณด๊ธฐ

CREATE SEQUENCE SEQ_MEMBER; //(ctrl + Enter)๋กœ ์ฟผ๋ฆฌ ๋•Œ๋ฆฌ๊ธฐ

CREATE TABLE TBL_MEMBER(
   ID NUMBER CONSTRAINT PK_MEMBER PRIMARY KEY,
   MEMBER_ID VARCHAR2(1000) UNIQUE NOT NULL,
   MEMBER_PASSWORD VARCHAR2(1000) NOT NULL,
   MEMBER_NAME VARCHAR2(1000)
);

10) mapper ๋งŒ๋“ค๊ณ  - member ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ๋“ค๊ธฐ

์ถ”๊ฐ€๋Š” void

11) domain ํ•„์š”ํ•จ - MemberVO ๋งŒ๋“ค๊ธฐ


MyBatis 1๋ฒˆ ์‹ค์Šต

  1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ
  2. ๋ชจ๋ธ ๊ฐ์ฒด ์ƒ์„ฑ(VO)
  3. config.xml์— typeAlias ๋“ฑ๋ก
  4. Mapper ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ
  5. Mapper.xml ์„ ์–ธ
  6. Mapper ์ธํ„ฐํŽ˜์ด์Šค์—์„œ CRUD ๋ฉ”์†Œ๋“œ ์„ ์–ธ
  7. Mapper.xml์—์„œ ์ฟผ๋ฆฌ ์ž‘์„ฑ
  8. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ

๊ฒŒ์‹œ๊ธ€ ์„œ๋น„์Šค

  1. ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก
  2. ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ(์ž‘์„ฑ์ž ์ด๋ฆ„๊นŒ์ง€ ์กฐํšŒ)
  3. ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก
  4. ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •
  5. ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ

MyBatis 2๋ฒˆ ์‹ค์Šต

  1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ
  2. ๋ชจ๋ธ ๊ฐ์ฒด ์ƒ์„ฑ(VO)
  3. config.xml์— typeAlias ๋“ฑ๋ก
  4. Mapper ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ
  5. Mapper.xml ์„ ์–ธ
  6. Mapper ์ธํ„ฐํŽ˜์ด์Šค์—์„œ CRUD ๋ฉ”์†Œ๋“œ ์„ ์–ธ
  7. Mapper.xml์—์„œ ์ฟผ๋ฆฌ ์ž‘์„ฑ
  8. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ

INSERT INTO TBL_REPLY
(SEQ_REPLY.NEXTVAL, ..., 1, SEQ_REPLY.CURRVAL)

[1 depth - ๋Œ“๊ธ€] โ€ป SEQ_REPLY.CURRVAL
๋Œ“๊ธ€ 1: ์•ˆ๋…•ํ•˜์„ธ์š”! (groupId = 1)
๋Œ“๊ธ€ 2: ์ €๋„ ๊ณต์œ ! (groupId = 2)
๋Œ“๊ธ€ 3: ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค^^7 (groupId = 3)

[2 depth - ๋Œ€๋Œ“๊ธ€]
๋Œ€๋Œ“๊ธ€ 1: ๋ฐ˜๊ฐ€์›Œ์š”~!(groupId = 1)
๋Œ€๋Œ“๊ธ€ 2: ์–ด์„œ์˜ค์„ธ์š”~!(groupId = 1)
๋Œ€๋Œ“๊ธ€ 3: ๊ณต์œ  ๋“œ๋ ธ์–ด์š”!(groupId = 2)

๋Œ“๊ธ€, ๋Œ€๋Œ“๊ธ€ ์„œ๋น„์Šค

  1. ๋Œ“๊ธ€ ๋“ฑ๋ก
  2. ๋Œ“๊ธ€ ์ˆ˜์ •
  3. ๋Œ“๊ธ€ ๋ชฉ๋ก(์ž‘์„ฑ์ž)
  4. ๋Œ“๊ธ€ ์‚ญ์ œ
  5. ๋Œ€๋Œ“๊ธ€ ์ž‘์„ฑ
  6. ๋Œ€๋Œ“๊ธ€ ๋ชฉ๋ก(์ž‘์„ฑ์ž)
  7. ๋Œ€๋Œ“๊ธ€ ์ˆ˜์ •
  8. ๋Œ€๋Œ“๊ธ€ ์‚ญ์ œ
profile
Slowly but surely

0๊ฐœ์˜ ๋Œ“๊ธ€