멀티캠퍼스 백엔드 과정39일차[7월 27일] - MVC 패턴을 적용한 회원인증 구현 및 게시판 만들기

GoldenDusk·2023년 7월 30일
0

1. MVC 패턴을 적용한 회원인증 구현

컨트롤러(서블릿)

  1. web.xml 수정
  • 서블릿 등록
<servlet>
        <servlet-name>MemberAuth</servlet-name>
        <servlet-class>servlet.MemberAuth</servlet-class>
        <!-- init-param 설정 -->
        <init-param>
            <param-name>admin_id</param-name>
            <param-value>nakja</param-value>
        </init-param>
    </servlet>
    
    <!-- Servlet과 요청명 매핑 -->
    <servlet-mapping>
        <servlet-name>MemberAuth</servlet-name>
        <url-pattern>/12Servlet/MemberAuth.mvc</url-pattern>
    </servlet-mapping>
</web-app>
  • 돌아가는 엔진
<Context docBase="webstudy4" path="/webstudy4" reloadable="true" source="org.eclipse.jst.jee.server:webstudy4"/><Context docBase="ExServlet" path="/ExServlet" reloadable="true" source="org.eclipse.jst.jee.server:ExServlet"/></Host>
    </Engine>
  1. MemberAuth.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    <!-- 아이디와 패스워드를 받아 인증 요청할 JSP(관리자, 회원, 비회원 구분 인증요청)  -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC 패턴으로 회원인증하기</title>
</head>
<body>
<h2>MVC패턴으로 회원인증하기</h2>
<strong>${authMessage}</strong>
<br />
<a href="./MemberAuth.mvc?id=nakja&pass=1234"> 회원인증(관리자)</a>
<a href="./MemberAuth.mvc?id=onetime&pass=12345"> 회원인증(회원)</a>
<a href="./MemberAuth.mvc?id=stranger&pass=12345"> 회원인증(비회원)</a>
</body>
</html>
  1. MemberDAO.java
  • 여러가지 방법이 있음 JDBConnection을 이용해도 되고 DBConnPool을 이용해도 됨

  • JDBConnection의 이것을 쓰고 싶다면
public MemberDAO(String driver, String url, String id, String pwd) {

		super(driver, url, id, pwd);
	}
  • 주석 처리된 이 부분을 풀면 됨
// 4. web.xml에 등록할 컨텍스트 초기화 매개변수 중 DB 연결 정보들을 읽어옴 => web.xml의 이름으로 가져옴
		/*
		 * String driver = application.getInitParameter("OracleDriver"); String
		 * connectUrl = application.getInitParameter("OracleURL"); String oId =
		 * application.getInitParameter("OracleId"); String oPass =
		 * application.getInitParameter("OraclePwd");
		 * => MemberDAO에 JDBConnection을 부모로 두며, JDBConnection에는 설정 되어 있기 때문에 필요없음
		 */
  • 반대로, DBConnPool을 이용하고 싶다면 자식으로 하지 말고 덜 종속적이게 설정
package membership;
//데이터베이스 연결/ 동적인 기능(CRUD) 구현 

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

import common.DBConnPool;

public class MemberDAO2 {
   
	DBConnPool db;
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	
	public MemberDAO2() {
	          db = new DBConnPool();	
	}
	
	/*
	 * public MemberDAO(String driver , String url, String id, String pwd) {
	 * super(driver,url,id,pwd); }
	 * 
	 * public MemberDAO(ServletContext application) {
	 * 
	 * super(application); }
	 */
   
	public MemberDTO getMemberDTO(String id, String pass) {
		MemberDTO dto = new MemberDTO();
		   String sql = "SELECT * FROM member WHERE id=? AND pass=?";
		   
		   try {
			   //쿼리 실행
			   pstmt = db.con.prepareStatement(sql);
			   pstmt.setString(1, id);
			   pstmt.setString(2, pass);
			   rs = pstmt.executeQuery();
			   
			//결과 처리
			   if(rs.next()) {
				   dto.setId(rs.getString("id"));
				   dto.setPass(rs.getString("pass"));
				   dto.setName(rs.getString("name"));
				   dto.setRegidate(rs.getString(4));
			   }
			   
			   
			   
		   }catch(Exception e) {
			   e.printStackTrace();
		   }
		  return dto;
	}
	
	 // 연결 해제(자원 반납)
    public  void close() {
        try {            
            if (rs != null) rs.close();
            if (pstmt != null) pstmt.close();
            if (con != null) con.close();  // 자동으로 커넥션 풀로 반납됨

            System.out.println("DB 커넥션 풀 자원 반납");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
	
	
}
  • 하지만 나는 JDBConnction의 application방법 이용을 할 것이기에 주석 처리 부분 필요 없음
  • 코드
package membership;
//데이터베이스 연결/ 동적인 기능(CRUD) 구현 

import javax.servlet.ServletContext;

import common.JDBConnection;

public class MemberDAO extends JDBConnection {

	public MemberDAO() {
	}

	public MemberDAO(String driver, String url, String id, String pwd) {

		super(driver, url, id, pwd);
	}

	public MemberDAO(ServletContext application) {

		super(application);
	}

	public MemberDTO getMemberDTO(String id, String pass) {
		MemberDTO dto = new MemberDTO();
		String sql = "SELECT * FROM member WHERE id=? AND pass=?";

		try {
			// 쿼리 실행
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pass);
			rs = pstmt.executeQuery();

			// 결과 처리
			if (rs.next()) {
				dto.setId(rs.getString("id"));
				dto.setPass(rs.getString("pass"));
				dto.setName(rs.getString("name"));
				dto.setRegidate(rs.getString(4));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return dto;
	}

}
  1. MemberDTO.java
package membership;
//회원한명의 정보를 담을 객체
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;
	}
  1. DBConnPool.java
package common;

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

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DBConnPool {

	public Connection con;
	public Statement stmt;
	public PreparedStatement pstmt=null;
	public ResultSet rs;
	
	public DBConnPool() {
		
		try {
			//컨넥션 풀(DataSource) 얻기
			
			Context initCtx = new InitialContext();
			Context ctx =(Context)initCtx.lookup("java:comp/env");
			DataSource source =(DataSource) ctx.lookup("dbcp_myoracle");
			
			//커넥션 풀을 이용한 연결(Connection) 얻기
			
			con = source.getConnection();
			System.out.println("커넥션 풀을 통한 연결 성공!");
			
		} catch (Exception e) {
            System.out.println("커넥션 풀 연결 실패!");
		    e.printStackTrace();
		}
		
		
	}
	
	public void close() {
		try {
              if(rs != null) rs.close();
              if(stmt != null) stmt.close();
              if(pstmt != null) pstmt.close();
              if(con != null) con.close();
              System.out.println("JDBC 자원 해제");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
  1. JDBConnection.java
package common;

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

import javax.servlet.ServletContext;

//1) 기본적인 DB 연결 관리 클래스
public class JDBConnection {
	
	/*
	 * 1. JDBC 드라이버 로드 2. DB연결 3. 연결을 통해 쿼리문을 전송 4. 결과값을 확인 (INSERT,UPDATE,DELTE -
	 * 성공,실패 , SELECT - ResultSet ) 5. 리소스 close()
	 */

	public Connection con;
	public Statement stmt;
	public PreparedStatement pstmt;
	public ResultSet rs;
	
	
	public JDBConnection() {
		
		try {
			//1. 오라클 드라이버 로드
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("드라이버 로드1 ok!");
			
			//2.DB 연결 
			String url = "jdbc:oracle:thin:@localhost:1521:orcl";
			String id = "multi"; 
			String pwd = "1234";
			
			con = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공(기본 생성자)");
			
		} catch (Exception e) {
			    System.out.println("오라클 드라이버가 없습니다.확인필요!");
			    e.printStackTrace();
			    		}
	}
	
public JDBConnection(String driver , String url, String id, String pwd) {
		
		try {
			//1. 오라클 드라이버 로드
			Class.forName(driver);
			System.out.println("드라이버 로드2 ok!");
			
			//2.DB 연결 
						
			con = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공(기본 생성자 2 )");
			
		} catch (Exception e) {
			   
			    e.printStackTrace();
			    		}
	}
	
	
public JDBConnection(ServletContext application) {
	
	try {
		 //JDBC 로드
		 String driver = application.getInitParameter("OracleDriver");
		 getClass().forName(driver);
		 System.out.println("드라이버 연결3 ok!");
		 //DB연결
		 String url = application.getInitParameter("OracleURL");
	     String id = application.getInitParameter("OracleId");
	     String pwd = application.getInitParameter("OraclePwd");
		 con = DriverManager.getConnection(url,id,pwd);
		 
		 System.out.println("JDBC 연결 성공: 생성자3 ");
		
		
	} catch (Exception e) {
		   
		    e.printStackTrace();
		    		}
}

	
	
	public void close() {
		try {
              if(rs != null) rs.close();
              if(stmt != null) stmt.close();
              if(pstmt != null) pstmt.close();
              if(con != null) con.close();
              System.out.println("JDBC 자원 해제");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
  1. MemberAuth.java
package servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
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 membership.MemberDAO;
import membership.MemberDTO;

public class MemberAuth extends HttpServlet{
	
	// 1. JDBC 프로그래밍을 위해 작성핚 MemberDAO 타입의 DAO 객체를 멤버 변수로 선언
	MemberDAO dao;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 6. 서블릿 초기화 매개변수를 얻어옴 - 관리자 아이디로 설정한 값
		String admin_id = this.getInitParameter("admin_id");
		
		// 7. 인증을 요청한 id, pass 받아옴
		String id = req.getParameter("id");
		String pass = req.getParameter("pass");
		
		// 회원테이블에서 인증 요청한 id/pass에 해당하는 회원 찾기
		MemberDTO memberDTO = dao.getMemberDTO(id, pass);
		
		//8. 찾은 회원의 이름에 따른 비교 처리
		String memberName = memberDTO.getName();
		if(memberName != null) { //일치하는 회원이 있음
			req.setAttribute("authMessage", memberName +"회원님 반갑습니다.");
		}
		else {
			if(admin_id.equals(id)) req.setAttribute("authMessage", id +"괸리자님 반갑습니다.");
			else { //비회원
				req.setAttribute("authMessage", "귀하는 회원이 아닙니다. 회원 가입 후 서비스를 이용해주세요.");
			}
		}
		//반환할 메시지를 request 영역에 저장
		req.getRequestDispatcher("/12Servlet/MemberAuth.jsp").forward(req, resp);
	}
	
	
	// 서블릿 객체 소멸 시 DAO 객체의 close( ) 메서드를 호출하여 JDBC에서 사용하던 객체를 메모리에서 소멸시킴
	@Override
	public void destroy() {
		dao.close();
	}

	@Override
	public void init() throws ServletException {
		// 2. init( ) 메서드에서 DB 연결을 위한 DAO 객체를 생성
		// 3. application 내장 객체를 가져오기
		ServletContext application = this.getServletContext();
		
		// 4. web.xml에 등록할 컨텍스트 초기화 매개변수 중 DB 연결 정보들을 읽어옴 => web.xml의 이름으로 가져옴
		/*
		 * String driver = application.getInitParameter("OracleDriver"); String
		 * connectUrl = application.getInitParameter("OracleURL"); String oId =
		 * application.getInitParameter("OracleId"); String oPass =
		 * application.getInitParameter("OraclePwd");
		 * => MemberDAO에 JDBConnection을 부모로 두며, JDBConnection에는 설정 되어 있기 때문에 필요없음
		 */
		
		// 5. 이 정보를 인수로 건네 MemberDAO 객체를 생성
		dao = new MemberDAO(application);
		
		
	}
	
}

2. 모델 2 방식의 자료실형 게시판 만들기

구상

구상

  • EL, JSTL, 파일 업로드, 서블릿을 종합적으로 활용하여 자료실형 게시판을 제작
  • 학습할 자료실형 게시판의 기능
  • 비회원제
    • 회원인증 없이 누구나 글을 작성
    • 글쓰기 시 비밀번호 입력이 필수
    • 비밀번호를 통해 수정이나 삭제 가능
  • 자료실
    • 글쓰기 시 파일을 첨부 가능
    • 파일 첨부 시 정해진 용량 이상은 업로드할 수 없음
    • 첨부된 파일 다운로드 가능

이 관련된 내용은 Git hub에 올릴 예정

회고

오늘은 강사님이 게시판 2 각자 작업해보게 작업시간을 주셨다. 어느정도는 작업했는데 파일 다운로드 부분이랑 서블릿 연결 부분을 잘 모르겠다. 그 부분은 구글 드라이브에 올려주신다고 하셨으니 내 코드랑 비교해서 공부해야겠다.

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. 참고로 워드프레스는 아직 수정중

0개의 댓글