** ๐Ÿ“Œ 6.1๋‹จ๊ณ„: ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ๋งคํผ ๊ตฌ์กฐ๋ž€? **

(๐Ÿ“‚ dao/StudentMapper.java, mapper/StudentMapper.xml ๊ธฐ์ค€)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  XML + ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ Mapper ID ๋Œ€์‹  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ SQL ์‹คํ–‰
ํšจ๊ณผ ํ˜ธ์ถœ๋ถ€ ๊ฐ„๊ฒฐํ™”, ์˜คํƒ€ ๋ฐฉ์ง€, ์ž๋™ ์™„์„ฑ ๊ฐ€๋Šฅ
ํ•ต์‹ฌ ์š”์†Œ @Mapper, StudentMapper.java, StudentMapper.xml, namespace ์ผ์น˜

โœ… 1. ๊ธฐ์กด ๋ฐฉ์‹์˜ ๋‹จ์  (SqlSession ์ง์ ‘ ์‚ฌ์šฉ ๋ฐฉ์‹)

session.selectList("student.getAllStudents");

โœ… 2. ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์˜ ํ•ต์‹ฌ

ํŒŒ์ผ๋ช… ์—ญํ• 
StudentMapper.java ์ธํ„ฐํŽ˜์ด์Šค๋กœ SQL ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ •์˜
StudentMapper.xml XML๋กœ ์‹ค์ œ ์ฟผ๋ฆฌ ์ •์˜ (namespace๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๋กœ์™€ ๊ฐ™์•„์•ผ ํ•จ)

โœ… 3. ๊ตฌ์กฐ ๊ตฌํ˜„ ์‹ค์Šต

๐Ÿ”น (1) Mapper ์ธํ„ฐํŽ˜์ด์Šค: dao/StudentMapper.java

package dao;

import java.util.List;
import main.Student;

public interface StudentMapper {
    List<Student> getAllStudents();                         // SELECT *
    Student getStudentByHakbun(int hakbun);                // SELECT WHERE
    int insertStudent(Student s);                          // INSERT
    int updateStudentGradeAndPhone(Student s);             // UPDATE
    int deleteStudentByHakbun(int hakbun);                 // DELETE
}

๐Ÿ”น (2) Mapper XML: mapper/StudentMapper.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">

<mapper namespace="dao.StudentMapper">  <!-- โœ… ์ธํ„ฐํŽ˜์ด์Šค์™€ ์™„๋ฒฝํžˆ ์ผ์น˜ํ•ด์•ผ ํ•จ -->

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

  <select id="getStudentByHakbun" parameterType="int" resultType="main.Student">
    SELECT * FROM student WHERE hakbun = #{hakbun}
  </select>

  <insert id="insertStudent" parameterType="main.Student">
    INSERT INTO student (hakbun, irum, hakgwa, addr, phone, jumin, grade)
    VALUES (#{hakbun}, #{irum}, #{hakgwa}, #{addr}, #{phone}, #{jumin}, #{grade})
  </insert>

  <update id="updateStudentGradeAndPhone" parameterType="main.Student">
    UPDATE student SET grade = #{grade}, phone = #{phone}
    WHERE hakbun = #{hakbun}
  </update>

  <delete id="deleteStudentByHakbun" parameterType="int">
    DELETE FROM student WHERE hakbun = #{hakbun}
  </delete>

</mapper>

โœ… 4. ํ˜ธ์ถœ ์˜ˆ์‹œ (์ปจํŠธ๋กค๋Ÿฌ/์„œ๋น„์Šค ๋“ฑ์—์„œ ์‚ฌ์šฉ)


SqlSession session = factory.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);

List<Student> list = mapper.getAllStudents();
Student s = mapper.getStudentByHakbun(1001);

Student newS = new Student(2030, "์œ ๋‹ค์ธ", "AI๊ณผ", "์„œ์šธ", "010-2222-3333", "010101-4123456", 2);
mapper.insertStudent(newS);
session.commit();

session.close();

โœ… 5. ๋งคํผ ์—ฐ๊ฒฐ ์กฐ๊ฑด ์š”์•ฝ

ํ•ญ๋ชฉ ํ•„์ˆ˜ ์กฐ๊ฑด
mapper.xml์˜ namespace ์ธํ„ฐํŽ˜์ด์Šค FQCN (dao.StudentMapper)์™€ ์™„์ „ ์ผ์น˜
๋ฉ”์„œ๋“œ๋ช… XML์˜ <select id="..."> ์™€ ์ •ํ™•ํžˆ ์ผ์น˜
ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… parameterType๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ํŒŒ๋ผ๋ฏธํ„ฐ ๋™์ผํ•ด์•ผ ํ•จ
๋ฐ˜ํ™˜ ํƒ€์ž… resultType ๋˜๋Š” resultMap๊ณผ ์ผ์น˜

โœ… 6. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
StudentMapper.java์™€ XML์ด ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”๊ฐ€? โœ… ย 
namespace๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๋กœ์™€ ์™„์ „ ์ผ์น˜ํ•˜๋Š”๊ฐ€? โœ… ย 
๋ฉ”์„œ๋“œ ์ด๋ฆ„ = ID ์ด๋ฆ„ = ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ธ๊ฐ€? โœ… ย 
SqlSession์œผ๋กœ getMapper()๋กœ ์ •์ƒ ์ž‘๋™๋˜๋Š”๊ฐ€? โœ… ย 

โœ… ์‹ค๋ฌด ํŒ

ํ•ญ๋ชฉ ํŒ
์Šคํ”„๋ง ํ™˜๊ฒฝ @Mapper, @Autowired StudentMapper mapper ๋กœ DI ๊ฐ€๋Šฅ
ํ…Œ์ŠคํŠธ ์‹œ mapper = session.getMapper(...) ๊ตฌ์กฐ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
์ž๋™์™„์„ฑ ์ง€์› IDE์—์„œ Mapper ๋ฉ”์„œ๋“œ ์ž๋™์™„์„ฑ + ํƒ€์ž… ์ถ”๋ก  ๊ฐ€๋Šฅ
์ธํ„ฐํŽ˜์ด์Šค์— @Select, @Insert ๋ถ™์ด๋ฉด XML ์—†์ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹) ย 

โœ… 6.2๋‹จ๊ณ„: MyBatis Config ์„ค์ • ํ™•์žฅ โ€“ ํƒœ๊ทธ ์‹ค์Šต

(๐Ÿ“„ mybatis-config.xml ๊ธฐ์ค€, ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ๋งคํผ ๊ตฌ์กฐ์— ๋Œ€์‘)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ Mapper๋ฅผ mybatis-config.xml์— ๋“ฑ๋ก
์ฃผ์š” ํƒœ๊ทธ <mappers>, <mapper resource="...">, <mapper class="...">
ํšจ๊ณผ SqlSessionFactory ์ƒ์„ฑ ์‹œ, Mapper XML & Java ์ธํ„ฐํŽ˜์ด์Šค ์ž๋™ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ

โœ… 1. ์„ค์ • ์œ„์น˜: mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

  <!-- ๐Ÿ’ก ๋‹ค๋ฅธ ์„ค์ • (์˜ˆ: ํ™˜๊ฒฝ์„ค์ • ๋“ฑ)์ด ์˜ฌ ์ˆ˜๋„ ์žˆ์Œ -->

  <mappers>
    <!-- โœ… 1) XML ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋ก -->
    <mapper resource="mapper/StudentMapper.xml"/>

    <!-- โœ… 2) ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค(Java) ๊ธฐ๋ฐ˜์œผ๋กœ ๋“ฑ๋ก (Spring ํ™˜๊ฒฝ or MyBatis ์ง์ ‘ ์‚ฌ์šฉ ์‹œ) -->
    <!-- <mapper class="dao.StudentMapper"/> -->
  </mappers>
</configuration>

โš ๏ธ ๋‘˜ ๋‹ค ๋“ฑ๋กํ•˜๋ฉด ์ค‘๋ณต ์—๋Ÿฌ!

๋ณดํ†ต์€ resource ๋ฐฉ์‹๋งŒ ์‚ฌ์šฉ, ๋˜๋Š” ์Šคํ”„๋ง์—์„œ๋Š” @MapperScan์œผ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ.


โœ… 2. ๋“ฑ๋ก ๋ฐฉ์‹ ๋น„๊ต ์š”์•ฝ

๋“ฑ๋ก ๋ฐฉ์‹ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ
resource="..." XML ๊ธฐ๋ฐ˜ ๋งคํผ ๋“ฑ๋ก mapper/StudentMapper.xml
class="..." ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ๋ก (์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ๋˜๋Š” Spring์šฉ) dao.StudentMapper

โœ… 3. ํ˜„์žฌ ๊ตฌ์กฐ ๊ธฐ์ค€ ์˜ˆ์‹œ (mapper ํด๋” ์•ˆ์— XML ์žˆ์Œ)

โœ… ์ด ๊ตฌ์กฐ์— ๋งž๋Š” ์„ค์ • ์˜ˆ:

๐Ÿ“ฆ mybatisstudy
 โ”ฃ ๐Ÿ“ dao
 โ”ƒ โ”— ๐Ÿ“„ StudentMapper.java
 โ”ฃ ๐Ÿ“ mapper
 โ”ƒ โ”— ๐Ÿ“„ StudentMapper.xml
 โ”ฃ ๐Ÿ“„ mybatis-config.xml
<mappers>
  <mapper resource="mapper/StudentMapper.xml"/>
</mappers>

โœ… 4. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
XML ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ <mapper>๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 
XML ๊ฒฝ๋กœ๊ฐ€ resource ๊ฒฝ๋กœ ๊ธฐ์ค€์œผ๋กœ ์ •ํ™•ํ•œ๊ฐ€ โœ… ย 
mybatis-config.xml์ด SqlSessionFactory์— ๋กœ๋”ฉ๋˜๊ณ  ์žˆ๋Š”๊ฐ€ โœ… ย 
์ค‘๋ณต ๋“ฑ๋ก ์—†์ด 1ํšŒ๋งŒ ์„ ์–ธ๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 

โœ… ์‹ค๋ฌด ํŒ

์ƒํ™ฉ ํŒ
XML ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ <mapper resource="..."/> ๋ฐฉ์‹ ์‚ฌ์šฉ
์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ @Mapper + @MapperScan(basePackages = "...")
์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹ ์‚ฌ์šฉ ์‹œ <mapper class="..."/>๋กœ๋„ ๋™์ž‘
์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ค‘๋ณต ๋“ฑ๋ก ๋˜๋Š” XML ์œ„์น˜ ์˜คํƒ€ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ

โœ… 6.3๋‹จ๊ณ„: ์ž๋™ ๋งคํผ ์Šค์บ” โ€“ @Mapper ์–ด๋…ธํ…Œ์ด์…˜ ํ™œ์šฉ

(๐Ÿ“‚ Spring ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐ, StudentMapper.java ๊ธฐ์ค€)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  MyBatis Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ XML ๋“ฑ๋ก ์—†์ด ์ž๋™ ์ธ์‹ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ
์ฃผ์š” ๊ธฐ์ˆ  @Mapper, @MapperScan, XML ์—†์ด๋„ ์ž‘๋™ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ
์žฅ์  ๊ฐ„๊ฒฐํ•œ ์„ค์ •, IDE ์ž๋™ ์™„์„ฑ, ์ปดํŒŒ์ผ ์‹œ์  ์˜ค๋ฅ˜ ๊ฐ์ง€

โœ… 1. ๊ธฐ์กด ๋ฐฉ์‹ vs ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹ ๋น„๊ต

๋ฐฉ์‹ ํŠน์ง• ๋“ฑ๋ก ์œ„์น˜
XML ๋ฐฉ์‹ (<mappers>) mapper/StudentMapper.xml + ์„ค์ • ํ•„์š” mybatis-config.xml
์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹ (@Mapper) ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ๋งคํ•‘ Spring ์„ค์ • ํด๋ž˜์Šค ๋˜๋Š” @MapperScan

โœ… 2. ์ž๋™ ๋งคํผ ์Šค์บ” ๋ฐฉ์‹ ์‚ฌ์šฉ ์˜ˆ

๐Ÿ”น (1) ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค์— @Mapper ์ถ”๊ฐ€

package dao;

import java.util.List;
import main.Student;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StudentMapper {
    List<Student> getAllStudents();
    Student getStudentByHakbun(int hakbun);
    int insertStudent(Student s);
    int updateStudentGradeAndPhone(Student s);
    int deleteStudentByHakbun(int hakbun);
}

@Mapper๊ฐ€ ๋ถ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” Spring์ด ์ž๋™์œผ๋กœ ๋งคํผ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•จ.

๐Ÿ’ก XML์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด namespace์™€ id๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•จ.


๐Ÿ”น (2) ์„ค์ • ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์ธ ํด๋ž˜์Šค์— @MapperScan ๋“ฑ๋ก

@SpringBootApplication
@MapperScan(basePackages = "dao")  // ๋˜๋Š” @Mapper๊ฐ€ ๋ถ™์€ ํŒจํ‚ค์ง€ ์ „์ฒด
public class MyBatisSpringBootApp {
    public static void main(String[] args) {
        SpringApplication.run(MyBatisSpringBootApp.class, args);
    }
}

@MapperScan์€ @Mapper๊ฐ€ ๋ถ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ์ž๋™ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์—ญํ• !


โœ… 3. ์–ด๋…ธํ…Œ์ด์…˜๋งŒ์œผ๋กœ SQL ์ž‘์„ฑ๋„ ๊ฐ€๋Šฅ (XML ์—†์ด!)

@Mapper
public interface StudentMapper {

    @Select("SELECT * FROM student")
    List<Student> getAllStudents();

    @Insert("INSERT INTO student (hakbun, irum, hakgwa, grade) VALUES (#{hakbun}, #{irum}, #{hakgwa}, #{grade})")
    int insertStudent(Student s);
}

โš ๏ธ ๋‹จ์ : SQL์ด ์ฝ”๋“œ์— ์„ž์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ๋Š” XML์ด ๋” ์œ ๋ฆฌํ•จ


โœ… 4. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
@Mapper๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ถ™์–ด ์žˆ๋Š”๊ฐ€ โœ… ย 
@MapperScan์ด Spring ์„ค์ •์— ๋“ฑ๋ก๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 
XML ์—†์ด ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š”๊ฐ€ โœ… ย 
IDE์—์„œ ์ž๋™ ์™„์„ฑ, ์—๋Ÿฌ ๊ฐ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€ โœ… ย 

โœ… ์‹ค๋ฌด ํŒ

ํ•ญ๋ชฉ ํŒ
๋‹จ์ˆœํ•œ ์ฟผ๋ฆฌ @Select, @Insert ๋“ฑ์œผ๋กœ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๋ณต์žกํ•œ SQL, ์กฐ์ธ XML์„ ์„ ํ˜ธํ•จ (resultMap, <sql>, <include>, <foreach>)
@MapperScan์€ Application ํด๋ž˜์Šค ๋˜๋Š” ์„ค์ • ํด๋ž˜์Šค์— 1ํšŒ ์„ ์–ธํ•˜๋ฉด ๋จ ย 
@Mapper๋งŒ ๋ถ™์ด๊ณ  @MapperScan ์—†์œผ๋ฉด ์ž‘๋™ ์•ˆ ๋จ (Spring Boot ๊ธฐ์ค€) ย