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
반응형
'My Project > Pet Shopping Mall GUI Project' 카테고리의 다른 글
[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 6일차 (03/16) (0) | 2023.03.17 |
---|---|
[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 5일차 (03/15) (0) | 2023.03.16 |
[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 4일차 (03/14) (0) | 2023.03.14 |
[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 2일차 (03/12) (0) | 2023.03.13 |
[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 1일차 (03/10) (0) | 2023.03.12 |