본문 바로가기
공부/웹 개발

웹 회원 추가 / 회원 삭제 / 회원 정보 수정 기능 만들어보기

by son_i 2023. 9. 2.
728x90

<회원추가>

* member_detail 에 정보넣는 건 안 되는 거 확인. -> 어떻게 해결 ?

** 근데 굳이 add.jsp와 ddUser.jsp를 나누지말고 폼 태그에서 받은 값들을 바로바로 세팅해서 넘겨줄 수 없나 ? 흐음..

더보기

<add.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="db.Member" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
table {
	width: 100%;
}

th, td {
	border: solid 1px;
}
</style>
</head>
<body>
<%
	Member member = new Member();
%>
	<h1>회원 추가</h1>
	<form method="get" action="addUser.jsp">
	<table>
	<colgroup>
			<col style="width: 20%;" />
			<col style="width: 80%;" />
		</colgroup>
	<tbody>
		<tr>
			<th>회원구분</th>
			<td><input type="text" name="memberType"></td>
		</tr>
		<tr>
			<th>아이디</th>
			<td><input type="text" name="userId"></td>
		</tr>
		<tr>
			<th>비밀번호</th>
			<td><input type="text" name="password"></td>
		</tr>
		<tr>
			<th>이름</th>
			<td><input type="text" name="name"></td>
		</tr>
		<tr>
			<th>핸드폰 번호</th>
			<td><input type="text" name="mobileNo"></td>
		</tr>
		<tr>
			<th>마케팅 수신여부</th>
			<td>
			<input type="checkbox" name="marketingYn" value="1">수신
			<input type="checkbox" name="marketingYn" value="0">미수신
			</td>
			
		</tr>
	</tbody>
	</table>
	<input type="submit" value="회원가입"/>
	</form>
</body>
</html>

form 태그 이용해서 사용자로부터 값을 받아올 수 있게 함.

method = "get" // 주소창에 표시됨.

action ="addUser.jsp" // submit 버튼을 눌렀을 때 입력된 정보가 날아갈 페이지

마케팅 수신여부는 체크박스를 만들어서 각 value 값을 다르게 줌. 수신은 1 미수신은 0

 

입력받은 값들을 memer setXxx() 메소드로 세팅 -> add.jsp

세팅한 member의 값을 memerService의 register()로 넘겨줌. ->addUser.jsp

 

<addUser.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="db.Member" %>
<%@ page import="db.MemberService" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	Member member = new Member();
	MemberService memberService = new MemberService();

	member.setMemberType(request.getParameter("memberType"));
	member.setUserId(request.getParameter("userId"));
	member.setPassword(request.getParameter("password"));
	member.setName(request.getParameter("name"));
	member.setMobileNo(request.getParameter("mobileNo"));
	if (request.getParameter("marketingYn").equals("0")) {
		member.setMarketingYn(false);
	} else {
		member.setMarketingYn(true);
	}
	java.util.Date date = new java.util.Date();
	long currentM = date.getTime();
	member.setRegisterDate(new java.sql.Date(currentM));
	
	memberService.register(member);
	
%>
	<a href="list.jsp">메인으로 돌아가기</a>

</body>
</html>

add.jsp에서 넘어온 member 객체의 값들을 request.paremeter로 받아서 memberService의 register(Member member)로 넘겨줌.

 

** 근데 굳이 add.jsp와 ddUser.jsp를 나누지말고 폼 태그에서 받은 값들을 바로바로 세팅해서 넘겨줄 수 없나 ? 흐음..

 

? 가입일자는 사용자 입력이 아닌 자동입력이 되어야 함.

Date 클래스 이용.

Date date = Calender.getInstance().getTime();

으로 받아왔는데 addUser.jsp 에서 오류가 났음.

입력은 java.util.Date인데 DB에 setRegisterDate 할 때는 java.sql.Date여야해서 오류가 난다 !

이부분

preparedStatement.setDate(9, (java.sql.Date)member.getRegisterDate());

이렇게 java.sql.Date로 형변환을 해주니까 

 

addUser에 Date 코드 쪽에 The type Date is ambiguous 오류

보통 java.util.Date와 java.sql.Date 둘 중 뭘 사용해야할 지 몰라서 발생하는 오류라고 함.

 

해결방법

1. import로 어떤 클래스 사용할 것인지 명시

2. 선언시 java.util.Date date 명시

 

둘다 걸릴게 없는데 안 됐음. 그렇다고 Member 속성을 LocalDate로 바꾸자니 일이 커질 것 같음.

 

* 변환을 해줘보자 !

<addUser.jsp>

java.util.Date date = new java.util.Date();
	long currentM = date.getTime();
	member.setRegisterDate(new java.sql.Date(currentM));

<MemberService.java>

insert() 메소드에

            preparedStatement.setDate(9,( java.sql.Date)member.getRegisterDate());

이 부분을 바꿔줬다. 

 

이건 해결 !

 


그런데 나는 member 테이블과 memberDetail 테이블 두 개가 있고

이것들은 서로 member_id, user_id 가 동일한 같은 회원임. 근데 속성이 다름.

이 정보를 한 번에 저장하고 싶어서

tring sql = "insert into member(member_type, user_id, password, name)" +
                    " values (?, ?, ?, ?) ;"
                    + " insert into member_detail(member_type, user_id, mobile_no, marketing_yn, register_date)"
                    + " values(?,?,?,?,?);";

이렇게 쿼리를 두 개 썼더니 오류가 났다. 데이터 저장이 안 됨.

엥 근데 생각보다 너무 가볍게 해결..

 String sql = "insert into member(member_type, user_id, password, name)" +
                    " values (?, ?, ?, ?) ;";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, member.getMemberType());
            preparedStatement.setString(2, member.getUserId());
            preparedStatement.setString(3, member.getPassword());
            preparedStatement.setString(4, member.getMemberType());
            
            sql = " insert into member_detail(member_type, user_id, mobile_no, marketing_yn, register_date)"
            + " values(?,?,?,?,?);";
            preparedStatement.setString(5, member.getUserId());
            preparedStatement.setString(6, member.getMobileNo());
            preparedStatement.setBoolean(7,member.isMarketingYn());
            preparedStatement.setString(8, member.getName());
            preparedStatement.setDate(9,( java.sql.Date)member.getRegisterDate());

            int affected = preparedStatement.executeUpdate();//쿼리를 실행하면 내용이 컬렉션형태로 반환 되기 때문에 그냥 execute가 아닌 executeQuery로 해야함.

그냥 쿼리문을 두 개 만들어줬다.

이게 맞는진 모르겠지만 일단 내 힘으로 해결했다는 것에 의의를 두며 .. 점점 발전시켜 나가야징

ㄴㄴ 이거 안 된다.

 


<회원삭제>

*여기서 메인으로 이동버튼 없이 삭제버튼 눌러서 삭제가 완료되면 다시 list.jsp로 오고 싶은데 리다이렉션이었나 ..? 다음에 구현해봐야겠다.

더보기

회원 상세에 들어갔을 때 삭제하도록 짜보자.

<detail.jsp> 삭제버튼 추가

<div>
  <a href="delete.jsp?memberType=<%=member.getMemberType() %>&userId=<%=member.getUserId() %>">삭제</a>
</div>

 

1. 삭제를 누르면 member_type과 user_id를 가지고 delete.jsp로 넘어가야함

<a>태그의 href 속성에 기재. 

 <a href="delete.jsp?memberType=<%=member.getMemberType() %>&userId=<%=member.getUserId() %>">

이 jsp 에서 넘겨주는 이름과 받는 곳에서 request.getParemeter()안의 인자값만 동일하면 어떤 값을 써도 상관없음

 

2. detail.jsp에서 삭제 버튼을 통해 넘어온 memberType과 userId를 이용해서 MemberService의 delete()를 호출.

<delete.jsp>

<%
	MemberService memberService = new MemberService();
	memberService.delete(request.getParameter("memberType"), request.getParameter("userId"));
%>

getParameter안에 인자값으로 받을 이름은 넘겨준 이름과 동일해야

 

3. memberService의 delete() 메소드 만들기. 이때의 인자는 그냥 String type 두 개로 받자.

 /**
     * 회원 탈퇴 함수
     */
    public void delete(String memberType, String userIdValue) {
    	//1. 드라이버 연결
    	try {
			Class.forName("org.mariadb.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    	
    	String url = "jdbc:mariadb://우분투 탄력 ip 주소:3306/testdb1";
    	String userId = "testuser1";
    	String password = "";
    	//2. connection 객체 생성
    	
    	Connection connection = null;
    	PreparedStatement preparedStatement = null;
    	
    	try {
    		connection = DriverManager.getConnection(url,userId, password);
    		
    		String sql = "delete from member "
    				+ " where member_type=? and user_id=?";
    		preparedStatement = connection.prepareStatement(sql);
    		
    		preparedStatement.setString(1, memberType);
    		preparedStatement.setString(2, userIdValue);
    		
    		sql = "delete from member_detail "
    				+ " where member_type=? and user_id=?";
    		preparedStatement.setString(3, memberType);
    		preparedStatement.setString(4, userIdValue);
    		
    		int affected = preparedStatement.executeUpdate();
    		
    		if (affected > 0) {
    			System.out.println("삭제 성공");
    		} else {
    			System.out.println("삭제 실패");
    		}
    	} catch (SQLException e){
    		e.printStackTrace();
    	} finally {
    		try {
    			if (connection != null && !connection.isClosed()) {
        			connection.close();
        		}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		try {
    			if (preparedStatement != null && !preparedStatement.isClosed()) {
        			preparedStatement.close();
        		}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    	}

잘 되는 것을 확인하였다 !

 

*여기서 메인으로 이동버튼 없이 삭제버튼 눌러서 삭제가 완료되면 다시 list.jsp로 오고 싶은데 리다이렉션이었나 ..? 다음에 구현해봐야겠다.


<회원 수정>

역시 회원 상세페이지에서 수정 진행.

* member_detail에는 정보 추가가 안 되기 때문에 member테이블의 속성 값만 변경할 수 있음.

더보기

1. 회원 정보 수정을 진행할 버튼 detail.jsp에 생성

<div>
  <a href="update.jsp?"memberType=<%=member.getMemberType() %>&userId=<%=member.getUserId() %>">정보수정</a>
</div>

 

2. 넘어온 정보를 받아 memeberService의 update() 메소드를 호출해줄 update.jsp 생성

 

* 음 근데 얘는 생각해보니까 넘어온 정보를 가지고 회원을 찾아줄 findBy어쩌구 하는 메소드가 또 필요하겠는 걸... 

 

 


직접 만들어보니 매번 기능마다 jsp 파일을 만들어 메소드를 호출해주는 것이 불필요하게 느껴진다.

한 번에 요청을 받아 메소드를 호출하는 파일이 있으면 좋을 것 같은데

예전에 단기 특강 때 이걸 servlet으로 받아서 처리했었던가 ?? .. 기억이 잘 안 난다. 

차차 익혀나가야지