본문 바로가기
My Project/Pet Shopping Mall GUI Project

[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 3일차 (03/13)

by 스응 2023. 3. 13.
728x90
728x90

3일차

  - id 형식 힌트 추가 (글자 수 제한)

      → phoneNumber와 id의 힌트가 그대로 남아 있으면 회원 가입 실행 X

  - member 테이블의 phone_number를 UNIQUE 컬럼으로 변경 & 중복 확인 기능 추가

  - 회원 가입 시 phoneNumber 형식 확인

      → 처음 '-'의 위치는 인덱스 3번, 마지막 '-'의 위치는 인덱스 8번, 문자열 길이는 13

  - id나 전화번호가 중복되었을 때에는 회원 가입 실행 X

 

  - 코드 리팩토링

      · memberSignUp 메서드의 매개변수를 MemberDTO 객체로 변경

      · memberLogin 메서드의 반환 값을 MemberDTO 객체로 변경

          → 로그인 시 다음 프레임에 MemberDTO 객체를 전달할 예정

               (비밀번호는 민감한 정보이므로 제외하고 전달함)

      · 패키지를 분리

      · 기존 main - DAO 형태에서 main - Controller - Service - DAO 형태로 변경

 

 


id 형식 힌트 & 전화번호 형식 확인

더보기
// 회원가입 버튼
} else if (targetButton == signUpButton) {
    // 방어적 코드
    for (int i = 0; i < textFields.length; i++) {
        // 텍스트 필드에 값이 입력되지 않았다면 실행 X
        if (textFields[i].getText().isEmpty()) {
            System.out.println("모든 값을 입력해주세요.");
            JOptionPane.showMessageDialog(null, "모든 값을 입력해주세요.", "회원 가입 실패", JOptionPane.PLAIN_MESSAGE);
            return;
        }
    }
    // 패스워드 필드에 값이 입력되지 않았다면 실행 X
    if (new String(pwField.getPassword()).isEmpty()) {
        System.out.println("모든 값을 입력해주세요.");
        JOptionPane.showMessageDialog(null, "모든 값을 입력해주세요.", "회원 가입 실패", JOptionPane.PLAIN_MESSAGE);
        return;
    }
    // id, 전화번호를 입력하지 않아 힌트가 그대로 남아 있으면 실행 X
    if (idHintOff == false || phoneHintOff == false) {
        System.out.println("모든 값을 입력해주세요.");
        JOptionPane.showMessageDialog(null, "모든 값을 입력해주세요.", "회원 가입 실패", JOptionPane.PLAIN_MESSAGE);
        return;				
    }
    // 전화번호 형식 확인
    // '-'가 인덱스 3번, 8번에 나와야 하고, 총 길이가 13이어야 함
    if (phoneTextField.getText().indexOf("-") != 3 || phoneTextField.getText().lastIndexOf("-" ) != 8
            || phoneTextField.getText().length() != 13) {
        System.out.println("전화번호의 형식이 잘못되었습니다.");
        JOptionPane.showMessageDialog(null, "전화번호는 010-####-####의 형식으로 입력해주세요.", "회원 가입 실패", JOptionPane.PLAIN_MESSAGE);				
        return;
    }

 

 

 


전화번호 중복 확인 기능

  - 전체적인 형식은 아이디 중복 확인과 동일

 

 


코드 리팩토링

  - 기존 : main - DAO - MySQL

  - 변경 : main - Controller(요청) - Service(로직) - DAO(DB 접근) - MySQL

 

더보기

#  MemberController

public class MemberController {

    private MemberService memberService;

    public MemberController() {
        memberService = new MemberService();
    }

    // 사용자 정보를 받아 회원가입 처리
    public int requestSignUp(MemberDTO member) {
        int response = 0;
        // 성공 시 1 반환 (실패 시 0 or 2 or 3 or 4 반환)
        response = memberService.signUp(member);
        return response;
    }

    // id 값을 받아 중복된 id인지 체크
    public int requestCheckId(String id) {
        int response = 0;
        // 중복 시 1 반환 (중복되지 않았다면 0, 값 미입력 시 2 반환)
        response = memberService.checkId(id);
        return response;
    }

    // phoneNumber 값을 받아 중복된 phoneNumber인지 체크
    public int requestCheckPhoneNumber(String phoneNumber) {
        int response = 0;
        // 중복 시 1 반환 (중복되지 않았다면 0, 값 미입력 시 2 반환)
        response = memberService.checkPhoneNumber(phoneNumber);
        return response;
    }

    // id와 password 값을 받아 로그인 처리
    public MemberDTO requestLogin(String id, String password) {
        MemberDTO response = null;
        // 정보가 정확하다면 DTO 객체 반환 (정확하지 않거나 값 미입력 시 null 반환)
        response = memberService.loginMember(id, password);
        return response;
    }

    // id와 phoneNumber 값을 받아 비밀번호 찾기
    public String requestFindPassword(String id, String phoneNumber) {
        String response = null;
        // 정보가 정확하다면 password 반환 (정확하지 않거나 값 미입력 시 null 반환)
        response = memberService.findPassword(id, phoneNumber);
        return response;
    }
}

 

#  MemberService

public class MemberService {

    private MemberDAO memberDAO;

    public MemberService() {
        memberDAO = new MemberDAO();
    }

    // 회원 가입 로직 처리
    // result 값에 따라 다른 결과가 나타나도록 함
    public int signUp(MemberDTO member) {
        int result = 0;

        // 입력 값이 유효한지 확인하기
        // 입력되지 않은 값이 있다면 실행 X (result == 2)
        if (member.getId().equals("") || member.getPassword().equals("") || member.getName().equals("")
        || member.getPhoneNumber().equals("") || member.getAddress().equals("")) {
            result = 2;
            return result;

        // 전화번호 형식에 맞지 않다면 실행 X (result == 3)
        // '-'가 인덱스 3번, 8번에 나와야 하고, 총 길이가 13이어야 함
        } else if (member.getPhoneNumber().indexOf("-") != 3 || member.getPhoneNumber().lastIndexOf("-") != 8
        || member.getPhoneNumber().length() != 13) {
            result = 3;
            return result;

        // id나 전화번호가 중복된 경우 실행 X (result == 4)
        } else if (memberDAO.selectById(member.getId()) == 1
        || memberDAO.selectByPhoneNumber(member.getPhoneNumber()) == 1) {
            result = 4;
            return result;
        }

        // 사용자 권한 여기서 지정

        // 성공했다면 result == 1 (아니면 0)
        result = memberDAO.insert(member);
        return result;
    } // end of signUp

    // 아이디 중복 확인 로직 처리
    public int checkId(String id) {
        int result = 0;

        // id가 입력되지 않았다면 실행 X (result == 2)
        if (id.equals("")) {
            result = 2;
            return result;
        }
        // 중복이라면 result == 1 (아니면 0)
        result = memberDAO.selectById(id);
        return result;
    } // end of checkId

    // 전화번호 중복 확인 로직 처리
    public int checkPhoneNumber(String phoneNumber) {
        int result = 0;

        // phonNumber가 입력되지 않았다면 실행 X (result == 2)
        if (phoneNumber.equals("")) {
            result = 2;
            return result;

        // 전화번호 형식에 맞지 않다면 실행 X (result == 3)
        // '-'가 인덱스 3번, 8번에 나와야 하고, 총 길이가 13이어야 함
        } else if (phoneNumber.indexOf("-") != 3 || phoneNumber.lastIndexOf("-") != 8
        || phoneNumber.length() != 13) {
            result = 3;
            return result;
        }

        // 중복이라면 result == 1 (아니면 0)
        result = memberDAO.selectByPhoneNumber(phoneNumber);
        return result;
    } // end of checkPhoneNumber

    // 로그인 로직 처리
    public MemberDTO loginMember(String id, String password) {
        MemberDTO resultMemberDTO = null;

        // 입력되지 않은 값이 있다면 실행 X
        if (id.equals("") || password.equals("")) {
            return resultMemberDTO;
        }

        // 입력한 정보가 정확하다면 객체가 생성됨
        resultMemberDTO = memberDAO.selectByIdAndPassword(id, password);		
        return resultMemberDTO;
    }

    // 비밀번호 찾기 로직 처리
    public String findPassword(String id, String phoneNumber) {
        String resultPw = null;

        // 입력되지 않은 값이 있다면 실행 X
        if (id.equals("") || phoneNumber.equals("")) {
            return resultPw;
        }

        // 입력한 정보가 정확하다면 resultPw에 비밀번호 정보가 담김
        resultPw = memberDAO.selectByIdAndPhoneNumber(id, phoneNumber);
        return resultPw;
    }

}

 

#  MemberDAO

public class MemberDAO implements IMemberDAO {

    private DBHelper dbHelper;
    private Connection conn;
    private PreparedStatement pstmt;
    private ResultSet rs;

    public MemberDAO() {
        dbHelper = DBHelper.getInstance();
        conn = dbHelper.getConnection();
    }

    // 아이디 중복 확인 기능
    @Override
    public int selectById(String id) {
        int result = 0;
        String sql = " SELECT * FROM member WHERE id = ? ";

        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            rs = pstmt.executeQuery();

            // 행이 존재한다면 while문으로 들어감
            while (rs.next()) {
                result = 1; // 아이디 중복
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    // 전화번호 중복 확인 기능
    @Override
    public int selectByPhoneNumber(String phoneNumber) {
        int result = 0;
        String sql = " SELECT * FROM member WHERE phone_number = ? ";

        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, phoneNumber);
            rs = pstmt.executeQuery();

            // 행이 존재한다면 while문으로 들어감
            while (rs.next()) {
                result = 1; // 전화번호 중복
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    // 회원 추가 (회원가입)
    @Override
    public int insert(MemberDTO dto) {
        int result = 0; // 초기화
        String sql = " INSERT INTO member(id, password, name, phone_number, address) " + "VALUES (?, ?, ?, ?, ?) ";

        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, dto.getId());
            pstmt.setString(2, dto.getPassword());
            pstmt.setString(3, dto.getName());
            pstmt.setString(4, dto.getPhoneNumber());
            pstmt.setString(5, dto.getAddress());
            result = pstmt.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    } // end of insert

    // 아이디와 비밀번호를 알 때 (로그인)
    @Override
    public MemberDTO selectByIdAndPassword(String id, String password) {
        MemberDTO resultMemberDTO = null; // 초기화
        String sql = " SELECT * FROM member WHERE id = ? AND password = ? ";

        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setString(2, password);
            rs = pstmt.executeQuery();

            // 행이 존재한다면 while문으로 들어감
            while (rs.next()) {
                resultMemberDTO = new MemberDTO();
                resultMemberDTO.setId(rs.getString("id"));
                resultMemberDTO.setMemberGrade(rs.getString("member_grade"));
                resultMemberDTO.setName(rs.getString("name"));
                resultMemberDTO.setPhoneNumber(rs.getString("phone_number"));
                resultMemberDTO.setAddress(rs.getString("address"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return resultMemberDTO;
    } // end of selectByIdAndPassword

    // 비밀번호를 모르고, 아이디와 전화번호를 알 때 (비밀번호 찾기)
    @Override
    public String selectByIdAndPhoneNumber(String id, String phoneNumber) {
        String resultPw = null;
        String sql = " SELECT * FROM member WHERE id = ? AND phone_number = ? "; 

        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.setString(2, phoneNumber);
            rs = pstmt.executeQuery();

            // 행이 존재한다면 while문으로 들어감
            while (rs.next()) {
                resultPw = rs.getString("password");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return resultPw;
    } // end of selectByIdAndPhoneNumber
	
}

 

 

 

320x100
반응형

댓글