** ๐Ÿ“Œ5.1๋‹จ๊ณ„: DAO ํด๋ž˜์Šค ์„ค๊ณ„ โ€“ StudentDao ๋ถ„๋ฆฌ ๊ตฌ์กฐ **

(๐Ÿ“‚ StudentDao.java, StudentMapper1.xml, main.Student ๊ธฐ๋ฐ˜)


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  DB ์ ‘๊ทผ ๋กœ์ง์„ DAO ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ
๊ตฌ์กฐ ๋ณ€ํ™” SqlSession ์ฝ”๋“œ โ†’ DAO ๋‚ด๋ถ€๋กœ ์ด๋™
๊ธฐ๋Œ€ ํšจ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ DB ๋กœ์ง ๋ถ„๋ฆฌ, ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

โœ… 1. DAO ํด๋ž˜์Šค ๊ธฐ๋ณธ ์„ค๊ณ„ (StudentDao.java)

package dao;

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 StudentDao {

    private static SqlSessionFactory factory;

    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            factory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<Student> selectAll() {
        SqlSession session = factory.openSession();
        List<Student> list = session.selectList("student.getAllStudents");
        session.close();
        return list;
    }

    public Student selectByHakbun(int hakbun) {
        SqlSession session = factory.openSession();
        Student result = session.selectOne("student.getStudentByHakbun", hakbun);
        session.close();
        return result;
    }

    public int insert(Student s) {
        SqlSession session = factory.openSession();
        int result = session.insert("student.insertStudent", s);
        session.commit();
        session.close();
        return result;
    }

    public int update(Student s) {
        SqlSession session = factory.openSession();
        int result = session.update("student.updateStudentGradeAndPhone", s);
        session.commit();
        session.close();
        return result;
    }

    public int delete(int hakbun) {
        SqlSession session = factory.openSession();
        int result = session.delete("student.deleteStudentByHakbun", hakbun);
        session.commit();
        session.close();
        return result;
    }
}


โœ… 2. Java ํ˜ธ์ถœ ์ฝ”๋“œ์—์„œ DAO ์‚ฌ์šฉํ•˜๊ธฐ (Test1_A.java ๋˜๋Š” Controller)

StudentDao dao = new StudentDao();

List<Student> list = dao.selectAll();
for (Student s : list) {
    System.out.println(s.getHakbun() + " / " + s.getIrum());
}

Student newS = new Student();
newS.setHakbun(2028);
newS.setIrum("์†ก๋‹ค์ •");
newS.setHakgwa("์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ");
int result = dao.insert(newS);
System.out.println("์‚ฝ์ž… ๊ฒฐ๊ณผ: " + result);

โœ… 3. Mapper XML์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•  ID๋“ค

๊ธฐ๋Šฅ ID ์„ค๋ช…
์ „์ฒด ์กฐํšŒ getAllStudents ๊ธฐ์กด SELECT *
ํ•œ ๋ช… ์กฐํšŒ getStudentByHakbun WHERE hakbun = #{hakbun}
์‚ฝ์ž… insertStudent ๊ธฐ์กด INSERT ๋ฌธ
์ˆ˜์ • updateStudentGradeAndPhone ๊ธฐ์กด UPDATE ๋ฌธ
์‚ญ์ œ deleteStudentByHakbun ๊ธฐ์กด DELETE ๋ฌธ

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

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
DAO์— ๋ชจ๋“  DB ์ ‘๊ทผ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ”๋Š”๊ฐ€ โœ… ย 
์™ธ๋ถ€์—์„œ๋Š” StudentDao๋งŒ ํ˜ธ์ถœํ•˜๋Š”๊ฐ€ โœ… ย 
SqlSession์€ DAO ๋‚ด๋ถ€์—์„œ๋งŒ ์—ด๊ณ  ๋‹ซ๋Š”๊ฐ€ โœ… ย 
commit/rollback์ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ์—๋งŒ commit์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”๊ฐ€ โœ… ย 

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

ํ•ญ๋ชฉ ์„ค๋ช…
SqlSessionFactory๋Š” static ๋ธ”๋ก์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™” ์„ฑ๋Šฅ๊ณผ ์•ˆ์ „์„ฑ ํ–ฅ์ƒ
DAO๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต(์„œ๋น„์Šค)๋ณด๋‹ค ํ•˜๋‹จ์— ๋ฐฐ์น˜ ๋ช…ํ™•ํ•œ ๊ณ„์ธตํ™”
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์‹œ try-catch-finally ๋˜๋Š” try-with-resources ์‚ฌ์šฉ ๊ถŒ์žฅ ์˜ค๋ฅ˜ ์ „ํŒŒ ๋ฐฉ์ง€

โœ… ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ ์˜ˆ์‹œ (MVC ์Šคํƒ€์ผ)

๐Ÿ“‚ main
 โ”ฃ ๐Ÿ“„ Student.java
๐Ÿ“‚ dao
 โ”ฃ ๐Ÿ“„ StudentDao.java
๐Ÿ“‚ mapper
 โ”ฃ ๐Ÿ“„ StudentMapper1.xml
๐Ÿ“‚ service (์„ ํƒ)
 โ”ฃ ๐Ÿ“„ StudentService.java
๐Ÿ“‚ controller
 โ”ฃ ๐Ÿ“„ Test1_A.java (๋˜๋Š” ์„œ๋ธ”๋ฆฟ)

โœ… 5.2๋‹จ๊ณ„: DTO ํด๋ž˜์Šค ์„ค๊ณ„ โ€“ Student.java ํ•„๋“œ ๊ตฌ์กฐ ์ •๋ฆฌ

(๐Ÿ“‚ main.Student ๊ธฐ์ค€, DB ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ๊ณผ ๋งคํ•‘)


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  DB์˜ ์ปฌ๋Ÿผ ๊ตฌ์กฐ์™€ 1:1 ๋งคํ•‘๋˜๋Š” DTO(Data Transfer Object)๋ฅผ ์„ค๊ณ„
์ฃผ์š” ํฌ์ธํŠธ ํ•„๋“œ ์ •๋ ฌ, ์ ‘๊ทผ ์ œ์–ด, ์ƒ์„ฑ์ž, getter/setter, toString
๊ธฐ๋Œ€ ํšจ๊ณผ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ + MyBatis ๋งคํ•‘ ์ผ๊ด€์„ฑ ์œ ์ง€

โœ… 1. DB ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ๊ฐ€์ •

CREATE TABLE student (
  hakbun INT PRIMARY KEY,
  irum VARCHAR(50),
  hakgwa VARCHAR(50),
  addr VARCHAR(100),
  phone VARCHAR(20),
  jumin VARCHAR(20),
  grade INT
);

โœ… 2. DTO ํด๋ž˜์Šค ์ •๋ฆฌ (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;         // ํ•™๋…„

    // โœ… ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
    public Student() {}

    // โœ… ์ „์ฒด ํ•„๋“œ ์ƒ์„ฑ์ž (์„ ํƒ์ )
    public Student(int hakbun, String irum, String hakgwa, String addr,
                   String phone, String jumin, int grade) {
        this.hakbun = hakbun;
        this.irum = irum;
        this.hakgwa = hakgwa;
        this.addr = addr;
        this.phone = phone;
        this.jumin = jumin;
        this.grade = grade;
    }

    // โœ… Getter/Setter
    public int getHakbun() { return hakbun; }
    public void setHakbun(int hakbun) { this.hakbun = hakbun; }

    public String getIrum() { return irum; }
    public void setIrum(String irum) { this.irum = irum; }

    public String getHakgwa() { return hakgwa; }
    public void setHakgwa(String hakgwa) { this.hakgwa = hakgwa; }

    public String getAddr() { return addr; }
    public void setAddr(String addr) { this.addr = addr; }

    public String getPhone() { return phone; }
    public void setPhone(String phone) { this.phone = phone; }

    public String getJumin() { return jumin; }
    public void setJumin(String jumin) { this.jumin = jumin; }

    public int getGrade() { return grade; }
    public void setGrade(int grade) { this.grade = grade; }

    // โœ… ๋””๋ฒ„๊น…์šฉ toString()
    @Override
    public String toString() {
        return "Student [hakbun=" + hakbun + ", irum=" + irum +
               ", hakgwa=" + hakgwa + ", addr=" + addr +
               ", phone=" + phone + ", jumin=" + jumin +
               ", grade=" + grade + "]";
    }
}


โœ… 3. ์„ค๊ณ„ ์›์น™ ์š”์•ฝ

์›์น™ ์„ค๋ช…
ํ•„๋“œ๋ช… = ์ปฌ๋Ÿผ๋ช… MyBatis ์ž๋™ ๋งคํ•‘์„ ์œ„ํ•ด ์ •ํ™•ํžˆ ์ผ์น˜์‹œํ‚ด
์ ‘๊ทผ ์ œํ•œ์ž ํ•„๋“œ๋Š” private, ๋ฉ”์„œ๋“œ๋Š” public
๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ•„์ˆ˜ (MyBatis ๋‚ด๋ถ€ ๊ฐ์ฒด ์ƒ์„ฑ์šฉ)
์ „์ฒด ์ƒ์„ฑ์ž ์„ ํƒ (ํ…Œ์ŠคํŠธ, ํŽธ์˜์šฉ)
toString() ๋””๋ฒ„๊น…/๋กœ๊น… ์šฉ๋„๋กœ ์œ ์šฉ

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

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
DB ์ปฌ๋Ÿผ๋ช…๊ณผ ํ•„๋“œ๋ช…์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š”๊ฐ€ โœ… ย 
getter/setter๊ฐ€ ๋ชจ๋‘ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”๊ฐ€ โœ… ย 
๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฐ€ โœ… ย 
์‹ค์ˆ˜๋กœ public ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๊ฐ€ โœ… ย 

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

ํ•ญ๋ชฉ ์„ค๋ช…
Lombok ์‚ฌ์šฉ ์‹œ @Getter, @Setter, @NoArgsConstructor, @ToString ๊ฐ€๋Šฅ
์ด๋ฆ„์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋งคํผ์—์„œ <resultMap>์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•  ๊ฒฝ์šฐ ์„œ๋ธŒ DTO ๋˜๋Š” Join DTO๋ฅผ ๋ณ„๋„ ์ƒ์„ฑ

โœ… ํ™•์žฅ ์‹ค์Šต ์˜ˆ์‹œ

๋ชฉ์  ํด๋ž˜์Šค
JOIN ๊ฒฐ๊ณผ์šฉ StudentWithDeptDTO ์ƒ์„ฑ ๊ฐ€๋Šฅ
๊ฒ€์ƒ‰ ์ „์šฉ ์กฐ๊ฑด DTO StudentSearchDTO ๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌ
์ž…๋ ฅ/์ถœ๋ ฅ์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ StudentInsertDTO, StudentViewDTO ๋“ฑ ์—ญํ•  ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ

โœ… 5.3๋‹จ๊ณ„: DAO + DTO + Mapper ์™„์ „ ๋ถ„๋ฆฌ ์‹ค์Šต

(๐Ÿ“‚ main/, dao/, mapper/ ๊ธฐ์ค€)


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ๊ฐ ๊ณ„์ธต์˜ ์ฑ…์ž„(R) ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
ํ•ต์‹ฌ DTO โ‡„ Mapper XML โ‡„ DAO โ‡„ Controller/JSP
๊ธฐ๋Œ€ ํšจ๊ณผ ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ํ•„๋“œ ๋ณ€๊ฒฝ, ์ฟผ๋ฆฌ ๋ณ€๊ฒฝ ์‹œ ์ตœ์†Œ ์ˆ˜์ • ๊ตฌ์กฐ ํ™•๋ณด

โœ… 1. ์•„ํ‚คํ…์ฒ˜ ์ •๋ฆฌ (MVC + MyBatis ๋ ˆ์ด์–ด ๋ถ„๋ฆฌ)

๐Ÿ“ main/Student.java         โ†’ DTO (VO, Bean ์—ญํ• )
๐Ÿ“ dao/StudentDao.java       โ†’ DB ์ ‘๊ทผ ์ „์šฉ DAO ๊ณ„์ธต
๐Ÿ“ mapper/StudentMapper1.xml โ†’ SQL๋งŒ ๋‹ด๋‹นํ•˜๋Š” Mapper XML
๐Ÿ“ controller/Test1_A.java   โ†’ ํ˜ธ์ถœ/์ž…์ถœ๋ ฅ ์ฒ˜๋ฆฌ (ํ–ฅํ›„ JSP ๋˜๋Š” Servlet)

โœ… 2. ์—ญํ•  ๋ถ„๋ฆฌ์˜ ํ•ต์‹ฌ ์›์น™

๊ตฌ์„ฑ ์š”์†Œ ์ฑ…์ž„๊ณผ ์—ญํ• 
DTO (Student) DB ์ปฌ๋Ÿผ โ†” Java ํ•„๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด
Mapper XML SQL๋งŒ ์„ ์–ธ (select, insert, update, delete)
DAO ํด๋ž˜์Šค Mapper ํ˜ธ์ถœ์„ ํ†ตํ•ด DB ์•ก์„ธ์Šค ์ถ”์ƒํ™”
Controller ์š”์ฒญ ํ๋ฆ„ ์ œ์–ด, ์„œ๋น„์Šค ํ˜ธ์ถœ (JSP ์—ฐ๊ณ„ ํฌํ•จ ์‹œ View ์—ฐ๊ฒฐ)

โœ… 3. ๊ตฌ์กฐ ๊ตฌํ˜„ ํ๋ฆ„ (์˜ˆ: ํ•™์ƒ ๋“ฑ๋ก)

๐Ÿ”ธ 1) DTO: Student.java

โ†’ ์ด์ „ 5.2๋‹จ๊ณ„ ์„ค๊ณ„ ์™„๋ฃŒ๋œ DTO ์‚ฌ์šฉ


๐Ÿ”ธ 2) Mapper: StudentMapper1.xml์— SQL ์ •์˜

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

๐Ÿ”ธ 3) DAO: StudentDao.java

public int insert(Student s) {
    SqlSession session = factory.openSession();
    int result = session.insert("student.insertStudent", s);
    session.commit();
    session.close();
    return result;
}

๐Ÿ”ธ 4) Controller or ํ˜ธ์ถœ๋ถ€: Test1_A.java

Student s = new Student(2029, "์žฅ์˜ˆ์ง„", "์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ", "์„œ์šธ", "010-1111-2222", "010101-4123456", 2);

StudentDao dao = new StudentDao();
int result = dao.insert(s);

System.out.println("ํ•™์ƒ ๋“ฑ๋ก ๊ฒฐ๊ณผ: " + result);


โœ… 4. ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„ ํฌ์ธํŠธ

ํ•ญ๋ชฉ ์‹ค๋ฌด ๊ธฐ์ค€ ํฌ์ธํŠธ
SQL๋งŒ ๋ฐ”๋€” ๋•Œ Mapper XML๋งŒ ์ˆ˜์ • โ†’ ๋‚˜๋จธ์ง€ ์˜ํ–ฅ ์—†์Œ
ํ•„๋“œ ์ถ”๊ฐ€/์‚ญ์ œ DTO โ†” Mapper XML๋งŒ ์ˆ˜์ • โ†’ DAO ์žฌ์‚ฌ์šฉ
DAO ๊ณตํ†ตํ™” BaseDao ์ƒ์† or ์ธํ„ฐํŽ˜์ด์Šค ์ ์šฉ ๊ฐ€๋Šฅ
ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ DAO ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, Controller ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ

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

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
DTO, DAO, Mapper XML์ด ๊ฐ๊ฐ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”๊ฐ€ โœ… ย 
๊ฐ ๊ณ„์ธต์˜ ์ฑ…์ž„์ด ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 
์ค‘๋ณต ์ฝ”๋“œ ์—†์ด ๊ธฐ๋Šฅ๋ณ„๋กœ๋งŒ ๊ตฌํ˜„๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 
์ „์ฒด INSERT/SELECT ํ๋ฆ„์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€ โœ… ย 

โœ… ํ™•์žฅ ์„ค๊ณ„ ์˜ˆ์‹œ (์‹ค๋ฌดํ˜• ๊ตฌ์กฐ ํ™•์žฅ)

๊ธฐ๋Šฅ ํ™•์žฅ ์˜ˆ
๊ฒ€์ƒ‰ ์กฐ๊ฑด ์ „๋‹ฌ StudentSearchDTO ๋”ฐ๋กœ ๋ถ„๋ฆฌ ํ›„ ์ „๋‹ฌ
View ์ „์šฉ DTO StudentViewDTO ์ƒ์„ฑ (์˜ˆ: JOIN ๊ฒฐ๊ณผ์šฉ)
DAO ์ธํ„ฐํŽ˜์ด์Šคํ™” IStudentDao ์ธํ„ฐํŽ˜์ด์Šค + ๊ตฌํ˜„์ฒด ๋ถ„๋ฆฌ
Service ๊ณ„์ธต ๋„์ž… StudentService ํด๋ž˜์Šค ์ถ”๊ฐ€ํ•ด ํŠธ๋žœ์žญ์…˜/๋กœ์ง ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ

โœ… ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ ์˜ˆ์‹œ (์‹ค๋ฌด MVC ๋ถ„๋ฆฌ ๊ตฌ์กฐ)

๐Ÿ“ฆ mybatisstudy
 โ”ฃ ๐Ÿ“ main
 โ”ƒ โ”— ๐Ÿ“„ Student.java           โ†’ DTO
 โ”ฃ ๐Ÿ“ dao
 โ”ƒ โ”— ๐Ÿ“„ StudentDao.java        โ†’ DAO
 โ”ฃ ๐Ÿ“ mapper
 โ”ƒ โ”— ๐Ÿ“„ StudentMapper1.xml     โ†’ Mapper
 โ”ฃ ๐Ÿ“ controller
 โ”ƒ โ”— ๐Ÿ“„ Test1_A.java           โ†’ ํ˜ธ์ถœ ํ…Œ์ŠคํŠธ or ์„œ๋ธ”๋ฆฟ ์ปจํŠธ๋กค๋Ÿฌ