Java

[Java] DAO(Data Access Object) / VO(Value Object)

소댓 2023. 4. 4. 23:55

* DAO (Data Access Object)

  : db 처리하는 순서가 같으니 중복된 부분을 객체로 만들어 활용하는 것

 

- db 처리 단계 중 1.환경변수, 2. 드라이버 로딩, 3. Connection을

  DeptDAO라는 객체로 만듦 (> 데이터베이스의 dept 테이블 활용)

 

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
package dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
 
import vo.DeptVO;
// * DAO : Data Access Object
// db 처리하는 순서가 같으니, 중복된 부분을 객체로 만들어 활용하는 것
 
public class DeptDAO {
 
    // 1. 환경변수
    String driver = "oracle.jdbc.driver.OracleDriver";
    String url =  "jdbc:oracle:thin:@localhost:1521:orcl"
    String username = "scott";
    String password = "tiger";
                        
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    DeptDAO() {
        // 2. 드라이버 로딩
        try {
            Class.forName(driver);
            // 3. Connection
            conn = DriverManager.getConnection(url, username, password);
            System.out.println("conn : "+conn);
        } catch (ClassNotFoundException e) {
            System.out.println("드라이버 로딩 실패");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("db 연결 실패");
            e.printStackTrace();
        }
        
    }
    
    // 부서 전체 목록
    public ArrayList<DeptVO> getAll() {// public 리턴타입 메서드명(매개변수) > 다 가져오면 매개변수 필요 x
        // DeptVO만 담는 전용 ArrayList가 됨
        ArrayList<DeptVO> list = new ArrayList<DeptVO>();
        
        // 4. sql문장
        String sql = "SELECT * FROM dept";
        
        try {
            // 5. sql문장 객체
            pstmt = conn.prepareStatement(sql);
            // 6. 실행 (select ==> ResultSet)
            rs = pstmt.executeQuery();
            while(rs.next()) { 
                int deptno = rs.getInt("deptno");
                String dname = rs.getString("dname");
                String loc = rs.getString("loc");
                System.out.println(deptno+" : "+dname+" : "+loc);
                DeptVO vo = new DeptVO(deptno, dname, loc); // 자바의 객체로 만듦
                list.add(vo);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
        
    }
    
    // 10부서 정보 가져오기
    public DeptVO getOne(int deptno) { // public 리턴타입 메소드이름(int 부서번호)
        DeptVO vo = null;
        // 4. sql문장
        String sql = "SELECT * FROM dept WHERE deptno = ?"// 내가 주는 부서번호(?)를 갖는 데이터
        // 5. sql문장 객체
         // 밑에서 오류 터지면 null이 되기 때문에, 밖의 변수로 지정
        try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, deptno); // 첫번째 부서번호에는 내가 준 번호 전달
        // 6. 실행 (select ==> ResultSet)
        rs = pstmt.executeQuery(); // resultset 받아오기
        // 7. 레코드별 로직 처리
        while(rs.next()) {
            String dname = rs.getString("dname");
            String loc = rs.getString("loc");
//            System.out.println("dname : "+dname+", loc : "+loc);
            vo = new DeptVO(deptno, dname, loc);
        
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return vo; // vo 리턴
    }
 
    // 8. 자원 반납
    
}
 
cs

 

 

- VO : 데이터베이스의 데이터를 value로 가져오게 해주는 것

 

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
package vo;
// VO(Value Object)
// = java bin = DTO
public class DeptVO {
    // 테이블 컬럼의 이름과 같은 멤버변수
    int deptno;
    String dname;
    String loc;
    
    // 기본생성자
    public DeptVO() {}
 
    // 매개변수 있는 생성자(source-generate constructor using fields)
    public DeptVO(int deptno, String dname, String loc) {
        super();
        this.deptno = deptno;
        this.dname = dname;
        this.loc = loc;
    }
 
    
    // setter (source-generate getter/setter)
    // getter
    public int getDeptno() {
        return deptno;
    }
 
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
 
    public String getDname() {
        return dname;
    }
 
    public void setDname(String dname) {
        this.dname = dname;
    }
 
    public String getLoc() {
        return loc;
    }
 
    public void setLoc(String loc) {
        this.loc = loc;
    }
    
    
    
    
}
 
cs

 

 

- DeptDAO, DeptVO 테스트 > 10번 부서에 대한 정보 / 전체 데이터 가져오기

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
package dao;
 
import java.util.ArrayList;
 
import vo.DeptVO;
 
public class TestMain {
    public static void main(String[] args) {
        DeptDAO dao = new DeptDAO(); // db연결할 때 이 한줄이면 끝남!
        
        DeptVO vo = dao.getOne(10); // 10번 부서에 대한 정보 호출
 
        System.out.println("vo : "+vo);
        System.out.println("부서번호 : "+vo.getDeptno());
        System.out.println("부서명 : "+vo.getDname());
        System.out.println("부서위치 : "+vo.getLoc());
        System.out.println("-------------------------");
        
        // 전체 목록(네 개의 부서 정보가 하나에 출력)
//        dao.getAll();
        
        ArrayList<DeptVO> list = dao.getAll();
        
        for(DeptVO vo2 : list) {
            System.out.println(vo.getDeptno()+" : "+vo.getDname()+" : "+vo.getLoc());
        }
        
    }
}
 
 
cs

 

 

 


 

- MemberDAO, MemberVO를 활용해 멤버 테이블 객체를 생성하여 

  데이터 추가 및 특정 데이터 정보 반환

 

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
package dao;
 
import java.util.ArrayList;
 
import vo.MemberVO;
 
public class TestMain2 {
    public static void main(String[] args) {
        
        MemberDAO dao = new MemberDAO();
        
        // conn : oracle.jdbc.driver.T4CConnection@3745e5c6
 
        MemberVO vo = new MemberVO();
        vo.setId("aaa");
        System.out.println("id : "+vo.getId()); // id : aaa
        
        System.out.println("--------------------------");
        
        
        MemberVO vo2 = dao.getOneById("aaa"); // 멤버 테이블 객체(vo2) 생성하고 아이디가 aaa인 데이터 반환
        System.out.println("id : "+vo2.getId());
        System.out.println("pw : "+vo2.getPw());
        System.out.println("name : "+vo2.getName());
        
        System.out.println("--------------------------");
        
        ArrayList<MemberVO> list = dao.getAll();
        
        for(MemberVO vo3 : list) {
            System.out.println(vo3.getId()+" : "+vo3.getPw()+" : "+vo3.getName());
        }
    }
}
 
cs

 

 

- MemberDAO

 

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
package dao;
 
import java.lang.reflect.Member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
 
import vo.MemberVO;
 
public class MemberDAO {
    
        // 1. 환경변수
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url =  "jdbc:oracle:thin:@localhost:1521:orcl"
        String username = "scott";
        String password = "tiger";
                            
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        public MemberDAO() { // 생성자에서 1번~3번
//            super(); // 부모 생성자 생략됨 (자바의 모든 개체는 object의 후손)
            try {
                Class.forName(driver);
                conn = DriverManager.getConnection(url, username, password);
            
            } catch (ClassNotFoundException e) {
                System.out.println("드라이버 로딩 실패");
                e.printStackTrace();
            } catch (SQLException e) {
                System.out.println("db 연결 실패");
                e.printStackTrace();
            }
            System.out.println("conn : "+conn);
        }
    
        
        // id가 aaa인 데이터 가져오기
        public MemberVO getOneById(String id) { // 4번 ~ 7번
            
            
            // 4. sql문장
            StringBuffer sb = new StringBuffer(); // String에 buffer 기능이 있어 사이즈 조절이 가능
            sb.append("SELECT no, id, pw, name, gender, motive ");
            sb.append("FROM MEMBER ");
            sb.append("WHERE id = ? ");
            
            System.out.println(sb.toString());
            
            MemberVO vo = null// 멤버변수 선언
            
            try {
                // 5. sql문장 객체
                pstmt = conn.prepareStatement(sb.toString());
                pstmt.setString(1, id);
                // 6. 실행 (select ==> ResultSet)
                rs = pstmt.executeQuery();
                // 7. 레코드별 로직 처리
                while(rs.next()) {
                    int no = rs.getInt("no");
                    String pw = rs.getString("pw");
                    String name = rs.getString("name");
                    String gender = rs.getString("gender");
                    String motive = rs.getString("motive");
                    vo = new MemberVO(id, pw, name, gender, motive); // vo 객체
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return vo; // 값 전달 필수!
        } // getOnebyId end
        
        public ArrayList<MemberVO> getAll() {
            ArrayList<MemberVO> list = new ArrayList<MemberVO>();
            
            StringBuffer sb = new StringBuffer();
            sb.append("SELECT no, id, pw, name, gender, motive ");
            sb.append("FROM MEMBER ");
            
            
            try {
                pstmt = conn.prepareStatement(sb.toString());
                rs = pstmt.executeQuery();
                while(rs.next()) {
                    int no = rs.getInt("no");
                    String id = rs.getString("id");
                    String pw = rs.getString("pw");
                    String name = rs.getString("name");
                    String gender = rs.getString("gender");
                    String motive = rs.getString("motive");
                    MemberVO vo = new MemberVO(id, pw, name, gender, motive);
                    list.add(vo);
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return list;
        }
        
// class end
 
cs

 

 

 

- MemberVO

 

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
package vo;
 
public class MemberVO {
 
    int no;
    String id;
    String pw;
    String name;
    String gender;
    String motive;
    
    public MemberVO() {}
 
    public MemberVO(String id, String pw, String name, String gender, String motive) {
        super();
        this.id = id;
        this.pw = pw;
        this.name = name;
        this.gender = gender;
        this.motive = motive;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getPw() {
        return pw;
    }
 
    public void setPw(String pw) {
        this.pw = pw;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getGender() {
        return gender;
    }
 
    public void setGender(String gender) {
        this.gender = gender;
    }
 
    public String getMotive() {
        return motive;
    }
 
    public void setMotive(String motive) {
        this.motive = motive;
    }
 
    
    
    
}
 
cs

 

 

 


[ DAO, VO를 활용한 로그인 창, 회원가입 창 구현 ]

 

- Login > 그대로

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
package day23;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
 
public class Login extends JFrame implements ActionListener{
 
    JLabel jlbId, jlbPw;
    JTextField jtfId, jtfPw;
    JButton jbtnLogin, jbtnRegister;
 
    Login() {
        
        setLayout(null);
        
        // 컴포넌트 초기화 
        jlbId = new JLabel("ID");
        jlbPw = new JLabel("PW");
        
        jtfId = new JTextField();
        jtfPw = new JTextField();
        
        jbtnLogin = new JButton("로그인");
        jbtnRegister = new JButton("회원가입");
        
        jlbId.setBounds(25013015050);
        jlbPw.setBounds(25023015050);
        
        jtfId.setBounds(45013015050);
        jtfPw.setBounds(45023015050);
        
        jbtnLogin.setBounds(20040015060);
        jbtnRegister.setBounds(45040015060);
        
        add(jlbId);
        add(jlbPw);
        add(jtfId);
        add(jtfPw);
        add(jbtnLogin);
        add(jbtnRegister);
        
        // 이벤트 처리
        jbtnLogin.addActionListener(this);
        jbtnRegister.addActionListener(this);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("로그인");
        setBounds(100100800600);
        setVisible(true);
        
    }
    
    public static void main(String[] args) {
        Login d = new Login();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        if(obj == jbtnLogin) { // 로그인 버튼 클릭 이벤트 처리
            System.out.println("로그인 버튼 눌림");
            
            // 1. 환경변수
            String driver = "oracle.jdbc.driver.OracleDriver";
            String url =  "jdbc:oracle:thin:@localhost:1521:orcl"
            String username = "scott";
            String password = "tiger";
                    
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            
            
            try {
                // 2. 드라이버 로딩
                Class.forName(driver);
                // 3. Connection
                conn = DriverManager.getConnection(url, username, password); // 이 url로 사용자의 아이디와 패스워드를 가지고 연결 한다!
                System.out.println("conn : "+conn);
            } catch (ClassNotFoundException e1) {
                System.out.println("드라이버 로딩 실패");
            } catch (SQLException e1)  {
                System.out.println("db 연결 실패");
                e1.printStackTrace();
            }
            
            // 4. sql문장
            String sql = "SELECT * FROM MEMBER WHERE ID = ? AND PW = ?"// bind 변수
            boolean isExists = false;
            
            // 5. sql문장 객체
            try {
                pstmt = conn.prepareStatement(sql);
                
                // 물음표 채우기
                pstmt.setString(1, jtfId.getText()); 
                pstmt.setString(2, jtfPw.getText());
                
                // 6. 실행 (select ==> ResultSet)
                rs = pstmt.executeQuery();
                isExists = rs.next(); // 있으면 true, 없으면 false 리턴
                // 7. 레코드별 로직 처리
                System.out.println((isExists)?"로그인 성공":"로그인 실패");
                
                // 메시지로 로그인 결과 띄우기
                JOptionPane.showMessageDialog(this, (isExists)?"로그인 성공":"로그인 실패"
                        "확인", JOptionPane.INFORMATION_MESSAGE);
                
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } finally { // 8. 자원 반납
                    try {
                        if(rs!=null) rs.close();
                        if(pstmt!=null) pstmt.close();
                        if(conn!=null) conn.close();
                    } catch (SQLException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
            }
            
        } else if (obj == jbtnRegister) {
            System.out.println("회원가입 버튼 눌림");
            Register r = new Register(this); // Register 창 띄우기 / this : '나'의 참조값 > 나의 생성자 호출
            this.setVisible(false); // 로그인 창 감추기
        }
        
        
    }
    
}
 
cs

 

 

- Register

 

  > 1번 ~ 3번을 DAO로 대체 MemberDAO dao = new MemberDAO();

 

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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
package day23;
// DAO를 사용해서 수정
// DAO > 객체를 사용해서 db 작업을 간단하게
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
import dao.MemberDAO;
import vo.MemberVO;
 
public class Register extends JFrame implements ActionListener {
    
    JLabel jlbId, jlbPw, jlbName, jlbGender, jlbMotive;
    JTextField jtfId, jtfPw, jtfName, jtfGender;
    JCheckBox jcbMan, jcbWoman;
    JTextArea jtaMotive;
    JButton jbtnRegister, jbtnCancel, jbtnCheck;
    boolean isExists = true// 중복확인을 위해 전역변수로
    Login d; // 창 보이게 하기 위해
    
    Register(Login d) {
        this.d = d; // 매개변수 생성자
        
        setLayout(null);
        
        jlbId = new JLabel("ID");
        jlbPw = new JLabel("PW");
        jlbName = new JLabel("이름");
        jlbGender = new JLabel("성별");
        jlbMotive = new JLabel("가입동기");
        
        jtfId = new JTextField();
        jtfPw = new JTextField();
        jtfName = new JTextField();
        
        jcbMan = new JCheckBox("남");
        jcbWoman = new JCheckBox("여");
        
        jtaMotive = new JTextArea();
        
        jbtnRegister = new JButton("회원가입");
        jbtnCancel = new JButton("취소");
        jbtnCheck = new JButton("중복확인");
        
        jlbId.setBounds(10013015050);
        jlbPw.setBounds(10023015050);
        jlbName.setBounds(10033015050);
        jlbGender.setBounds(10043015050);
        jlbMotive.setBounds(10053015050);
        
        jbtnCheck.setBounds(450130,  10050);
        jbtnRegister.setBounds(20075010050);
        jbtnCancel.setBounds(35075010050);
        
        jtfId.setBounds(22513020030);
        jtfPw.setBounds(22523020030);
        jtfName.setBounds(22533020030);
        
        jcbMan.setBounds(2254308050);
        jcbWoman.setBounds(3254308050);
        
        jtaMotive.setBounds(225500250200);
        
        add(jlbId);
        add(jlbPw);
        add(jlbName);
        add(jlbGender);
        add(jlbMotive);
        
        add(jtfId);
        add(jtfPw);
        add(jtfName);
        
        add(jcbMan);
        add(jcbWoman);
        add(jtaMotive);
        
        add(jbtnRegister);
        add(jbtnCancel);
        add(jbtnCheck);
        
        // 이벤트 처리
        jbtnCheck.addActionListener(this);
        jbtnRegister.addActionListener(this);
        jbtnCancel.addActionListener(this);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(100100600900);
        setVisible(true);
        
    }
    
//    public static void main(String[] args) {
//        
////        Register r = new Register();
//    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource(); // 어떤 대상인지 참조값 얻어옴
        if(obj == jbtnCheck) {
            System.out.println("체크 버튼 눌림");
            String id = jtfId.getText(); 
            
            // 1번 ~ 3번을 DAO로 대체
            MemberDAO dao = new MemberDAO(); // > MemberDAO 생성자를 public으로..
            
            MemberVO vo = dao.getOneById(id);
            if(vo == null// vo가 null이면 false, null이 아니면 true로 전달
                isExists = false;
            else
                isExists = true;
            
            JOptionPane.showMessageDialog(this, (vo != null)?"id가 중복됨":"사용 가능한 id입니다.",  // vo가 null이 아니라면 id가 중복된 것, null이면 사용 가능
                        "확인", JOptionPane.INFORMATION_MESSAGE);
            
        } else if(obj == jbtnRegister) {
            if(!isExists) { // 값이 존재하지 않으면,
            String id = jtfId.getText();
            String pw = jtfPw.getText();
            String name = jtfName.getText();
            String gender = "";
            if(jcbMan.isSelected()) 
                gender = jcbMan.getText();
            else if (jcbWoman.isSelected())
                gender = jcbWoman.getText();
            
            String motive = jtaMotive.getText();
            System.out.println(id + " : "+pw+" : "+name+" : "+gender+" : "+motive);
            
            // 1. 환경변수
            String driver = "oracle.jdbc.driver.OracleDriver";
            String url =  "jdbc:oracle:thin:@localhost:1521:orcl"
            String username = "scott";
            String password = "tiger";
                    
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            
            try { 
                // 2. 드라이버 로딩
                Class.forName(driver);
                // 3. Connection
                conn = DriverManager.getConnection(url, username, password);
                System.out.println("conn : "+conn);
            } catch (ClassNotFoundException e1) {
                System.out.println("드라이버 연결 실패");
                e1.printStackTrace();
            } catch (SQLException e1) {
                System.out.println("db 연결 실패");
                e1.printStackTrace();
            }
 
            // 4. sql문장
            String sql = "INSERT INTO member Values (mem_no_seq.nextval, ?, ?, ?, ?, ?)"// mem_no_seq는 시퀀스명
                    
            
            try {
                // 5. sql문장 객체
                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, id);
                pstmt.setString(2, pw);
                pstmt.setString(3, name);
                pstmt.setString(4,  gender);
                pstmt.setString(5, motive);
                
                // 6. 실행 (select ==> ResultSet)
                int result = pstmt.executeUpdate();
                // 7. 레코드별 로직 처리
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } finally { // 8. 자원 반납
                try {
                    if(rs!=null) rs.close();
                    if(pstmt!=null) pstmt.close();
                    if(conn!=null) conn.close();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }    
            System.out.println("등록 버튼 눌림");
            }else {
                JOptionPane.showMessageDialog(this"중복된 ID로 등록할 수 없습니다.""확인",
                        JOptionPane.INFORMATION_MESSAGE);
                
            }
        } else if(obj == jbtnCancel) {
            System.out.println("취소 버튼 눌림");
            this.setVisible(false);
            this.d.setVisible(true); // 회원가입창 취소하면 다시 로그인창이 보이게
        }
    }
    
}
 
cs