Model: 비즈니스 로직, 데이터 처리 클래스View: 사용자에게 보여지는 화면Controller: X컨트롤러 없이 JSP가 요청 처리와 비즈니스 로직, 화면 출력까지 모두 담당하는 구조로, 비교적 단순하고 소규모 웹 애플리케이션 개발에 적합하지만, 유지보수와 확장에 어려움이 있음
form.jsp로 이동form.jsp에서 데이터를 입력하고 submit 버튼 클릭form.jsp 또는 다른 jsp 파일이 직접 request.getParameter()를 통해 데이터를 받고 처리jsp 또는 또 다른 jsp에서 출력-> 새로운 프로젝트 mvc1를 만든 뒤, 자바 9버전으로 설정했다. (이전 Tomcat 9 프로젝트 생성 글 확인)
-> pom.xml dependencies를 이렇게 수정한다.
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<h2>회원가입</h2>
<form method="post" action="result.jsp">
<input type="hidden" name="action" value="join">
<p>아이디: <input type="text" name="userid"></p>
<p>비밀번호: <input type="password" name="userpw"></p>
<p>이름: <input type="text" name="name"></p>
<p>휴대폰: <input type="text" name="hp"></p>
<p>이메일: <input type="email" name="email"></p>
<p>성별: <select name="gender">
<option value="남자">남자</option>
<option value="여자">여자</option>
</select></p>
<p>주민등록번호: <input type="text" name="ssn1"> - <input type="password" name="ssn2"></p>
<p>우편번호: <input type="text" name="zipcode"></p>
<p>주소: <input type="text" name="address1"></p>
<p>상세주소: <input type="text" name="address2"></p>
<p>참고항목: <input type="text" name="address3"></p>
<p><button type="submit">완료</button></p>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>로그인</title>
</head>
<body>
<h2>로그인</h2>
<form method="post" action="result.jsp">
<input type="hidden" name="action" value="login">
<p>아이디: <input type="text" name="userid"></p>
<p>비밀번호: <input type="password" name="userpw"></p>
<p><button type="submit">로그인</button></p>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
session.invalidate();
response.sendRedirect("login.jsp");
%>
세션을 파괴시킴.(없애버림. 유효하지 못하게 만들어버림.)
-> 로그아웃 됨. -> 로그인으로 이동!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.koreait.mvc1.data.MemberDTO" %>
<%
MemberDTO user = (MemberDTO) session.getAttribute("user");
if (user == null) {
response.sendRedirect("login.jsp");
return;
}
%>
<html>
<head>
<title>회원정보 수정</title>
</head>
<body>
<h2>회원정보 수정</h2>
<form method="post" action="result.jsp">
<input type="hidden" name="action" value="update">
<p>아이디: <%= user.getUserid() %></p>
<p>이름: <input type="text" name="name" value="<%= user.getName() %>"></p>
<p>휴대폰: <input type="text" name="hp" value="<%= user.getHp() %>"></p>
<p>이메일: <input type="email" name="email" value="<%= user.getEmail() %>"></p>
<p>성별:
<select name="gender">
<option value="남자" <%= "남자".equals(user.getGender()) ? "selected" : "" %>>남자</option>
<option value="여자" <%= "여자".equals(user.getGender()) ? "selected" : "" %>>여자</option>
</select>
</p>
<p>우편번호: <input type="text" name="zipcode" value="<%= user.getZipcode() %>"></p>
<p>주소: <input type="text" name="address1" value="<%= user.getAddress1() %>"></p>
<p>상세주소: <input type="text" name="address2" value="<%= user.getAddress2() %>"></p>
<p>참고항목: <input type="text" name="address3" value="<%= user.getAddress3() %>"></p>
<p><button type="submit">수정 완료</button></p>
</form>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.koreait.mvc1.data.MemberDTO" %>
<%
MemberDTO user = (MemberDTO) session.getAttribute("user");
if (user == null) {
response.sendRedirect("login.jsp");
return;
}
%>
<html>
<head><title>회원 탈퇴</title></head>
<body>
<h2>정말 탈퇴하시겠습니까?</h2>
<form method="post" action="result.jsp">
<input type="hidden" name="action" value="leave">
<input type="hidden" name="userid" value="<%= user.getUserid() %>">
비밀번호 확인: <input type="password" name="userpw"><br><br>
<input type="submit" value="탈퇴하기">
</form>
</body>
</html>
package com.koreait.mvc1.data;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/java?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASSWORD = "1234";
public static Connection getConnection() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
MySQL와 연결~~
package com.koreait.mvc1.data;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class MemberDAO {
public boolean insertMember(MemberDTO member) {
String sql = """
insert into member (userid, userpw, name, hp, email,
gender, ssn1, ssn2, zipcode, address1, address2, address3)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""";
try(Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)){
pstmt.setString(1, member.getUserid());
pstmt.setString(2, member.getUserpw());
pstmt.setString(3, member.getName());
pstmt.setString(4, member.getHp());
pstmt.setString(5, member.getEmail());
pstmt.setString(6, member.getGender());
pstmt.setString(7, member.getSsn1());
pstmt.setString(8, member.getSsn2());
pstmt.setString(9, member.getZipcode());
pstmt.setString(10, member.getAddress1());
pstmt.setString(11, member.getAddress2());
pstmt.setString(12, member.getAddress3());
return pstmt.executeUpdate() == 1;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
public MemberDTO login(String userid, String userpw){
String sql = "SELECT * FROM member WHERE userid = ? AND userpw = ?";
try(Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)){
pstmt.setString(1, userid);
pstmt.setString(2, userpw);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
MemberDTO member = new MemberDTO();
member.setIdx(rs.getInt("idx"));
member.setUserid(rs.getString("userid"));
member.setName(rs.getString("name"));
member.setHp(rs.getString("hp"));
member.setEmail(rs.getString("email"));
member.setGender(rs.getString("gender"));
member.setZipcode(rs.getString("zipcode"));
member.setAddress1(rs.getString("address1"));
member.setAddress2(rs.getString("address2"));
member.setAddress3(rs.getString("address3"));
member.setPoint(rs.getInt("point"));
return member;
}
} catch (Exception e){
e.printStackTrace();
}
return null;
}
public boolean updateMember(MemberDTO member) {
String sql = """
UPDATE member SET name = ?, hp = ?, email = ?,
gender = ?, zipcode = ?, address1 = ?,
address2 = ?, address3 = ? WHERE userid = ?
""";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, member.getName());
pstmt.setString(2, member.getHp());
pstmt.setString(3, member.getEmail());
pstmt.setString(4, member.getGender());
pstmt.setString(5, member.getZipcode());
pstmt.setString(6, member.getAddress1());
pstmt.setString(7, member.getAddress2());
pstmt.setString(8, member.getAddress3());
pstmt.setString(9, member.getUserid());
return pstmt.executeUpdate() == 1;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean deleteMember(String userid, String userpw) {
boolean result = false;
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(
"DELETE FROM member WHERE userid=? AND userpw=?")) {
pstmt.setString(1, userid);
pstmt.setString(2, userpw);
result = pstmt.executeUpdate() > 0;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
package com.koreait.mvc1.data;
public class MemberDTO {
private int idx;
private String userid;
private String userpw;
private String name;
private String hp;
private String email;
private String gender;
private String ssn1;
private String ssn2;
private String zipcode;
private String address1;
private String address2;
private String address3;
private String regdate;
private int point;
public MemberDTO() {
}
public MemberDTO(int idx, String userid, String userpw, String name, String hp, String email, String gender, String ssn1, String ssn2, String zipcode, String address1, String address2, String address3, String regdate, int point) {
this.idx = idx;
this.userid = userid;
this.userpw = userpw;
this.name = name;
this.hp = hp;
this.email = email;
this.gender = gender;
this.ssn1 = ssn1;
this.ssn2 = ssn2;
this.zipcode = zipcode;
this.address1 = address1;
this.address2 = address2;
this.address3 = address3;
this.regdate = regdate;
this.point = point;
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserpw() {
return userpw;
}
public void setUserpw(String userpw) {
this.userpw = userpw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHp() {
return hp;
}
public void setHp(String hp) {
this.hp = hp;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getSsn1() {
return ssn1;
}
public void setSsn1(String ssn1) {
this.ssn1 = ssn1;
}
public String getSsn2() {
return ssn2;
}
public void setSsn2(String ssn2) {
this.ssn2 = ssn2;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getAddress3() {
return address3;
}
public void setAddress3(String address3) {
this.address3 = address3;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.koreait.mvc1.data.MemberDTO, com.koreait.mvc1.data.MemberDAO"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
String action = request.getParameter("action");
request.setAttribute("action", action);
MemberDTO dto = new MemberDTO();
MemberDAO dao = new MemberDAO();
%>
<html>
<head>
<title>result</title>
</head>
<body>
<c:choose>
<c:when test="${action eq 'join'}">
<%
// useBeans 액션태그
dto.setUserid(request.getParameter("userid"));
dto.setUserpw(request.getParameter("userpw"));
dto.setName(request.getParameter("name"));
dto.setHp(request.getParameter("hp"));
dto.setEmail(request.getParameter("email"));
dto.setGender(request.getParameter("gender"));
dto.setSsn1(request.getParameter("ssn1"));
dto.setSsn2(request.getParameter("ssn2"));
dto.setZipcode(request.getParameter("zipcode"));
dto.setAddress1(request.getParameter("address1"));
dto.setAddress2(request.getParameter("address2"));
dto.setAddress3(request.getParameter("address3"));
boolean success = dao.insertMember(dto);
request.setAttribute("success", success);
%>
<c:choose>
<c:when test="${success}">
<h2>회원가입 성공</h2>
<p><a href="login.jsp">로그인</a></p>
</c:when>
<c:otherwise>
<h2>회원가입 실패</h2>
<p><a href="join.jsp">회원가입</a></p>
</c:otherwise>
</c:choose>
</c:when>
<c:when test="${action eq 'login'}">
<%
String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");
MemberDTO loginUser = dao.login(userid, userpw);
if(loginUser != null){
session.setAttribute("user", loginUser);
request.setAttribute("loginUser", loginUser);
}
%>
<c:choose>
<c:when test="${not empty loginUser}">
<h2>${loginUser.userid}(${loginUser.name})님, 로그인 성공!</h2>
<p>[<a href="logout.jsp">로그아웃</a>] | [<a href="info.jsp">정보수정</a>] | [<a href="leave.jsp">회원탈퇴</a>]</p>
</c:when>
<c:otherwise>
<h2>로그인 실패!</h2>
<p>아이디 또는 비밀번호가 올바르지 않습니다.</p>
<p><a href="login.jsp">로그인</a></p>
</c:otherwise>
</c:choose>
</c:when>
<c:when test="${action eq 'update'}">
<%
dto.setUserid(((MemberDTO) session.getAttribute("user")).getUserid());
dto.setName(request.getParameter("name"));
dto.setHp(request.getParameter("hp"));
dto.setEmail(request.getParameter("email"));
dto.setGender(request.getParameter("gender"));
dto.setZipcode(request.getParameter("zipcode"));
dto.setAddress1(request.getParameter("address1"));
dto.setAddress2(request.getParameter("address2"));
dto.setAddress3(request.getParameter("address3"));
boolean success = dao.updateMember(dto);
request.setAttribute("success", success);
if (success) {
session.setAttribute("user", dto);
}
%>
<c:choose>
<c:when test="${success}">
<h2>회원정보 수정 성공</h2>
<p><a href="login.jsp">로그인</a></p>
</c:when>
<c:otherwise>
<h2>회원정보 수정 실패</h2>
<p><a href="info.jsp">다시 시도</a></p>
</c:otherwise>
</c:choose>
</c:when>
<c:when test="${action eq 'leave'}">
<%
String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");
boolean success = dao.deleteMember(userid, userpw);
request.setAttribute("success", success);
if (success) session.invalidate();
%>
<c:choose>
<c:when test="${success}">
<h2>회원 탈퇴 완료</h2>
<p><a href="join.jsp">다시 회원가입</a></p>
</c:when>
<c:otherwise>
<h2>회원 탈퇴 실패</h2>
<p>비밀번호가 틀렸거나 오류가 발생했습니다.</p>
<p><a href="leave.jsp">다시 시도</a></p>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<h2>잘못된 요청입니다.</h2>
</c:otherwise>
</c:choose>
</body>
</html>
action이 join일 때 -> 회원가입
회원가입 성공 시(success(True)) -> 로그인으로!
회원가입 실패 시(success(False)) -> 로그인으로!
action이 login일 때 -> 로그인
loginUser가 null이 아니면 ! -> session에 user 정보 저장하고 userid(name)님, 로그인 성공!
loginUser가 null이면 ! -> 로그인 실패...
action이 update일 때 -> 회원정보 수정
회원정보 수정 성공 시(success(True)) -> 로그인으로!
회원정보 수정 실패 시(success(False)) -> 다시도시...
action이 leave일 때 -> 회원 탈퇴
회원 탈퇴 성공 시(success(True)) -> 다시 회원가입!
회원 탈퇴 실패 시(success(False)) -> 다시도시...
🤔 useBeans라는 액션태그가 있다고 함.
-> 이게 무엇인지는 따로 적어두어야 겠다.
MVC1 폴더 구조

