ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [KB IT’s Your Life 7기] 데이터 베이스 활용 후기 3편
    카테고리 없음 2026. 6. 16. 08:21

     

    안녕하세요.

     

    오늘은  6월 2주차 기술블로그를 작성하고자 합니다.
    이번주는 데이터베이스 활용후기 3편을 작성할 것인데요.

    jsp 와 서블렛 관련 기본 설정 위주로 내용으로 작성해보려고 합니다.

     



     

    JSP(Java Server Pages)는 HTML 구조 안에 자바 코드를 삽입하여 동적인 콘텐츠를 생성하는 기술입니다.

    하지만 단순히 보여주는 것에 그치지 않고, 사용자가 입력한 데이터를 서버에서 어떻게 수신하고 처리하는지,

    즉 '파라미터 처리' 메커니즘을 완벽히 이해하는 것이 중요합니다.

    어차피 나중에 스프링을 하면 다른 것들을 상대적으로 덜 중요해진다고 하셨거든요.

     

     

     

    1. 프로젝트 환경 설정 (IntelliJ & Tomcat 9)

     

     

     

    본격적인 실습에 앞서 환경을 정렬합시다. 본 가이드는 Tomcat 9.0.98 버전을 기준으로 하며,

    이는 Jakarta EE 8 (javax.servlet) 네임스페이스를 사용함을 의미합니다.

    (버전에 따라 패키지명이 달라지니 주의하세요! 저도 이거 때문에 다른 코드 참조할 때 좀 헷갈렸어요..)

     

    • 프레임워크: Jakarta EE (Web Application)
    • 서버: Tomcat 9.0.98
    • 언어 및 빌드: Java 17 / Gradle
    • Artifact: .war (Web Archive) 배포 설정 확인

     

    프로젝트 생성 후에는 '실행/디버그 구성(Run/Debug Configurations)'에서

    톰캣 서버와 아티팩트가 정상적으로 매핑되었는지 반드시 체크해야 합니다.

     

     

    톰캣 다운은 이곳에서!

    https://tomcat.apache.org/

     

    Apache Tomcat® - Welcome!

    The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the Jakarta

    tomcat.apache.org

     

     

     

    2. HTML5 Form과 전송 방식 (GET vs POST)

     

     

    사용자의 데이터를 서버로 보낼 때는 <form> 태그를 사용합니다.

    이때 목적지인 action과 데이터를 실어 보낼 방식인 method를 지정하게 됩니다.

    전문가의 시선: GET vs POST 비교 분석

    주니어 개발자들이 가장 자주 묻는 질문 중 하나가 두 방식의 차이점입니다.

    단순히 'URL에 보이냐 아니냐'를 넘어 멱등성(Idempotency)과 캐싱 측면에서 이해해야 합니다.

     

     

     

     

    구분GET 방식POST 방식




    데이터 위치 URL 뒤의 쿼리 스트링 (Header) HTTP Request Body (요청 몸체)
    보안성 URL 노출되어 민감 정보에 부적합 상대적으로 보안에 유리함
    길이 제한 브라우저별 URL 길이 제한 있음 제한이 거의 없음 (대용량 전송 가능)
    멱등성/캐싱 멱등함(여러 수행해도 결과 동일), 캐싱 가능 비멱등적, 캐싱 불가 (새로고침 재요청 경고창 발생)

     

     

     

    3. 단일 파라미터 처리: getParameter(name)

     

    아이디나 비밀번호처럼 하나의 필드에 하나의 값만 매핑될 때 사용합니다.

    LoginServlet.java 구현 (javax.servlet 패키지 기준)

    서블릿에서 응답을 보낼 때는 반드시 resp.setContentType과 PrintWriter를 사용하여

    브라우저가 해석할 수 있는 형식을 지정해줘야 합니다.

     

     

    4. 다중 값 처리: getParameterValues(name)

     

    Expert Tip: 만약 체크박스처럼 여러 값이 선택될 수 있는 필드에 getParameter()를 사용하면 어떻게 될까요?

    오직 첫 번째 값만 반환되고 나머지는 유실됩니다. 이를 방지하기 위해 String[] 배열을 반환하는 

     

    getParameterValues()를 사용해야 합니다.

    sports.jsp에서 사용자가 선택한 여러 운동 정보를 배열로 처리하는 로직입니다.

     

     

    // doPost 내 구현부
    req.setCharacterEncoding("UTF-8");
    String[] sports = req.getParameterValues("sports");
    String sex = req.getParameter("sex");
    
    resp.setContentType("text/html; charset=UTF-8");
    PrintWriter out = resp.getWriter();
    
    out.print("<html><body>");
    if (sports != null) {
        for (String sport : sports) {
            out.print("좋아하는 운동: " + sport + "<br>");
        }
    }
    out.print("성별 : " + sex + "<br>");
    out.print("</body></html>");
    



     

     

    5. 동적 파라미터 이름 추출: getParameterNames()

    전달되는 데이터의 필드 이름을 정확히 모르거나, 일괄 처리가 필요할 때 Enumeration 인터페이스를 활용합니다.

     

    아래 소스 코드의 board_form.jsp에는 <input type="hidden" name="action" value="write">가 포함되어 있습니다.

    getParameterNames()는 사용자에게 보이지 않는 이러한 Hidden 파라미터까지 모두 찾아내므로,

    내부적인 상태 관리나 로직 분기를 처리할 때 매우 유용합니다.

    BoardServlet.java 구현

    Enumeration을 사용하기 위해 java.util.Enumeration 임포트가 필수입니다.

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/board")
    public class BoardServlet extends HttpServlet {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html; charset=UTF-8");
            PrintWriter out = resp.getWriter();
            out.print("<html><body>");
    
            // 모든 파라미터 이름을 열거형으로 가져옴
            Enumeration<String> enu = req.getParameterNames();
    
            while(enu.hasMoreElements()) {
                String name = enu.nextElement();
                String value = req.getParameter(name);
                // hidden 필드인 'action'도 여기서 출력됨을 확인하세요!
                out.print("<b>" + name + "</b> : " + value + "<br>");
            }
            out.print("</body></html>");
        }
    
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8"); // POST 방식의 한글 처리
            doGet(req, resp);
        }
    }
    

     

     

    6. 필수 팁: 한글 깨짐 방지 및 인코딩 원리

    한글이 깨지는 현상은 톰캣의 기본 인코딩인 ISO-8859-1이 한글 한 글자를 제대로 표현하지 못해 발생하는

    'Mojibake(모지바케)' 현상입니다.

    • GET 방식: 최신 서블릿 컨테이너는 URI 내의 한글을 UTF-8로 자동 인식하는 경우가 많아 상대적으로 자유롭습니다.
    • POST 방식: 데이터가 HTTP Body에 실려 오기 때문에, 데이터를 읽기 전(getParameter 호출 전)에 반드시 req.setCharacterEncoding("UTF-8")을 선언해야 합니다.

     

    한글 깨지는 현상..

     

     

    인코딩 설정이 없을 때 '홍길동'을 전송하면 '홍길동'과 같은 외계어로 출력되는 결과를 꼭 확인해 보세요.

    인코딩 설정 하나가 디버깅 시간을 시간 단축해 줍니다.

     

     

    다음 시간엔 위 과정의 전체적인 흐름을 다시한번 확인하며 이해하는 시간을 가져보도록 하겠습니다.

    오늘은 여기까지!

Designed by Tistory.