JSP 데이터베이스 연동 개발 가이드

데이터베이스에 정보 추가하기

JSP 페이지에서 사용자가 입력한 정보를 MySQL 데이터베이스에 저장하는 방법은 기본적으로 간단합니다. JSP 페이지에 form 태그를 추가하고, action 속성에는 데이터베이스와 상호작용할 서블릿의 주소를, method 속성에는 get 또는 post 중 하나를 선택하여 설정합니다. 방식은 두 가지가 있는데, get 방식은 데이터가 주소 표시줄에 노출되어 보안에 취약하지만, post 방식은 사용자가 입력한 데이터가 노출되지 않아 상대적으로 안전합니다. form 태그를 설정한 후 사용자가 양식을 작성하고 제출하면, 데이터는 서블릿으로 전송됩니다. 서블릿은 이 데이터를 수신한 후, 미리 작성된 데이터 추가 메소드를 호출하여 사용자가 입력한 정보를 데이터베이스에 저장합니다.

JSP 페이지 예시 코드:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" errorPage="error.html"%>
<%
String contextPath = request.getContextPath();
String baseUrl = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contextPath+"/";
%>

<!DOCTYPE html>
<html>
  <head>
    <base href="<%=baseUrl%>">
    <title>데이터 추가</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
      body { font-family: Arial, sans-serif; }
      .container { max-width: 600px; margin: 0 auto; padding: 20px; }
      table { width: 100%; border-collapse: collapse; }
      td, th { padding: 8px; border: 1px solid #ddd; }
      input[type="text"], input[type="radio"] { margin: 5px; }
      input[type="submit"], input[type="reset"] { padding: 8px 15px; background: #4CAF50; color: white; border: none; cursor: pointer; }
    </style>
  </head>
  
  <body>
    <div class="container">
        <h1>MySQL 데이터베이스에 데이터 추가</h1>
        <hr/>
        <form action="dataInsert" method="post" id="userForm">
            | 이름: | <input name="userName" required="" type="text"></input> |
|---|---|
| 성별: | <input checked="checked" name="userGender" type="radio" value="남자"></input>남자 <input name="userGender" type="radio" value="여자"></input>여자 |
| 나이: | <input max="120" min="1" name="userAge" required="" type="number"></input> |
| 출신지역: | <input name="userRegion" type="text"></input> |
| 학교: | <input name="userSchool" type="text"></input> |
| <input type="submit" value="제출"></input> <input type="reset" value="초기화"></input> |
        </form>
    </div>
  </body>
</html>

서블릿 코드:

package com.example.web.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.web.dao.UserDAO;
import com.example.web.model.User;

public class DataInsertServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // POST 요청만 처리하도록 설정
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "GET method not supported");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 요청 및 응답 문자 인코딩 설정
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        
        // 세션에서 로그인 정보 확인
        String sessionUser = (String)request.getSession().getAttribute("loggedUser");
        String sessionPass = (String)request.getSession().getAttribute("userPassword");
        
        // 로그인 검증
        AuthValidator validator = new AuthValidator();
        if(!validator.checkAuthentication(sessionUser, sessionPass)) {
            request.setAttribute("message", "로그인이 필요한 작업입니다. 먼저 로그인해주세요.");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        
        // 폼 데이터 추출
        String name = request.getParameter("userName");
        String genderStr = request.getParameter("userGender");
        int gender = "여자".equals(genderStr) ? 0 : 1;
        int age = Integer.parseInt(request.getParameter("userAge"));
        String region = request.getParameter("userRegion");
        String school = request.getParameter("userSchool");
        
        // User 객체 생성
        User newUser = new User();
        newUser.setUserName(name);
        newUser.setUserGender(gender);
        newUser.setUserAge(age);
        newUser.setUserRegion(region);
        newUser.setUserSchool(school);
        
        // 데이터베이스에 사용자 추가
        UserDAO userDAO = new UserDAO();
        boolean insertResult = userDAO.insertUser(newUser);
        
        if(insertResult){
            // 모든 사용자 목록을 다시 가져와서 표시
            List<User> userList = userDAO.getAllUsers();
            request.setAttribute("userList", userList);
            request.getRequestDispatcher("/userList.jsp").forward(request, response);            
        }else{
            response.sendRedirect("/error.html");
        }
    }
}

데이터베이스에 정보 추가 방법은 여기서 설명드렸습니다. 이전 내용과 함께 JSP를 이용한 동적 웹사이트 개발의 기본 개념을 이해하셨으리라 생각합니다. 이제 로그인 검증 기능에 대해 자세히 알아보겠습니다.

세션 기반 로그인 검증

웹사이트에서 흔히 볼 수 있는 기능 중 하나가 로그인 검증입니다. 일반적으로 특정 자료를 다운로드하려면 회원으로 로그인해야 하는 경우가 있습니다. 이 기능은 간단하지만 매우 유용합니다. 여기서는 세션(session)이라는 개념을 사용합니다. 사용자가 로그인에 성공하면, 사용자 계정 정보를 세션에 저장합니다. 이렇게 하면 모든 페이지나 서블릿에서 해당 정보를 얻어올 수 있습니다.

세션에 정보 저장 코드:

// 로그인 성공 후
request.getSession().setAttribute("loggedUser", username);
request.getSession().setAttribute("userPassword", password);

세션 정보 사용 코드:

String loggedUser = (String)request.getSession().getAttribute("loggedUser");
String userPassword = (String)request.getSession().getAttribute("userPassword");

데이터베이스 데이터 표시

데이터 추가 방법을 배웠으니, 이제 데이터베이스의 모든 데이터를 JSP 페이지를 통해 사용자에게 표시하는 방법을 알아보겠습니다.

서블릿 코드:

UserDAO userDAO = new UserDAO();
List<User> userList = userDAO.getAllUsers();
request.setAttribute("userList", userList);
request.getRequestDispatcher("/userList.jsp").forward(request, response);

JSP 페이지:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" errorPage="error.html"%>
<%@page import="com.example.web.model.User"%>
<%
String contextPath = request.getContextPath();
String baseUrl = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contextPath+"/";
%>

<!DOCTYPE html>
<html>
  <head>
    <base href="<%=baseUrl%>">
    <title>데이터베이스 데이터 표시</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
      body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }
      .container { max-width: 1000px; margin: 0 auto; }
      h1 { color: #333; }
      table { width: 100%; border-collapse: collapse; margin-top: 20px; }
      th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }
      th { background-color: #f2f2f2; }
      tr:hover { background-color: #f5f5f5; }
      .search-form { margin-bottom: 20px; }
      .search-form input { padding: 8px; margin-right: 10px; }
      .search-form button { padding: 8px 15px; background: #4CAF50; color: white; border: none; cursor: pointer; }
      .error-message { color: red; margin-left: 10px; }
      .actions a { margin-right: 10px; text-decoration: none; color: #0066cc; }
    </style>
  </head>
  
  <body>
  <% List<User> userList = (List<User>)request.getAttribute("userList"); %>
    <div class="container">
        <h1>데이터베이스 내 모든 사용자 정보</h1>
        <hr/>
        
        <div class="search-form">
            <form action="search" method="post">
                <input type="text" name="exactSearch" placeholder="정확한 검색"/>
                <%if(request.getAttribute("exactError")!=null){ %>
                    <span class="error-message"><%=request.getAttribute("exactError")%></span>
                <% } %>
                
                <input type="text" name="fuzzySearch" placeholder="포함 검색"/>
                <%if(request.getAttribute("fuzzyError")!=null){ %>
                    <span class="error-message"><%=request.getAttribute("fuzzyError")%></span>
                <% } %>
                
                <button type="submit">검색</button>
            </form>
        </div>
        
        | ID | 이름 | 성별 | 나이 | 지역 | 학교 | 작업 |
|---|---|---|---|---|---|---|
<userlist.size i=""> &lt;% User currentUser = userList.get(i); %&gt; | &lt;%=currentUser.getUserId() %&gt; | &lt;%=currentUser.getUserName() %&gt; | &lt;%=currentUser.getUserGender() == 1 ? "남자" : "여자" %&gt; | &lt;%=currentUser.getUserAge() %&gt; | &lt;%=currentUser.getUserRegion() %&gt; | &lt;%=currentUser.getUserSchool() %&gt; | [수정](<editUser?id=<%=currentUser.getUserId() %>>) | [삭제](<deleteUser?id=<%=currentUser.getUserId() %>>) |
 &lt;% } %&gt; &lt;% } else { %&gt; | 등록된 사용자가 없습니다. |
 &lt;% } %&gt; </userlist.size>
    </div>
  </body>
</html>

데이터 삭제

삭제 작업은 별도의 사용자 인터페이스가 필요하지 않습니다. 사용자가 삭제 버튼을 클릭하면, 서블릿이 전송된 데이터를 수신하고 미리 작성된 삭제 메소드를 호출하여 삭제 작업을 완료합니다.

서블릿 코드:

public class DeleteUserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 삭제 작업은 GET 방식으로 요청됨 (주소 표시줄에서 ID 확인 가능)
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 요청 및 응답 문자 인코딩 설정
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        
        // 세션에서 로그인 정보 확인
        String sessionUser = (String)request.getSession().getAttribute("loggedUser");
        String sessionPass = (String)request.getSession().getAttribute("userPassword");
        
        // 로그인 검증
        AuthValidator validator = new AuthValidator();
        if(!validator.checkAuthentication(sessionUser, sessionPass)) {
            request.setAttribute("message", "로그인이 필요한 작업입니다. 먼저 로그인해주세요.");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        
        // 삭제할 사용자 ID 추출
        int userId = Integer.parseInt(request.getParameter("id"));
        
        // 데이터베이스에서 사용자 삭제
        UserDAO userDAO = new UserDAO();
        boolean deleteResult = userDAO.deleteUser(userId);
        
        if(deleteResult){
            // 모든 사용자 목록을 다시 가져와서 표시
            List<User> userList = userDAO.getAllUsers();
            request.setAttribute("userList", userList);
            request.getRequestDispatcher("/userList.jsp").forward(request, response);
        }else{
            response.sendRedirect("/error.html");
        }
    }
}

데이터 업데이트

추가, 삭제, 표시 작업을 배웠으니, 이제 업데이트 작업을 배워보겠습니다.

업데이트 작업을 위한 JSP 페이지:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" errorPage="error.html"%>
<%@page import="com.example.web.model.User"%>
<%
String contextPath = request.getContextPath();
String baseUrl = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contextPath+"/";
%>

<!DOCTYPE html>
<html>
  <head>
    <base href="<%=baseUrl%>">
    <title>데이터 수정</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
      body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }
      .container { max-width: 600px; margin: 0 auto; }
      h1 { color: #333; }
      table { width: 100%; border-collapse: collapse; margin-top: 20px; }
      td, th { padding: 12px; border: 1px solid #ddd; }
      input[type="text"], input[type="number"], input[type="radio"] { padding: 8px; width: 100%; box-sizing: border-box; }
      input[type="submit"], input[type="reset"] { padding: 10px 15px; margin-top: 10px; background: #4CAF50; color: white; border: none; cursor: pointer; }
      .radio-group { display: flex; gap: 15px; }
    </style>
  </head>
  
  <body>
  <%User userData = (User)request.getAttribute("userData"); %>
    <div class="container">
        <h1>MySQL 데이터베이스 데이터 수정</h1>
        <hr/>
        <form action="updateUserData" method="post" >
            | ID: | <input name="userId" readonly="readonly" type="text" value="<%=userData.getUserId() %>"></input> |
|---|---|
| 이름: | <input name="userName" required="" type="text" value="<%=userData.getUserName() %>"></input> |
| 성별: | <label> <input :="" name="userGender" type="radio" value="1"></input>&gt; 남자 </label> <label> <input :="" name="userGender" type="radio" value="0"></input>&gt; 여자 </label> |
| 나이: | <input max="120" min="1" name="userAge" required="" type="number" value="<%=userData.getUserAge() %>"></input> |
| 지역: | <input name="userRegion" type="text" value="<%=userData.getUserRegion() %>"></input> |
| 학교: | <input name="userSchool" type="text" value="<%=userData.getUserSchool() %>"></input> |
| <input type="submit" value="수정"></input> <input type="reset" value="초기화"></input> |
        </form>
    </div>
  </body>
</html>

수정할 사용자 정보를 가져오는 서블릿:

public class GetUserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 요청 문자 인코딩 설정
        request.setCharacterEncoding("UTF-8");
        
        // 수정할 사용자 ID 가져오기
        int userId = Integer.parseInt(request.getParameter("id"));
        
        // 데이터베이스에서 사용자 정보 조회
        UserDAO userDAO = new UserDAO();
        User userData = userDAO.getUserById(userId);
        
        if(userData != null) {
            request.setAttribute("userData", userData);
            request.getRequestDispatcher("/editUser.jsp").forward(request, response);
        } else {
            response.sendRedirect("/error.html");
        }
    }
}

사용자가 수정한 데이터를 받아서 데이터베이스를 업데이트하는 서블릿:

public class UpdateUserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // POST 요청만 처리하도록 설정
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "GET method not supported");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 요청 및 응답 문자 인코딩 설정
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        
        // 세션에서 로그인 정보 확인
        String sessionUser = (String)request.getSession().getAttribute("loggedUser");
        String sessionPass = (String)request.getSession().getAttribute("userPassword");
        
        // 로그인 검증
        AuthValidator validator = new AuthValidator();
        if(!validator.checkAuthentication(sessionUser, sessionPass)) {
            request.setAttribute("message", "로그인이 필요한 작업입니다. 먼저 로그인해주세요.");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        
        // 폼 데이터 추출
        int userId = Integer.parseInt(request.getParameter("userId"));
        String name = request.getParameter("userName");
        int gender = Integer.parseInt(request.getParameter("userGender"));
        int age = Integer.parseInt(request.getParameter("userAge"));
        String region = request.getParameter("userRegion");
        String school = request.getParameter("userSchool");
        
        // User 객체 생성
        User updatedUser = new User();
        updatedUser.setUserId(userId);
        updatedUser.setUserName(name);
        updatedUser.setUserGender(gender);
        updatedUser.setUserAge(age);
        updatedUser.setUserRegion(region);
        updatedUser.setUserSchool(school);
        
        // 데이터베이스에 사용자 정보 업데이트
        UserDAO userDAO = new UserDAO();
        boolean updateResult = userDAO.updateUser(updatedUser);
        
        if(updateResult){
            // 모든 사용자 목록을 다시 가져와서 표시
            List<User> userList = userDAO.getAllUsers();
            request.setAttribute("userList", userList);
            request.getRequestDispatcher("/userList.jsp").forward(request, response);
        }else{
            response.sendRedirect("/error.html");
        }
    }
}

여기까지 JSP를 이용한 데이터베이스의 생성(추가), 읽기(조회), 업데이트, 삭제(CRUD) 작업을 설명드렸습니다. 다음 내용에서는 JSP 페이지를 이용한 정확한 검색 및 모호한 검색 기능에 대해 알아보겠습니다.

태그: JSP Servlet MySQL Java Web Session Management

7월 22일 03:42에 게시됨