게시판 구조 확인해보기
- 다시 한번 게시판 구조를 확인해보겠습니다.
- 현재 웹페이지를 처음 들어올 때 볼 수 있는 웰컴 페이지와 'LoginForm.do' 요청에 따른
Controller와 properties, MemberFormChange 클래스를 확인해봤습니다.
- 이제 Model에서 DB에 접근할 수 있도록 클래스를 구현해보겠습니다.
JDBC
- 데이터베이스에 접근하기 위해 자바 API인 JDBC를 활용합니다.
- 본 프로젝트에는 ojdbc8을 사용했습니다.
- JDBC를 사용하기 위해 'WebContent-WEB-INF' 아래에 'ojdbc8.jar' 파일을 추가해줍니다.
테이블 구조
- 테이블 구조는 위와 같습니다.
- 기본키는 MEMBER_ID로 설정했습니다.
- 테이블을 만들기 위한 DDL은 다음과 같습니다.
1
2
3
4
5
6
7
8
9
|
CREATE TABLE JSP_BOARD.MEMBER
(
MEMBER_ID VARCHAR2(50),
MEMBER_PWD VARCHAR2(50),
MEMBER_EMAIL VARCHAR2(100),
MEMBER_NAME VARCHAR2(50),
MEMBER_REG DATE DEFAULT SYSDATE,
CONSTRAINT JSP_MEMBER_PK PRIMARY KEY (MEMBER_ID)
)
|
cs |
DBConnection.java
- 데이터베이스에 접근하기 위한 객체입니다.
- 데이터베이스 접근 객체가 무분별하게 생기고 접근되는 것을 방지하기 위해 싱글톤 패턴을 제공합니다.
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
|
package jsp.common.util;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBConnection {
//물리적으로 떨어져 있는 오라클 서버에 연결통로를 확보
Connection conn = null;
//자바코드에서 작성한 select문을 전달함
Statement stmt = null;
//오라클에게 전달된 select문을 처리한 결과를 꺼내기 위해서 커서를 조작해야 하는데
//그 때 커서를 이동하는데 필요한 메소드를 선언한 인터페이스
ResultSet rs = null;
public static final String _DRIVER = "oracle.jdbc.OracleDriver";//ojdbc8.jar 의존관계, 의존성 주입 제조사
//서버측 아이피, 서버측 포트번호, 오라클 SID
public static final String _URL = "jdbc:oracle:thin:@127.0.0.1:1522:ORCL";
public static final String _USER = "jsp_board";
public static final String _PW = "1234";
private static DBConnection db = null;
//싱글톤 패턴
private DBConnection() {}
public static DBConnection getInstance() {
if(db == null) {
db = new DBConnection();
}
return db;
}
public Connection getConnection() {
try {
Class.forName(_DRIVER);
conn = DriverManager.getConnection(_URL, _USER, _PW);
} catch (Exception e) {
System.out.println("드라이버 클래스를 찾을 수 없습니다.");
System.out.println(e.toString());
}
return conn;
}
/*
* 사용한 자원 반납하기
* 생성된 역순으로 반납
*/
public void freeConnection(Connection conn, PreparedStatement pstmt, ResultSet rs) {//select일때
try {
if(rs !=null) rs.close();
if(pstmt !=null) pstmt.close();
if(conn !=null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//PreparedStatement 동적쿼리에서 사용(권장사항) SELECT * FROM member WHERE id=?
public void freeConnection(Connection conn, PreparedStatement pstmt) {//INSERT|UPDATE|DELETE
try {
if(pstmt !=null) pstmt.close();
if(conn !=null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
cs |
- Class.forName을 이용해 메모리에 JDBC Driver를 로드합니다.
- Class.forName("driver 라이브러리"); 형식으로 이용하는데 driver 라이브러리는 본인에 환경에 맞추어 작성해줍니다.
- DriverManager.getConnection()을 이용하여 DB와 연결을 합니다.
- 해당 프로젝트를 진행하면서 JSP_BOARD라는 사용자 계정을 만들었습니다.
- DB와 연결하기 위해 사용한 Connection, PreparedStatement, ResultSet과 같은 객체는
사용 후 반드시 자원을 반납해야 하기 때문에 자원을 반납하는 메서드를 작성합니다.(50~68번째 줄)
Model
- Model에는 DB에 접근하기 위한 객체인 MemberDAO와
로직을 가지지 않는 순수한 데이터 객체로 getter, setter 메서드를 가진 MemberBean이 있습니다.
MeberBean
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 jsp.member.model;
import java.sql.Date;
public class MemberBean {
private String memberID;
private String memberPWD;
private String memberName;
private String memberEmail;
private Date memberReg;
public String getMemberID() {
return memberID;
}
public void setMemberID(String memberID) {
this.memberID = memberID;
}
public String getMemberPWD() {
return memberPWD;
}
public void setMemberPWD(String memberPWD) {
this.memberPWD = memberPWD;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String getMemberEmail() {
return memberEmail;
}
public void setMemberEmail(String memberEmail) {
this.memberEmail = memberEmail;
}
public Date getMemberReg() {
return memberReg;
}
public void setMemberReg(Date memberReg) {
this.memberReg = memberReg;
}
@Override
public String toString() {
return "MemberBean [memberID=" + memberID + ", memberPWD=" + memberPWD + ", memberName=" + memberName
+ ", memberEmail=" + memberEmail + ", memberReg=" + memberReg + "]";
}
}
|
cs |
- 데이터베이스에 접근해 얻어온 값을 저장하고 전달하는 역할을 담당합니다.
- getter, setter를 이용해 데이터에 접근할 수 있습니다.
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
|
package jsp.member.model;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import jsp.common.util.DBConnection;
public class MemberDAO {
private static MemberDAO instance;
private MemberDAO() {
}
//싱글톤 패턴
public static MemberDAO getInstance() {
if(instance==null) {
instance = new MemberDAO();
} return instance;
}
//아이디를 이용해 현재 회원 정보를 가져오기
public MemberBean inquireData(String id) {
DBConnection dbConnection = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
MemberBean member = null;
try {
dbConnection = DBConnection.getInstance();
StringBuffer sql = new StringBuffer(); //멀티쓰레드에서는 StringBuffer가 안전
sql.append("SELECT * FROM MEMBER WHERE MEMBER_ID=?");
conn = dbConnection.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
member = new MemberBean();
member.setMemberID(rs.getString("MEMBER_ID"));
member.setMemberPWD(rs.getString("MEMBER_PWD"));
member.setMemberName(rs.getString("MEMBER_NAME"));
member.setMemberEmail(rs.getString("MEMBER_EMAIL"));
member.setMemberReg(rs.getDate("MEMBER_REG"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
dbConnection.freeConnection(conn, pstmt, rs); //연결 종료
}
return member;
}
//로그인할 때 아이디와 비밀번호가 일치하는지 확인하는 메서드
public int loginCheck(String id, String pwd) {
int result = 0;
DBConnection dbConnection = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String dbPWD = "";
try {
dbConnection = DBConnection.getInstance();
StringBuffer sql = new StringBuffer(); //멀티쓰레드에서는 StringBuffer가 안전
sql.append("SELECT MEMBER_PWD FROM MEMBER WHERE MEMBER_ID=?");
conn = dbConnection.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
//MEMBER_PWD 컬럼의 String값 get해오기
dbPWD = rs.getString("MEMBER_PWD"); //dbPWD는 데이터베이스 비밀번호
System.out.println(dbPWD);
if(dbPWD.equals(pwd)) { //넘겨받은 비번과 데이터베이스 비번이 같다면?
result = 1; //넘겨 받은 비밀번호가 DB의 비밀번호가 같으면 1 반환
} else {
result = 0; //넘겨 받은 비밀번호가 DB의 비밀번호와 다르면 0 반환
}
} else {
result = -1; // 해당 아이디가 없는 경우 -1 반환
}
} catch (Exception e) {
e.printStackTrace();
} finally {
dbConnection.freeConnection(conn, pstmt, rs); //연결 종료
}
return result;
}
//회원가입을 위한 메서드
public void joinMember(MemberBean member) throws SQLException{
int result = 0;
DBConnection dbConnection = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
dbConnection = DBConnection.getInstance();
StringBuffer sql = new StringBuffer();
sql.append("INSERT INTO MEMBER(MEMBER_ID, MEMBER_PWD, MEMBER_EMAIL, MEMBER_NAME) VALUES (?, ?, ?, ?)");
conn = dbConnection.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, member.getMemberID());
pstmt.setString(2, member.getMemberPWD());
pstmt.setString(3, member.getMemberEmail());
pstmt.setString(4, member.getMemberName());
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
dbConnection.freeConnection(conn, pstmt); //conn, pstmt 닫기
}
}
//회원정보 업데이트를 위한 메서드
public void updateMember(MemberBean member) throws SQLException{
DBConnection dbConnection = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
StringBuffer sql = new StringBuffer();
sql.append("UPDATE MEMBER SET MEMBER_PWD=?, MEMBER_EMAIL=?, MEMBER_NAME=? WHERE MEMBER_ID=?");
dbConnection = DBConnection.getInstance();
conn = dbConnection.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, member.getMemberPWD());
pstmt.setString(2, member.getMemberEmail());
pstmt.setString(3, member.getMemberName());
pstmt.setString(4, member.getMemberID());
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
dbConnection.freeConnection(conn, pstmt);
}
}
//훼원정보 삭제를 위한 메서드
public void deleteMember(String id) {
DBConnection dbConnection = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
StringBuffer sql = new StringBuffer();
sql.append("DELETE FROM MEMBER WHERE MEMBER_ID=?");
dbConnection = DBConnection.getInstance();
conn = dbConnection.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, id);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
dbConnection.freeConnection(conn, pstmt);
}
}
}
|
cs |
- DB 접근을 위한 객체인 MemberDAO입니다.
- 각 메서드는 필요에 따라서 DB에 정보를 요청하거나, 수정하거나, 삭제하거나, 저장하기 위한 메서드입니다.
- DB에서 데이터를 수정, 삭제하는 경우 'pstmt.executeUpdate()'를
DB에서 데이터를 간단히 조회하는 경우 'pstmt.executeQuery()'를 사용합니다.
- DB에 SQL문을 전달할 때는 StringBuffer를 사용합니다.
- DBConnection 객체를 이용해 DB에 접근합니다.
오늘은 Model의 역할을 하는 객체들과 DB구조를 알아봤습니다.
다음 글에서는 회원가입이나 로그인, 회원정보 상세보기 등 회원과 관련된 Action 클래스를 모두 알아보겠습니다.
댓글