자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 40. 서블릿(Servlet) 작성 - MVC 패턴을 적용한 회원인증 구현

개발학생 2025. 5. 1. 17:44
반응형

*JAVA/JSP 35번 글의 시점부터는 노트북이 고장나는 바람에.. 다른 분의 글과 이전에 올렸던 글들을 참고하여, 다른 데스크탑의 윈도우 환경에 환경설정을 다시 진행한 후 작성하였습니다. 환경설정 관련 글들은 아래를 참고해 주세요.

  • JDK11 설치 및 환경 변수(JAVA_HOME) 설정 - CLASSPATH는 추가하지 않음
 

자바(JAVA) 11 설치 및 환경설정 | 자바 11 환경 변수

자바로 코딩 공부를 하려면 개발 할 수 있는 환경을 만들어 주어야 한다. 그 순서를 먼저 작성하자면JAVA SE JDK 설치 -> JAVA 환경 변수 설정 -> IDE 설치 이렇게 볼 수 있겠다. 이 포스팅은 자바로 개

velog.io

  • 톰캣 설치, 이클립스 설치 - 이 글을 쓰는 시점에서는 Tomcat 8버전이 없어, Tomcat 9버전 설치
 

JSP) JDK, 이클립스(eclipse), 톰캣 설치 및 환경 설정

1. JDK 설치 → Path 설정 2.eclipse JAVA EE버전 다운로드 3.웹컨테이너 톰캣 설치 →톰캣 환경설정 1. JDK 설치 - JAVA) 1. JDK 참고하여 설치하고 설정한다. -https://storyblogger.tistory.com/15?category=984696 2. 구글에

storyblogger.tistory.com

  • 이클립스 JDK 버전 설정 - JDK11로 설정
 

[이클립스] JDK 버전 바꾸는 법

스프링을 사용하는 에러가 난다? 그러면 JRE 버전을 확인해보자! 프로젝트의 JRE System Library의 오른쪽을 살펴보면 [JavaSE-17]이라고 되어있다. 스프링이나 하이버네이트를 사용할 때, 자바 8이나 자

myvelop.tistory.com

  • JDK 설치 및 환경 변수(JAVA_HOME) 설정, 톰캣 설치, 이클립스 설치 및 JDK 버전 설정 이후~ ⇒ 톰캣 버전과 jsp 파일 경로는 글 내용과 다르게 아래 이미지와 같음

 

JAVA/JSP 1. 개발 환경 구축 - 이클립스 기본 설정

*JDK 설치 및 환경 변수(JAVA_HOME) 설정, 톰캣 설치, 이클립스 설치를 완료한 상태OpenJDK 11: 자바 프로그램을 컴파일하고 실행해주는 기본 도구*이클립스 JDK-17이 설치되어있어서, https://coding-house.tisto

keep-programming-study.tistory.com

 

 

JAVA/JSP 1. 개발 환경 구축 - JSP 예제 테스트

1. 프로젝트 생성1) [File] → [New] → [Dynamic Web Project] 선택 2) 프로젝트 설정 화면 → Project name: HelloJSP, Target runtime: Apache Tomcat v9.0, Dynamic web module version: 4.0으로 설정 후 Next 클릭 3) 자바 소스 파일

keep-programming-study.tistory.com

 

 

JAVA/JSP 1. 개발 환경 구축 - 마지막 추가 설정

1. 외부 웹 브라우저로 실행하기-크롬이클립스는 웹 애플리케이션 실행 시, 자체 브라우저를 통해 실행 결과 출력웹 애플리케이션 배포 시 사용자는 크롬/파이어폭스 같은 전용 웹 브라우저로

keep-programming-study.tistory.com

  • 오라클(Oracle Database 11gR2 Express Edition) 설치 및 설정 
 

JAVA/JSP 14. 데이터베이스 - 특징, 오라클 설치(Oracle Database 11gR2 Express Edition), 사용자 계정 생성 및

1. 데이터베이스의 특징우리가 매일 PC나 스마트폰을 통해 접하는 거의 모든 웹 애플리케이션에서 사용함매일 업데이트되는 뉴스나 날씨 등의 정보는 데이터베이스가 없다면 클라이언트에 전달

keep-programming-study.tistory.com

 

 

 

JAVA/JSP 15. 데이터베이스 - 테이블 및 시퀀스 생성, JDBC 설정 및 데이터베이스 연결

*회원제 게시판 만들기-회원 인증 필요4. 테이블 및 시퀀스 생성1) 테이블 생성(1) member 테이블 - 아이디, 패스워드, 이름, 가입 날짜테이블 정의컬럼명데이터 타입 null 허용 키 기본값 설명idvarchar2

keep-programming-study.tistory.com

 

JAVA/JSP 16. 데이터베이스 - 커넥션 풀로 성능 개선, 간단한 쿼리 작성 및 실행

6. 커넥션 풀로 성능 개선웹은 클라이언트의 요청에 서버가 응답하는 구조→ Connection 객체 생성 때마다 네트워크 통신이 이뤄지며, 시간이 걸리는 작업들이 수반됨 == 시스템 성능에 큰 영향을

keep-programming-study.tistory.com

  • 시퀀스 설정
 

JAVA/JSP 15. 데이터베이스 - 테이블 및 시퀀스 생성, JDBC 설정 및 데이터베이스 연결

*회원제 게시판 만들기-회원 인증 필요4. 테이블 및 시퀀스 생성1) 테이블 생성(1) member 테이블 - 아이디, 패스워드, 이름, 가입 날짜테이블 정의컬럼명데이터 타입 null 허용 키 기본값 설명idvarchar2

keep-programming-study.tistory.com

 

 

1. MVC 패턴 회원인증 구성도

2. 구현

1) 뷰(JSP 파일)

// src/main/webapp/member/MemberAuth.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MemberAuth.jsp</title>
</head>
<body>
  <h2>MVC 패턴으로 회원인증하기</h2>
  <p>
    <!-- 1. 서블릿에서 회원인증 처리 후 결과 메시지 출력 -->
  	<strong>${ authMessage }</strong>
  	<br />
  	<!-- 2. 관리자 ID로 인증 요청 -->
  	<a href="./MemberAuth.mvc?id=admin1&pass=1234">회원인증(관리자)</a>
  	&nbsp; &nbsp;
  	<!-- 3. 회원 ID로 인증 요청 -->
  	<a href="./MemberAuth.mvc?id=hello&pass=1234">회원인증(회원)</a>
  	&nbsp; &nbsp;
  	<!-- 4. 비회원 ID로 인증 요청 -->
  	<a href="./MemberAuth.mvc?id=stranger&pass=1234">회원인증(비회원)</a>
  </p>
</body>
</html>

2) MemberDAO.java

// Java Resources/src/member/MemberDAO.java

package member;

import common.JDBConnect;

public class MemberDAO extends JDBConnect {    
    // 명시한 데이터베이스로의 연결이 완료된 MemberDAO 객체를 생성합니다.
    public MemberDAO(String drv, String url, String id, String pw) {
        super(drv, url, id, pw);   
    }

    // 명시한 아이디/패스워드와 일치하는 회원 정보를 반환합니다.
    public MemberDTO getMemberDTO(String uid, String upass) {    
        MemberDTO dto = new MemberDTO();  // 회원 정보 DTO 객체 생성
        String query = "SELECT * FROM member WHERE id=? AND pass=?";  // 쿼리문 템플릿

        try {    //5.
            // 쿼리 실행
            psmt = con.prepareStatement(query); // 동적 쿼리문 준비
            psmt.setString(1, uid);    // 쿼리문의 첫 번째 인파라미터에 값 설정
            psmt.setString(2, upass);  // 쿼리문의 두 번째 인파라미터에 값 설정
            rs = psmt.executeQuery();  // 쿼리문 실행

            // 결과 처리
            if (rs.next()) {   
                // 쿼리 결과로 얻은 회원 정보를 DTO 객체에 저장
                dto.setId(rs.getString("id"));
                dto.setPass(rs.getString("pass"));
                dto.setName(rs.getString(3));
                dto.setRegidate(rs.getString(4));
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return dto;  // DTO 객체 반환
    }
}

3) MemberDTO.java 

// Java Resources/src/member/MemberDTO.java

package member;

public class MemberDTO {
    // 멤버 변수 선언
    private String id;
    private String pass;
    private String name;
    private String regidate;

    // 멤버 변수별 게터와 세터
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRegidate() {
        return regidate;
    }
    public void setRegidate(String regidate) {
        this.regidate = regidate;
    }
}

4) JDBConnect.java 코드 수정

// Java Resources/src/common/JDBConnect.java

package common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBConnect {
  public Connection con;
  public Statement stmt;
  public PreparedStatement psmt;
  public ResultSet rs;

  // 기본 생성자
  public JDBConnect(String drv, String url2, String id2, String pw) {
    try {
      // JDBC 드라이버 코드
      Class.forName("oracle.jdbc.OracleDriver");  
			
      // DB에 연결
      String url = "jdbc:oracle:thin:@localhost:1521:xe";    
      String id = "hello";   
      String pwd = "1234";    
      con = DriverManager.getConnection(url, id, pwd);   
		
      System.out.println("DB 연결 성공(기본 생성자)");    
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // 연결 해제(자원 반납)
  public void close() {
    try {
      if (rs != null) rs.close();
	  if (stmt != null) stmt.close();
      if (psmt != null) psmt.close();
      if (con != null) con.close();

      System.out.println("JDBC 자원 해제");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

5) 컨트롤러(서블릿)

(1) web.xml에서 서블릿으로 매핑

<!-- src/main/webapp/WEB-INF/web.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>HelloJSP</display-name>
  ... 생략 ...
  <servlet> <!-- 서블릿 등록 -->
    <servlet-name>MemberAuth</servlet-name>  <!-- 1. 서블릿 매핑을 위한 서블릿명 -->
    <servlet-class>member.MemberAuth</servlet-class>  <!-- 2. 요청을 처리할 서블릿을 패키지를 포함하여 명시 -->
    <init-param>
      <param-name>admin_id</param-name>
      <param-value>admin1</param-value>
    </init-param> 
  </servlet>
  <servlet-mapping>  <!-- 서블릿과 요청명 매핑 -->
    <servlet-name>MemberAuth</servlet-name>  <!-- 3. 1과 동일한 서블릿명 -->
    <url-pattern>/member/MemberAuth.mvc</url-pattern>  <!-- 4. 컨텍스트 루트를 제외한 요청명 작성 -->
  </servlet-mapping>
</web-app>

(2) 회원인증 컨트롤러(서블릿)

// Java Resources/src/member/MemberAuth.java
package member;

import java.io.IOException;

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

public class MemberAuth extends HttpServlet{
  // 1. MemberDAO 타입의 DAO 객체를 멤버 변수로 선언 
  MemberDAO dao;
	
  // 2. 서블릿 초기화를 위한 init 메서드(DB 연결을 위한 DAO 객체 생성)
  @Override
  public void init() throws ServletException {
    // 3. application 내장 객체 얻기
    ServletContext application = this.getServletContext();
		
    // 4. web.xml에서 DB 연결 정보 얻기
    String driver = application.getInitParameter("OracleDriver");
    String connectUrl = application.getInitParameter("OracleURL");
    String oId = application.getInitParameter("OracleId");
    String oPass = application.getInitParameter("OraclePwd");
		
    // 5. 4에서 가져온 DB 연결 정보로 DAO 생성
    dao = new MemberDAO(driver, connectUrl, oId, oPass);
  }
	
  // 6. 클라이언트의 요청을 처리할 service() 메서드 정의
  @Override
  public void service(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
    // 7. 서블릿 초기화 매개변수에서 관리자 ID 받기
    String admin_id = this.getInitParameter("admin_id");
		
    // 8. 인증을 요청한 ID/패스워드
    String id = req.getParameter("id");
    String pass = req.getParameter("pass");
		
    // 9. 회원 테이블에서 인증 요청한 ID/패스워드에 해당하는 회원 찾기 
    MemberDTO dto = dao.getMemberDTO(id, pass);
		
    // 찾은 회원의 이름에 따른 처리
    String name = dto.getName();
		
    // 10. 일치하는 회원 찾음
    if(name != null) {
      req.setAttribute("authMessage", name+" 회원님 환영합니다.");
    // 일치하는 회원 없음
    } else {
      // 11. 관리자
      if(admin_id.equals(id))
        req.setAttribute("authMessage", admin_id+"는 최고 관리자입니다.");
      // 12. 비회원
      else
        req.setAttribute("authMessage", "귀하는 회원이 아닙니다");
      }
      // 13. MemberAuth.jsp로 포워드
      req.getRequestDispatcher("/member/MemberAuth.jsp").forward(req, resp);
  }
	
  // 14. DAO 객체의 close() 메서드로 JDBC에서 사용하던 객체를 메모리에서 소멸
  @Override
  public void destroy() {
    dao.close();
  }
}

3. 프로그램 실행(MemberAuth.jsp 실행)

1) 첫 화면

2) [회원인증(관리자)] 링크 클릭

admin1이 아니라 null이라고 나와서 콘솔창에서 admin_id와 id 값이 찍히는지 확인 
-> 모두 값이 제대로 찍혔으며, name+"는 최고 관리자입니다"의 name 자리에 admin_id를 넣었어야 했음

 

코드 수정 후 정상 작동하는 모습

 

3) [회원인증(회원)] 링크 클릭

4) [회원인증(비회원)] 링크 클릭

 

반응형