본문 바로가기
교재 실습/자바 웹 개발 워크북

25. HttpServlet으로 POST 요청 다루기

by Jint 2022. 1. 20.

HttpServlet 클래스의 doPost()를 이용하여 POST 요청을 다루는 방법과 JDBC를 이용하여 회원 정보를 DB에 저장하는 방법을 알아본다.

 

MemberAddServlet 클래스에서 doPost()를 오버라이딩 한다. 이 메소드는 클라이언트에서 POST 요청을 보낼 때 호출된다.

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//JDBC 객체를 보관할 참조 변수 선언
		Connection conn = null;
		PreparedStatement stmt = null;
		//PreparedStatement : 반복적인 질의를 하거나, 입력 매개변수가 많은 경우 유용.
		//이미지와 같은 바이너리 데이터를 저장, 변경 시 PreparedStatement만 가능.

		try {//데이터베이스 관련 코드는 try 블록에 둔다.
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost/studydb", //JDBC URL
					"study",	// DBMS 사용자 아이디
					"study");	// DBMS 사용자 암호
			stmt = conn.prepareStatement(
					"INSERT INTO MEMBERS(EMAIL,PWD,MNAME,CRE_DATE,MOD_DATE)"
					+ " VALUES (?,?,?,NOW(),NOW())"); //? : 입력 매개변수(입력 매개변수의 번호는 1부터 시작)
			
			stmt.setString(1, request.getParameter("email"));
			stmt.setString(2, request.getParameter("password"));
			stmt.setString(3, request.getParameter("name"));
			
			//SQL문 서버에 보냄
			stmt.executeUpdate();
			
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter out = response.getWriter();
			out.println("<html><head><title>회원등록결과</title></head>");
			out.println("<body>");
			out.println("<p>등록 성공입니다!</p>");
			out.println("</body></html>");
			
		} catch (Exception e) {//JDBC 프로그래밍에서 예외처리
			throw new ServletException(e);
			
		} finally {//회원정보 입력의 성공여부에 상관없이 반드시 수행
			//사용한 자원 해제
			try {if (stmt != null) stmt.close();} catch(Exception e) {}
			try {if (conn != null) conn.close();} catch(Exception e) {}
		}

	}

PreparedStatement 객체를 사용하여 SQL문과 입력 매개변수를 서버에 보낸다. 입력 매개변수의 설정은 입력 매개변수의 타입이 문자열이면 setString(), 정수형이면 setInt(), 날짜형이면 setDate()를 호출한다. 입력 매개변수의 번호는 배열의 인덱스와 달리 0부터 시작하지 않고 1부터 시작한다. 2, 3, 1처럼 순서에 상관없이 설정 가능하지만 원활한 소스 코드 해석을 위해 가급적 1, 2, 3처럼 순서대로 설정한다.

그림 1 (PreparedStatement의 입력 매개변수)

 

결과를 반환하는 SELECT문을 실행할 때 executeQuery()를 호출하고, INSERT처럼 결과 레코드를 만들지 않는 DDL이나 DML 종류의 SQL문을 실행할 때 executeUpdate()를 호출한다. 엄밀히 말하면 SQL문을 직접실행하는 것이 아닌 서버에 보내는 것이다. JDBC API는 애플리케이션에서 데이터베이스 서버에 SQL 명령문을 보내고 그 결과를 받는 일은 한다. 서버에 SQL문을 보낼 때 문자열 그대로 보내지 않고 전송의 효율을 위해 데이터베이스 전용 프로토콜에 맞게 변환하여 보내고 받는다.

 

소스 파일 저장 후 톰캣 서버를 재시작한다. 보통 소스 파일을 저장하면 자동으로 컴파일 되고, 컴파일 된 클래스 파일은 톰캣 임시 배포 폴더로 자동 배포 된다. 만약 웹 애플리케이션이 자동 로딩으로 설정되어 있다면, 톰캣 서버는 일정시간마다 클래스 파일의 변경 여부를 검사하여 변경 사항이 있으면 해당 클래스를 다시 로딩한다.

 

그림 2 (회원 정보 입력폼에 테스트 값 입력)

회원 정보 입력폼에 테스트 값 입력 후 추가 버튼을 클릭한다.

그림 3 (회원 정보 등록 결과)

회원 정보 등록 결과가 출력된다(그림 3). 만약 실행 오류가 발생한다면, SQL문에 오류가 있는 것이다. 여기서 그림 2와 그림 3의 URL이 같은데, 그럼에도 다른 응답 결과가 나온 이유는 클라이언트의 요청 방식에 따라 doGet(), doPost()를 구분하여 호출하기 때문이다.

 

정상적으로 등록되었는지 회원 목록 화면을 출력한다(그림 4).

그림 4 (회원 목록 조회 결과)

입력한 회원 정보가 맨 밑에 출력되었다.

 

그림 5 (Statement와 PreparedStatement의 특징 비교)

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글