mvc , 서블릿(get, put) dao dto jsp, jstl, ajax 의 관계를 설명해줘. 특히, 서로 주고 받는 인자들의 흐름을 기준으로 설명해줘
MVC(Model-View-Controller) 패턴에서 Servlet, DAO, DTO, JSP, JSTL, 그리고 AJAX는 웹 애플리케이션에서 데이터를 처리하고 표시하는 주요 구성요소입니다. 아래에서는 각 구성요소가 서로 전달하는 **인자(데이터)**의 흐름을 중심으로 설명하겠습니다.
1. 주요 구성요소의 역할
- Controller (Servlet): 클라이언트 요청을 처리하고, 데이터를 가져와 가공하거나 적절한 뷰(JSP)에 전달합니다.
- Model (DAO & DTO):
- DAO (Data Access Object): 데이터베이스와 상호작용하며 SQL 실행.
- DTO (Data Transfer Object): 데이터의 구조화된 전송을 위한 객체.
- View (JSP & JSTL):
- JSP: 클라이언트에게 데이터를 보여주는 페이지.
- JSTL: JSP에서 데이터 출력 및 간단한 논리 처리를 위한 태그 라이브러리.
- AJAX: 클라이언트와 서버 간 데이터를 비동기로 교환하여 페이지 새로고침 없이 서버와 통신.
2. 데이터 흐름
2.1 데이터 조회 (GET 요청 + AJAX 사용)
1) 클라이언트 요청
클라이언트는 AJAX를 통해 데이터를 요청합니다.
- 예: 사용자 정보 조회
fetch('/user?id=123', { method: 'GET' })
.then(response => response.json())
.then(data => {
console.log(data); // 서버에서 받은 데이터
});
2) Controller (Servlet)
- 클라이언트 요청을 받고, 필요한 데이터를 DAO에서 가져옵니다.
- request.getParameter("id")로 클라이언트 데이터를 가져옵니다.
String id = request.getParameter("id");
UserDTO user = userDAO.getUserById(id);
3) DAO
- DAO는 데이터베이스에서 SQL을 실행해 데이터를 가져오고, DTO 객체에 담아 반환합니다.
public UserDTO getUserById(String id) {
String sql = "SELECT * FROM users WHERE id = ?";
// JDBC 코드 실행 후 결과를 DTO에 담아 반환
UserDTO user = new UserDTO();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
return user;
}
4) Controller (Servlet)
- DAO에서 가져온 DTO 데이터를 JSON 형식으로 변환해 클라이언트(AJAX)에 응답합니다.
response.setContentType("application/json");
response.getWriter().write(new Gson().toJson(user));
5) AJAX 결과 처리
- 클라이언트는 AJAX 응답으로 JSON 데이터를 받아 화면에 표시합니다.
.then(data => {
document.getElementById('username').textContent = data.name;
});
2.2 데이터 등록/수정 (PUT 요청 + AJAX 사용)
1) 클라이언트 요청
- 사용자가 폼에서 데이터를 입력하고 AJAX를 통해 서버로 전송합니다.
- 예: 사용자 정보 수정
fetch('/user', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: 123, name: "새 이름" })
})
.then(response => response.json())
.then(data => {
console.log(data.message); // 처리 결과 메시지
});
2) Controller (Servlet)
- 클라이언트 요청 데이터를 JSON 형태로 받습니다.
- request.getReader()로 JSON 데이터를 파싱.
BufferedReader reader = request.getReader();
String json = reader.lines().collect(Collectors.joining());
UserDTO user = new Gson().fromJson(json, UserDTO.class);
- DAO에 DTO 데이터를 전달하여 데이터베이스를 업데이트합니다.
boolean result = userDAO.updateUser(user);
3) DAO
- SQL을 실행하여 데이터베이스를 갱신합니다.
public boolean updateUser(UserDTO user) {
String sql = "UPDATE users SET name = ? WHERE id = ?";
// JDBC 코드 실행
return rowsUpdated > 0;
}
4) Controller (Servlet)
- 처리 결과를 JSON 형식으로 클라이언트(AJAX)에 응답.
response.setContentType("application/json");
response.getWriter().write("{\"message\": \"업데이트 성공\"}");
5) AJAX 결과 처리
- 클라이언트는 처리 결과 메시지를 받아 화면에 반영.
.then(data => {
alert(data.message); // "업데이트 성공"
});
3. 구성요소 간 데이터 흐름 요약
조회(GET 요청 + AJAX)
- 클라이언트(AJAX): 데이터 요청 (예: /user?id=123).
- Controller(Servlet): 요청 데이터를 DAO에 전달.
- DAO: SQL 실행 → 데이터베이스에서 데이터 조회 → DTO 반환.
- Controller(Servlet): DTO 데이터를 JSON으로 변환하여 클라이언트에 응답.
- 클라이언트(AJAX): JSON 데이터를 화면에 표시.
등록/수정(PUT 요청 + AJAX)
- 클라이언트(AJAX): JSON 데이터를 서버에 전송 (예: /user).
- Controller(Servlet): JSON 데이터를 DTO로 변환하여 DAO에 전달.
- DAO: SQL 실행 → 데이터베이스 갱신.
- Controller(Servlet): 처리 결과(JSON)를 클라이언트에 응답.
- 클라이언트(AJAX): 결과 메시지를 화면에 표시.
4. 예제 흐름
사용자 정보 조회(GET + AJAX):
- 클라이언트가 /user?id=123 AJAX 요청.
- Servlet이 id=123을 DAO에 전달.
- DAO가 데이터베이스에서 사용자 정보를 조회하여 DTO 반환.
- Servlet이 DTO를 JSON으로 변환하여 AJAX에 응답.
- 클라이언트가 JSON 데이터를 파싱해 화면에 표시.
사용자 정보 수정(PUT + AJAX):
- 클라이언트가 JSON 데이터 {id: 123, name: "새 이름"}을 /user PUT 요청.
- Servlet이 JSON 데이터를 DTO로 변환하여 DAO에 전달.
- DAO가 데이터베이스를 업데이트.
- Servlet이 처리 결과를 JSON으로 클라이언트에 응답.
- 클라이언트가 응답 결과(업데이트 성공)를 사용자에게 표시.
5. MVC와 각 구성요소의 상호작용
- AJAX → Servlet: 클라이언트 데이터 전달.
- Servlet → DAO: 데이터베이스 연동 요청.
- DAO → DTO: 데이터베이스 결과를 DTO로 반환.
- Servlet → 클라이언트(AJAX): 처리 결과 JSON 반환.
- AJAX → JSP (간접적): 필요 시 결과 데이터를 JSP DOM에 반영.
6. JSTL과 JSP의 역할
- AJAX가 아닌 경우, 데이터를 request 객체에 저장하고 JSP에서 JSTL로 처리.
- AJAX 요청 결과는 클라이언트 측에서 DOM을 직접 업데이트하므로 JSTL 역할이 줄어듦.
이 흐름은 현대적인 웹 애플리케이션에서 데이터의 흐름을 효율적으로 처리할 수 있도록 돕습니다.
반응형
'코딩ㆍ개발 정보 > HTML 연습' 카테고리의 다른 글
[쿠키 및 CSS 보안 설정] 외부 침입자를 막기 위한 방법 (0) | 2024.08.29 |
---|---|
[JavaScript] 전화번호 - 표시 하고, 저장은 숫자로만 (0) | 2024.08.29 |
[ASP, MSSQL] dbconnection.asp 사용하기 (0) | 2024.08.28 |
[ASP, AJAX] 메뉴 검색 기능 (2) | 2024.08.27 |
[도커] 시놀로지 SSH로 Docker 사용하는 명령어들 (0) | 2024.08.21 |
댓글