코딩ㆍ개발 정보/HTML 연습

mvc를 서블릿(get, put) dao dto jsp(jstl, ajax)의 인자 흐름으로 보기

RioRex 2024. 11. 19.

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)

  1. 클라이언트(AJAX): 데이터 요청 (예: /user?id=123).
  2. Controller(Servlet): 요청 데이터를 DAO에 전달.
  3. DAO: SQL 실행 → 데이터베이스에서 데이터 조회 → DTO 반환.
  4. Controller(Servlet): DTO 데이터를 JSON으로 변환하여 클라이언트에 응답.
  5. 클라이언트(AJAX): JSON 데이터를 화면에 표시.

등록/수정(PUT 요청 + AJAX)

  1. 클라이언트(AJAX): JSON 데이터를 서버에 전송 (예: /user).
  2. Controller(Servlet): JSON 데이터를 DTO로 변환하여 DAO에 전달.
  3. DAO: SQL 실행 → 데이터베이스 갱신.
  4. Controller(Servlet): 처리 결과(JSON)를 클라이언트에 응답.
  5. 클라이언트(AJAX): 결과 메시지를 화면에 표시.

4. 예제 흐름

사용자 정보 조회(GET + AJAX):

  1. 클라이언트가 /user?id=123 AJAX 요청.
  2. Servlet이 id=123을 DAO에 전달.
  3. DAO가 데이터베이스에서 사용자 정보를 조회하여 DTO 반환.
  4. Servlet이 DTO를 JSON으로 변환하여 AJAX에 응답.
  5. 클라이언트가 JSON 데이터를 파싱해 화면에 표시.

사용자 정보 수정(PUT + AJAX):

  1. 클라이언트가 JSON 데이터 {id: 123, name: "새 이름"}을 /user PUT 요청.
  2. Servlet이 JSON 데이터를 DTO로 변환하여 DAO에 전달.
  3. DAO가 데이터베이스를 업데이트.
  4. Servlet이 처리 결과를 JSON으로 클라이언트에 응답.
  5. 클라이언트가 응답 결과(업데이트 성공)를 사용자에게 표시.

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 역할이 줄어듦.

이 흐름은 현대적인 웹 애플리케이션에서 데이터의 흐름을 효율적으로 처리할 수 있도록 돕습니다.

반응형

댓글