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

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

by 스응 2023. 3. 14.
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(1000800);
        
        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(200235226);
        mainPanel = new MainPanel(mContext);
    }
    
    // 프레임 기본 설정 + 상단 패널 관련
    private void setInitLayout() {
        setLayout(null);
        setResizable(false);
        setLocationRelativeTo(null);
        
        topPanel.setLocation(00);
        topPanel.setSize(100060);
        topPanel.setBackground(mintColor);
        topPanel.setLayout(null);
        add(topPanel);
            
        gradeLabel.setSize(30,30);
        gradeLabel.setLocation(1016);
        topPanel.add(gradeLabel);
        
        idLabel.setSize(20030);
        idLabel.setLocation(4514);
        topPanel.add(idLabel);
        
        logoutButton.setSize(8525);
        logoutButton.setLocation(13018);
        logoutButton.setBorder(null);
        logoutButton.setBackground(mintColor);
        logoutButton.setFont(new Font("맑은 고딕", Font.BOLD, 13));
        topPanel.add(logoutButton);
        
        homeButton.setSize(60054);
        homeButton.setLocation(2003);
        homeButton.setBorder(null);
        homeButton.setBackground(mintColor);
        homeButton.setFont(new Font("맑은 고딕", Font.BOLD, 30));
        topPanel.add(homeButton);
                
        cartButton.setSize(4050);
        cartButton.setLocation(88013);
        cartButton.setBorder(null);
        cartButton.setBackground(mintColor);
        topPanel.add(cartButton);
        
        myPageButton.setSize(4050);
        myPageButton.setLocation(93013);
        myPageButton.setBorder(null);
        myPageButton.setBackground(mintColor);
        topPanel.add(myPageButton);
        
        borderPanel.setSize(10007);
        borderPanel.setLocation(060);
        add(borderPanel);
        
        mainPanel.setLocation(070);
        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
반응형

댓글