팀프로젝트/JAVA

JAVA 팀플) 20240116_회원가입 구현, 전체 비밀번호 찾기 구현

일일일코_장민기 2024. 3. 11. 13:18
728x90

 

이 날은 그동안 미구현되었던 회원가입, 전체 비밀번호 찾기 기능을 구현했다.
우선 유저 타입은 2가지 타입으로 분리해서 관리자와 일반 유저를 구분했다.

 

CREATE TABLE memberDB (
    userId VARCHAR2(20) PRIMARY KEY,
    userPw VARCHAR2(50) NOT NULL CHECK (LENGTH(userPw) >= 4),
    userName VARCHAR2(20) NOT NULL CHECK (LENGTH(userName) >= 2),
    userSSN1 NUMBER(6, 0) NOT NULL CHECK (LENGTH(userSSN1) = 6),
    userSSN2 NUMBER(7, 0) NOT NULL CHECK (LENGTH(userSSN2) = 7 AND SUBSTR(userSSN2, 1, 1) BETWEEN 1 AND 4),
    userGender VARCHAR2(20) CHECK (userGender IN ('male', 'female')),
    nickname VARCHAR2(20) UNIQUE,
    userPhoneNum1 VARCHAR2(3) NOT NULL,
    userPhoneNum2 VARCHAR2(4) NOT NULL,
    userPhoneNum3 VARCHAR2(4) NOT NULL,
    userEmailId VARCHAR2(50) NOT NULL,
    userEmailDomain VARCHAR2(50) NOT NULL,
    userSignDate VARCHAR2(10) DEFAULT TO_CHAR(SYSDATE, 'yyyy/MM/dd') NOT NULL,
    userType VARCHAR2(1) DEFAULT 1 CHECK (userType IN (0, 1)) -- 0 for admin, 1 for member, default is member
);

새로 만든 SQL...유저 타입이 추가되었다.

 

 

위의 과정을 거치면 정상적인 가입이 가능하다.
유형이 추가되었다.

public String getUserType() {
		String resultUserType = "";
		if(userType.equals("0")) {
			resultUserType = "admin";
		} else if(userType.equals("1")) {
			resultUserType = "member";
		} 
		return resultUserType;
	}

DTO의 Getter 함수를 수정해서 자동으로 유저 타입을 확인할 수 있다.

 

 

버튼을 클릭하면 자식창이 나온다.

package com.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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 javax.servlet.http.HttpSession;

import com.dto.memberDTO;
import com.service.memberService;

@WebServlet("/confirm_Answer_For_All_Password")
public class confirm_Answer_For_All_Password extends HttpServlet {
       
	//childWindow_FindAllPassword.html에서 사용
	//전체 비밀번호 확인을 위한 질문과 대답을 받아와서, DB에 저장된 정보와 일치하면 전체 비밀번호 출력
	//일치할 경우, found_PW.jsp가 
	//불일치할 경우, found_PW.jsp에 ajax처리
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		memberService serv = new memberService();
		
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		
        PrintWriter out = response.getWriter();

        try {
        	String confirmUserInfo = request.getParameter("userInfo");
        	String userAnswer = request.getParameter("answer");
             String userId = request.getParameter("userId");
             boolean can_All_PW = false;
        	
             System.out.println(confirmUserInfo);
             System.out.println(userAnswer);
             System.out.println(userId);
             
                 // 선택된 질문에 따라 memberService로 전달
                 if (confirmUserInfo.equals("nickname")) {
                     can_All_PW = serv.findPWbyNickname(userAnswer, userId);
                 } else if (confirmUserInfo.equals("userPhoneNum")) {
                     can_All_PW = serv.findPWbyPhoneNum(userAnswer, userId);
                 } else if (confirmUserInfo.equals("userEmail")) {
                     can_All_PW = serv.findPWbyEmail(userAnswer, userId);
                 }
        	
                 System.out.println(can_All_PW);    
                 
            if (can_All_PW == true) {
                out.print("correct_Answer");
            } else if (can_All_PW == false){
                out.print("wrong_Answer");
            }
        } catch (Exception e) {
            out.print("error");
            e.printStackTrace();
        } finally {
            out.close();
        }
    }
}

당시 만들었던 컨트롤러

처음에는 mapper에서 choose를 사용하려 했으나,

각각 받아오는 정보가 너무 달라서 일단 이렇게 처리했다.

자식창 jsp에서는 부모창에서 userId를 전송 받아 해당 아이디의 DB정보와 비교하도록 만들었다.

 

 

해당 자식 창은 여러가지 기능을 탑재했다.

1. 3가지 질문에 대해 올바른 답변을 할 경우에만 이벤트 발생(그외에는 ajax처리)

 

알맞지 않은 답을 적었을 때는 ajax가 출력된다.

 

2. 핸드폰 번호에 숫자 외 글자를 입력했을 경우, 경고창 출력

숫자가 아닌 경우에 경고창이 출력된다.

 

3. 이메일에 @가 안 들어갔을 경우, 경고창 출력

 

다만, 이 당시에 전체 비밀번호 찾기에 버그가 많았다.

예를 들면, 지속적으로 오류내거나 새로고침을 계속했을 경우, ajax를 비롯한 함수가 작동을 멈추는 버그

또는 평소에는 잘 되다가 갑자기 올바른 답을 입력했음에도 제대로 이벤트 처리가 되지 않는 버그 등등

이후에는 다 고쳤지만 당시에는 정말 고치기 어려웠던 버그였다.

이 포스팅을 쓰는 현 시점에도 버그가 걸려서 뒤로 갔다가 다시 이벤트 처리를 했다.

 

 

아무튼 올바른 답을 입력하면 모든 비밀번호를 출력해주는 페이지로 이동한다.

 

 

 

 

이로써 사실상 1차적인 로그인/회원가입 처리를 다 만들었다고 할 수 있다.

당시에도 이제부터 계속 보안해 나가는 작업만 계속했던 것으로 기억한다.