** ๐Ÿ“Œโœ… 1.1๋‹จ๊ณ„: MyBatis๋ž€? & ๋™์ž‘ ํ๋ฆ„ **


๐Ÿ’ก MyBatis๋ž€?

SQL์„ XML์— ์ž‘์„ฑํ•ด์„œ Java ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌํ•˜๊ณ , ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์— ์ž๋™ ๋งคํ•‘ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์•ผ.

๐Ÿ” ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ:


๐Ÿงฑ ์ „์ฒด ํ๋ฆ„: ๋„ค ํ”„๋กœ์ ํŠธ ๊ธฐ์ค€ ๋™์ž‘ ์ˆœ์„œ

์‹คํ–‰ ํŒŒ์ผ์ธ Test1_A.java์—์„œ ์ž‘๋™ํ•˜๋Š” MyBatis์˜ ์ „์ฒด ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

1๏ธโƒฃ mybatis-config.xml ์„ค์ • ์ฝ๊ธฐ
    โ†“
2๏ธโƒฃ SqlSessionFactory ์ƒ์„ฑ (์„ค์ • ํŒŒ์ผ ๊ธฐ๋ฐ˜)
    โ†“
3๏ธโƒฃ SqlSession ์ƒ์„ฑ (์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฐ์ฒด)
    โ†“
4๏ธโƒฃ Mapper XML(SQL) ํ˜ธ์ถœ
    โ†“
5๏ธโƒฃ ๊ฒฐ๊ณผ๋ฅผ Student ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘
    โ†“
6๏ธโƒฃ ์„ธ์…˜ ๋‹ซ๊ธฐ

๐Ÿ“„ ์‹ค์ œ ์ฝ”๋“œ ๋ถ„์„: Test1_A.java

package test0415;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import main.Student;

public class Test1_A {
    public static void main(String[] args) throws Exception {
        // 1๏ธโƒฃ ์„ค์ • ํŒŒ์ผ(xml) ์ฝ๊ธฐ
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

        // 2๏ธโƒฃ ์„ค์ • ๊ธฐ๋ฐ˜์œผ๋กœ SqlSessionFactory ์ƒ์„ฑ
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

        // 3๏ธโƒฃ SqlSession (DB ์—ฐ๊ฒฐ + SQL ์‹คํ–‰ ๋‹ด๋‹น ๊ฐ์ฒด) ์ƒ์„ฑ
        SqlSession session = factory.openSession();

        // 4๏ธโƒฃ Mapper ํ˜ธ์ถœ โ†’ SQL ์‹คํ–‰ (๋‹จ์ผ ๊ฐ’ ๋ฐ˜ํ™˜)
        int count = session.selectOne("student.getStudentCount");
        System.out.println("์ „์ฒด ํ•™์ƒ ์ˆ˜ : " + count);

        // 5๏ธโƒฃ Mapper ํ˜ธ์ถœ โ†’ SQL ์‹คํ–‰ (๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜ + DTO ๋งคํ•‘)
        List<Student> list = session.selectList("student.getAllStudents");
        for (Student s : list) {
            System.out.println(s.getHakbun() + " / " + s.getIrum() + " / " + s.getHakgwa());
        }

        // 6๏ธโƒฃ ์„ธ์…˜ ๋‹ซ๊ธฐ
        session.close();
    }
}


๐Ÿ“‚ ์„ค์ • ํŒŒ์ผ: mybatis-config.xml

<configuration> <!-- MyBatis ์ „์ฒด ์„ค์ • ์‹œ์ž‘ -->

  <environments default="development"> <!-- DB ํ™˜๊ฒฝ ๋ชฉ๋ก, ๊ธฐ๋ณธ์€ development -->
    <environment id="development"> <!-- ๊ฐœ๋ฐœ์šฉ DB ์„ค์ • -->
      <transactionManager type="JDBC"/> <!-- JDBC ๋ฐฉ์‹ ํŠธ๋žœ์žญ์…˜ -->
      <dataSource type="POOLED"> <!-- ์ปค๋„ฅ์…˜ ํ’€ ์‚ฌ์šฉ -->
        <property name="driver" value="org.mariadb.jdbc.Driver"/> <!-- ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค -->
        <property name="url" value="jdbc:mariadb://localhost:3306/mybatisdb"/> <!-- DB ์ฃผ์†Œ -->
        <property name="username" value="root"/> <!-- DB ๊ณ„์ • -->
        <property name="password" value="1234"/> <!-- DB ๋น„๋ฐ€๋ฒˆํ˜ธ -->
      </dataSource>
    </environment>
  </environments>

  <mappers> <!-- Mapper ํŒŒ์ผ ๋“ฑ๋ก -->
    <mapper resource="StudentMapper1.xml"/> <!-- SQL ์ •์˜๋œ XML -->
  </mappers>

</configuration> <!-- ์„ค์ • ๋ -->

๐Ÿ”‘ ํ•ต์‹ฌ ํฌ์ธํŠธ:


๐Ÿงพ SQL Mapper ํŒŒ์ผ: StudentMapper1.xml

<!-- โœ… ์ด ํŒŒ์ผ์€ MyBatis์˜ Mapper XML๋กœ, SQL ๋ฌธ์žฅ์„ ์ •์˜ํ•˜๊ณ  Java ๊ฐ์ฒด์™€ ๋งคํ•‘ํ•˜๋Š” ์—ญํ• ์„ ํ•จ -->
<mapper namespace="student">
  <!-- โœ… namespace: ์ด ๋งคํผ๋ฅผ Java์—์„œ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ  ์ด๋ฆ„ -->
  <!-- ์˜ˆ: sqlSession.selectList("student.getAllStudents")์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋จ -->
  <!-- ๋ฐ˜๋“œ์‹œ Java ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•จ -->

  <!-- โœ… ์ฒซ ๋ฒˆ์งธ SQL ์ •์˜ ์˜์—ญ ์‹œ์ž‘ -->
  <select id="getStudentCount" resultType="int">
    <!-- โœ… id="getStudentCount": ์ด SQL์„ Java์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ด๋ฆ„ -->
    <!-- โœ… resultType="int": ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์ •์ˆ˜(int)ํ˜•์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ๋œป -->
    SELECT COUNT(*) FROM student
    <!-- โœ… SQL ๋‚ด์šฉ: student ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ํ–‰ ์ˆ˜(๋ ˆ์ฝ”๋“œ ์ˆ˜)๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ -->
    <!-- ์˜ˆ: SELECT COUNT(*)๋Š” ์ด ๋ช‡ ๋ช…์˜ ํ•™์ƒ์ด ์žˆ๋Š”์ง€ ์ˆซ์ž ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ -->
  </select>

  <!-- โœ… ๋‘ ๋ฒˆ์งธ SQL ์ •์˜ ์˜์—ญ ์‹œ์ž‘ -->
  <select id="getAllStudents" resultType="main.Student">
    <!-- โœ… id="getAllStudents": ์ด SQL์„ Java์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ด๋ฆ„ -->
    <!-- โœ… resultType="main.Student": ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ main ํŒจํ‚ค์ง€์˜ Student ํด๋ž˜์Šค์™€ ์ž๋™ ๋งคํ•‘๋จ -->
    SELECT * FROM student
    <!-- โœ… SQL ๋‚ด์šฉ: student ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ๊ณผ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ -->
    <!-- โœ… ์ด ๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•™์ƒ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ ํ–‰์€ Student ๊ฐ์ฒด๋กœ ์ž๋™ ๋ณ€ํ™˜๋จ -->
    <!-- โœ… ์ž๋™ ๋งคํ•‘ ์กฐ๊ฑด: DB ์ปฌ๋Ÿผ๋ช…๊ณผ Student ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ช…์ด ๋™์ผํ•ด์•ผ ์ž๋™์œผ๋กœ ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ง -->
    <!-- ์˜ˆ: DB์˜ name โ†’ Student ํด๋ž˜์Šค์˜ setName() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋จ -->
  </select>

</mapper>

ํ•ญ๋ชฉ ์„ค๋ช…
namespace="student" ํ˜ธ์ถœ ์‹œ "student.getStudentCount" ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋จ
resultType="int" ์ฒซ ์ฟผ๋ฆฌ๋Š” ๋‹จ์ผ ์ˆซ์ž ๋ฐ˜ํ™˜ (ํ•™์ƒ ์ˆ˜)
resultType="main.Student" ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” Student ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘

๐Ÿ“ฆ DTO ํด๋ž˜์Šค: main.Student.java

package main;

public class Student {
    private int hakbun;
    private String irum;
    private String hakgwa;
    private String addr;
    private String phone;
    private String jumin;
    private int grade;

    // Getter/Setter ์ƒ๋žต
}

๐Ÿ”Ž DB ์ปฌ๋Ÿผ๋ช…๊ณผ ํ•„๋“œ๋ช…์ด ๊ฐ™์œผ๋ฉด ์ž๋™์œผ๋กœ ๋งคํ•‘๋จ

์˜ˆ: SELECT * FROM student โ†’ hakbun, irum, hakgwa โ†’ ์ž๋™ ์ฃผ์ž…


๐Ÿง  ๊ตฌ์กฐ ์‹œ๊ฐํ™”

๐Ÿ“„ Test1_A.java
    โ†“
๐Ÿ“– mybatis-config.xml ๋กœ๋”ฉ
    โ†“
โš™ SqlSessionFactory ์ƒ์„ฑ
    โ†“
๐Ÿ”“ SqlSession ์—ด๊ธฐ
    โ†“
๐Ÿงพ StudentMapper1.xml์˜ SQL ์‹คํ–‰
    โ†“
๐Ÿ“ฆ ๊ฒฐ๊ณผ๋ฅผ Student ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
    โ†“
๐Ÿ“ƒ ์ฝ˜์†” ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ


โœ… ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์ฝ˜์†” ์ถœ๋ ฅ ์˜ˆ์‹œ (DB์— 6๋ช… ์žˆ๋‹ค๊ณ  ๊ฐ€์ •):

์ „์ฒด ํ•™์ƒ ์ˆ˜ : 6
1001 / ๊น€๋ฏผ์ˆ˜ / ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ
1002 / ์ด์˜ํฌ / ์ „์ž๊ณตํ•™๊ณผ
...

โœ… ์ •๋ฆฌ ์š”์•ฝ

์š”์†Œ ์—ญํ• 
mybatis-config.xml DB ์—ฐ๊ฒฐ + Mapper ๋“ฑ๋ก
StudentMapper1.xml ์‹ค์ œ SQL์ด ์ •์˜๋œ XML
Test1_A.java MyBatis ์‹คํ–‰ ์ฝ”๋“œ
Student.java SQL ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๊ฐ์ฒด (DTO)

โœ… 1.2๋‹จ๊ณ„: SqlSessionFactoryBuilder + ์„ค์ • ๋กœ๋”ฉ ๊ตฌ์กฐ (๐Ÿ” Test1_A.java ๊ธฐ์ค€)


๐Ÿ”„ ํ•ต์‹ฌ ํ๋ฆ„ ์š”์•ฝ (๋„ˆ์˜ ์ฝ”๋“œ ๊ธฐ์ค€)

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
์ˆœ์„œ ์‹ค์ œ ๋™์ž‘ ๊ด€๋ จ ํŒŒ์ผ
1๏ธโƒฃ ์„ค์ •ํŒŒ์ผ ๋กœ๋”ฉ (Reader) mybatis-config.xml
2๏ธโƒฃ ์„ค์ •์„ ํŒŒ์‹ฑํ•˜๊ณ  ํŒฉํ† ๋ฆฌ ์ƒ์„ฑ ๋‚ด๋ถ€์ ์œผ๋กœ XML์„ ์ฝ์–ด SqlSessionFactory ์ƒ์„ฑ
3๏ธโƒฃ ํŒฉํ† ๋ฆฌ์—์„œ ์„ธ์…˜์„ ์—ด์–ด DB ์—ฐ๊ฒฐ session ๊ฐ์ฒด๋Š” ์‹ค์ œ DB ์—ฐ๊ฒฐ๋œ ์ƒํƒœ

๐Ÿ” ์‹ค์ œ ์ฝ”๋“œ ๋ถ„์„: Test1_A.java

package test0415;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import main.Student;

public class Test1_A {
    public static void main(String[] args) throws Exception {
        // ์„ค์ • ํŒŒ์ผ(mybatis-config.xml) ์ฝ๊ธฐ
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        
        // SqlSessionFactory ์ƒ์„ฑ
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        
        // SqlSession ์—ด๊ธฐ (DB ์—ฐ๊ฒฐ)
        SqlSession session = factory.openSession();

        // ํ•™์ƒ ์ˆ˜ ์กฐํšŒ (์ •์ˆ˜ 1๊ฐœ ๋ฐ˜ํ™˜)
        int count = session.selectOne("student.getStudentCount");
        System.out.println("์ „์ฒด ํ•™์ƒ ์ˆ˜ : " + count);

        // ์ „์ฒด ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ
        List<Student> list = session.selectList("student.getAllStudents");
        
        // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        for (Student s : list) {
            System.out.println(s.getHakbun() + " / " + s.getIrum() + " / " + s.getHakgwa());
        }

        // ์„ธ์…˜ ์ข…๋ฃŒ
        session.close();
    }
}

๐Ÿ“ ์„ค์ • ํŒŒ์ผ ๋ถ„์„: mybatis-config.xml

<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="org.mariadb.jdbc.Driver"/>
        <property name="url" value="jdbc:mariadb://localhost:3306/mybatisdb"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="StudentMapper1.xml"/>
  </mappers>
</configuration>

๐Ÿ”ง ์„ค์ • โ†’ ์‹คํ–‰ ํ๋ฆ„ ๊ตฌ์กฐ๋„

๐Ÿ“„ mybatis-config.xml
   โ”œโ”€ DB ์ ‘์† ์„ค์ •
   โ””โ”€ Mapper ๋“ฑ๋ก
        โ†“
๐Ÿ“– Resources.getResourceAsReader()   โ† XML ํŒŒ์ผ ์ฝ๊ธฐ
        โ†“
๐Ÿ— SqlSessionFactoryBuilder.build()  โ† Reader โ†’ XML ํŒŒ์‹ฑ
        โ†“
โš™ SqlSessionFactory                 โ† DB ์„ธ์…˜ ์ƒ์„ฑ ๊ณต์žฅ
        โ†“
๐Ÿ”“ factory.openSession()            โ† ์‹ค์ œ DB ์—ฐ๊ฒฐ ๊ฐ์ฒด(SqlSession)
        โ†“
๐Ÿงพ session.selectOne() / selectList()


โœ… ํ•ต์‹ฌ ๊ฐœ๋… ์š”์•ฝ

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช… ์‹ค์ œ ์‚ฌ์šฉ ํŒŒ์ผ
Resources.getResourceAsReader ์„ค์ •ํŒŒ์ผ(xml)์„ ์ฝ์–ด์„œ Reader ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ mybatis-config.xml
SqlSessionFactoryBuilder ์„ค์ •์„ ๋ฐ”ํƒ•์œผ๋กœ MyBatis ์ดˆ๊ธฐํ™” ๊ฐ์ฒด ์ƒ์„ฑ Test1_A.java
SqlSessionFactory ์„ธ์…˜(SqlSession)์„ ๋งŒ๋“œ๋Š” ๊ณต์žฅ ๊ฐ์ฒด ๋‚ด๋ถ€ ์‚ฌ์šฉ
SqlSession ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฐ์ฒด (select, insert ๋“ฑ) Test1_A.java

๐Ÿงช ์‹ค์Šต ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์‹คํ–‰ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ˜์†” ์ถœ๋ ฅ์ด ๋‚˜์™€์•ผ ์ •์ƒ ์ž‘๋™:

์ „์ฒด ํ•™์ƒ ์ˆ˜ : 6
1001 / ๊น€๋ฏผ์ˆ˜ / ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ
1002 / ์ด์˜ํฌ / ์ „์ž๊ณตํ•™๊ณผ
...

๐Ÿงฏ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์›์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
IOException: Could not find resource mybatis-config.xml ๊ฒฝ๋กœ ์˜ค๋ฅ˜ src ํ•˜์œ„ ๋˜๋Š” classpath ํ™•์ธ
ClassNotFoundException: org.mariadb.jdbc.Driver JAR ํŒŒ์ผ ๋ˆ„๋ฝ WEB-INF/lib ํ™•์ธ + Build Path ๋“ฑ๋ก
SQLException: Access denied DB ๊ณ„์ •/๋น„๋ฐ€๋ฒˆํ˜ธ ์˜ค๋ฅ˜ root ๋น„๋ฒˆ ํ™•์ธ, ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ถ€์—ฌ

โœ… ์ตœ์ข… ์ •๋ฆฌ

SqlSessionFactoryBuilder๋Š” MyBatis์—์„œ ์„ค์ •ํŒŒ์ผ์„ ๋ถ„์„ํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜ ํŒฉํ† ๋ฆฌ(SqlSessionFactory) ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์—”์ง„์ด์•ผ.

์ด ์„ค์ •์— ๋”ฐ๋ผ ๋‚˜์ค‘์— selectOne, selectList ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด.

โœ… 1.3๋‹จ๊ณ„: selectOne vs selectList ์‹ค์ „ ์‚ฌ์šฉ๋ฒ• (๐Ÿ“‚ mybatisstudy ๊ธฐ๋ฐ˜)


๐Ÿ“„ ๊ธฐ์ค€ ์‹คํ–‰ํŒŒ์ผ: Test1_A.java

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();

// ๐Ÿ”ธ selectOne: 1๊ฐœ์˜ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜
int count = session.selectOne("student.getStudentCount");
System.out.println("์ „์ฒด ํ•™์ƒ ์ˆ˜ : " + count);

// ๐Ÿ”ธ selectList: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜
List<Student> list = session.selectList("student.getAllStudents");
for (Student s : list) {
    System.out.println(s.getHakbun() + " / " + s.getIrum() + " / " + s.getHakgwa());
}

โ‘  selectOne() ์‚ฌ์šฉ๋ฒ•

๐Ÿ“Œ ์‚ฌ์šฉ๋œ ์ฟผ๋ฆฌ: StudentMapper1.xml

<select id="getStudentCount" resultType="int">
  SELECT COUNT(*) FROM student
</select>

๐Ÿ”Ž ๋ถ„์„

ํ•ญ๋ชฉ ์„ค๋ช…
id="getStudentCount" Java์—์„œ student.getStudentCount๋กœ ํ˜ธ์ถœ
resultType="int" ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ•˜๋‚˜ (ํ•™์ƒ ์ˆ˜)
์‹คํ–‰ ์ฝ”๋“œ session.selectOne("student.getStudentCount")

โœ… ํŠน์ง• ์ •๋ฆฌ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ฆฌํ„ด ํƒ€์ž… ๋‹จ์ผ ๊ฐ’ (int, String, DTO ํ•œ ๊ฐœ ๋“ฑ)
๊ฒฐ๊ณผ 1ํ–‰ 1์—ด๋งŒ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ
์˜ˆ์™ธ 2๊ฐœ ์ด์ƒ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ์‹œ TooManyResultsException ๋ฐœ์ƒ

โ‘ก selectList() ์‚ฌ์šฉ๋ฒ•

๐Ÿ“Œ ์‚ฌ์šฉ๋œ ์ฟผ๋ฆฌ: StudentMapper1.xml

<select id="getAllStudents" resultType="main.Student">
  SELECT * FROM student
</select>

๐Ÿ”Ž ๋ถ„์„

ํ•ญ๋ชฉ ์„ค๋ช…
id="getAllStudents" Java์—์„œ student.getAllStudents๋กœ ํ˜ธ์ถœ
resultType="main.Student" ๊ฒฐ๊ณผ๋ฅผ Student ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘
์‹คํ–‰ ์ฝ”๋“œ session.selectList("student.getAllStudents")

โ— main.Student ๊ฒฝ๋กœ๋Š” DTO ํด๋ž˜์Šค๊ฐ€ src/main/Student.java์— ์žˆ๊ธฐ ๋•Œ๋ฌธ!


๐Ÿ“ฆ DTO ๋งคํ•‘: Student.java

public class Student {
    private int hakbun;
    private String irum;
    private String hakgwa;
    private String addr;
    private String phone;
    private String jumin;
    private int grade;
    // Getter/Setter ์ƒ๋žต
}

๐Ÿ”Ž ์ž๋™ ๋งคํ•‘ ์›๋ฆฌ


โœ… selectOne vs selectList ์ฐจ์ด ์š”์•ฝ

ํ•ญ๋ชฉ selectOne() selectList()
๋ฆฌํ„ด ํƒ€์ž… ๋‹จ์ผ ๊ฐ์ฒด or ๊ธฐ๋ณธํ˜• List<๊ฐ์ฒด>
์˜ˆ์ œ ์ฟผ๋ฆฌ SELECT COUNT(*) FROM ... SELECT * FROM ...
๋งคํ•‘ ๋Œ€์ƒ ๊ธฐ๋ณธํ˜• or DTO ํ•˜๋‚˜ DTO ๋ชฉ๋ก
์˜ˆ์™ธ ๋ฐœ์ƒ ์กฐ๊ฑด ๊ฒฐ๊ณผ 2๊ฐœ ์ด์ƒ์ด๋ฉด ์˜ค๋ฅ˜ 0๊ฐœ์—ฌ๋„ ์ •์ƒ ์ž‘๋™

๐Ÿงช ์ฝ˜์†” ์ถœ๋ ฅ ์˜ˆ์‹œ

์ „์ฒด ํ•™์ƒ ์ˆ˜ : 6
1001 / ๊น€๋ฏผ์ˆ˜ / ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ
1002 / ์ด์˜ํฌ / ์ „์ž๊ณตํ•™๊ณผ
...

๐Ÿ“ ํŒŒ์ผ ๊ธฐ์ค€ ์‚ฌ์šฉ ์ •๋ฆฌ

์‚ฌ์šฉ๋œ XML ํŒŒ์ผ SQL ID Java ํ˜ธ์ถœ ์ฝ”๋“œ ๋ฆฌํ„ด ํƒ€์ž…
StudentMapper1.xml getStudentCount selectOne("student.getStudentCount") int
StudentMapper1.xml getAllStudents selectList("student.getAllStudents") List<Student>

โœ… ์‹ค์Šต ํ™•์ธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ํ™•์ธ ์—ฌ๋ถ€
selectOne() โ†’ COUNT ์ฟผ๋ฆฌ์—์„œ ์ •์ƒ ์ž‘๋™ โœ…
selectList() โ†’ DTO ๋ฆฌ์ŠคํŠธ๋กœ ์ •์ƒ ๋งคํ•‘ โœ…
์ฝ˜์†” ์ถœ๋ ฅ ํ™•์ธ โœ…
DB ์ปฌ๋Ÿผ๋ช… โ†” DTO ํ•„๋“œ๋ช… ์ผ์น˜ ์—ฌ๋ถ€ โœ…

โœ… ์ •๋ฆฌ ์š”์•ฝ

selectOne()์€ ๋‹จ์ผ ๊ฐ’ ๋ฐ˜ํ™˜์—๋งŒ ์‚ฌ์šฉํ•˜๊ณ ,

selectList()๋Š” ์—ฌ๋Ÿฌ ํ–‰์„ List<DTO>๋กœ ๋ฐ˜ํ™˜ํ•ด์„œ for๋ฌธ ๋“ฑ์œผ๋กœ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.

๋‘˜ ๋‹ค Mapper XML์˜ id์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ,

resultType์ด ์ •ํ™•ํžˆ DTO ๋˜๋Š” ๊ธฐ๋ณธํ˜•๊ณผ ๋งค์นญ๋˜๋„๋ก ํ•ด์•ผ ์˜ค๋ฅ˜๊ฐ€ ์•ˆ ๋‚˜.

โœ… 1.4๋‹จ๊ณ„: ๋งคํผ ํŒŒ์ผ ๊ตฌ์„ฑ


โœ… ๋จผ์ € ๋งคํผ ํŒŒ์ผ์ด๋ž€?

MyBatis์—์„œ SQL์„ ์ •์˜ํ•ด๋‘๋Š” XML ํŒŒ์ผ์ด๋ฉฐ,

Java ์ฝ”๋“œ์—์„œ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ ID, ๊ฒฐ๊ณผ ๋งคํ•‘ ๋ฐฉ์‹, ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๋“ฑ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ด์•ผ.


๐Ÿ“„ ์‹ค์ œ ๋งคํผ ํŒŒ์ผ: StudentMapper1.xml (ํŒŒ์ผ์—์„œ ์ถ”์ถœ)

<?xml version="1.0" encoding="UTF-8" ?>
<!-- โœ… ์ด XML์€ MyBatis 3.0์šฉ ๋งคํผ ๋ฌธ์„œ์ž„์„ ๋ช…์‹œ -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- โœ… ์ด ๋งคํผ์˜ ์‹๋ณ„ ์ด๋ฆ„(namespace). Java์—์„œ ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉ -->
<mapper namespace="student">

  <!-- โœ… 1. ์ „์ฒด ํ•™์ƒ ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” SQL -->
  <!-- id="getStudentCount": Java ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ฟผ๋ฆฌ ์ด๋ฆ„ -->
  <!-- resultType="int": ๊ฒฐ๊ณผ๊ฐ€ ์ •์ˆ˜ ํ•˜๋‚˜ (COUNT) -->
  <select id="getStudentCount" resultType="int">
    SELECT COUNT(*) FROM student
    <!-- โœ… student ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ํ–‰์˜ ์ˆ˜(ํ•™์ƒ ์ˆ˜)๋ฅผ ๊ฐ€์ ธ์˜ด -->
  </select>

  <!-- โœ… 2. ์ „์ฒด ํ•™์ƒ ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๋Š” SQL -->
  <!-- resultType="main.Student": ๊ฐ ํ–‰์ด Student ๊ฐ์ฒด๋กœ ๋งคํ•‘๋จ -->
  <select id="getAllStudents" resultType="main.Student">
    SELECT * FROM student
    <!-- โœ… ๋ชจ๋“  ํ•™์ƒ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ List<Student> ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ -->
  </select>

  <!-- โœ… 3. 1ํ•™๋…„ ํ•™์ƒ๋งŒ ์กฐํšŒํ•˜๋Š” SQL -->
  <select id="getGrade1Students" resultType="main.Student">
    SELECT * FROM student WHERE grade = 1
    <!-- โœ… grade ์ปฌ๋Ÿผ์ด 1์ธ (์ฆ‰, 1ํ•™๋…„) ํ•™์ƒ๋งŒ ๊ฐ€์ ธ์˜ด -->
  </select>

  <!-- โœ… 4. ์ด๋ฆ„์ด '๊น€'์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•™์ƒ๋งŒ ์กฐํšŒํ•˜๋Š” SQL -->
  <select id="getKimStudents" resultType="main.Student">
    SELECT * FROM student WHERE irum LIKE '๊น€%'
    <!-- โœ… irum(์ด๋ฆ„) ์ปฌ๋Ÿผ์ด '๊น€'์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์กฐํšŒ -->
    <!-- โœ… '๊น€%'๋Š” '๊น€OO', '๊น€์ฒ ์ˆ˜', '๊น€ํ•˜๋‚˜' ๋“ฑ ๋ชจ๋“  ๊น€์”จ๋ฅผ ์˜๋ฏธํ•จ -->
  </select>

  <!-- โœ… 5. ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋กœ ์—ฌํ•™์ƒ ํŒ๋ณ„ํ•ด์„œ ์กฐํšŒํ•˜๋Š” SQL -->
  <select id="getFemaleStudents" resultType="main.Student">
    SELECT * FROM student
    WHERE SUBSTR(jumin, 8, 1) = '2' OR SUBSTR(jumin, 8, 1) = '4'
    <!-- โœ… jumin(์ฃผ๋ฏผ๋ฒˆํ˜ธ)์—์„œ 8๋ฒˆ์งธ ์ž๋ฆฌ๊ฐ€ ์„ฑ๋ณ„ ์ฝ”๋“œ -->
    <!-- โœ… '2' ๋˜๋Š” '4'๋Š” ์—ฌ์ž (1980๋…„๋Œ€ ์ดํ›„ ์ฃผ๋ฏผ๋ฒˆํ˜ธ ๊ธฐ์ค€) -->
    <!-- โœ… SUBSTR(jumin, 8, 1)์€ jumin์—์„œ 8๋ฒˆ์งธ ๊ธ€์ž ํ•˜๋‚˜๋ฅผ ์ถ”์ถœ -->
  </select>

</mapper>


๐Ÿ“Œ ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ์ •๋ฆฌ

๊ตฌ์„ฑ ์š”์†Œ ์˜ˆ์‹œ ์„ค๋ช…
namespace "student" Java ์ฝ”๋“œ์—์„œ ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๋‘์‚ฌ
<select> id="getAllStudents" Java์—์„œ ํ˜ธ์ถœํ•  SQL ์‹๋ณ„์ž
resultType "main.Student" SQL ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ž๋™ ๋งคํ•‘ํ•  DTO ํƒ€์ž…
parameterType (์ƒ๋žต๋จ) ์—†์Œ โ†’ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๋“ค ย 

โœ… 1. namespace="student"

session.selectList("student.getAllStudents");

๐Ÿ‘‰ ์—ฌ๊ธฐ์„œ student๋Š” XML์˜ <mapper namespace="student">์™€ ๋งค์นญ๋˜๋Š” ๊ฒƒ!


โœ… 2. <select> ํƒœ๊ทธ

๊ฐ SQL ๊ตฌ๋ฌธ์„ ์ •์˜ํ•˜๋Š” ํ•ต์‹ฌ ํƒœ๊ทธ๋กœ, ์ตœ์†Œ id์™€ resultType์„ ํฌํ•จํ•ด์•ผ ํ•ด.

์˜ˆ: getAllStudents

<select id="getAllStudents" resultType="main.Student">
  SELECT * FROM student
</select>
ํ•ญ๋ชฉ ์„ค๋ช…
id ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  SQL ์‹๋ณ„์ž
resultType ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•  Java ํด๋ž˜์Šค (Student)
parameterType (์ƒ๋žต) ํŒŒ๋ผ๋ฏธํ„ฐ ์—†๋Š” ์ฟผ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žต ๊ฐ€๋Šฅ

โœ… 3. ์ „์ฒด ๋งคํผ ๊ตฌ์กฐ ์‹œ๊ฐํ™”

StudentMapper1.xml
  โ””โ”€โ”€ <mapper namespace="student">
        โ”œโ”€โ”€ <select id="getStudentCount" resultType="int">
        โ”œโ”€โ”€ <select id="getAllStudents" resultType="main.Student">
        โ”œโ”€โ”€ <select id="getGrade1Students" resultType="main.Student">
        โ”œโ”€โ”€ ...

โœ… 4. resultType="main.Student" ์ž๋™ ๋งคํ•‘ ์ž‘๋™ ๋ฐฉ์‹

SELECT * FROM student
โ†’ DB ๊ฒฐ๊ณผ: hakbun = 1001 โ†’ student.setHakbun(1001)

๐Ÿ’ก ๋„ˆ์˜ main.Student.java ํด๋ž˜์Šค ๊ตฌ์กฐ๋Š” ์ด๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

public class Student {
    private int hakbun;
    private String irum;
    private String hakgwa;
    ...
}

์ฆ‰, resultType="main.Student"์™€ ์™„๋ฒฝํ•˜๊ฒŒ ๋งคํ•‘๋จ.


โœ… ์‹ค์Šต ์ •๋ฆฌ: ์ฟผ๋ฆฌ ID๋ณ„ ๋งคํผ ๊ตฌ์กฐ

SQL ID ์„ค๋ช… ๋ฐ˜ํ™˜ ํƒ€์ž…
getStudentCount ์ „์ฒด ํ•™์ƒ ์ˆ˜ ์กฐํšŒ int
getAllStudents ์ „์ฒด ํ•™์ƒ ๋ฆฌ์ŠคํŠธ List<Student>
getGrade1Students 1ํ•™๋…„ ํ•™์ƒ ํ•„ํ„ฐ List<Student>
getKimStudents ์„ฑ์ด โ€˜๊น€โ€™์”จ List<Student>
getFemaleStudents ์—ฌํ•™์ƒ ํŒ๋ณ„ List<Student>
ย  ย  ย 

โœ… ๋งคํผ XML ์ •๋ฆฌ ์š”์•ฝํ‘œ

ํƒœ๊ทธ ์—ญํ• 
<!DOCTYPE mapper ...> XML ๋ฌธ๋ฒ• ์œ ํšจ์„ฑ ์„ ์–ธ
<mapper namespace="..."> ํ˜ธ์ถœ ์‹๋ณ„์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜
<select id="..." resultType="..."> SQL ์ •์˜ + ๊ฒฐ๊ณผ ๋งคํ•‘ ํƒ€์ž… ์ง€์ •

โœ… 1.5๋‹จ๊ณ„: resultType vs resultMap ๋น„๊ต (์‹ค์ „ ์ฝ”๋“œ ์ค‘์‹ฌ)


๐Ÿ”ธ ๋จผ์ € ์š”์•ฝ ๋น„๊ต๋ถ€ํ„ฐ

๊ตฌ๋ถ„ resultType resultMap
ํ•ต์‹ฌ ์—ญํ•  DB ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘ ๋ณต์žกํ•œ ๋งคํ•‘, ๋ณ„๋ช…(alias), ์กฐ์ธ ๊ฒฐ๊ณผ ์ˆ˜๋™ ๋งคํ•‘
์„ค์ • ๋ฐฉ์‹ resultType="main.Student" resultMap="studentResultMap"
์‚ฌ์šฉ ์กฐ๊ฑด DB ์ปฌ๋Ÿผ๋ช… == Java ํ•„๋“œ๋ช…์ผ ๋•Œ ์ถ”์ฒœ ์ปฌ๋Ÿผ๋ช… โ‰  ํ•„๋“œ๋ช…์ผ ๋•Œ ํ•„์ˆ˜
์žฅ์  ๋งค์šฐ ๊ฐ„๋‹จํ•จ (์ž๋™ ๋งคํ•‘) ๋งคํ•‘ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ธํžˆ ์ •์˜ ๊ฐ€๋Šฅ
๋‹จ์  ์ปฌ๋Ÿผ๋ช…๊ณผ ํ•„๋“œ๋ช…์ด ๋‹ค๋ฅด๋ฉด ๋งคํ•‘ ์‹คํŒจ ์„ค์ •์ด ์กฐ๊ธˆ ๋” ๋ณต์žกํ•จ

โœ… ์‹ค์Šต 1: ํ˜„์žฌ ๋„ˆ์˜ ๋งคํผ๋Š” ์ „๋ถ€ resultType ์‚ฌ์šฉ ์ค‘

์˜ˆ: StudentMapper1.xml

<select id="getAllStudents" resultType="main.Student">
  SELECT * FROM student
</select>

โ†’ ์ด ๊ฒฝ์šฐ๋Š” DB ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ๋ช…(hakbun, irum, hakgwa, โ€ฆ)๊ณผ

Java DTO ํ•„๋“œ๋ช…(main.Student)์ด ์™„๋ฒฝํ•˜๊ฒŒ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— resultType์œผ๋กœ ์ถฉ๋ถ„ํ•จ.


โœ… ์‹ค์Šต 2: ์ปฌ๋Ÿผ๋ช…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ โ†’ resultMap์ด ํ•„์š”ํ•จ

๐Ÿ“Œ ์˜ˆ์ œ ์ƒํ™ฉ: ๋ณ„์นญ(alias)์„ ์“ฐ๊ฑฐ๋‚˜, ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•  ๋•Œ

SELECT hakbun AS stu_no, irum AS name FROM student

์ด ๊ฒฐ๊ณผ๋Š” Java์˜ Student ํด๋ž˜์Šค์™€ ํ•„๋“œ๋ช…์ด ๋‹ค๋ฆ„

โ†’ ์ž๋™ ๋งคํ•‘ ์‹คํŒจ! โ†’ resultMap ํ•„์š”


โœ… ์‹ค์Šต ์ฝ”๋“œ ์˜ˆ์‹œ (ํŒŒ์ผ ํ™•์žฅ์šฉ)

๐Ÿ”ง 1) ๋งคํผ์— resultMap ์ •์˜ ์ถ”๊ฐ€

<resultMap id="studentResultMap" type="main.Student">
  <result property="hakbun" column="stu_no"/>
  <result property="irum" column="name"/>
</resultMap>

๐Ÿ”ง 2) select์— resultMap ์ ์šฉ

<select id="getStudentsWithAlias" resultMap="studentResultMap">
  SELECT hakbun AS stu_no, irum AS name FROM student
</select>

โ˜ ์ด ์ฟผ๋ฆฌ๋Š” resultType์œผ๋กœ๋Š” ๋งคํ•‘์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ resultMap์œผ๋กœ๋งŒ ๊ฐ€๋Šฅ!


๐Ÿ”ง 3) Java์—์„œ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์‹œ

List<Student> list = session.selectList("student.getStudentsWithAlias");
for (Student s : list) {
    System.out.println(s.getHakbun() + " / " + s.getIrum());
}

โœ… ์‹œ๊ฐ์  ๋น„๊ต ์š”์•ฝ

โœ… resultType ๋ฐฉ์‹ (ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘)

<select id="getAllStudents" resultType="main.Student">
  SELECT * FROM student
</select>

โœ… resultMap ๋ฐฉ์‹ (๋ณต์žกํ•œ ๋งคํ•‘์— ํ•„์ˆ˜)

<resultMap id="studentResultMap" type="main.Student">
  <result property="hakbun" column="stu_no"/>
  <result property="irum" column="name"/>
</resultMap>

<select id="getStudentsWithAlias" resultMap="studentResultMap">
  SELECT hakbun AS stu_no, irum AS name FROM student
</select>

โœ… ์ •๋ฆฌ ์š”์•ฝ

ํ•ญ๋ชฉ resultType resultMap
๊ธฐ๋ณธ ๋งคํ•‘ ๋ฐฉ์‹ ์ž๋™ ๋งคํ•‘ ์ˆ˜๋™ ๋ช…์‹œ ๋งคํ•‘
์‚ฌ์šฉ ์กฐ๊ฑด ์ปฌ๋Ÿผ๋ช…๊ณผ DTO ํ•„๋“œ๋ช…์ด ๊ฐ™์„ ๋•Œ ์ปฌ๋Ÿผ๋ช… โ‰  ํ•„๋“œ๋ช… / JOIN / alias
์‚ฌ์šฉ๋ฒ• ๊ฐ„๋‹จ ๋ช…์‹œ์  ์„ค์ • ํ•„์š”
์˜ˆ์‹œ ์ƒํ™ฉ SELECT * FROM student SELECT โ€ฆ AS alias, JOIN ๋“ฑ

โœ… ์‹ค์Šต ํ™•์žฅ ๊ณผ์ œ (๋„ค ํ”„๋กœ์ ํŠธ์— ๋ฐ˜์˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ)

โž• ๋„์ „ ์‹ค์Šต:

  1. StudentMapper1.xml์— ๋ณ„์นญ ์ฟผ๋ฆฌ ์ถ”๊ฐ€
  2. resultMap ์ž‘์„ฑ
  3. Java์—์„œ selectList๋กœ ํ˜ธ์ถœ
  4. ์ฝ˜์†” ์ถœ๋ ฅ๊นŒ์ง€ ํ™•์ธ