728x90
728x90
4일차
- MemberDAO 리팩토링
· 기존 : selectById, selectByPhoneNumber, selectByIdAndPassword, selectByIdAndPhoneNumber
· 개선 : 메서드 오버로딩 → select (조건 1개), select (조건 2개)
· 매개변수로 컬럼명(String)과 값을 받음
→ 오타 방지를 위해 MemberService에 member 테이블의 컬럼명들을 String[]로 정의해둠
- LoginFrame 편의성 개선
· idTextField에서 Enter 키를 누르면 pwField로 포커스가 옮겨짐
· pwField에서 Enter 키를 누르면 loginButton이 눌러짐
- shopFrame 상단 패널 설계
· 로그인한 회원의 DTO 객체 정보를 받음 (비밀번호 정보는 제외)
→ 회원 등급에 따라 아이콘이 나타나게 함
· 로그아웃 버튼
→ 예/아니오 메세지에서 예를 선택하면 shopFrame이 종료되며 loginFrame이 다시 나타남
· 홈 버튼
→ 초기 화면(mainPanel)으로 되돌아감
· 마이페이지 버튼
· 장바구니 버튼
MemberDAO - select (조건 1개)
더보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | // 하나의 조건을 이용한 SELECT @Override public ArrayList<MemberDTO> select(String columnName, String columnValue) { ArrayList<MemberDTO> resultList = new ArrayList<>(); String sql = " SELECT * FROM member WHERE " + columnName + " = ? "; try { pstmt = conn.prepareStatement(sql); pstmt.setString(1, columnValue); rs = pstmt.executeQuery(); // 행이 존재한다면 while문으로 들어감 while (rs.next()) { MemberDTO dto = new MemberDTO(); dto.setId(rs.getString("id")); dto.setPassword(rs.getString("password")); dto.setMemberGrade(rs.getString("member_grade")); dto.setName(rs.getString("name")); dto.setPhoneNumber(rs.getString("phone_number")); dto.setAddress(rs.getString("address")); resultList.add(dto); } } catch (SQLException e) { e.printStackTrace(); } finally { try { rs.close(); pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } return resultList; } // end of select (조건 1개) | cs |
MemberDAO - select (조건 2개)
더보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | // 두 개의 조건을 이용한 SELECT (완전히 식별하는 목적이므로 단일 객체 반환) @Override public MemberDTO select(String firstColumn, String firstValue, String secondColumn, String secondValue) { MemberDTO resultDto = null; String sql = " SELECT * FROM member WHERE " + firstColumn + " = ? AND " + secondColumn + " = ? "; try { pstmt = conn.prepareStatement(sql); pstmt.setString(1, firstValue); pstmt.setString(2, secondValue); rs = pstmt.executeQuery(); // 행이 존재한다면 while문으로 들어감 while (rs.next()) { resultDto = new MemberDTO(); resultDto.setId(rs.getString("id")); resultDto.setPassword(rs.getString("password")); resultDto.setMemberGrade(rs.getString("member_grade")); resultDto.setName(rs.getString("name")); resultDto.setPhoneNumber(rs.getString("phone_number")); resultDto.setAddress(rs.getString("address")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { rs.close(); pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } return resultDto; } // end of select (조건 2개) | cs |
MemberService (DAO에 맞게 수정)
더보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | // 아이디 중복 확인 로직 처리 public int checkId(String id) { int result = 0; // id가 입력되지 않았다면 실행 X (result == 2) if (id.equals("")) { result = 2; return result; } // 중복이라면 result == 1 (아니면 0) result = memberDAO.select(memberColumns[0], id).size(); return result; } // end of checkId // 전화번호 중복 확인 로직 처리 public int checkPhoneNumber(String phoneNumber) { int result = 0; // phonNumber가 입력되지 않았다면 실행 X (result == 3) if (phoneNumber.equals("")) { result = 3; return result; // 전화번호 형식에 맞지 않다면 실행 X (result == 2) // '-'가 인덱스 3번, 8번에 나와야 하고, 총 길이가 13이어야 함 } else if (phoneNumber.indexOf("-") != 3 || phoneNumber.lastIndexOf("-") != 8 || phoneNumber.length() != 13) { result = 2; return result; } // 중복이라면 result == 1 (아니면 0) result = memberDAO.select(memberColumns[4], phoneNumber).size(); return result; } // end of checkPhoneNumber // 로그인 로직 처리 public MemberDTO loginMember(String id, String password) { MemberDTO resultMemberDTO = null; // 입력되지 않은 값이 있다면 실행 X if (id.equals("") || password.equals("")) { return resultMemberDTO; } // 입력한 정보가 정확하다면 객체가 생성됨 (아니면 null) resultMemberDTO = memberDAO.select(memberColumns[0], id, memberColumns[1], password); // 로그인 시에 password 정보를 반환하지 않도록 함 (민감한 정보) resultMemberDTO.setPassword(null); return resultMemberDTO; } // end of loginMember // 비밀번호 찾기 로직 처리 public String findPassword(String id, String phoneNumber) { String resultPw = null; // 입력되지 않은 값이 있다면 실행 X if (id.equals("") || phoneNumber.equals("")) { return resultPw; } // 입력한 정보가 정확하다면 객체가 생성됨 (아니면 null) MemberDTO targetDto = memberDAO.select(memberColumns[0], id, memberColumns[4], phoneNumber); // 방어적 코드 (null이 아닐 때만) if (targetDto != null) { resultPw = targetDto.getPassword(); } return resultPw; } // end of findPassword | cs |
LoginFrame 편의성 개선
더보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | idTextField.addKeyListener(new KeyAdapter() { // idTextField에서 엔터를 누르면 pwField로 포커스 이동 @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { idTextField.transferFocus(); } } }); pwField.addKeyListener(new KeyAdapter() { // pwField에서 엔터를 누르면 loginButton 활성화 @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { loginButton.doClick(); } } }); | cs |
ShopFrame 상단 패널 설계
더보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | public class ShopFrame extends JFrame implements ActionListener { private ShopFrame mContext = this; private MemberController memberController; private MemberDTO loginMemberDto; // 로그인된 회원의 DTO객체 private JPanel topPanel; // 상단 패널 private JLabel gradeLabel; // 로그인된 회원의 등급 아이콘 private JLabel idLabel; // 로그인된 회원의 아이디 private JButton logoutButton; // 로그아웃 버튼 private JButton homeButton; // 홈 버튼 private JButton myPageButton; // 마이페이지 버튼 private JButton cartButton; // 장바구니 버튼 private JPanel borderPanel; // 상단과 메인 패널 사이 경계 private MainPanel mainPanel; private CartPanel cartPanel; private MyPagePanel myPagePanel; private Color mintColor; public ShopFrame(MemberDTO loginMember) { this.loginMemberDto = loginMember; initData(); setInitLayout(); addEventListener(); } private void initData() { setTitle("홈페이지"); setSize(1000, 800); memberController = new MemberController(); // 회원 등급 아이콘 ImageIcon gradeIcon = null; topPanel = new JPanel(); if (loginMemberDto.getMemberGrade().equals("Gold")) { gradeIcon = new ImageIcon("images/gold.png"); } else if (loginMemberDto.getMemberGrade().equals("Silver")) { gradeIcon = new ImageIcon("images/silver.png"); } else { gradeIcon = new ImageIcon("images/bronze.png"); } gradeLabel = new JLabel(gradeIcon); // 회원 아이디 idLabel = new JLabel(loginMemberDto.getName() + " 님"); idLabel.setFont(new Font("맑은 고딕", Font.BOLD, 20)); logoutButton = new JButton("로그아웃"); homeButton = new JButton("Shopping Mall"); myPageButton = new JButton(new ImageIcon("images/home.png")); cartButton = new JButton(new ImageIcon("images/bag.png")); borderPanel = new JPanel(); mintColor = new Color(200, 235, 226); mainPanel = new MainPanel(mContext); } // 프레임 기본 설정 + 상단 패널 관련 private void setInitLayout() { setLayout(null); setResizable(false); setLocationRelativeTo(null); topPanel.setLocation(0, 0); topPanel.setSize(1000, 60); topPanel.setBackground(mintColor); topPanel.setLayout(null); add(topPanel); gradeLabel.setSize(30,30); gradeLabel.setLocation(10, 16); topPanel.add(gradeLabel); idLabel.setSize(200, 30); idLabel.setLocation(45, 14); topPanel.add(idLabel); logoutButton.setSize(85, 25); logoutButton.setLocation(130, 18); logoutButton.setBorder(null); logoutButton.setBackground(mintColor); logoutButton.setFont(new Font("맑은 고딕", Font.BOLD, 13)); topPanel.add(logoutButton); homeButton.setSize(600, 54); homeButton.setLocation(200, 3); homeButton.setBorder(null); homeButton.setBackground(mintColor); homeButton.setFont(new Font("맑은 고딕", Font.BOLD, 30)); topPanel.add(homeButton); cartButton.setSize(40, 50); cartButton.setLocation(880, 13); cartButton.setBorder(null); cartButton.setBackground(mintColor); topPanel.add(cartButton); myPageButton.setSize(40, 50); myPageButton.setLocation(930, 13); myPageButton.setBorder(null); myPageButton.setBackground(mintColor); topPanel.add(myPageButton); borderPanel.setSize(1000, 7); borderPanel.setLocation(0, 60); add(borderPanel); mainPanel.setLocation(0, 70); add(mainPanel); setVisible(true); } private void addEventListener() { logoutButton.addActionListener(this); homeButton.addActionListener(this); cartButton.addActionListener(this); myPageButton.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { JButton targetButton = (JButton) e.getSource(); // 로그아웃 버튼 if (targetButton == logoutButton) { // 로그아웃하면 해당 프레임이 닫히고 로그인 프레임을 다시 열음 int a = JOptionPane.showConfirmDialog(this, "로그아웃하시겠습니까?", "로그아웃", JOptionPane.YES_NO_OPTION); if (a == JOptionPane.YES_OPTION) { this.dispose(); new LoginFrame(); } // 홈 버튼 } else if (targetButton == homeButton) { mainPanel.setVisible(true); // 장바구니 버튼 } else if (targetButton == cartButton) { mainPanel.setVisible(false); } else if (targetButton == myPageButton) { mainPanel.setVisible(false); } } // end of actionPerformed } | cs |
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 구현 프로젝트 3일차 (03/13) (0) | 2023.03.13 |
[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 2일차 (03/12) (0) | 2023.03.13 |
[개발 일지] 반려동물 용품 쇼핑몰 GUI 구현 프로젝트 1일차 (03/10) (0) | 2023.03.12 |