[JSP] 회원 기능 (1)

2024. 10. 5. 20:39JSP

오늘은 memebr 테이블을 생성하여 로그인, 로그아웃, 회원가입 기능들을 구현해볼 것이다.

 


member 테이블

varchar2(300) userid;
varchar2(300) userpw;
varchar2(300) username;
varchar2(100) gender;
varchar2(500) email;

DTO, DAO 생성

DTO

: 필드와 getter & setter 생성

 

DAO

: DB와 연결할 수 있도록 DAO 에 connection 객체를 생성해야한다.

 

Connection을 미리 생성하여 관리하는 DataSource 객체는 context.xml에 정의되어 있다.


미리 준비한 DataSource를 자바 객체로 불러오기 위해서는 Context를 객체화해서 불러와야 한다.
Connection 이후에는 이전 순서대로 PreparedStatement, ResultSet]등이 필요하다.

1. context.xml 의 내용을 자바 객체로 불러온다. new InitialContext();
2. context.xml 에 작성한 DataSource 객체를 지정한 이름 "jdbc/oracle"로 불러온다.
3. context.xml 에 정의한 객체는 이름 앞에 접두사를 붙여야 한다. "java:comp/env/"
4. Object 타입을 반환하기 때문에 좌우의 자료형을 맞추기 위해 다운캐스팅 한다. (이후 예외 처리)

public class MemberDAO {

	private Context init;
	private DataSource ds;
	
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private static MemberDAO instance = new MemberDAO(); // MemberDAO의 객체는 오직 하나뿐이다
	
	public static MemberDAO getInstance() {	// 객체를 반환하는 함수 getInstance()는 외부에서 호출가능
		return instance;
	}
	
	private MemberDAO() {	// 생성자 외부 호출 금지
		try {
			init = new InitialContext();	// context.xml 불러오기
			ds = (DataSource) init.lookup("java:comp/env/jdbc/oracle");	// context 내부 DataSource 불러오기
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	private MemberDTO mapping(ResultSet rs) throws SQLException {
		MemberDTO dto = new MemberDTO();
		dto.setEmail(rs.getString("email"));
		dto.setGender(rs.getString("gender"));
		dto.setUserid(rs.getString("userid"));
		dto.setUsername(rs.getString("username"));
		dto.setUserpw(rs.getString("userpw"));
		return dto;
	}
	
	private void close() {
		try {
			if(rs != null) 		rs.close();
			if(pstmt != null) 	pstmt.close();
			if(conn != null) 	conn.close();
		} catch(SQLException e) {}
	}
	
	// DB 버전정보 (접속 여부 확인하기)
	public String getVersion() {
		String version = null;
		String sql = "select banner from v$version";
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while(rs.next()) {
				version = rs.getString("banner");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			version = e.getMessage();
		} finally { close(); }
		return version;
	}
	
	// Member 목록을 반환하는 함수 (list 페이지)
	public List<MemberDTO> selectList() {
		ArrayList<MemberDTO> list = new ArrayList<>();
		String sql = "select * from member order by userid";
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while(rs.next()) {
				MemberDTO dto = mapping(rs);
				list.add(dto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { close(); }
		return list;
	}
	
	// 사용자 입력값을 테이블에 추가하는 함수 (join-action 페이지)
	public int insert(MemberDTO dto) {
		int row = 0;
		String sql = "insert into member (userid, userpw, username, gender, email)"
				+ " values (?, ?, ?, ?, ?)";
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, dto.getUserid());
			pstmt.setString(2, dto.getUserpw());
			pstmt.setString(3, dto.getUsername());
			pstmt.setString(4, dto.getGender());
			pstmt.setString(5, dto.getEmail());
			row = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { close(); }
		return row;
	}
	
	// 입력값(id, password)를 전달받아서 일치하는 계정 하나를 반환하는 함수
    // login 페이지
	public MemberDTO login(MemberDTO dto) {
		MemberDTO login = null;
		String sql = "select * from member where userid = ? and userpw = ?";
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, dto.getUserid());
			pstmt.setString(2, dto.getUserpw());
			rs = pstmt.executeQuery();
			while(rs.next()) {
				login = mapping(rs);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { close(); }
		return login;
	}

}

 

필요한 jsp 페이지 생성 

: header / login  / login-action / logout / list / join / join-action / index / delete

 

페이지를 많이 만들때에는 항상 header 를 만들어서 사용하자.

 

join.jsp

사용자에게 보이는 화면 / 회원가입

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>

<section>
	<h3>회원가입 (join.jsp)</h3>
	<form method="POST" action="join-action.jsp">
		<p><input type="text" name="userid" placeholder="ID" required autofocus></p>
		<p><input type="password" name="userpw" placeholder="Password" required></p>
		<p><input type="text" name="username" placeholder="Name" required></p>
		<p><input type="email" name="email" placeholder="foo@bar.com" required></p>
		<p>
			<label><input type="radio" name="gender" value="남성" required>남성</label>
			<label><input type="radio" name="gender" value="여성" required>여성</label>
		</p>
		<p><input type="submit" value="가입신청"></p>
	</form>
</section>

</body>
</html>

 

join-action.jsp

실질적으로 회원가입 기능을 구현하는 페이지.

MemberDAO에 insert() 함수를 사용하여 데이터를 추가한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>

<jsp:useBean id="dto" class="day14.MemberDTO" />
<jsp:setProperty property="*" name="dto" />

<c:set var="row" value="${dao.insert(dto) }" />
${row }

<c:if test="${row != 0 }">
	<c:redirect url="/list.jsp" />
</c:if>

<script>
	alert('가입이 처리되지 않았습니다')
	history.go(-1)
</script>

</body>
</html>

 

login.jsp

사용자에게 보여지는 로그인 페이지

join.jsp에서 회원가입을 진행한 후 login.jsp에 아이디와 비밀번호를 입력하면 로그인이 된다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>

<section>
	<h3>login.jsp</h3>
	<form action="login-action.jsp" method="POST">
		<p><input type="text" name="userid" placeholder="ID" required autofocus></p>
		<p><input type="password" name="userpw" placeholder="password" required></p>
		<p><input type="submit" value="로그인"></p>
	</form>
</section>

</body>
</html>

 

login-action.jsp

실질적으로 login기능을 구현하는 페이지

사용자가 입력한 아이디와 비번을 dto 라는 이름으로 묶어서

useBean + setProperty 를 통해서 저장한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>

<jsp:useBean id="dto" class="day14.MemberDTO" />
<jsp:setProperty property="*" name="dto" />

<c:set var="login" value="${dao.login(dto) }" scope="session" />

<c:if test="${not empty login }">
	<c:redirect url="/" />
</c:if>

<script>
	alert('계정 혹은 패스워드가 일치하지 않습니다')
	history.go(-1)
</script>

</body>
</html>

 

logout.jsp

세션을 만료시켜서 로그인을 해제한다.

 

login 이라는 이름의 세션 객체를 remove 태그를 이용하여 삭제한다.

로그인이 해제된 다음에는 대문페이지로 리다이렉트 시킴.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>

<section>
	<h3>logout.jsp</h3>
	<c:remove var="login" scope="session" />
	<c:redirect url="/" />
</section>

</body>
</html>

 

String sql = "insert into member (userid, userpw, username, gender, email)"
+ " values (?, ?, ?, ?, ?)";
try {
conn = ds.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getUserid());
pstmt.setString(2, dto.getUserpw());
pstmt.setString(3, dto.getUsername());
pstmt.setString(4, dto.getGender());
pstmt.setString(5, dto.getEmail());
row = pstmt.executeUpdate();

}

 

이 부분에서 가장 오류가 많이 발생했었다.

매개변수 개수와 타입을 정확히 일치하게 받아줘야 해서 오타 또는 순서가 맞지 않으면 오류가 발생했다.

실수를 더 줄여야 하는데 참 쉽지가 않다,,

 

'JSP' 카테고리의 다른 글

[JSP] 게시판 (1)  (0) 2024.10.07
[JSP] 회원 기능 (2)  (0) 2024.10.07
[JSP] Login Session  (1) 2024.10.05
[JSP] JSP 실전  (1) 2024.10.05
[JSP] request & response  (2) 2024.10.05