** πŸ“Œ 3.1단계: INSERT ꡬ문 μž‘μ„± – 학생 등둝 κΈ°λŠ₯ μ‹€μŠ΅ **

(πŸ“‚ StudentMapper1.xml + DTO: main.Student 기반)


🎯 ν•™μŠ΅ λͺ©ν‘œ

ν•­λͺ© μ„€λͺ…
λͺ©μ  μƒˆλ‘œμš΄ 학생 정보λ₯Ό DB에 INSERT ν•˜κΈ°
μ£Όμš” 포인트 parameterType, insert, commit()
μ „μ œ 쑰건 Student 클래슀의 ν•„λ“œμ™€ DB 컬럼λͺ…이 μΌμΉ˜ν•΄μ•Ό 함

βœ… 1. DTO 클래슀 ꡬ쑰 (main.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 포함
}

βœ… 2. INSERT SQL μž‘μ„± (πŸ“„ StudentMapper1.xml에 μΆ”κ°€)

<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>
ν•­λͺ© μ„€λͺ…
id="insertStudent" Javaμ—μ„œ ν˜ΈμΆœν•  SQL ID
parameterType="main.Student" DTO 객체 전체λ₯Ό λ„˜κΉ€
#{ν•„λ“œλͺ…} DTO의 ν•„λ“œλͺ…κ³Ό 100% μΌμΉ˜ν•΄μ•Ό 함

βœ… 3. Java 호좜 μ½”λ“œ μ˜ˆμ‹œ

Student s = new Student();
s.setHakbun(2025);                      // ν•™λ²ˆ
s.setIrum("μ •λ‹€μš΄");                    // 이름
s.setHakgwa("컴퓨터곡학과");             // ν•™κ³Ό
s.setAddr("μ„œμšΈμ‹œ 마포ꡬ");              // μ£Όμ†Œ
s.setPhone("010-1234-5678");            // μ „ν™”λ²ˆν˜Έ
s.setJumin("010101-4123456");           // 주민번호
s.setGrade(3);                          // ν•™λ…„

int result = session.insert("student.insertStudent", s);
session.commit();  // ν•„μˆ˜!

System.out.println("학생 등둝 κ²°κ³Ό: " + result);


βœ… SQL 둜그 좜λ ₯ μ˜ˆμ‹œ (log4j μ„€μ • μ‹œ)

==>  Preparing: INSERT INTO student (hakbun, irum, hakgwa, addr, phone, jumin, grade) VALUES (?, ?, ?, ?, ?, ?, ?)
==> Parameters: 2025(Integer), μ •λ‹€μš΄(String), 컴퓨터곡학과(String), ...

βœ… 4. μ‹€μŠ΅ 체크리슀트

ν•­λͺ© μ„€λͺ… 확인
DTO의 ν•„λ“œλͺ…이 DB 컬럼λͺ…κ³Ό μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ”κ°€ hakbun, irum λ“± βœ…
parameterType이 main.Student둜 μ§€μ •λ˜μ—ˆλŠ”κ°€ 경둜 μ •ν™•νžˆ μž…λ ₯ βœ…
SQL INSERT ꡬ문이 μ •ν™•ν•˜κ²Œ μž‘μ„±λ˜μ—ˆλŠ”κ°€ 컬럼 수 == κ°’ 수 βœ…
session.commit() 호좜이 μžˆλŠ”κ°€ μƒλž΅ μ‹œ DB 반영 μ•ˆ 됨 βœ…
μ½˜μ†” λ‘œκ·Έμ— INSERT 쿼리가 좜λ ₯λ˜λŠ”κ°€ log4j μ„€μ • ν•„μš” βœ…

βœ… DB 반영 확인 쿼리 (MariaDB)

SELECT * FROM student WHERE hakbun = 2025;


βœ… 싀무 ν™•μž₯ 포인트

포인트 μ„€λͺ…
쀑볡 ν•™λ²ˆ λ°©μ§€ hakbun에 UNIQUE μ œμ•½ 쑰건 κ±ΈκΈ°
κΈ°λ³Έ ν‚€ μžλ™ 생성 auto_increment 컬럼 μ„€μ • + useGeneratedKeys="true" μ‚¬μš©
μž…λ ₯ μœ νš¨μ„± 검사 Java λ‹¨μ—μ„œ null, 곡백, ν˜•μ‹ 검사 λ“± 사전 처리 ν•„μš”

βœ… 3.2단계: UPDATE ꡬ문 – ν•™λ…„ μˆ˜μ •, μ „ν™”λ²ˆν˜Έ μˆ˜μ • κΈ°λŠ₯ μ‹€μŠ΅

(πŸ“‚ StudentMapper1.xml + DTO: main.Student 기반)


🎯 ν•™μŠ΅ λͺ©ν‘œ

ν•­λͺ© μ„€λͺ…
λͺ©μ  κΈ°μ‘΄ 학생 λ°μ΄ν„°μ˜ grade, phone 값을 μˆ˜μ •
μ£Όμš” ν‚€μ›Œλ“œ update, parameterType, #{} μ‚¬μš©, commit()
μ „μ œ 쑰건 μˆ˜μ • κΈ°μ€€ 컬럼 (hakbun)이 WHERE μ ˆμ— μ‘΄μž¬ν•΄μ•Ό 함

βœ… 1. UPDATE SQL μž‘μ„± – hakbun κΈ°μ€€μœΌλ‘œ ν•™λ…„κ³Ό μ „ν™”λ²ˆν˜Έ μˆ˜μ •

πŸ”§ 맀퍼 XML (StudentMapper1.xml에 μΆ”κ°€)

<update id="updateStudentGradeAndPhone" parameterType="main.Student">
  UPDATE student
  SET grade = #{grade},
      phone = #{phone}
  WHERE hakbun = #{hakbun}
</update>
ν•­λͺ© μ„€λͺ…
id="updateStudentGradeAndPhone" Javaμ—μ„œ 호좜 μ‹œ μ‚¬μš©λ  ID
parameterType="main.Student" DTO 전체 전달
WHERE hakbun = #{hakbun} μˆ˜μ • λŒ€μƒ 식별 κΈ°μ€€
SET grade = #{grade} μˆ˜μ •ν•  λ‚΄μš© μ •μ˜

βœ… 2. Java 호좜 μ½”λ“œ μ˜ˆμ‹œ

Student s = new Student();
s.setHakbun(2025);              // ν•™λ²ˆμœΌλ‘œ λŒ€μƒ 학생 μ§€μ •
s.setGrade(4);                  // ν•™λ…„ μˆ˜μ •
s.setPhone("010-9999-8888");    // μ „ν™”λ²ˆν˜Έ μˆ˜μ •

int result = session.update("student.updateStudentGradeAndPhone", s);
session.commit();  // λ°˜λ“œμ‹œ 컀밋해야 μ‹€μ œ 반영됨

System.out.println("μˆ˜μ •λœ 학생 수: " + result);

βœ… 3. 둜그 좜λ ₯ μ˜ˆμ‹œ (log4j μ„€μ • μ‹œ)

==> Preparing: UPDATE student SET grade = ?, phone = ? WHERE hakbun = ?
==> Parameters: 4(Integer), 010-9999-8888(String), 2025(Integer)

βœ… 4. DB κ²°κ³Ό 확인 쿼리

SELECT * FROM student WHERE hakbun = 2025;
κΈ°λŒ€ κ²°κ³Ό λ³€κ²½ 확인 포인트
grade = 4 ν•™λ…„ μˆ˜μ •λ¨
phone = β€˜010-9999-8888’ μ „ν™”λ²ˆν˜Έ μˆ˜μ •λ¨

βœ… μ‹€μŠ΅ 체크리슀트

ν•­λͺ© μ„€λͺ… 확인
WHERE 절이 λˆ„λ½λ˜μ§€ μ•Šμ•˜λŠ”κ°€? hakbun κΈ°μ€€ ν•„μˆ˜ βœ…
DTO ν•„λ“œλͺ…κ³Ό SQL의 #{} 이름이 μΌμΉ˜ν•˜λŠ”κ°€? phone, grade, hakbun βœ…
session.commit()이 μžˆλŠ”κ°€? μ—†μœΌλ©΄ rollback 됨 βœ…
둜그 좜λ ₯으둜 μ‹€μ œ 쿼리 ν™•μΈν–ˆλŠ”κ°€? log4j μ„€μ • ν•„μš” βœ…

βœ… 싀무 팁

포인트 μ„€λͺ…
쑰건 없이 UPDATE μ‹œ 주의 WHERE λˆ„λ½ μ‹œ 전체 데이터 μˆ˜μ •λ  수 있음
νŒŒλΌλ―Έν„° ν•˜λ‚˜λ§Œ μˆ˜μ •ν•˜κ³  싢을 λ•Œ if, trim으둜 동적 SQL μž‘μ„± ν•„μš”
update() λ°˜ν™˜κ°’ μˆ˜μ •λœ ν–‰ 수 (0이면 λŒ€μƒ μ—†μŒ)

βœ… ν™•μž₯ μ‹€μŠ΅ 아이디어

  1. μ΄λ¦„μœΌλ‘œ μ°Ύκ³  μ£Όμ†Œ λ³€κ²½
  2. 주민번호 κΈ°μ€€μœΌλ‘œ ν•™κ³Ό λ³€κ²½
  3. if 쑰건으둜 μ „ν™”λ²ˆν˜Έλ§Œ μžˆμ„ λ•Œλ§Œ μˆ˜μ •ν•˜λŠ” 버전

βœ… 3.3단계: DELETE ꡬ문 – νŠΉμ • 학생 μ‚­μ œ κΈ°λŠ₯ μ‹€μŠ΅

(πŸ“‚ StudentMapper1.xml + DTO: main.Student 기반)


🎯 ν•™μŠ΅ λͺ©ν‘œ

ν•­λͺ© μ„€λͺ…
λͺ©μ  νŠΉμ • ν•™λ²ˆ(hakbun)의 학생 데이터λ₯Ό μ‚­μ œ
핡심 κ°œλ… delete, parameterType, #{}, commit()
μ „μ œ 쑰건 hakbun은 WHERE μ ˆμ—μ„œ λ°˜λ“œμ‹œ 쑰건으둜 μ‚¬μš©λ˜μ–΄μ•Ό 함

βœ… 1. DELETE SQL μž‘μ„± – ν•™λ²ˆ κΈ°μ€€ μ‚­μ œ

πŸ”§ 맀퍼 XML (StudentMapper1.xml에 μΆ”κ°€)

<delete id="deleteStudentByHakbun" parameterType="int">
  DELETE FROM student
  WHERE hakbun = #{hakbun}
</delete>
속성 μ„€λͺ…
id "deleteStudentByHakbun" – Javaμ—μ„œ ν˜ΈμΆœν•  쿼리 μ‹λ³„μž
parameterType int – 단일 ν•™λ²ˆ(hakbun) κ°’ 전달
#{hakbun} μ‚­μ œ κΈ°μ€€μœΌλ‘œ 전달받은 ν•™λ²ˆμ΄ 듀어감

βœ… 2. Java 호좜 μ½”λ“œ μ˜ˆμ‹œ

int hakbun = 2025;  // μ‚­μ œ λŒ€μƒ ν•™λ²ˆ

int result = session.delete("student.deleteStudentByHakbun", hakbun);
session.commit();  // ν•„μˆ˜! delete ν›„ commit μ•ˆ ν•˜λ©΄ rollback 됨

System.out.println("μ‚­μ œλœ 학생 수: " + result);
좜λ ₯ μ˜ˆμ‹œ
μ‚­μ œλœ 학생 수: 1

βœ… 3. 둜그 좜λ ₯ μ˜ˆμ‹œ (log4j μ„€μ • μ‹œ)

==> Preparing: DELETE FROM student WHERE hakbun = ?
==> Parameters: 2025(Integer)

βœ… 4. DB μ‚­μ œ 확인 쿼리

SELECT * FROM student WHERE hakbun = 2025;
κΈ°λŒ€ κ²°κ³Ό
(κ²°κ³Ό μ—†μŒ) β†’ 정상 μ‚­μ œ

βœ… μ‹€μŠ΅ 체크리슀트

ν•­λͺ© μ„€λͺ… 체크
WHERE μ ˆμ— hakbun이 μ •ν™•νžˆ λ“€μ–΄κ°”λŠ”κ°€ 전체 μ‚­μ œ λ°©μ§€ βœ…
parameterType="int"κ°€ μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ˜μ—ˆλŠ”κ°€ hakbun κ°’ 전달 βœ…
#{} λ‚΄λΆ€ 이름이 Java λ³€μˆ˜λͺ…κ³Ό μΌμΉ˜ν•˜λŠ”κ°€ hakbun βœ…
session.commit() 호좜 μ—¬λΆ€ DB 반영 βœ…
둜그 좜λ ₯μ—μ„œ DELETE 쿼리 확인 μ—¬λΆ€ log4j μ„€μ • ν•„μš” βœ…

βœ… 싀무 팁

ν•­λͺ© μ„€λͺ…
WHERE 쑰건 없을 경우 전체 ν…Œμ΄λΈ” 데이터 μ‚­μ œλ¨ β†’ 맀우 μœ„ν—˜!
μ‚­μ œ μ „ μœ νš¨μ„± 검사 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν•™λ²ˆμΌ 경우 μ‚¬μš©μžμ—κ²Œ μ•Œλ¦Ό ν•„μš”
λ°˜ν™˜κ°’ 처리 0이면 μ‚­μ œ λŒ€μƒμ΄ μ—†μŒ β†’ λ©”μ‹œμ§€ 좜λ ₯ ν•„μš”

βœ… ν™•μž₯ μ‹€μŠ΅ 아이디어

βœ… 3.4단계: νŠΈλžœμž­μ…˜ 처리 μ‹€μŠ΅

(πŸ“‚ Test1_A.java λ˜λŠ” 컨트둀러 클래슀 + StudentMapper1.xml 기반)


🎯 ν•™μŠ΅ λͺ©ν‘œ

ν•­λͺ© μ„€λͺ…
λͺ©μ  commit()κ³Ό rollback()을 ν™œμš©ν•œ νŠΈλžœμž­μ…˜ κ°œλ… 이해
핡심 ν‚€μ›Œλ“œ νŠΈλžœμž­μ…˜, μ˜ˆμ™Έ 처리, μˆ˜λ™ 컀밋, μžλ™ λ‘€λ°±
μ‹€μŠ΅ INSERT β†’ UPDATE 도쀑 μ˜ˆμ™Έ λ°œμƒ μ‹œ, 전체 μ·¨μ†Œ 확인

βœ… 1. νŠΈλžœμž­μ…˜μ΄λž€?

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ ν•˜λ‚˜μ˜ μž‘μ—… λ‹¨μœ„λ‘œ μ²˜λ¦¬λ˜μ–΄μ•Ό ν•˜λŠ” μ—°μ‚° μ§‘ν•©

즉, β€œλͺ¨λ‘ 성곡 or λͺ¨λ‘ μ‹€νŒ¨β€κ°€ λ˜μ–΄μ•Ό 함.


βœ… 2. κΈ°λ³Έ νŠΈλžœμž­μ…˜ ꡬ쑰 (MyBatis의 SqlSession μˆ˜λ™ 처리)

SqlSession session = factory.openSession();  // autoCommit = false
try {
    session.insert(...);   // 1단계
    session.update(...);   // 2단계
    session.commit();      // βœ… λͺ¨λ‘ 성곡 μ‹œ 컀밋
} catch (Exception e) {
    session.rollback();    // ❌ μ‹€νŒ¨ λ°œμƒ μ‹œ λ‘€λ°±
    e.printStackTrace();
} finally {
    session.close();
}

βœ… 3. μ‹€μ „ μ˜ˆμ‹œ: INSERT + UPDATE 쀑간 μ‹€νŒ¨ β†’ rollback()

πŸ”§ 맀퍼 XML: 기쑴에 μž‘μ„±λœ 것 ν™œμš©


πŸ”§ Java νŠΈλžœμž­μ…˜ μ˜ˆμ‹œ

SqlSession session = factory.openSession();  // μžλ™ 컀밋 ❌

try {
    // 1. INSERT μ‹€ν–‰
    Student s = new Student();
    s.setHakbun(2026);
    s.setIrum("κΉ€λ―Όμ§€");
    s.setHakgwa("μ „μ‚°ν•™κ³Ό");
    s.setAddr("λΆ€μ‚°");
    s.setPhone("010-1111-1111");
    s.setJumin("000101-4123456");
    s.setGrade(1);

    session.insert("student.insertStudent", s);

    // 2. κ°•μ œλ‘œ μ˜ˆμ™Έ λ°œμƒ (null 포인트 λ“±)
    String test = null;
    System.out.println(test.length());  // πŸ’₯ κ°•μ œ μ˜ˆμ™Έ λ°œμƒ

    // 3. 이 μ•„λž˜λŠ” μ‹€ν–‰ μ•ˆ 됨
    s.setPhone("010-0000-0000");
    session.update("student.updateStudentGradeAndPhone", s);

    session.commit();
} catch (Exception e) {
    session.rollback();  // βœ… λͺ¨λ“  μž‘μ—… λ‘€λ°±
    System.out.println("⚠️ νŠΈλžœμž­μ…˜ μ‹€νŒ¨, 둀백됨: " + e.getMessage());
} finally {
    session.close();
}


βœ… 4. 둜그 & DB μƒνƒœ 확인

ν•­λͺ© κΈ°λŒ€ κ²°κ³Ό
μ½˜μ†” 둜그 rollback() λ°œμƒ λ©”μ‹œμ§€ 좜λ ₯
DB 쑰회 SELECT * FROM student WHERE hakbun = 2026 β†’ κ²°κ³Ό μ—†μŒ

βœ… νŠΈλžœμž­μ…˜ 체크리슀트

ν•­λͺ© μ„€λͺ… 확인
factory.openSession()에 컀밋 μƒλž΅ν–ˆλŠ”κ°€ MyBatisλŠ” 기본적으둜 autoCommit = false μƒνƒœμ—μ„œ μ„Έμ…˜μ„ μ—΄κΈ° λ•Œλ¬Έμ—, SQL을 싀행해도 commit() ν•˜μ§€ μ•ŠμœΌλ©΄ DB에 μ‹€μ œλ‘œ λ°˜μ˜λ˜μ§€ μ•ŠμŒ βœ…
commit() 전에 μ˜ˆμ™Έ λ°œμƒ μ‹œ rollback() μ²˜λ¦¬ν–ˆλŠ”κ°€ SQL μ‹€ν–‰ 도쀑 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ commit() 없이 λλ‚˜λ―€λ‘œ, λ°˜λ“œμ‹œ catch λΈ”λ‘μ—μ„œ session.rollback() ν˜ΈμΆœν•΄μ„œ λ³€κ²½ μ‹œλ„λ₯Ό μ·¨μ†Œν•΄μ•Ό 함 βœ…
DBμ—λŠ” 아무 μž‘μ—…λ„ λ°˜μ˜λ˜μ§€ μ•Šμ•˜λŠ”κ°€ commit() 전에 μ˜ˆμ™Έκ°€ λ‚˜κ±°λ‚˜ rollback()만 μ‹€ν–‰λ˜μ—ˆμ„ 경우, DBμ—λŠ” μ•„λ¬΄λŸ° INSERT/UPDATE/DELETE λ‚΄μš©μ΄ μ €μž₯λ˜μ§€ μ•Šμ•„μ•Ό 정상 βœ…
λ‘œκ·Έμ— rollback κ΄€λ ¨ λ‘œκ·Έκ°€ 좜λ ₯λ˜λŠ”κ°€ μ˜ˆμ™Έ λ°œμƒ μ‹œ rollback()이 μ œλŒ€λ‘œ μ‹€ν–‰λ˜λ©΄, μ½˜μ†”μ΄λ‚˜ λ‘œκ·ΈνŒŒμΌμ— Rolling back JDBC Connectionκ³Ό 같은 문ꡬ가 좜λ ₯됨 βœ…

πŸ’‘ μΆ”κ°€ μ„€λͺ…: νŠΈλžœμž­μ…˜ μ‹€νŒ¨ 흐름 μ˜ˆμ‹œ


βœ… 정리 μš”μ•½

ꡬ뢄 μ„€λͺ…
commit() λͺ¨λ“  μž‘μ—…μ΄ 문제 없을 λ•Œ λͺ…μ‹œμ μœΌλ‘œ μ‹€ν–‰
rollback() μ˜ˆμ™Έ λ°œμƒ μ‹œ, 이전 μž‘μ—…κΉŒμ§€ λͺ¨λ‘ μ·¨μ†Œ
finally { close(); } μžμ› ν•΄μ œ ν•„μˆ˜
νŠΈλžœμž­μ…˜ λ‹¨μœ„ ν•˜λ‚˜μ˜ SqlSession λ‚΄μ—μ„œ μˆ˜ν–‰λ˜λŠ” μž‘μ—… μ§‘ν•©

🧠 싀무 팁

ν•­λͺ© μ„€λͺ…
μžλ™ 컀밋 μ‚¬μš© μ‹œ μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ 이전 μž‘μ—…μ΄ 반영됨 (μœ„ν—˜)
닀단계 μž‘μ—… μ‹œ λ°˜λ“œμ‹œ μˆ˜λ™ 컀밋 방식 μ‚¬μš© ꢌμž₯
μ›Ή ν™˜κ²½μ—μ„œλŠ” μŠ€ν”„λ§μ—μ„œλŠ” νŠΈλžœμž­μ…˜ μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ λŒ€μ²΄ (@Transactional)