** ๐Ÿ“Œ 8.1๋‹จ๊ณ„: ๋„๋ฉ”์ธ ์˜ˆ์‹œ ์„ ์ • โ€“ ํ•™์ƒ๊ด€๋ฆฌ, ๊ฒŒ์‹œํŒ, ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ ์ค‘ 1๊ฐœ ์„ ํƒ **


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ์‹ค์ „ ์›น ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์ฃผ์ œ ๋„๋ฉ”์ธ์„ ์„ ํƒ
์„ ํƒ์ง€ ํ•™์ƒ๊ด€๋ฆฌ ์‹œ์Šคํ…œ / ๊ฒŒ์‹œํŒ ์‹œ์Šคํ…œ / ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ
๊ธฐ๋Œ€ ํšจ๊ณผ ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด MVC2 + MyBatis ๊ตฌ์กฐ๋กœ ํ™•์žฅ ์‹ค์Šต ๊ฐ€๋Šฅ

โœ… ์„ ํƒ ๊ฐ€๋Šฅํ•œ ๋„๋ฉ”์ธ ๋ชฉ๋ก

๋„๋ฉ”์ธ ์„ค๋ช… ์‹ค์Šต ํ™•์žฅ์„ฑ
1. ํ•™์ƒ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ํ•™์ƒ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ, ๊ฒ€์ƒ‰ ๋“ฑ ์ „ํ˜•์ ์ธ CRUD ๊ธฐ๋Šฅ ์ค‘์‹ฌ DTO, DAO, ๋™์ ์ฟผ๋ฆฌ, ํŠธ๋žœ์žญ์…˜, ์œ ํšจ์„ฑ๊ฒ€์‚ฌ๊นŒ์ง€ ์‹ค์Šต ๊ฐ€๋Šฅ
2. ๊ฒŒ์‹œํŒ ์‹œ์Šคํ…œ ๊ธ€์“ฐ๊ธฐ, ๋ชฉ๋ก, ์ƒ์„ธ๋ณด๊ธฐ, ๋Œ“๊ธ€ ๋“ฑ ์‚ฌ์šฉ์ž ์ฝ˜ํ…์ธ  ์ค‘์‹ฌ ํŽ˜์ด์ง•, ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋“ฑ ๊ณ ๊ธ‰๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ
3. ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ์„ธ์…˜ ์ฒ˜๋ฆฌ, ์•”ํ˜ธํ™” ๋“ฑ ๋ณด์•ˆ ์ค‘์‹ฌ ์„ธ์…˜, ์ฟ ํ‚ค, ํ•„ํ„ฐ, ๋กœ๊ทธ์ธ ์œ ์ง€, ๊ถŒํ•œ ์ œ์–ด ๋“ฑ ์‹ค๋ฌด ๋ณด์•ˆ ํ•ต์‹ฌ

โœ… ์ถ”์ฒœ ๋„๋ฉ”์ธ ๋ณ„ ํŠน์ง• ๋น„๊ต

ํ•ญ๋ชฉ ํ•™์ƒ๊ด€๋ฆฌ ๊ฒŒ์‹œํŒ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ
์ฃผ ๋ชฉ์  DB ๊ธฐ๋ณธ ์—ฐ์‚ฐ (CRUD) ๋งˆ์Šคํ„ฐ ์ฝ˜ํ…์ธ  ์ฒ˜๋ฆฌ + ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„ ์ธ์ฆ, ๋ณด์•ˆ, ๊ถŒํ•œ ์ฒ˜๋ฆฌ ์‹ค์Šต
DTO ์ˆ˜ ๋‚ฎ์Œ (1~2๊ฐœ) ๋ณดํ†ต (๊ฒŒ์‹œ๊ธ€ + ๋Œ“๊ธ€) ํšŒ์› + ์„ธ์…˜ ๊ด€๋ จ ๊ฐ์ฒด
๊ธฐ๋Šฅ ์ˆ˜ ๊ธฐ๋ณธ ์ค‘์‹ฌ ์‹ค๋ฌดํ˜• ๊ธฐ๋Šฅ ํฌํ•จ (ํŽ˜์ด์ง•, ๊ฒ€์ƒ‰) ๋ณด์•ˆ ์‹ค์Šต ๊ฐ€๋Šฅ (์•”ํ˜ธํ™”, ์„ธ์…˜)
๋‚œ์ด๋„ โญ (์ดˆ์ค‘๊ธ‰) โญโญ (์ค‘๊ธ‰) โญโญโญ (์ค‘์ƒ๊ธ‰)
ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ ์‰ฌ์›€ (ํ•™์ƒ ์„ฑ์ , ์ถœ๊ฒฐ ๋“ฑ์œผ๋กœ ํ™•์žฅ) ๋†’์€ ํŽธ (๊ฒŒ์‹œํŒ + ๋Œ“๊ธ€, ์ข‹์•„์š” ๋“ฑ) ๋งค์šฐ ๋†’์Œ (SNS ๋กœ๊ทธ์ธ, ๊ด€๋ฆฌ์ž ๊ตฌ๋ถ„ ๋“ฑ)

โœ… ์˜ˆ์‹œ ๋„๋ฉ”์ธ ์„ ํƒ ์˜ˆ

๋„ˆ๊ฐ€ ์ด์ „์— ์‚ฌ์šฉํ•œ Student.java, StudentDao, StudentMapper1.xml ๊ตฌ์กฐ๋Š”

์ด๋ฏธ ํ•™์ƒ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌ์กฐ์˜ ๊ธฐ๋ฐ˜์„ ๊ฐ–์ถ”๊ณ  ์žˆ์–ด.

๐Ÿ’ก ๋”ฐ๋ผ์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด๊ฐ€๋ ค๋ฉด ๐Ÿ‘‰ โ€œํ•™์ƒ๊ด€๋ฆฌ ์‹œ์Šคํ…œโ€ ์„ ์„ ํƒํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์œ ๋ฆฌํ•ด.


โœ… 8.2๋‹จ๊ณ„: ์š”๊ตฌ์‚ฌํ•ญ ๋„์ถœ

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


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ํ•™์ƒ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ, ๋ฐ์ดํ„ฐ ํ๋ฆ„, DB ๊ตฌ์กฐ ์ •์˜
๊ตฌ์„ฑ ๊ธฐ๋Šฅ ๋ชฉ๋ก โ†’ ์ž…๋ ฅ/์ถœ๋ ฅ ๋ช…์„ธ โ†’ ํ…Œ์ด๋ธ” ์„ค๊ณ„
๊ธฐ๋Œ€ ํšจ๊ณผ ๊ตฌํ˜„ ์ „ ๋ช…ํ™•ํ•œ ์„ค๊ณ„์„œ ๊ธฐ๋ฐ˜ ํ™•๋ณด (์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ ์—ญํ• )

โœ… 1. ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ •์˜

๊ธฐ๋Šฅ ์ฝ”๋“œ ๊ธฐ๋Šฅ ๋ช…์นญ ์„ค๋ช…
S001 ํ•™์ƒ ์ „์ฒด ์กฐํšŒ ๋ชจ๋“  ํ•™์ƒ ๋ชฉ๋ก ์ถœ๋ ฅ
S002 ํŠน์ • ํ•™๋ฒˆ์œผ๋กœ ์กฐํšŒ hakbun ๊ธฐ์ค€ ํ•™์ƒ 1๋ช… ์ถœ๋ ฅ
S003 ์‹ ๊ทœ ํ•™์ƒ ๋“ฑ๋ก insertStudent
S004 ํ•™๋…„/์ด๋ฆ„ ์กฐ๊ฑด ๊ฒ€์ƒ‰ grade, irum LIKE ๋“ฑ ์กฐ๊ฑด ํ•„ํ„ฐ
S005 ํ•™๋…„/์ „ํ™”๋ฒˆํ˜ธ ์ˆ˜์ • hakbun ๊ธฐ์ค€์œผ๋กœ grade, phone ๋ณ€๊ฒฝ
S006 ํ•™๋ฒˆ์œผ๋กœ ์‚ญ์ œ ํ•ด๋‹น ํ•™๋ฒˆ ํ•™์ƒ ์ •๋ณด ์‚ญ์ œ

โœ… ์œ„ ๊ธฐ๋Šฅ๋“ค์€ ์ „๋ถ€ ํŒŒ์ผ ๋‚ด XML๊ณผ DAO ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ ๊ตฌ์กฐ๊ฐ€ ์ •๋ฆฌ๋˜์–ด ์žˆ์Œ.


โœ… 2. ์ž…๋ ฅ / ์ถœ๋ ฅ ์ •์˜

๊ธฐ๋Šฅ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ (From JSP / Controller) ์ถœ๋ ฅ (JSP, ์ฝ˜์†”, ๋ฐ˜ํ™˜๊ฐ’ ๋“ฑ)
ํ•™์ƒ ์ „์ฒด ์กฐํšŒ ์—†์Œ List
ํŠน์ • ํ•™๋ฒˆ ์กฐํšŒ int hakbun Student
ํ•™์ƒ ๋“ฑ๋ก Student ๊ฐ์ฒด (๋ชจ๋“  ํ•„๋“œ) ๋“ฑ๋ก ์„ฑ๊ณต ์—ฌ๋ถ€ (int)
์กฐ๊ฑด ๊ฒ€์ƒ‰ Student ๊ฐ์ฒด (๋ถ€๋ถ„ ํ•„๋“œ: irum, grade ๋“ฑ) List
์ •๋ณด ์ˆ˜์ • Student ๊ฐ์ฒด (hakbun + ์ˆ˜์ • ๋Œ€์ƒ ํ•„๋“œ) ์ˆ˜์ • ์„ฑ๊ณต ์—ฌ๋ถ€ (int)
์‚ญ์ œ int hakbun ์‚ญ์ œ ์„ฑ๊ณต ์—ฌ๋ถ€ (int)

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

๐Ÿ“„ ํ…Œ์ด๋ธ”๋ช…: student

์ปฌ๋Ÿผ๋ช… ์ž๋ฃŒํ˜• ์„ค๋ช… ์ œ์•ฝ์กฐ๊ฑด
hakbun INT ํ•™๋ฒˆ (PK) PRIMARY KEY
irum VARCHAR(50) ์ด๋ฆ„ NOT NULL
hakgwa VARCHAR(50) ํ•™๊ณผ๋ช… ย 
addr VARCHAR(100) ์ฃผ์†Œ ย 
phone VARCHAR(20) ์ „ํ™”๋ฒˆํ˜ธ ย 
jumin VARCHAR(20) ์ฃผ๋ฏผ๋ฒˆํ˜ธ (์„ฑ๋ณ„ ํŒ๋‹จ์šฉ) ย 
grade INT ํ•™๋…„ (1~4) ย 

๐Ÿ’ก ์‹ค์ œ ์ฝ”๋“œ์— ์žˆ๋Š” main.Student.java์™€ ์™„์ „ํžˆ ์ผ์น˜

(โ†’ MyBatis์—์„œ resultType=โ€main.Studentโ€ ์‚ฌ์šฉ ์‹œ ์ž๋™ ๋งคํ•‘๋จ)


โœ… 4. ํ™”๋ฉด ํ๋ฆ„ ์˜ˆ์‹œ (Controller โ†’ JSP)

๊ธฐ๋Šฅ ์š”์ฒญ URL ์ฒ˜๋ฆฌ ํ๋ฆ„ ๊ฒฐ๊ณผ JSP
์ „์ฒด ์กฐํšŒ /student/list.do DAO โ†’ selectAll() โ†’ setAttribute list.jsp
์ƒ์„ธ ์กฐํšŒ /student/detail.do?hakbun=1001 DAO โ†’ selectByHakbun() โ†’ setAttribute detail.jsp
๋“ฑ๋ก ์ฒ˜๋ฆฌ /student/insert.do (POST) request โ†’ DTO โ†’ DAO โ†’ insert() redirect:list.do
์ˆ˜์ • ์ฒ˜๋ฆฌ /student/update.do (POST) request โ†’ DTO โ†’ DAO โ†’ update() redirect:detail.do?hakbun=...
์‚ญ์ œ ์ฒ˜๋ฆฌ /student/delete.do?hakbun=... DAO โ†’ delete() redirect:list.do

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

ํ•ญ๋ชฉ ์„ค๋ช… ์™„๋ฃŒ ์—ฌ๋ถ€
๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ๋ชจ๋‘ ๋‚˜์—ดํ–ˆ๋Š”๊ฐ€ โœ… ย 
๊ฐ ๊ธฐ๋Šฅ์˜ ์ž…๋ ฅ/์ถœ๋ ฅ์„ ์ •๋ฆฌํ–ˆ๋Š”๊ฐ€ โœ… ย 
DB ์ปฌ๋Ÿผ๋ช…๊ณผ DTO ํ•„๋“œ๋ช…์ด ์ผ์น˜ํ•˜๋Š”๊ฐ€ โœ… ย 
์ œ์•ฝ์กฐ๊ฑด(PK, NOT NULL ๋“ฑ)์ด ๋ช…ํ™•ํžˆ ์„ค์ •๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 
์‹ค์ œ Mapper/DAO ์ฝ”๋“œ์™€ ์„ค๊ณ„๊ฐ€ ์ผ์น˜ํ•˜๋Š”๊ฐ€ โœ… ย 

โœ… 8.3๋‹จ๊ณ„: Controller โ†’ Service โ†’ DAO โ†’ MyBatis ํ๋ฆ„ ์„ค๊ณ„

(๐Ÿ“‚ MVC ๊ตฌ์กฐ ์™„์ „ ์—ฐ๋™ + ์‹ค๋ฌด Mapper ์—ฐ๊ณ„ ๋ฐฉ์‹ ์‹ค์Šต)


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  MVC2 ๊ธฐ๋ฐ˜์—์„œ Controller โ†’ Service โ†’ DAO โ†’ MyBatis ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ณ  ๊ตฌํ˜„
ํ•ต์‹ฌ ๊ตฌ์„ฑ ๊ฐ ๊ณ„์ธต ์ฑ…์ž„ ๋ถ„๋ฆฌ, ํ˜ธ์ถœ ํ๋ฆ„ ๊ตฌ์กฐํ™”, ์ค‘๋ณต ๋ฐฉ์ง€
๊ธฐ๋Œ€ ํšจ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ํ™•์žฅ, ํŠธ๋žœ์žญ์…˜/๋กœ์ง/DB ์ ‘๊ทผ ๋ถ„๋ฆฌ

โœ… 1. ์ „์ฒด ํ๋ฆ„ ๊ตฌ์กฐ (์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„๋„)

[Client (๋ธŒ๋ผ์šฐ์ €)]
      โ†“ ์š”์ฒญ (e.g., /student/list.do)
[๐Ÿ“‚ Controller]
      โ†“ StudentService ํ˜ธ์ถœ
[๐Ÿ“‚ Service]
      โ†“ StudentDao ํ˜ธ์ถœ
[๐Ÿ“‚ DAO]
      โ†“ StudentMapper.xml ์‹คํ–‰ (MyBatis)
[๐Ÿ“‚ DB]
      โ†‘ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

โœ… 2. ๊ณ„์ธต๋ณ„ ์ฑ…์ž„ ์ •๋ฆฌ

๊ณ„์ธต ํด๋ž˜์Šค ์˜ˆ ์—ญํ• 
Controller StudentController.java, Test1_A.java ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ˆ˜์‹ , ์„œ๋น„์Šค ํ˜ธ์ถœ, JSP ์—ฐ๊ฒฐ
Service StudentService.java ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜ ์ œ์–ด, DAO ํ˜ธ์ถœ
DAO StudentDao.java DB ์ ‘๊ทผ ์ฝ”๋“œ, Mapper ์‹คํ–‰
Mapper StudentMapper.xml ์‹ค์ œ SQL ์ •์˜ (<select>, <insert> ๋“ฑ)
DTO Student.java DB โ†” Java ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด

โœ… 3. ์‹ค์ „ ์˜ˆ์‹œ โ€“ ์ „์ฒด ์กฐํšŒ ๊ธฐ๋Šฅ ํ๋ฆ„

๐Ÿ’ก ์š”์ฒญ: /student/list.do โ†’ ์ „์ฒด ๋ชฉ๋ก ์กฐํšŒ

๐Ÿ”น โ‘  Controller

StudentService service = new StudentService();
List<Student> list = service.getStudentList();
request.setAttribute("list", list);
request.getRequestDispatcher("/view/student/list.jsp").forward(request, response);

๐Ÿ”น โ‘ก Service

public class StudentService {
    private StudentDao dao = new StudentDao();

    public List<Student> getStudentList() {
        return dao.selectAll();  // DAO ํ˜ธ์ถœ
    }
}

๐Ÿ”น โ‘ข DAO

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

๐Ÿ”น โ‘ฃ Mapper XML

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

โœ… 4. ์‹ค๋ฌด ์„ค๊ณ„ ํ•ต์‹ฌ ํฌ์ธํŠธ

ํ•ญ๋ชฉ ์„ค๋ช…
Controller โ†’ Service ๋ถ„๋ฆฌ ์ด์œ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ณ€๊ฒฝ ์‹œ Controller ์˜ํ–ฅ ์ตœ์†Œํ™”
Service โ†’ DAO ํ˜ธ์ถœ ์ด์œ  ํŠธ๋žœ์žญ์…˜ ์ œ์–ด๋‚˜ ์„œ๋น„์Šค ์ •์ฑ…(์˜ˆ: ์ค‘๋ณต์ฒดํฌ) ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
DAO๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰๋งŒ ์˜ค๋กœ์ง€ Mapper ํ˜ธ์ถœ๋งŒ ๋‹ด๋‹น (DB ์ „์šฉ)
Mapper๋Š” SQL๋งŒ ๋‹ด๋‹น XML ๊ตฌ์กฐ๋กœ ์œ ์ง€๋ณด์ˆ˜, ๊ฐ€๋…์„ฑ ํ™•๋ณด

โœ… 5. ์‹ค์Šต ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ (๊ถŒ์žฅ)

๐Ÿ“ mybatisstudy/
 โ”ฃ ๐Ÿ“ main/Student.java          โ†’ DTO
 โ”ฃ ๐Ÿ“ dao/StudentDao.java        โ†’ DB ํ˜ธ์ถœ
 โ”ฃ ๐Ÿ“ dao/StudentMapper.java     โ†’ ์ธํ„ฐํŽ˜์ด์Šค (์„ ํƒ)
 โ”ฃ ๐Ÿ“ service/StudentService.javaโ†’ ์„œ๋น„์Šค ๊ณ„์ธต
 โ”ฃ ๐Ÿ“ controller/StudentController.java โ†’ ์š”์ฒญ ์ฒ˜๋ฆฌ
 โ”ฃ ๐Ÿ“ mapper/StudentMapper.xml   โ†’ SQL ์ •์˜
 โ”ฃ ๐Ÿ“ view/student/list.jsp      โ†’ ๊ฒฐ๊ณผ ์ถœ๋ ฅ JSP

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

ํ•ญ๋ชฉ ์„ค๋ช… ์ฒดํฌ
Controller โ†’ Service โ†’ DAO ๊ณ„์ธต์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”๊ฐ€ โœ… ย 
๊ฐ ๊ณ„์ธต์€ ์ž์‹ ์˜ ์ฑ…์ž„๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€ (์˜ˆ: Controller๋Š” DB ์ง์ ‘ ์ ‘๊ทผ โŒ) โœ… ย 
Mapper ID, DAO ํ˜ธ์ถœ๋ช…, ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ๋ช…์ด ์ผ์น˜ํ•˜๋Š”๊ฐ€ โœ… ย 
ํ๋ฆ„์„ ๋ฐ”๊พธ๋”๋ผ๋„ ๊ตฌ์กฐ๊ฐ€ ์˜ํ–ฅ์„ ์ตœ์†Œ๋กœ ๋ฐ›๋Š”๊ฐ€ (์œ ์ง€๋ณด์ˆ˜์„ฑ ํ™•๋ณด) โœ… ย 

โœ… 8.4๋‹จ๊ณ„: JSP + JSTL ์—ฐ๋™ โ€“ View ์ถœ๋ ฅ ๋ฐ ์ž…๋ ฅํผ ์ฒ˜๋ฆฌ

(๐Ÿ“‚ view/student/*.jsp + JSTL + EL + controller ์—ฐ๊ณ„ ๊ธฐ์ค€)


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  Controller์—์„œ ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ JSP์—์„œ JSTL/EL๋กœ ์ถœ๋ ฅํ•˜๊ณ , ์ž…๋ ฅํผ๋„ ๊ตฌ์„ฑ
์ฃผ์š” ๊ตฌ์„ฑ list.jsp, detail.jsp, insert.jsp, update.jsp
๊ธฐ๋Œ€ ํšจ๊ณผ MVC2 ๊ตฌ์กฐ์˜ ์™„์ „ํ•œ ํ๋ฆ„ ๊ตฌํ˜„ (์ž…๋ ฅ โ†’ ์ฒ˜๋ฆฌ โ†’ ์ถœ๋ ฅ)

โœ… 1. ์ „์ฒด ํ๋ฆ„ ๋ณต์Šต (๋ฐ์ดํ„ฐ ์ถœ๋ ฅ)

[Controller]
  โ†“ setAttribute("list", list)
  โ†“
[view/student/list.jsp]
  <c:forEach items="${list}" var="stu"> ... </c:forEach>

โœ… 2. ํ•™์ƒ ๋ชฉ๋ก ์ถœ๋ ฅ JSP (list.jsp)

๐Ÿ“„ view/student/list.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>ํ•™์ƒ ๋ชฉ๋ก</title></head>
<body>

<h2>๐Ÿ“‹ ํ•™์ƒ ๋ชฉ๋ก</h2>

<table border="1">
  <tr>
    <th>ํ•™๋ฒˆ</th><th>์ด๋ฆ„</th><th>ํ•™๊ณผ</th><th>์ „ํ™”</th><th>ํ•™๋…„</th><th>์‚ญ์ œ</th>
  </tr>

  <c:forEach var="stu" items="${list}">
    <tr>
      <td><a href="detail.do?hakbun=${stu.hakbun}">${stu.hakbun}</a></td>
      <td>${stu.irum}</td>
      <td>${stu.hakgwa}</td>
      <td>${stu.phone}</td>
      <td>${stu.grade}</td>
      <td><a href="delete.do?hakbun=${stu.hakbun}">๐Ÿ—‘ ์‚ญ์ œ</a></td>
    </tr>
  </c:forEach>
</table>

<p><a href="insertForm.jsp">โž• ์‹ ๊ทœ ๋“ฑ๋ก</a></p>

</body>
</html>

โœ… 3. ํ•™์ƒ ๋“ฑ๋ก ํผ (insertForm.jsp)

๐Ÿ“„ view/student/insertForm.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head><title>ํ•™์ƒ ๋“ฑ๋ก</title></head>
<body>

<h2>๐Ÿ“ ํ•™์ƒ ๋“ฑ๋ก</h2>

<form action="insert.do" method="post">
  ํ•™๋ฒˆ: <input type="number" name="hakbun"><br>
  ์ด๋ฆ„: <input type="text" name="irum"><br>
  ํ•™๊ณผ: <input type="text" name="hakgwa"><br>
  ์ฃผ์†Œ: <input type="text" name="addr"><br>
  ์ „ํ™”: <input type="text" name="phone"><br>
  ์ฃผ๋ฏผ๋ฒˆํ˜ธ: <input type="text" name="jumin"><br>
  ํ•™๋…„: <select name="grade">
    <option>1</option><option>2</option><option>3</option><option>4</option>
  </select><br><br>
  <input type="submit" value="๋“ฑ๋กํ•˜๊ธฐ">
</form>

</body>
</html>

โœ… 4. Controller ์˜ˆ์‹œ โ€“ insert.do (POST)

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    Student s = new Student();

    s.setHakbun(Integer.parseInt(req.getParameter("hakbun")));
    s.setIrum(req.getParameter("irum"));
    s.setHakgwa(req.getParameter("hakgwa"));
    s.setAddr(req.getParameter("addr"));
    s.setPhone(req.getParameter("phone"));
    s.setJumin(req.getParameter("jumin"));
    s.setGrade(Integer.parseInt(req.getParameter("grade")));

    StudentService service = new StudentService();
    int result = service.insertStudent(s);

    res.sendRedirect("list.do");
}

โœ… 5. ์ƒ์„ธ๋ณด๊ธฐ JSP (detail.jsp)

<h2>๐Ÿ‘ค ํ•™์ƒ ์ƒ์„ธ ์ •๋ณด</h2>
<p>ํ•™๋ฒˆ: ${student.hakbun}</p>
<p>์ด๋ฆ„: ${student.irum}</p>
<p>ํ•™๊ณผ: ${student.hakgwa}</p>
<p>์ฃผ์†Œ: ${student.addr}</p>
<p>์ „ํ™”: ${student.phone}</p>
<p>ํ•™๋…„: ${student.grade}</p>

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

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
JSTL ํƒœ๊ทธ ์„ ์–ธ์ด ๋˜์–ด ์žˆ๋Š”๊ฐ€ <%@ taglib ... %> โœ…
<c:forEach>๋กœ ๋ฆฌ์ŠคํŠธ ๋ฐ˜๋ณต ์ถœ๋ ฅ์ด ๊ตฌํ˜„๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 
ํผ โ†’ POST โ†’ Controller โ†’ DB ์ €์žฅ ํ๋ฆ„์ด ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€ โœ… ย 
setAttributeํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ${}๋กœ ์ถœ๋ ฅํ–ˆ๋Š”๊ฐ€ โœ… ย 
null ์ฒดํฌ ์‹œ <c:if test="${empty student}"> ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€ โœ… ย 

โœ… ์‹ค๋ฌด ํ™•์žฅ ํŒ

๊ธฐ๋Šฅ ํ™•์žฅ ๋ฐฉ๋ฒ•
ํผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ JavaScript ๋˜๋Š” ์„œ๋ฒ„ ์œ ํšจ์„ฑ ์ฒดํฌ ์ถ”๊ฐ€
์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„ updateForm.jsp + update.do ์ถ”๊ฐ€
ํ•„ํ„ฐ ๊ฒ€์ƒ‰ ๊ฒ€์ƒ‰ ํผ + ์กฐ๊ฑด ์ฒ˜๋ฆฌ โ†’ <if> + <where>
์ „์ฒด CRUD ์™„์„ฑ Controller + Service + DAO + JSP ์ „๋ถ€ ๊ตฌ์„ฑ

โœ… 8.5๋‹จ๊ณ„: ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ โ€“ WAR ํŒŒ์ผ ์ƒ์„ฑ โ†’ Tomcat ๋ฐฐํฌ ํ…Œ์ŠคํŠธ

(๐Ÿ“‚ Eclipse or IntelliJ ํ”„๋กœ์ ํŠธ ๊ธฐ์ค€, JSP + Servlet + MyBatis ํฌํ•จ)


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

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  JSP + MyBatis ์›น ํ”„๋กœ์ ํŠธ๋ฅผ .war ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•ํ•˜์—ฌ ์‹ค์ œ ํ†ฐ์บฃ์— ๋ฐฐํฌ
์ฃผ์š” ๊ฐœ๋… WAR ๊ตฌ์กฐ ์ดํ•ด, ๋นŒ๋“œ ์„ค์ •, Tomcat ์—ฐ๋™
๊ธฐ๋Œ€ ํšจ๊ณผ ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ ์‹ค์„œ๋ฒ„ ๋˜๋Š” ๋กœ์ปฌ ํ†ฐ์บฃ์—์„œ ์ง์ ‘ ์‹คํ–‰ ๊ฐ€๋Šฅ

โœ… 1. WAR ํŒŒ์ผ์ด๋ž€?

์šฉ์–ด ์„ค๋ช…
WAR (Web Archive) JSP, Servlet, WEB-INF, lib ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ํŒจํ‚ค์ง€
๊ตฌ์กฐ ์˜ˆ์‹œ ย 
myapp.war/
 โ”ฃ index.jsp
 โ”ฃ login.jsp
 โ”ฃ WEB-INF/
     โ”ฃ web.xml
     โ”ฃ classes/
         โ”ฃ dao/
         โ”ฃ service/
         โ”ฃ controller/
         โ”ฃ main/Student.class
     โ”ฃ lib/
         โ”ฃ mybatis-*.jar
         โ”ฃ log4j.jar ๋“ฑ

โœ… 2. Eclipse์—์„œ WAR ํŒŒ์ผ ์ƒ์„ฑ (Dynamic Web Project ๊ธฐ์ค€)

๐Ÿ”น โ‘  Java EE ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ โ†’ Export

๐Ÿ”น โ‘ก ์˜ต์…˜ ์„ค์ •

ํ•ญ๋ชฉ ์„ค๋ช…
Web project ๋‚ด ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์„ ํƒ
Destination Tomcat์˜ /webapps ๊ฒฝ๋กœ ๋˜๋Š” ๋กœ์ปฌ ์ง€์ •
Target Runtime Tomcat์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ•จ
Export source files โœ… ์ฒดํฌ ํ•„์š” ์—†์Œ (์ปดํŒŒ์ผ๋œ class๋งŒ ๋‚ด๋ณด๋ƒ„)

โœ… 3. Tomcat์— ๋ฐฐํฌ ๋ฐ ์‹คํ–‰

๐Ÿงฉ ๋ฐฉ์‹ 1: ์ˆ˜๋™ ๋ฐฐํฌ

  1. myapp.war ๋ณต์‚ฌ โ†’ C:\tomcat\webapps\ ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ
  2. Tomcat ์‹คํ–‰
  3. ์ž๋™์œผ๋กœ myapp/ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์••์ถ• ํ•ด์ œ๋จ
  4. ์ ‘์† ์ฃผ์†Œ ํ™•์ธ:

    http://localhost:8080/myapp/student/list.do

๐Ÿงฉ ๋ฐฉ์‹ 2: Eclipse ์„œ๋ฒ„ ํƒญ์— ์ง์ ‘ ์ถ”๊ฐ€

  1. Servers ํƒญ ์šฐํด๋ฆญ โ†’ Add and Remove...
  2. ํ”„๋กœ์ ํŠธ ์ถ”๊ฐ€ โ†’ Finish
  3. ์„œ๋ฒ„ ์‹คํ–‰ (Ctrl + F11)
  4. ์ฝ˜์†”์—์„œ ๋กœ๊ทธ ํ™•์ธ + ์ฃผ์†Œ๋กœ ์ ‘๊ทผ

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

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
/WebContent/WEB-INF/web.xml ํŒŒ์ผ์ด ์ •ํ™•ํžˆ ์„ค์ •๋˜์–ด ์žˆ๋Š”๊ฐ€ ์„œ๋ธ”๋ฆฟ ๋งคํ•‘ ํฌํ•จ ์—ฌ๋ถ€ โœ…
JSP, CSS, JS, ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด WAR ๋‚ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”๊ฐ€ WAR ์•ˆ ๊ตฌ์กฐ ํ™•์ธ โœ…
lib/ ํด๋”์— ํ•„์š”ํ•œ .jar ํŒŒ์ผ์ด ๋ˆ„๋ฝ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€ MyBatis, JSTL ๋“ฑ ํฌํ•จ โœ…
์ปจํŠธ๋กค๋Ÿฌ URL โ†’ JSP ์—ฐ๊ฒฐ ํ๋ฆ„์ด ์ž‘๋™ํ•˜๋Š”๊ฐ€ list.do, insert.do ๋“ฑ ํ…Œ์ŠคํŠธ โœ…

โœ… WAR ๋ฐฐํฌ ํ›„ ์˜ค๋ฅ˜ ์ฒดํฌ ๋ฐฉ๋ฒ•

ํ˜„์ƒ ์›์ธ ํ•ด๊ฒฐ
404 ์˜ค๋ฅ˜ ์„œ๋ธ”๋ฆฟ URL, web.xml ๋งคํ•‘ ๋ฌธ์ œ URL ์˜คํƒ€ / @WebServlet ํ™•์ธ
500 ์˜ค๋ฅ˜ ์ž๋ฐ” ์ฝ”๋“œ ์˜ˆ์™ธ / DB ์—ฐ๊ฒฐ ์‹คํŒจ ์ฝ˜์†” ๋กœ๊ทธ ๋ถ„์„
WAR ์••์ถ• ํ•ด์ œ ์•ˆ ๋จ WAR ๋‚ด๋ถ€ ๊ตฌ์กฐ ์˜ค๋ฅ˜ /WEB-INF/web.xml ๋ˆ„๋ฝ ๊ฐ€๋Šฅ

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

ํŒ ์„ค๋ช…
์ •์  ๋ฆฌ์†Œ์Šค ์œ„์น˜ /WebContent/css, /js, /images ๊ถŒ์žฅ
๋นŒ๋“œ ์ž๋™ํ™” Maven/Gradle ํ”„๋กœ์ ํŠธ๋ฉด mvn package๋กœ WAR ์ƒ์„ฑ
๋ฐฐํฌ ์ž๋™ํ™” Jenkins, GitHub Actions ๋“ฑ์œผ๋กœ .war ๋นŒ๋“œ + ์›๊ฒฉ ์ „์†ก ๊ฐ€๋Šฅ
Tomcat reload ์—†์ด ๋ณ€๊ฒฝ /webapps ๋‚ด ๋ณ€๊ฒฝ์€ ์žฌ์‹œ์ž‘ ํ•„์š” โ†’ hot reload ์–ด๋ ค์›€ (IDE ์—ฐ๋™ ์ถ”์ฒœ)

โœ… ๋‹ค์Œ ํ•™์Šต ํ™•์žฅ ์ œ์•ˆ

์ฃผ์ œ ์„ค๋ช…
DB ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์ž๋™ ์‚ฝ์ž… init.sql โ†’ Tomcat ์‹œ์ž‘ ์‹œ ์ž๋™ ์‹คํ–‰
Maven/Gradle ์ ์šฉ pom.xml๋กœ ์˜์กด์„ฑ ์ž๋™ ๊ด€๋ฆฌ, ๋นŒ๋“œ ํšจ์œจ ํ–ฅ์ƒ
Web.xml โ†’ ์–ด๋…ธํ…Œ์ด์…˜ ์ „ํ™˜ Spring MVC๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „ ๋‹จ๊ณ„
HTTPS ์„ค์ • localhost:8443์œผ๋กœ SSL ํ…Œ์ŠคํŠธ