서버프로그램 2일차

2026. 3. 3. 20:51대우개발원 수업 내용/서버프로그램

반응형

JSP 기본 객체의 속성(Attribute) 사용

  • JSP에는 네 가지 기본 객체가 있음:
    pageContext, request, session, application
  • 각 기본 객체는 속성을 가질 수 있으며, 객체가 존재하는 동안 속성을 사용할 수 있음.
  • 속성은 JSP 페이지 간에 정보를 주고받거나 공유하기 위해 사용됨.
  • 속성은 <속성이름, 값> 형태를 가지며, 서로 다른 이름을 가진 여러 속성을 포함할 수 있음.
  • request 객체는 한 번의 요청(Request)에 대해 유효하게 동작하며, 해당 요청을 처리하는 모든 JSP에서 공유됨.

즉, JSP에서 속성(Attribute)은 데이터를 JSP 페이지 사이에서 전달하거나 공유하는 데 중요한 역할을 함

JSP 속성(Attribute) 관련 메서드 정리

메서드 반환형 설명

setAttribute(String name, Object value) void 이름이 name인 속성의 값을 value로 지정한다.
getAttribute(String name) Object 이름이 name인 속성의 값을 가져온다. 존재하지 않을 경우 null을 반환한다.
removeAttribute(String name) void 이름이 name인 속성을 삭제한다.
getAttributeNames() Enumeration 속성의 이름 목록을 가져온다. (단, pageContext 제외)

핵심 포인트

  • 속성은 <속성이름, 값> 형태로 저장된다.
  • JSP 기본 객체(pageContext, request, session, application)에 적용 가능하다.
  • request 객체는 한 번의 요청 동안 모든 JSP에서 공유된다.
  • session과 application은 더 긴 범위에서 데이터를 공유할 수 있다.

표시된 부분의 역할

1. request.setAttribute("num1", num1);

  • request 객체에 "num1"이라는 이름으로 num1 값을 저장합니다.
  • 같은 방식으로 "num2", "add"도 저장합니다.
  • 이렇게 하면 JSP 페이지에서 request.getAttribute("num1") 같은 메서드로 값을 꺼내 쓸 수 있습니다.

👉 즉, 서블릿에서 계산한 데이터를 JSP로 전달하기 위해 request 객체에 담는 과정입니다.


 

웹페이지로 포워딩

 

표시된 부분의 역할

1. request.setAttribute("num1", num1);

  • request 객체에 "num1"이라는 이름으로 num1 값을 저장합니다.
  • 같은 방식으로 "num2", "add"도 저장합니다.
  • 이렇게 하면 JSP 페이지에서 request.getAttribute("num1") 같은 메서드로 값을 꺼내 쓸 수 있습니다.

👉 즉, 서블릿에서 계산한 데이터를 JSP로 전달하기 위해 request 객체에 담는 과정입니다.


2. RequestDispatcher dispatcher = request.getRequestDispatcher("/exercise/addition02.jsp");

  • RequestDispatcher는 특정 JSP나 다른 서블릿으로 요청을 넘겨주는 역할을 합니다.
  • 여기서는 /exercise/addition02.jsp로 요청과 응답을 전달하도록 준비합니다.

3. dispatcher.forward(request, response);

  • 실제로 요청과 응답을 JSP로 포워딩(forward) 합니다.
  • 이때 request에 담아둔 속성(num1, num2, add)도 함께 전달되므로 JSP에서 바로 사용할 수 있습니다.

정리

  • setAttribute → 데이터를 request에 저장
  • getRequestDispatcher + forward → JSP로 요청을 넘기면서 저장된 데이터를 함께 전달

즉, 표시된 부분은 서블릿에서 계산한 결과를 JSP 페이지로 전달하는 핵심 로직이에요.

원하시면 제가 이 JSP(addition02.jsp)에서 어떻게 request.getAttribute로 값을 꺼내서 화면에 출력하는지 예시 코드도 보여드릴까요?


📌 Servlet + JSP 데이터 전달 흐름

1. 서블릿 (AdditionServlet02.java)

@WebServlet("/addservlet")
public class AdditionServlet02 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        int num1 = 20;
        int num2 = 10;
        int add = num1 + num2;

        // JSP에서 쓸 수 있도록 request에 데이터 저장
        request.setAttribute("num1", num1);
        request.setAttribute("num2", num2);
        request.setAttribute("add", add);

        // JSP로 요청 전달 (forward)
        RequestDispatcher dispatcher = 
            request.getRequestDispatcher("/exercise/addition02.jsp");
        dispatcher.forward(request, response);
    }
}

👉 핵심:

  • setAttribute → 데이터를 request에 담음
  • forward → JSP로 요청을 넘김 (주소창은 그대로 /addservlet 유지됨)

2. JSP (addition02.jsp)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Addition</title>
</head>
<body>
    ${num1} + ${num2} = ${add}
</body>
</html>

👉 핵심:

  • ${num1}, ${num2}, ${add} → EL(Expression Language)로 request에 담긴 값 꺼내서 출력

🚀 실행 흐름 요약

  1. 브라우저에서 /addservlet 호출
  2. 서블릿이 계산 후 request에 값 저장
  3. forward로 JSP 실행
  4. JSP가 request에 담긴 값 출력 → 결과: 20 + 10 = 30

📖 기억하기 쉽게 한 줄 정리

  • 서블릿: 데이터 준비 → request.setAttribute()
  • JSP: 데이터 출력 → ${속성이름}
  • forward: 주소창은 서블릿 URL 유지, JSP는 내부에서 실행됨

📌 포워드(forward)란?

  • 서버 내부에서 요청을 다른 자원(JSP, 다른 서블릿 등)으로 넘기는 동작입니다.
  • 클라이언트(브라우저)는 여전히 처음 요청한 URL을 유지합니다.
  • 즉, 브라우저 주소창은 바뀌지 않고, 서버 안에서만 요청이 이동합니다.

🚀 특징

  1. 주소창 유지
    • 브라우저는 /addservlet을 요청했으니 주소창은 그대로 /addservlet입니다.
    • JSP로 넘어가도 내부 처리라서 주소창이 바뀌지 않음.
  2. 데이터 공유 가능
    • request.setAttribute()로 담은 데이터를 JSP에서 그대로 꺼내 쓸 수 있습니다.
    • 같은 요청 객체(request)를 JSP까지 전달하기 때문입니다.
  3. 서버 내부 동작
    • 클라이언트는 JSP가 실행된다는 사실을 직접 알지 못합니다.
    • 결과 HTML만 응답으로 받습니다.

🔄 포워드 vs 리다이렉트

구분 Forward Redirect

주소창 바뀌지 않음 (원래 URL 유지) 새 URL로 변경됨
요청/응답 같은 request, response 객체 사용 새로운 요청/응답 발생
데이터 전달 request.setAttribute로 JSP에 전달 가능 전달 불가 (새 요청이므로 사라짐)
사용 목적 내부 처리, 데이터 공유 다른 페이지로 이동, 외부 URL 연결

📖 한 줄 정리

포워드는 서버 내부에서 요청을 JSP로 넘겨주는 방식 → 주소창은 그대로, 데이터는 그대로 전달된다.


📌 JSP 코드 (form.jsp)

<form method="get" action="/jspWeb/method">
    <input type="submit" value="get 방식으로 호출하기">
</form>

<form method="post" action="/jspWeb/method">
    <input type="submit" value="post 방식으로 호출하기">
</form>

✨ 핵심

  • 두 개의 <form> 태그가 있음
  • 첫 번째는 GET 방식으로 /jspWeb/method 요청
  • 두 번째는 POST 방식으로 /jspWeb/method 요청
  • 버튼을 누르면 각각 다른 HTTP 메서드로 같은 URL(/method)에 요청을 보냄

👉 즉, JSP는 단순히 사용자가 어떤 방식(GET/POST)으로 요청을 보낼지 선택할 수 있는 화면을 제공하는 역할을 합니다.


📌 Servlet 코드 (MethodServlet.java)

@WebServlet("/method")
public class MethodServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.print("<h1>get 방식으로 처리됨</h1>");
        out.close();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.print("<h1>post 방식으로 처리됨</h1>");
        out.close();
    }
}

✨ 핵심

  • @WebServlet("/method") → /method URL로 들어오는 요청을 처리
  • doGet() → GET 요청을 받으면 "get 방식으로 처리됨" 출력
  • doPost() → POST 요청을 받으면 "post 방식으로 처리됨" 출력
  • PrintWriter를 이용해 HTML을 직접 응답으로 작성

👉 즉, Servlet은 JSP에서 보낸 요청을 받아서 GET/POST 방식에 따라 다른 응답을 출력하는 역할을 합니다.


🚀 실행 흐름 요약

  1. 사용자가 JSP 화면에서 버튼 클릭
  2. /jspWeb/method로 요청 전송 (GET 또는 POST)
  3. MethodServlet이 요청을 받아 처리
  4. GET이면 "get 방식으로 처리됨", POST이면 "post 방식으로 처리됨"을 브라우저에 출력

📖 블로그용 한 줄 정리

  • JSP: 사용자 입력 화면 제공 (GET/POST 선택)
  • Servlet: 요청을 받아서 처리하고 결과 응답 출력
  • 핵심 차이: GET 요청은 URL에 데이터가 붙고, POST 요청은 요청 본문에 데이터가 담김
    → Servlet에서 doGet, doPost로 구분 처리

더보기
더보기

하지만 수를 입력하지 않고 확인을 누르면

null값 때문에 오류가 난다

다시를 누르면

이 화면으로 돌아옴

📌 JSP 코드 (param.jsp)

<form method="get" action="/jspWeb/param" name="frm">
    아이디 : <input type="text" name="id"><br>
    나 이 : <input type="text" name="age"><br>
    <input type="submit" value="전송" onclick="return check()">
</form>

✨ 핵심

  • 사용자 입력 화면 제공 (아이디, 나이 입력)
  • action="/jspWeb/param" → /param 서블릿으로 요청 전송
  • onclick="return check()" → 제출 전에 자바스크립트로 유효성 검사 실행

📌 자바스크립트 코드 (param.js)

function check() {
    if (document.frm.id.value == "") {
        alert("아이디를 입력해주세요.");
        document.frm.id.focus();
        return false;
    } else if (document.frm.age.value == "") {
        alert("나이를 입력해주세요.");
        document.frm.age.focus();
        return false;
    } else if (isNaN(document.frm.age.value)) {
        alert("숫자를 입력해주세요.");
        document.frm.age.focus();
        return false;
    } else {
        return true;
    }
}

✨ 핵심

  • 빈 값 검사: 아이디나 나이가 비어 있으면 경고창 띄움
  • 숫자 검사: 나이가 숫자가 아니면 경고창 띄움
  • 모든 조건을 통과하면 true 반환 → 폼 제출 진행

👉 즉, 잘못된 입력을 막고 올바른 값만 서버로 전송하도록 하는 클라이언트 측 검증 로직입니다.


📌 Servlet 코드 (ParamServlet.java)

@WebServlet("/param")
public class ParamServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        
        String id = request.getParameter("id");
        int age = Integer.parseInt(request.getParameter("age"));
        
        PrintWriter out = response.getWriter();
        out.print("<html><body>");
        out.print("당신이 입력한 정보입니다.<br>");
        out.print("아이디 : " + id + "<br>");
        out.print("나이 : " + age + "<br>");
        out.print("<a href='javascript:history.go(-1)'>다시</a>");
        out.print("</body></html>");
        out.close();
    }

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

✨ 핵심

  • request.getParameter("id") → JSP에서 입력한 아이디 가져오기
  • request.getParameter("age") → JSP에서 입력한 나이 가져오기
  • PrintWriter로 HTML 응답 작성 → 입력값을 브라우저에 출력
  • <a href='javascript:history.go(-1)'>다시</a> → 이전 페이지(JSP)로 돌아가는 링크 제공

🚀 실행 흐름 요약

  1. 사용자가 JSP 화면에서 아이디와 나이를 입력
  2. 자바스크립트 check()로 값 검증 (빈 값/숫자 여부)
  3. 올바른 값이면 /param 서블릿으로 GET 요청 전송
  4. 서블릿이 request.getParameter()로 값 꺼내서 응답 HTML 작성
  5. 브라우저에 입력값 출력 + "다시" 링크로 JSP로 돌아갈 수 있음

📖 블로그용 한 줄 정리

  • JSP: 입력 폼 제공
  • JS: 클라이언트 측 유효성 검사
  • Servlet: 입력값을 받아서 처리 후 결과 출력

👉 세 가지가 합쳐져서 폼 입력 → 검증 → 서버 처리 → 결과 출력이라는 웹 애플리케이션 기본 흐름을 완성합니다.



로그인은 보안이 중요하기 때문에 post방식

 

📌 JSP 코드 (login.jsp)

<form method="post" action="/jspWeb/login" name="lg">
    아이디 : <input type="text" name="id"><br>
    암 호 : <input type="text" name="pw"><br>
    <input type="submit" value="로그인" onclick="return check()">
</form>

✨ 핵심

  • 사용자 입력 화면 제공 (아이디, 암호 입력)
  • action="/jspWeb/login" → /login 서블릿으로 POST 요청 전송
  • onclick="return check()" → 제출 전에 자바스크립트로 유효성 검사 실행

📌 자바스크립트 코드 (login.js)

function check() {
    if (document.lg.id.value == "") {
        alert("아이디를 입력해주세요.");
        document.lg.id.focus();
        return false;
    } else if (document.lg.pw.value == "") {
        alert("암호를 입력해주세요.");
        document.lg.pw.focus();
        return false;
    } else {
        return true;
    }
}

✨ 핵심

  • 빈 값 검사: 아이디나 암호가 비어 있으면 경고창 띄움
  • 모든 조건을 통과하면 true 반환 → 폼 제출 진행

👉 즉, 잘못된 입력을 막고 올바른 값만 서버로 전송하도록 하는 클라이언트 측 검증 로직입니다.


📌 Servlet 코드 (LoginServlet.java)

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");

        String id = request.getParameter("id");
        String pw = request.getParameter("pw");

        PrintWriter out = response.getWriter();
        out.print("<html><body>");
        out.print("당신이 입력한 정보입니다.<br>");
        out.print("아이디 : " + id + "<br>");
        out.print("비밀번호 : " + pw + "<br>");
        out.print("<a href='javascript:history.go(-1)'>다시</a>");
        out.print("</body></html>");
        out.close();
    }
}

✨ 핵심

  • request.getParameter("id") → JSP에서 입력한 아이디 가져오기
  • request.getParameter("pw") → JSP에서 입력한 암호 가져오기
  • PrintWriter로 HTML 응답 작성 → 입력값을 브라우저에 출력
  • <a href='javascript:history.go(-1)'>다시</a> → 이전 페이지(JSP)로 돌아가는 링크 제공

🚀 실행 흐름 요약

  1. 사용자가 JSP 화면에서 아이디와 암호 입력
  2. 자바스크립트 check()로 값 검증 (빈 값 여부)
  3. 올바른 값이면 /login 서블릿으로 POST 요청 전송
  4. 서블릿이 request.getParameter()로 값 꺼내서 응답 HTML 작성
  5. 브라우저에 입력값 출력 + "다시" 링크로 JSP로 돌아갈 수 있음

📖 블로그용 한 줄 정리

  • JSP: 입력 폼 제공
  • JS: 클라이언트 측 유효성 검사
  • Servlet: 입력값을 받아서 처리 후 결과 출력

👉 세 가지가 합쳐져서 폼 입력 → 검증 → 서버 처리 → 결과 출력이라는 웹 애플리케이션 기본 흐름을 완성합니다.


 


📌 JSP 코드 (radio.jsp)

<form method="get" action="/jspWeb/radio">
    성별 :
    <input type="radio" name="gender" value="남자" checked> 남자
    <input type="radio" name="gender" value="여자"> 여자
    <br><br>

    메일 정보 수신 여부 :
    <input type="radio" name="chk_mail" value="yes" checked> 수신
    <input type="radio" name="chk_mail" value="no"> 거부
    <br><br>

    간단한 가입인사 :
    <textarea name="content" rows="3" cols="35"></textarea>
    <br>

    <input type="submit" value="전송">
</form>

✨ 핵심

  • 라디오 버튼으로 성별과 메일 수신 여부 선택
  • textarea로 가입 인사 작성
  • action="/jspWeb/radio" → /radio 서블릿으로 GET 요청 전송

👉 JSP는 사용자 입력 화면을 제공하는 역할입니다.


📌 Servlet 코드 (RadioServlet.java)

@WebServlet("/radio")
public class RadioServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String gender = request.getParameter("gender");
        String chk_mail = request.getParameter("chk_mail");
        String content = request.getParameter("content");

        PrintWriter out = response.getWriter();
        out.print("<html><body>");
        out.println("당신이 입력한 정보입니다.<hr>");
        out.println("성별 : <b>" + gender + "</b><br>");
        out.println("메일 정보 수신 여부 : <b>" + chk_mail + "</b><br>");
        out.println("가입 인사 : <b><pre>" + content + "</pre></b>");
        out.println("<a href='javascript:history.go(-1)'>다시</a>");
        out.print("</body></html>");
        out.close();
    }
}

✨ 핵심

  • request.getParameter("gender") → JSP에서 선택한 성별 가져오기
  • request.getParameter("chk_mail") → 메일 수신 여부 가져오기
  • request.getParameter("content") → 가입 인사 가져오기
  • PrintWriter로 HTML 응답 작성 → 입력값을 브라우저에 출력
  • history.go(-1) → 이전 페이지(JSP)로 돌아가는 링크 제공

👉 Servlet은 JSP에서 보낸 데이터를 받아서 처리하고 결과를 출력하는 역할을 합니다.


🚀 실행 흐름 요약

  1. 사용자가 JSP 화면에서 성별, 메일 수신 여부, 가입 인사 입력
  2. /radio 서블릿으로 GET 요청 전송
  3. 서블릿이 request.getParameter()로 값 꺼내서 응답 HTML 작성
  4. 브라우저에 입력값 출력 + "다시" 링크로 JSP로 돌아갈 수 있음

📖 블로그용 한 줄 정리

  • JSP: 입력 폼 제공 (라디오 버튼 + textarea)
  • Servlet: 입력값을 받아서 처리 후 결과 출력
  • 전체 흐름: 폼 입력 → 서버 전달 → 서블릿 처리 → 결과 응답


📌 JSP 코드 (checkbox.jsp)

<h2>악세사리</h2>
관심항목을 선택하세요.
<hr>
<form method="get" action="/jspWeb/checkbox">
    <input type="checkbox" name="item" value="신발"> 신발 
    <input type="checkbox" name="item" value="가방"> 가방 
    <input type="checkbox" name="item" value="벨트"> 벨트<br> 
    <input type="checkbox" name="item" value="모자"> 모자 
    <input type="checkbox" name="item" value="시계"> 시계 
    <input type="checkbox" name="item" value="쥬얼리"> 쥬얼리<br> 
    <input type="submit" value="전송">
</form>

✨ 핵심

  • 여러 개의 체크박스를 name="item"으로 묶음 → 같은 이름으로 여러 값 전달 가능
  • 사용자가 선택한 항목들을 /checkbox 서블릿으로 GET 요청 전송
  • 선택하지 않으면 item 값이 아예 전달되지 않음

👉 JSP는 사용자 입력 화면을 제공하는 역할입니다.


📌 Servlet 코드 (CheckboxServlet.java)

@WebServlet("/checkbox")
public class CheckboxServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String items[] = request.getParameterValues("item");
        PrintWriter out = response.getWriter();

        out.print("<html><body>");
        if (items == null) {
            out.print("선택한 항목이 없습니다.");
        } else {
            out.println("당신이 선택한 항목입니다.<hr>");
            for (String item : items) {
                out.print(item + " ");
            }
        }
        out.println("<br><a href='javascript:history.go(-1)'>다시</a>");
        out.print("</body></html>");
        out.close();
    }
}

✨ 핵심

  • request.getParameterValues("item") → 같은 이름(item)으로 전달된 여러 값을 배열로 가져옴
  • 선택한 항목이 없으면 null 반환 → "선택한 항목이 없습니다." 출력
  • 선택한 항목이 있으면 배열을 순회하며 출력
  • history.go(-1) → 이전 페이지(JSP)로 돌아가는 링크 제공

👉 Servlet은 JSP에서 보낸 여러 값을 받아서 처리하고 결과를 출력하는 역할을 합니다.


🚀 실행 흐름 요약

  1. 사용자가 JSP 화면에서 체크박스 선택
  2. /checkbox 서블릿으로 GET 요청 전송
  3. 서블릿이 request.getParameterValues()로 값 꺼내서 응답 HTML 작성
  4. 브라우저에 선택한 항목 출력 + "다시" 링크로 JSP로 돌아갈 수 있음

📖 블로그용 한 줄 정리

  • JSP: 체크박스 입력 폼 제공
  • Servlet: 여러 값(getParameterValues)을 받아서 처리 후 결과 출력
  • 전체 흐름: 폼 입력 → 서버 전달 → 서블릿 처리 → 결과 응답