본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

Servlet - 로그인정보를 DB에서 조회, 브라우저에 응답(JDBC연동)

by 개발하는 경제학도 2022. 3. 12.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.

교재로는 자바 웹을 다루는 기술을 사용하고 있습니다.


JDBC

자바로 구현한 JDBC 패턴

- xxxDAO 클래스

DAO는 Data Access Object로 DB에 직접 접근하는 클래스이다.

- xxxDTO 클래스

DTO는 Data Transfer Object로 DAO와 DB 간의 데이터를 주고받는 클래스이다.  DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter만 가진 클래스)이다.

서블릿과 JDBC연동

사용자 로그인할 때, 로그인 정보 html에서 받아와 서블릿에서 처리한 뒤 DB에 반영하는 작업을 한다면 아래와 같은 도식이 된다.

이때 DB에 사용자의 로그인 정보 등을 저장, 조회, 삭제, 수정할 수 있는데, 이를 CRUD라 한다.

이번 포스팅에서는 CRUD 중 조회만을 구현한다.

 


서블릿과 DB 연동

로그인 정보를 DB에서 조회하고, 결과를 브라우저에 출력하기

아래에는 회원이 로그인을 시도한 id, pw를 가지고 DB에서 사용자 정보를 조회하는 예제 코드이다.

 

1. DB 생성, 데이터 insert

먼저 DB를 MySQL에 만들어준다.

CREATE TABLE `employeesdb`.`login_table` (
  `id` VARCHAR(45) NOT NULL,
  `name` VARCHAR(45) NULL,
  `pw` VARCHAR(100) NULL,
  PRIMARY KEY (`id`));

우선 emloyeesdb라는 스키마(MySQL기준) 안에, login_table이라는 테이블을 만들어주었다.

그 테이블 내에는 id라는 PK와, name과 pw를 저장할 수 있게 만들었다.

 

insert into login_table values('cat', 'nayong', 111);
insert into login_table values('dog', 'dang', 222);

그 테이블 안에 로그인할 수 있도록 샘플 데이터를 insert 하였다.

 

2. DAO클래스

public class MemberDAO {	
	// 사용자 1명만 select
	public int selectMember(String id, String pw) {
		int result = 0;
		try {
		// jdbc driver 메모리  로드
		Class.forName("com.mysql.cj.jdbc.Driver");
		// db 연결
		Connection conn = DriverManager.getConnection
		("jdbc:mysql://127.0.0.1:3306/스키마이름", "계정id", "계정pw");
		System.out.println("mysql db연결성공");
		
		String sql = "select * from login_table where id = ?";
		PreparedStatement pt = conn.prepareStatement(sql);
		pt.setString(1 , id);
		ResultSet rs = pt.executeQuery();//rs 행갯수 0 또는 1
		if(rs.next() == true) {
			String pwdb = rs.getString("password");
			if(pwdb.equals(pw)) { //암호 동일하면
				result = 0;
			}
			else { //암호 동일하지 않으면
				result = 1;
			}
		}
		else {//행갯수 0 = id 존재하지 않는다
			result = 2;
		}
		
		conn.close();
		System.out.println("mysql db연결해제성공");			
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
}

id가 login_table에 존재하는지 확인한 뒤, id가 있는데 DB내에서 pw가 같으면 0, 같지 않으면 1을 리턴한다.

만약 id가 DB내에 존재하지 않는다면 2를 리턴하는 메서드 selectMember를 만들어 사용자 정보를 조회할 수 있게 했다.

 

3. login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.6.0.slim.js" integrity="sha256-HwWONEZrpuoh951cQD1ov2HUK5zA5DwJ1DNUXaM6FsY=" crossorigin="anonymous"></script>
<title>Insert title here</title>
</head>
<body>

<!-- 경로 똑같으면 http://localhost:8080/폴더명/ 같은 절대경로 생략 가능  -->
<form action="loginreview">
	아이디 입력<input type = text name = "id"><br>
	비밀번호 입력<input type = password name = "pw"><br>
	<input type = submit value = "로그인">
</form>

</body>
</html>

이 html을 실행시키면 사용자가 form태그를 통해 id, pw를 입력할 수 있다.

입력을 마친 후 사용자가 로그인 버튼을 누르면 form태그의 action속성에 있는 주소의 서블릿으로 입력된 id, pw값이 전달된다.

java파일은 src폴더에 작성하고, java파일을 제외한 html 등의 파일은 WebContent폴더에 넣어준다는 점을 유의해야 한다.

 

4. LoginReview.java (서블릿)

@WebServlet("/loginreview")
public class LoginReview extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// login.html에서 사용자가 입력한 id, pw를 가져온다.
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		MemberDAO dao = new MemberDAO();
		int result = dao.selectMember(id, pw);
		
		String printing = "";
		
		if (result == 0) {
			printing = "<h3 style = color:green>" + id + " 회원님 정상 로그인 되셨습니다.</h3>";			
		}
		else if (result == 1) {
			printing = "<h3 style = color:blue>" + id + " 회원님 암호를 확인하세요.</h3>";			
		}
		else {
			printing = "<h3 style = color:red>" + id + " 는 존재하지 않는 id입니다.</h3>";
		}
		
		// 결과 응답 내용
		response.setContentType("text/html;charset=utf-8"); // setContentType: 지금 내가 보낼 내용이 html 문서임을 알려주는 것.
		PrintWriter out = response.getWriter(); // 서버 출력 = 클라이언트로 전송. 응답결과는 PrintWriter타입이다. 
		out.println(printing);
	}
}

dao에서 selectMember메서드를 실행시킨 결과에 따라 reulst가 반환된다.

result가 0이면 id, pw모두 일치이고 1이면 id일치, pw 불일치, 2이라면 id 미존재로 구분하여 return결과를 다르게 주었다. 

 

5. 로그인하기

이제 login.html을 실행하고 DB에 저장한 데이터인 id: cat, pw: 111을 입력하면 정상 로그인되었다는 메시지가 뜬다.

마찬가지로 잘못된 로그인에 대한 결과도 볼 수 있다.

또한, 서버 실행시 html파일명이었던 url이

http://localhost:8080/sevlettest/login.html

 

url이 서블릿 url매핑 값으로 바뀌어 아래와 같이 바뀐 점도 확인할 수 있다. (? 뒤는 get전송방식에 의해 표시되는 사용자 입력값이다.)

http://localhost:8080/sevlettest/loginreview?id=cat&pw=111

 

위 예제를 통해 서블릿과 DB를 연동하여 로그인 결과를 DB에서 조회한 뒤, 결과를 브라우저에 출력해주었다.

만약 4번의 서블릿이 아니라 main메서드가 포함된 일반 자바 파일로 바꾸었다면 결과를 콘솔 창에서 확인할 수 있었을 것이다.

하지만 서블릿으로 작성함으로써 DB에서 조회한 결과를 다시 클라이언트 측의 브라우저로 출력할 수 있었다.

댓글