koeun23 / kosta_middle_project

0 stars 0 forks source link

What is Servlet? #12

Open wacheni opened 2 years ago

wacheni commented 2 years ago

Servlet이란?? 클라이언트의 요청을 처리하고 그 결과를 반환하는 java웹 프로그래밍 기술입니다. 즉 JAVA로 웹 프로그래밍을 할 때에는 필요하다고 볼 수 있죠. Servlet이 하는 역할을 간단히 말하면 유저가 로그인을 하려 할 시에 입력한 아이디, 비밀번호 값을 받아서 서버에서 유저의 아이디 비번값을 비교한 후 페이지를 띄워주는 일을 한다고 볼 수 있습니다.

Servlet의 특징은 1.http로 요청을 받고 응답한다. 2.Java Thread를 이용하여 동작한다. 3.MVC 패턴에서 Controller로 이용된다. 4.HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.

입니다.

동작방식은 다음과 같습니다. image 잠시 예시 코드를 보도록 하겠습니다.


package com.my.control;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

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

import com.my.sql.MyConnection;

/**
 * Servlet implementation class SignupServlet
 */
public class SignupServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
//GET method는 URL방식으로 전달되어서 보안에 취약함
//POST method는 header로 전송되어서 상대적으로 보안에 강함

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json;charset=UTF-8");
        //String id=request.getParameter("id");
        String id=request.getParameter("id");
        //int i=1; i++; String id="id"+i;
        String pwd=request.getParameter("pwd");
        String name=request.getParameter("name");
        String addr=request.getParameter("addr");
        String buildingno=request.getParameter("buildingno");

//      System.out.println(id+":"+pwd+":"+name+":"+addr+":"+buildingno);
//      
//      response.setContentType("application/json;charset=UTF-8");
//      out.print("{\"status\":1,\"msg\":\"가입\"}");
        //[{\"status\":0,\"msg\":\"가입실패\"},{\"status\":1,\"msg\": \"가입성공\"}]
        //"{\"status\":0}"
        String result="{\"status\":0,\"msg\": \"가입실패\"}";
        //DB연결 
        Connection con=null;
        //SQL송신
        PreparedStatement pstmt=null;//executeUpdate()..
        String insertSQL="INSERT INTO customer(id,pwd,name,status,buildingno,address) VALUES(?,?,?,1,?,?)";
        try {
            con=MyConnection.getConnection();
            pstmt=con.prepareStatement(insertSQL);
            pstmt.setString(1,id);
            pstmt.setString(2, pwd);        
            pstmt.setString(3, name);
            pstmt.setString(4, addr);
            pstmt.setString(5, buildingno);
            pstmt.executeUpdate();
            result="{\"status\":1,\"msg\": \"가입성공\"}";
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) { // 값이 들어가 있음
                    pstmt.close(); // statement 닫음
                }
                if (con != null) { // 디비 연결되어 있음
                    con.close(); // connection닫아줌
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        PrintWriter out=response.getWriter();
        out.print(result);
    }

}

이제 하나하나 살펴보도록 합시다.


public class SignupServlet extends HttpServlet{
//Some Code
}

위의 코드는 Servlet Class의 이름을 준 것과 이 class에서 사용하는 doPost method를 받아오기 위하여 HttpServlet class를 extend 즉 상속2받는 것을 의미합니다. 또한 아래의 코드는


private static final long serialVersionUID = 1L;

직렬화 혹은 Serialization1를 수행하기 위한 목적으로 기술된 코드입니다. 이제 다음인 doPost method를 살펴보도록 하겠습니다.


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json;charset=UTF-8");

여기에서 HttpServletRequest와 HttpServletResponse는 Servlet과 Client를 이어주는 중요한 Object들 입니다. 그 뒤에 나오는 throws는 예외 처리를 하는 방법이며 이러한 예외를 상위 class에 전달해 줍니다. 비슷한 아이인 throw는 Exception을 사용자가 정의할 수 있게 합니다. 이제 try catch block으로 넘어가겠습니다.


PreparedStatement pstmt=null;//executeUpdate()..
        String insertSQL="INSERT INTO customer(id,pwd,name,status,address,buildingno) VALUES(?,?,?,1,?,?)";
        try {
            con=MyConnection.getConnection();
            pstmt=con.prepareStatement(insertSQL);
            pstmt.setString(1,id);
            pstmt.setString(2, pwd);        
            pstmt.setString(3, name);
            pstmt.setString(4, addr);
            pstmt.setString(5, buildingno);
            pstmt.executeUpdate();
            result="{\"status\":1,\"msg\": \"가입성공\"}";
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) { // 값이 들어가 있음
                    pstmt.close(); // statement 닫음
                }
                if (con != null) { // 디비 연결되어 있음
                    con.close(); // connection닫아줌
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        PrintWriter out=response.getWriter();
        out.print(result);
    }

아래의 코드는 sql 구문으로 sql에 입력 즉 insert하기 위하여 사용됩니다.

String insertSQL="INSERT INTO customer(id,pwd,name,status,buildingno,address) VALUES(?,?,?,1,?,?)";

그 뒤에 나오는


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

같은 코드는 String Object인 id, 비밀번호, 유저이름...etc를 받아오는 것을 요청하는 것입니다.

이제 여기에서 받아온 Object의 input data를 Connection을 통하여 DB에 연결을 하고 SQL에 캐시를 사용하는 방식인 prepearedStatement를 활용하여 sql db에 입력을 하는 것입니다. 성공적으로 값을 받았다면 이제 update를 수행한 후 .close method로 db와의 연결을 해제합니다. 마지막으로 중간에 exception이 발생할 수 있으므로 이를 try catch block으로 감싼 후 catch block에 SQLException 처리를 해줍니다. 1 직렬화란 데이터 구조 혹은 오브젝트 상태를 동일 혹은 다른 컴퓨터 환경(e.g 파일, 메모리 버퍼...etc)에서 저장하고 나중에 재구성 할 수 있는 폼으로 바꾸는 작업입니다. 2 extend는 부모의 method를 그대로 사용할 수 있으나, implement는 java에서 지원되지 않는 다중상속을 대신해준다.


public class Son implements Father, Mother{...}

단 implement는 꼭 Override를 해야한다. 참고링크: 1.https://velog.io/@jakeseo_me/%EC%9E%90%EB%B0%94-%EC%84%9C%EB%B8%94%EB%A6%BF%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90.-%EA%B7%BC%EB%8D%B0-%ED%86%B0%EC%BA%A3%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A7%81%EC%9D%84-%EC%82%B4%EC%A7%9D-%EA%B3%81%EB%93%A4%EC%9D%B8#:~:text=%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%80%20%EC%9B%B9%EC%84%9C%EB%B2%84%20%EB%82%B4%EB%B6%80,%EC%A3%BC%EB%A1%9C%20HTTP%EB%A5%BC%20%ED%86%B5%ED%95%9C%EB%8B%A4. 2.https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4

koeun23 commented 2 years ago

잘 보고 갑니다~

koeun23 commented 2 years ago

INSERT INTO customer(id,pwd,name,status,buildingno,address) pstmt.setString(4, addr); pstmt.setString(5, buildingno); 이부분 순서 바뀐것같아요..???