본문 바로가기
JSP

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(2) - 웹에서 데이터베이스로 값 넣기

by 김마리님 2020. 5. 28.

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(1) - 기본 세팅하기

 

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(1) - 기본 세팅하기

앞서 만들었던 회원가입 시스템은 jsp만을 이용했다. 이런 형태를 모델1 형식이라고 한다. 서블릿과 jsp를 이용해서 병행하여 사용하는 것을 모델2 형식이라고 한다. 다음 블로그 형식에서는 컨트

itstudy-mary.tistory.com

 

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(1) - 기본 세팅하기

 

이제 클라이언트의 요청과 응답을 받을 컨트롤러 서블릿을 만든다.

 

-UsersController.java

ackage com.cos.blog.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cos.blog.action.Action;
import com.cos.blog.action.user.UsersJoinAction;
import com.cos.blog.action.user.UsersJoinProcAction;


//http://localhost:8000/blog/user

@WebServlet("/user")
public class UsersController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private final static String TAG="UsersController : ";

    public UsersController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//http://localhost:8000/blog/user?cmd=join
		String cmd=request.getParameter("cmd");
		System.out.println(TAG+"router : "+cmd);
		Action action=router(cmd);
		action.execute(request, response);
	}
	
	public Action router(String cmd) {
		if(cmd.equals("join")) {
			return new UsersJoinAction();
		}else if(cmd.equals("joinProc")) {
			//회원가입 진행 후 -> index.jsp 이동
			return new UsersJoinProcAction();
		}else if(cmd.equals("update")) {
			//회원 수정 페이지 이동(세션에 user object를 가지고 있을 예정)
		}else if(cmd.equals("updateProc")) {
			//회원 수정 진행 -> index 이동
		}else if(cmd.equals("delete")) {
			//회원 삭제 진행 후 -> 로그아웃 -> index.jsp
		}else if(cmd.equals("login")) {
			//회원 로그인 페이지로 이동
		}else if(cmd.equals("loginProc")) {
			//로그인 수행 -> 세션 등록 -> index.jsp
		}
		return null;
	}

}

 

요청 받는 모든 것을 일단 프로세스로 보낸다. 프로세스에서 라우터로 보내서 받은 쿼리문(cmd= ???) 에 따라 다른 곳으로 이동시키는 코드를 작성할 것이다.

 

그 전에, 라우터에서 모든 일을 해결하면 라우터가 점점 라우터로서의 역할이 희미해진다. 그렇기 때문에 라우터는 연결통로의 역할만 하고, 역할은 action 에서 해결하도록 한다.

그런데 액션에서 역할을 하려면, 요청과 응답을 반드시 받아야 하는 공통점이 있다. 이것을 공통적으로 코드를 줄이고 효율성을 높이기 위해 action 인터페이스를 만든다.

 

-Action.java

package com.cos.blog.action;

import java.io.IOException;

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

public interface Action {
	public void execute(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
}

 

이제 인터페이스를 상속해서 회원가입 페이지를 띄우는 코드를 보자.

 

-UsersJoinAction.java

package com.cos.blog.action.user;

import java.io.IOException;

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

import com.cos.blog.action.Action;

public class UsersJoinAction implements Action {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher dis=request.getRequestDispatcher("user/join.jsp");
		dis.forward(request, response);
		
	}
}

인터페이스를 상속받은 클래스는 요청과 응답을 필수적으로 받게 되고, 회원가입 페이지로 가게 된다.

 

또, 회원가입 페이지로 가고 싶다는 요청뿐만 아니라, 입력받은 값을 DB에 넣고 회원가입의 성패 여부, 또 성공했다면 홈페이지로 돌려줄 코드도 필요하다. 회원가입을 진행하는 코드를 보자.

 

-UsersJoinProcAction.java

package com.cos.blog.action.user;

import java.io.IOException;
import java.io.PrintWriter;

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

import org.apache.catalina.User;

import com.cos.blog.action.Action;
import com.cos.blog.model.RoleType;
import com.cos.blog.model.Users;
import com.cos.blog.repository.UsersRepository;
import com.cos.blog.util.Script;

public class UsersJoinProcAction implements Action {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//0. 유효성 검사
		if(
			request.getParameter("username").equals("")||
			request.getParameter("username")==null||
			request.getParameter("password").equals("")||
			request.getParameter("password")==null||
			request.getParameter("email").equals("")||
			request.getParameter("email")==null||
			request.getParameter("address").equals("")||
			request.getParameter("address")==null
		) {
			return ;
		}
		
		
		
		//1. 파라메터 받기(x-www-form-urlencoded mime type -> key = value)
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String email = request.getParameter("email");
		String address=request.getParameter("address");
		String userRole=RoleType.USER.toString();
		
		//2. User 오브젝트 변환
		Users user=Users.builder()
				.username(username)
				.password(password)
				.address(address)
				.email(email)
				.userRole(userRole)
				.build();
		
		//3. DB 연결 - Repository save 호출
		UsersRepository usersRepository=UsersRepository.getInstance();
		int result=usersRepository.save(user);
		
		//4. index.jsp 페이지 이동
		if(result==1) {
			RequestDispatcher dis=request.getRequestDispatcher("index.jsp");
		}else {
			Script.back("회원가입에 실패하셨습니다.", response);
		}
	}
}

 

먼저 유효성 검사를 한다. 값이 비어있으면 회원가입을 실패할 수 있도록.

 

그리고 입력받은 값을 key=vaule으로 받아서 bulider(이것도 lombok의 기능이다.)을 이용해 모델에 값을 채워넣는다.

그리고 아까 입력한, DB에 연결해 줄 클래스를 호출하고, 호출한 클래스 속의 sava 함수를 이용해 데이터베이스에 값을 넣는다.

대신 주의할 점이 있다.

다른 페이지로 갈 때, 절대 redirect로 돌아가도록 하지 않도록 한다. 돌아가게 될 경우 이 같은 경우는 내가 어떤 경로에 어떤 파일을 넣어두었는지 그대로 노출되게 되므로, 위험하다.

또, 회원가입이 실패했을 때 다음과 같은 코드를 쓰는 것이 좋다.

 

-Script.java

package com.cos.blog.util;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;

public class Script {

	public static void back(String msg, HttpServletResponse response) {
		try {
		PrintWriter out=response.getWriter();
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		out.println("<script>");
		out.println("alert('"+msg+".');");
		out.println("history.back();");
		out.println("</script>");
		}catch (Exception e) {
			// TODO: handle exception
		}

	}
}

  history.back 함수를 사용해서 돌아가면 입력한 정보가 그대로 돌아가게 되지만, 재요청을 하게 될 경우 입력한 값이 남지 않기 때문에 불편한 코드가 된다.

 

이제 save 함수를 수정해보자.

 

-UsersResponsitory.java

	public int save(Users user) {
		final String SQL="insert into users (id,username,password,email,address,userrole,createdate) values(USER_SEQ.nextval,?,?,?,?,?,sysdate) ";
		try {
			conn=DBConn.getConnection();
			pstmt = conn.prepareStatement(SQL);
			pstmt.setString(1, user.getUsername());
			pstmt.setString(2, user.getPassword());
			pstmt.setString(3, user.getEmail());
			pstmt.setString(4, user.getAddress());
			pstmt.setString(5, user.getUserRole());
			
			return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(TAG+"save : "+e.getMessage());
		}finally {
			DBConn.close(conn, pstmt);
		}
		
		return -1;
	}

 

postman을 통해 결과값이 들어가는 것을 확인하면,

결과가 데이터베이스에 깔끔하게 들어가는 것을 확인할 수 있다.

 

 

Next --

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(3) - 부트스트랩을 이용한 웹 폼 만들기

 

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(3) - 부트스트랩을 이용한 웹 폼 만들기

웹페이지를 만들다보면 CSS 덕분에 시간이 다 가는 경우가 있다. 우리는.. 일단 프론트엔드가 위주가 아니므로 편리한 부트스트랩을 이용하고자 한다. 부트스트랩은 트위터가 만든 프론트엔드 ��

itstudy-mary.tistory.com

 

반응형