JSP

[JSP] JSP로 CRUD 게시판 만들기 (3) - JSP 파일 및 로그인 기능 만들기

Song hyun 2024. 7. 15. 10:46
728x90
반응형

[JSP] JSP로 CRUD 게시판 만들기 (3) - JSP 파일 및 로그인 기능 만들기

 

1. index.jsp 파일 생성

-각각의 페이지로 넘어가는 버튼 만들기 (<a> 태그 사용)

ㄴex: 회원가입, 로그인, 로그아웃, 게시판 목록...

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP MVC 게시판</title>
<style type="text/css">
body{
	font-family: arial, sans-serif;
	background-color: #f4f4f4;
	color: #333;
	margin: 0;
	padding: 0;
}
.nav-list{
	list-style-type:none;
	padding:0;
}
.nav-list li{
	margin:10px;
	display: inline-block;
}
.nav-list li a{
	text-decoration:none;
	padding: 10px 20px;
	color:white;
}
.btn-primary{
	background-color: #007dff;
}
.btn-secondary{
	background-color: #6c757d;
}
</style>
</head>
<body>
	<div class="container">
		<h2>JSP MVC 게시판 테스트 페이지</h2>
		<ul class="nav-list">
			<li class="btn btn-primary"><a href="/t-board/user/signup">회원가입</a></li>	
			<li class="btn btn-primary"><a href="/t-board/user/signup">로그인</a></li>	
			<li class="btn btn-secondary"><a href="/t-board/user/signup">로그아웃</a></li>	
			<li class="btn btn-secondary"><a href="/t-board/user/signup">게시판 목록</a></li>	
		</ul>
	</div>
</body>
</html>

 

 

 

2. 회원가입 및 로그인 기능 만들기 (1) : DTO 인터페이스, DTO-DAO 클래스 생성하기

(1) User.java : user(사용자) 정보 인스턴스화.

package com.tenco.tboard.model;

import java.sql.Timestamp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
	private int id;
	private String username;
	private String password;
	private String email;
	private Timestamp createdAt;

}

 

(2) UserRepasitory(인터페이스)

package com.tenco.tboard.repasitory.interfaces;

import java.util.List;

import com.tenco.tboard.model.User;

public interface UserRepasitory {

	void addUser(User user);
	void deleteUser(int id);
	User getUserByUsername(String username);
	User getUserByUsernameAndPassword(String username,String password);
	List<User> getAllUsers();
}

 

(3) UserRepasitoryImpl((2)의 구현 메서드)

package com.tenco.tboard.repasitory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.tenco.tboard.model.User;
import com.tenco.tboard.repasitory.interfaces.UserRepasitory;
import com.tenco.tboard.util.DBUtil;

public class UserRepasitoryImpl implements UserRepasitory {

	// CRUD 쿼리문 선언 
	// 유저 추가 쿼리
	private static final String INSERT_USER_SQL=" INSERT INTO users(username,password,email) values (? , ? , ?)";
	// 유저 삭제 쿼리
	private static final String DELETE_USER_SQL=" DELETE FROM users where id = ? ";
	// 이름으로 유저 검색 쿼리
	private static final String SELECT_USER_BY_USERNAME=" SELECT * from users where username = ? ";
	// 이름, 비밀번호로 유저 검색 쿼리
	private static final String SELECT_USER_BY_USERNAME_AND_PASSWORD=" SELECT * FROM users where username= ? AND password = ? ";
	// 전체 유저 확인
	private static String SELECT_ALL_USERS= " SELECT * FROM users ";
	
	@Override
	public void addUser(User user) {
		try (Connection conn=DBUtil.getConnection()){
			// 트랜잭션 시작
			conn.setAutoCommit(false);
			// Service 객체 :
			// username 중복 확인 필요
			// email 중복 확인 필요
			
			try (PreparedStatement pstmt=conn.prepareStatement(INSERT_USER_SQL)){
				pstmt.setString(1, user.getUsername());
				pstmt.setString(2, user.getPassword());
				pstmt.setString(3, user.getEmail());
				pstmt.executeUpdate();
				conn.commit();
			} catch (Exception e) {
				conn.rollback();
				e.printStackTrace();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public void deleteUser(int id) {
		try (Connection conn=DBUtil.getConnection()){
			// 트랜잭션 시작
			conn.setAutoCommit(false);
			// 실제로 사용자가 존재하는지 여부 확인 필요
			// 하지만 delete 는 오류가 거의 없기 때문에, 넣지 않아도 ㅇ
			// int rowCount를 사용해 확인할 수 있다.
			try (PreparedStatement pstmt=conn.prepareStatement(DELETE_USER_SQL)){
				pstmt.setInt(1,id);
				pstmt.executeUpdate();
				conn.commit();
			} catch (Exception e) {
				conn.rollback();
				e.printStackTrace();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public User getUserByUsername(String username) {
		User user=null;
		try (Connection conn=DBUtil.getConnection()){
			// SELECT-트랜잭션 처리 x
			PreparedStatement pstmt=conn.prepareStatement(SELECT_USER_BY_USERNAME);
			pstmt.setString(1, username);
			pstmt.executeQuery();
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()) {
				user=User.builder().id(rs.getInt("id"))
						.username(rs.getString("username"))
						.password(rs.getString("password"))
						.email(rs.getString("email"))
						.createdAt(rs.getTimestamp("created_at"))
						.build();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return user;
	}

	@Override
	public User getUserByUsernameAndPassword(String username, String password) {
		User user=null;
		try (Connection conn=DBUtil.getConnection()){
			// SELECT-트랜잭션 처리 x
			PreparedStatement pstmt=conn.prepareStatement(SELECT_USER_BY_USERNAME_AND_PASSWORD);
			pstmt.setString(1, username);
			pstmt.setString(2, password);
			pstmt.executeQuery();
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()) {
				user=User.builder().id(rs.getInt("id"))
						.username(rs.getString("username"))
						.password(rs.getString("password"))
						.email(rs.getString("email"))
						.createdAt(rs.getTimestamp("created_at"))
						.build();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return user;
	}

	@Override
	public List<User> getAllUsers() {
		List<User> users=new ArrayList<>();
		try (Connection conn=DBUtil.getConnection()){
			// SELECT-트랜잭션 처리 x
			PreparedStatement pstmt=conn.prepareStatement(SELECT_ALL_USERS);
			pstmt.executeQuery();
			ResultSet rs=pstmt.executeQuery();
			while(rs.next()) {
				User user=User.builder().id(rs.getInt("id"))
						.username(rs.getString("username"))
						.password(rs.getString("password"))
						.email(rs.getString("email"))
						.createdAt(rs.getTimestamp("created_at"))
						.build();
				users.add(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return users;
	}

}

 

3. 회원가입 및 로그인 기능 만들기 (2) : JSP 페이지 생성하기

(1) WEB_INF 폴더란?

(2) pageContext란?

(3) page Scope

(4) 

728x90
반응형