[Spring / MyBatis] MyBatis ๊ฐœ๋…

DevelopHeoยท2025๋…„ 1์›” 5์ผ
post-thumbnail

๐Ÿ“™ MyBatis๋ž€?

MyBatis๋Š” Java ๊ธฐ๋ฐ˜์˜ SQL ๋งคํผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  XML ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ์™€ ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ORM ํ”„๋ ˆ์ž„์›Œํฌ์ธ JPA์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, SQL์„ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“™ 1. MyBatis์˜ ์ฃผ์š” ํŠน์ง•

  • ์ง์ ‘์ ์ธ SQL ์ œ์–ด: ๊ฐœ๋ฐœ์ž๊ฐ€ SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, SQL ์ฟผ๋ฆฌ๋ฅผ ์„ธ๋ถ€์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ์—ฐํ•œ ๋งคํ•‘: XML ํŒŒ์ผ ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ: ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠนํ™”๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ„๋‹จํ•œ ์„ค์ •: JPA์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๋ฉฐ, SQL์„ ์ž˜ ์•„๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ํ™” ๊ธฐ๋Šฅ ๋ถ€์กฑ: CRUD ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ชจ๋“  SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ MyBatis์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ


โœ๏ธ MyBatis DB Access ์•„ํ‚คํ…์ฒ˜

  • ๊ธฐ์กด JDBC ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฝ์šฐ Repository์—์„œ ๊ณง๋ฐ”๋กœ JDBC API ์ชฝ์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ DB๋ฅผ ์—ฐ๊ฒฐํ•˜์˜€์ง€๋งŒ, ์œ„์˜ ๊ทธ๋ฆผ์— ๋‚˜์™€์žˆ๋“ฏ์ด MyBatis๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Repository์™€ JDBC API์‚ฌ์ด์— MyBatis๊ฐ€ ์œ„์น˜ํ•จ์œผ๋กœ์„œ ํŽธ๋ฆฌํ•œ Access๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • JDBC API๋ฅผ ๊ฐ์‹ธ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์กฐ๊ธˆ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด MyBatis์ด๋‹ค.
  • ์„œ๋น„์Šค์—์„œ DAO๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  DAO์—์„œ Mybatis๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋œ๋‹ค.

โœ๏ธ MyBatis DB Access ์ˆœ์„œ


(1) ~ (3)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ํ•  ์‹œ ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋‹ค.
1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด SqlSessionFactoryBuilder๋ฅผ ํ†ตํ•ด SqlSessionFactory๋ฅผ ๋นŒ๋“œํ•˜๋„๋ก ์š”์ฒญํ•œ๋‹ค.
2. SqlSessionFactoryBuilder๋Š” SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Mybatis Config ํŒŒ์ผ์„ ์ฝ๊ณ ,
3. SqlSessionFactoryBuilder๋Š” MyBatis Config ํŒŒ์ผ์— ๋”ฐ๋ผ SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

(4) ~ (10)์€ ํด๋ผ์ด์–ธํŠธ์˜ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋‹ค.
4. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
5. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ SqlSessionFactoryBuilder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ SqlSessionFactory์—์„œ SqlSession์„ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ช…๋ นํ•œ๋‹ค.
6. SqlSessionFactory๋Š” SqlSession๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.
7. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด SqlSession์—์„œ Mapper ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ ,
8. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Mapper ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
9. Mapper ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ SqlSession ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  SQL ์‹คํ–‰์„ ์š”์ฒญํ•œ๋‹ค.
10. SqlSession์€ Mapping ํŒŒ์ผ์—์„œ ์‹คํ–‰ํ•  SQL์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰ํ•œ๋‹ค.

๐Ÿ“™ 2. MyBatis ๊ตฌ์„ฑ ์š”์†Œ

1. SQL Mapper XML ํŒŒ์ผ

  • SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด ์ฟผ๋ฆฌ์™€ Java ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
  <select id="selectUserById" resultType="com.example.dto.User">
    SELECT * FROM user WHERE id = #{id}
  </select>
</mapper>

2. Mapper Interface

  • XML ํŒŒ์ผ์— ์ •์˜๋œ SQL ์ฟผ๋ฆฌ์™€ ๋งคํ•‘๋˜๋Š” Java ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
public interface UserMapper {
    User selectUserById(int id);
}

3. Configuration File

  • MyBatis ์„ค์ •์„ ์ •์˜ํ•˜๋Š” XML ํŒŒ์ผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด, ๋งคํผ ํŒŒ์ผ ์œ„์น˜ ๋“ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ:
<!-- mybatis-config.xml -->
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

4. SqlSessionFactory

  • MyBatis์˜ ํ•ต์‹ฌ ๊ฐ์ฒด๋กœ, SQL ์‹คํ–‰, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. SqlSession์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

๐Ÿ“™ 3. MyBatis ์„ค์ • ๊ณผ์ •

1. Dependency ์ถ”๊ฐ€

  • Maven ๋˜๋Š” Gradle ํ”„๋กœ์ ํŠธ์—์„œ MyBatis์™€ MyBatis-Spring Starter๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
<!-- Maven dependency -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.2.0</version>
</dependency>

2. Mapper XML ํŒŒ์ผ ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ

  • SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” XML ํŒŒ์ผ๊ณผ Java ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

3. SqlSessionFactory ์„ค์ •

  • mybatis-config.xml์„ ํ†ตํ•ด MyBatis ์„ค์ •์„ ์ •์˜ํ•˜๊ณ , SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

4. SQL ์‹คํ–‰

  • SqlSession ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“™ 4. MyBatis ์ฝ”๋“œ ์˜ˆ์ œ

UserMapper.xml

<mapper namespace="com.example.mapper.UserMapper">
  <select id="selectUserById" resultType="com.example.dto.User">
    SELECT * FROM user WHERE id = #{id}
  </select>
</mapper>

UserMapper.java

public interface UserMapper {
    User selectUserById(int id);
}

MyBatis ์„ค์ • ํŒŒ์ผ (mybatis-config.xml)

<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

SqlSessionFactory ๋ฐ SqlSession ์‚ฌ์šฉ

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
    System.out.println(user);
}


์ฐธ๊ณ  ์ถœ์ฒ˜

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