| 웹 용어 | 학교 반 비유 |
|---|---|
| 서버 시작 | 아침 8시 반 시작! 선생님 출근! 교실 문 열림 |
| Listener | 선생님이 교실 들어오면서 “오늘은 이 조는 수학, 저 조는 과학” 정해줌 |
| actionMapping | 학급 시간표: 누구 조가 어떤 과목 맡았는지 정리된 표 |
| DispatcherServlet | 반장: 친구가 뭘 도와달라고 하면, 어떤 조로 보내야 할지 판단함 |
| key=insert | “저 수학 질문이요!” 라고 적은 쪽지 |
| Controller | 조장: 반장이 보낸 친구를 맞이해서 일 처리 시작 |
| Service | 부반장: 조장이 뭐 할지 물어보면 대신 조원들 정리해줌 |
| DAO | 조원들: 실제로 노트 정리하고 칠판에 적는 실무 담당 친구들 |
| ModelAndView | 조장이 “넌 이따 발표하러 3반 교실 가면 돼~” 하고 알려주는 쪽지 |
🛎️ 아침이 되면
🏃 친구가 와서 반장에게 말해
key=insert)👨🏫 조장이 친구를 맞이해
✉️ 일이 끝나면
= 건물 문 앞에서 관리자가 카드키 찍고 “문 열어~” 하는 거야!
마치 미리 출근해서 사무실에 대기하고 있는 거지!
손님이 들어오면서 “나 가입하러 왔어요~” 하고 종이에 써서 보여줘!
예:/front?key=insert
“오셨어요~! 이름이 뭐고 나이는 몇이에요?”
손님한테 정보를 받아서, 뒤에 있는 팀원들에게 전달해.
→ 다 처리되면 “완료!” 라고 외치고,
어느 페이지로 이동할지 알려줘.
“이제 손님, 여기서 나가실게요~” 하면서
| 웹 용어 | 비유 |
|---|---|
| 서버 시작 | 건물 문 열림 (카드키 찍기) |
| Listener | 관리자: 도우미들을 미리 준비해둠 |
| actionMapping | 안내책자: 누구한테 가야 할지 지도 |
| DispatcherServlet | 입구 안내직원 |
| key=insert | 손님이 들고 오는 메모지 |
| Controller | 실제로 일 처리하는 도우미 |
| Service | 실무 담당 매니저 |
| DAO | 진짜 저장하는 팀원 (DB 연결) |
| ModelAndView | “손님, 어디로 가야 할지” 안내서 |
src/
├── web/
│ ├── mvc/
│ │ ├── controller/
│ │ │ ├── Controller.java ← 인터페이스
│ │ │ ├── InsertController.java
│ │ │ ├── SelectController.java
│ │ │ ├── UpdateController.java
│ │ │ └── DispatcherServlet.java ← FrontController
│ │ ├── listener/
│ │ │ └── HandlerMappingListener.java ← 컨트롤러 매핑 초기화
│ │ └── ModelAndView.java ← 뷰 정보 전달 객체
resources/
└── actionMapping.properties ← key=컨트롤러 클래스명
webapp/
└── *.jsp (index.jsp, selectResult.jsp, updateResult.jsp 등)
HandlerMappingListener 실행actionMapping.properties 파일에서 key-value (예: "insert"=web.mvc.controller.InsertController)를 읽어옴Map<String, Controller>에 저장application.setAttribute("map", map) 으로 전역 저장/front?key=insert)DispatcherServlet이 모든 요청을 받음key 파라미터를 통해 매핑된 Controller 객체 추출 (map.get(key))handleRequest() 호출ModelAndView(view, isRedirect) 반환지금 너가 준 코드에는 DAO나 DB 연결 관련 구현은 없음, 대신 InsertController, SelectController, UpdateController 내부에 다음과 같은 주석으로 DB 연동 구조가 예정되어 있어:
// service쪽으로 vo를 전달해서 등록완료후 결과를 받는다.
→ 즉, 추후에는 다음 구조로 확장됨
DAO가 JDBC 또는 DBCP로 DB에 연결예상 파일 구조는 다음처럼 추가될 수 있어:
├── dao/
│ ├── MemberDAO.java
│ └── MemberDAOImpl.java
├── dto/
│ └── MemberDTO.java
├── service/
│ ├── MemberService.java
│ └── MemberServiceImpl.java
너는 특정 기능을 담당하는 Controller 하나를 구현하면 돼. 예를 들어 다음 중 하나:
| 기능 | 구현 파일 | 할 일 요약 |
|---|---|---|
| 회원 등록 | InsertController.java | request → DTO → service 호출 → 결과에 따라 index.jsp로 redirect |
| 회원 조회 | SelectController.java | mock 데이터 리스트 생성 → request.setAttribute → selectResult.jsp로 forward |
| 회원 정보 수정 | UpdateController.java | message 설정 → updateResult.jsp로 forward |
👉 참고: handleRequest() 내에서 다음 순서를 따르면 돼
request.getParameter()로 파라미터 받기new MemberDTO(...))request.setAttribute(...))new ModelAndView("xxx.jsp", true/false) 반환ModelAndView는 Spring MVC 구조의 축소판처럼 동작함.
actionMapping.properties는 이런 식으로 생겨 있을 것:
insert=web.mvc.controller.InsertController
select=web.mvc.controller.SelectController
update=web.mvc.controller.UpdateController
handleRequest 안에서 파라미터 받기부터 DTO 생성, 응답까지 구현필요하면 actionMapping.properties 예시도 줄 수 있어.
컨트롤러 중 어떤 거 맡았는지 알려줄래?
너무 잘하고 있어! 처음 자바 배울 때보다 확실히 성장한 거야 🙌
자 이제, 요청한 Service/DAO 기본 구조, actionMapping.properties 연결 방식, 그리고 다시 한 번 HandlerMappingListener까지 설명해줄게.
src/
├── web/
│ ├── mvc/
│ │ ├── controller/
│ │ │ ├── InsertController.java
│ │ │ ├── ...
│ │ ├── service/
│ │ │ ├── MemberService.java
│ │ │ └── MemberServiceImpl.java
│ │ ├── dao/
│ │ │ ├── MemberDAO.java
│ │ │ └── MemberDAOImpl.java
│ │ ├── dto/
│ │ │ └── MemberDTO.java
│ ├── listener/
│ │ └── HandlerMappingListener.java
resources/
└── actionMapping.properties
actionMapping.properties 예시와 연결 방식insert=web.mvc.controller.InsertController
select=web.mvc.controller.SelectController
update=web.mvc.controller.UpdateController
insert)는 URL의 ?key=insert에서 사용됨.web.mvc.controller.InsertController)은 클래스 이름으로,HandlerMappingListener에서 리플렉션을 통해 인스턴스 생성 후 Map<String, Controller>에 저장됨.Controller con = (Controller)className.getDeclaredConstructor().newInstance();
→ 이렇게 생성된 InsertController는 /front?key=insert 요청 시 DispatcherServlet에서 호출됨!
HandlerMappingListener.java 역할 다시 정리actionMapping.properties 로딩해서application.setAttribute("map", map) 저장 → 모든 서블릿에서 접근 가능MemberDTO.javapackage web.mvc.dto;
public class MemberDTO {
private String id;
private String name;
private int age;
public MemberDTO() {}
public MemberDTO(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// Getter / Setter 생략
}
MemberService.javapackage web.mvc.service;
import web.mvc.dto.MemberDTO;
public interface MemberService {
void insertMember(MemberDTO member);
}
MemberServiceImpl.javapackage web.mvc.service;
import web.mvc.dao.MemberDAO;
import web.mvc.dao.MemberDAOImpl;
import web.mvc.dto.MemberDTO;
public class MemberServiceImpl implements MemberService {
private MemberDAO dao = new MemberDAOImpl();
@Override
public void insertMember(MemberDTO member) {
dao.insert(member);
}
}
MemberDAO.javapackage web.mvc.dao;
import web.mvc.dto.MemberDTO;
public interface MemberDAO {
void insert(MemberDTO member);
}
MemberDAOImpl.java (DB 연결은 간단히 print로 대체 가능)package web.mvc.dao;
import web.mvc.dto.MemberDTO;
public class MemberDAOImpl implements MemberDAO {
@Override
public void insert(MemberDTO member) {
System.out.println("DB에 저장: " + member.getId() + ", " + member.getName());
// 실제로는 JDBC 사용
}
}
InsertController.java 연결 예시package web.mvc.controller;
import jakarta.servlet.http.*;
import web.mvc.dto.MemberDTO;
import web.mvc.service.MemberService;
import web.mvc.service.MemberServiceImpl;
public class InsertController implements Controller {
private MemberService service = new MemberServiceImpl();
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
String id = request.getParameter("id");
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
MemberDTO dto = new MemberDTO(id, name, age);
service.insertMember(dto);
return new ModelAndView("index.jsp", true); // redirect
}
}
dto, service, dao 폴더 생성하고 위 예제 붙여넣기/front?key=insert)궁금한 거 또 있으면 얼마든지 물어봐줘 😊
지금처럼 차근차근 가면 꼭 멋진 웹 프로젝트 완성할 수 있어!
좋아! 지금까지 내가 설명한 내용들을 초등학교 6학년 친구한테 말하듯 아주 쉽게 풀어볼게 😊
건물로 치면:
DispatcherServlet이야)InsertControllerSelectControllerUpdateController→ 각각 담당한 방으로 데려가고, 결과를 돌려줘!
key=insert 같은 비밀번호를 살짝 보여줘DispatcherServlet)가actionMapping.properties야)서버 시작될 때)HandlerMappingListener 라는 사람이actionMapping.properties)를 보고→ 그래서 손님이 왔을 때 바로 꺼내쓸 수 있어!
자기 친구들한테 도움을 줘! (이게 Service, DAO)
Service는 일 시키는 매니저 느낌이고,
DAO는 진짜 컴퓨터에 저장하는 친구야.
/front?key=insert)index.jsp)쉽게 이해했지?
이 웹 프로젝트는 정말 "회사처럼 역할 나눠서 일하는 구조" 라고 보면 돼!
또 궁금하면 언제든 물어봐도 돼~ 넌 점점 잘하고 있어 👏🔥