이번 글에서는 DB 연결 소스분석과 시연을 하도록 하겠습니다.
*MySQL 사용 했습니다.
데이터 베이스와 관련된 메소드(및 쿼리문 등)을 한 곳에 모아 놓았고, 본 프로젝트에서 절대 뺄 수 없는 데이터베이스 연결이기도 해서 마지막으로 소개 드립니다.
!!! TMI 주의 !!!
여기저기 DB 연결 코드가 꼴보기 싫다 생각해 한 곳에 몰아 넣어야 겠다는 생각을 했습니다. 기똥차다고 생각해 뿌듯했지만, 중간 점검 때 선생님께서 이렇게 되면 메소드를 사용할 때마다 DB연결 코드가 실행(=DB호출)되기 때문에 좋지 않은 방법인 것 같다고 하셨습니다.
일단 계속 진행하고 있으면 다른 방법을 알려주시겠다고 했는데, 알려주시지 않았습니다..^^ 잘못된 거라면 고치고 싶었기 때문에 몇 번이고 물어봤지만 돌아오는 답변은 '잘 돌아간다면 괜찮다!' 였습니다..
찝찝하지만 괜찮다고 하시니 그대로 뒀던..! 그런 스토리가 있습니다.. ㅎㅎ
사용 아이디와 비밀번호를 올바르게 입력해주어야 데이터 베이스와 연결이 성공합니다.
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet srs;
private String sql;
private String res = null;
private int result;
private String nullSurf;
// --------------------------------------------------------------
// DB 연결 메소드
private void connect() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/miniworddb", "root", "test123");
stmt = conn.createStatement();
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
본 프로젝트에 필요한 DB 관련된 모든 것을 하나로 모아 두었습니다. 그래서 메소드 개수가 많기 때문에 DB 내 테이블 기준으로 구분하여 소개하도록 하겠습니다.
★ 개인적으로 고통 받았던 것 공유 드립니다. ★
DB에 찾는 정보가 없다면 null 이 출력됩니다.. 그래서 'null'을 활용해 조건문으로 판단을 하려 했지만,,, 나오는 결과는 에러와 경고 문구들이었습니다. 왜?? 왜??? 도대체 왜지??? 약 이틀동안 머리 싸매고 구글링해서 원인과 해결방안을 찾았습니다.
이 문제에 대한 원인은 중복 값이 없을 경우 반환 값이 없어 null 이 되는데, 이 null 은 아예 값이 없는 경우로 값 비교가 불가합니다. (완전한 원인은 아닌 것 같습니다.)
이에 대한 해결방안으로 최대값을 뽑아 주는 max 함수를 사용해 주는 것입니다. 만약 최대 값이 없을 때는 null 을 출력해줍니다. 네, 우리가 원하는 그 null 이 들어오게 됩니다.
⭐Description⭐
- memberSurf: 컬럼명과 값을 받아 해당 컬럼에 찾고자 하는 값이 있는지 확인
- infoSurfID: col2의 값이 value일때 col1의 값 추출
- select에 사용될 컬럼명: col1, where에 사용될 컬럼명, 값: col2, value- infoSurfPW: col2의 값이 value1 이고 col3의 값이 value2일 때 col1의 값 추출
- select에 사용될 컬럼명: col1, where에 사용될 컬럼명, 값: col2, col3, value1, value2- firstValue: 회원가입 시 입력된 정보를 데이터베이스에 넣음
- inputGrade: 점수에 변동이 있을 경우 데이터베이스에 업데이트 된 점수를 넣음
/*memberDB section*/
// DB의 중복값 유무 확인
public String memberSurf(String col, String value) throws SQLException { // 메소드 호출 시 검색하고 싶은 column 과 중복여부를 확인하고 싶은 값을 매개 변수로 받는다.
// [X] 이 경우, 중복 값 없을 경우 반환 값이 없어 null 이 되는데, 이 null 은 아예 값이 없는 경우로 값 비교가 불가. [O] 와 같이 해야함
// [X] srs = stmt.executeQuery("select " + col + " from member where " + col + " = '" + value + "'");
// [O] value가 DB에 없다면 null == 중복값 없다는 뜻 , 있다면 문자열 담김 == 중복값 있다는 뜻!
connect();
srs = stmt.executeQuery("select max(" + col + ") " + col + " from member where " + col + " = '" + value + "'");
while(srs.next()) {
res = srs.getString(col);
}
return res;
}
// ID 찾기
public String infoSurfID(String col1, String col2, String value) throws SQLException {
connect();
srs = stmt.executeQuery("select " + col1 + " from member where " + col2 + " = '" + value + "'");
while(srs.next()) {
res = srs.getString(col1);
}
return res;
}
// PW 찾기
public String infoSurfPW(String col1, String col2, String col3, String value1, String value2) throws SQLException {
connect();
srs = stmt.executeQuery("select " + col1 + " from member where " + col2 + " = '" + value1 + "' and " + col3 + " = '" + value2 + "'");
while(srs.next()) {
res = srs.getString(col1);
}
return res;
}
// 회원가입시 insert
public void firstValue(JTextField [] firTxt, JPasswordField [] firPw) {
connect();
String pw = new String(firPw[0].getPassword());
try {
sql = "insert into member values(?, ?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
for(int i=1; i<6; i++) {
if(i<3) {
pstmt.setString(i, firTxt[i-1].getText());
} else if(i==3) {
pstmt.setString(i, pw);
} else if(i==4){
if(!(firTxt[i-1].getText()).equals("") && !(firTxt[i].getText()).equals("")) {
pstmt.setString(i, "010 "+firTxt[i-1].getText()+" "+firTxt[i].getText());
} else {
pstmt.setString(i, "-");
}
} else {
pstmt.setInt(i, 0);
}
}
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// grade 넣기
public void inputGrade(int grade, String name) {
connect();
try {
stmt.executeUpdate("update member set grade = '" + grade + "' where name = '"+ name +"'");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
⭐Description⭐
- resetWordList: 기존에 출력되어 있는 리스트들로 초기화
- wordNullSurf: 특정 알파벳으로 시작하는 단어의 유무 확인
- existKorSurf: 단어 테이블 내 영어 단어를 랜덤으로 추출
- selectAllword: 전체 단어를 불러와 테이블(표)의 형태로 만듦
- selectAlphabet: 콤보박스에 사용, 특정 알파벳을 선택할 경우 다시 리스트업
- searchAlphabet: 검색창에 사용, 입력된 알파벳으로 다시 리스트 업
- insertValue: 단어 추가
- deleteValue: 단어 삭제
- updateValue: 단어 수정
/*wordDB section*/
// (판별용 1) 원하는 조건의 결과가 없을 때 Null 출력
public String wordNullSurf(String col, String value) throws SQLException {
connect();
srs = stmt.executeQuery("select max(" + col + ") " + col + " from word where " + col + " like '" + value + "%'");
while(srs.next()) {
res = srs.getString(col);
}
return res;
}
// (추출용) 기존 뜻 추출
public String existKorSurf(String col, String value) throws SQLException {
connect();
srs = stmt.executeQuery("select " + col + " from word where eng = '" + value + "'");
while(srs.next()) {
res = srs.getString(col);
}
return res;
}
// (추출용 2) 영단어 랜덤 추출
public String randomWord() throws SQLException {
connect();
srs = stmt.executeQuery("select eng from word order by rand() limit 1");
while(srs.next()) {
res = srs.getString("eng");
}
return res;
}
// 전체 단어 select
public void selectAllword(DefaultTableModel model, JTable table) {
connect();
resetWordList(model, table);
try {
srs = stmt.executeQuery("select * from word order by eng asc");
while(srs.next()) {
String eng = srs.getString("eng");
String kor = srs.getString("kor");
Object data [] = {eng, kor};
model.addRow(data);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 기존 테이블 리셋
public void resetWordList(DefaultTableModel model, JTable table) {
DefaultTableModel resetModel = (DefaultTableModel) table.getModel();
resetModel.setNumRows(0);
}
// 특정 알파벳으로 시작하는 단어들만 리스트업
public void selectAlphabet(DefaultTableModel model, String tables, String alphabet, JTable table) {
connect();
resetWordList(model, table);
try {
if(alphabet.equals("All")) {
srs = stmt.executeQuery("select * from word order by eng asc");
while(srs.next()) {
String eng = srs.getString("eng");
String kor = srs.getString("kor");
Object data [] = {eng, kor};
model.addRow(data);
}
} else {
nullSurf = wordNullSurf("eng", alphabet);
if(nullSurf == null) {
Object data [] = null;
model.addRow(data);
} else {
srs = stmt.executeQuery("select * from " + tables + " where eng like '" + alphabet + "%' order by eng asc");
while(srs.next()) {
String eng = srs.getString("eng");
String kor = srs.getString("kor");
Object data [] = {eng, kor};
model.addRow(data);
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 텍스트창 입력 알파벳 들어가는 단어들로 리스트업
public void searchAlphabet(DefaultTableModel model, String alphabet, JTable table) throws SQLException {
connect();
// !!! 해당 메소드에서 받은 table로 아래 메소드에 넣어줘야함 !!!
resetWordList(model, table);
try {
if(alphabet.equals("")) {
srs = stmt.executeQuery("select * from word order by eng asc");
} else {
srs = stmt.executeQuery("select * from word where eng like '%" + alphabet + "%' order by eng asc");
}
while(srs.next()) {
String eng = srs.getString("eng");
String kor = srs.getString("kor");
Object data [] = {eng, kor};
model.addRow(data);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// insert
public void insertValue(String eng, String kor) {
connect();
try {
stmt.executeUpdate("insert into word (eng, kor) values ('" + eng + "', '" + kor + "');");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
}
// delete
public void deleteValue(String eng) {
connect();
try {
stmt.executeUpdate("delete from word where eng = '" + eng + "'");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
}
// update
public void updateValue(String kor, String eng) {
connect();
try {
stmt.executeUpdate("update word set kor = '" + kor + "' where eng = '" + eng + "'");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
}
⭐Description⭐
- resetWordList: 기존에 출력되어 있는 리스트들로 초기화
- selectAllrequest: 요청사항을 데이터베이스에 넣음
- deleteRequest: 데이터베이스에 있는 요청사항 삭제
/*requestDB section*/
public void selectAllrequest(DefaultTableModel model, JTable table) {
connect();
resetWordList(model, table);
try {
srs = stmt.executeQuery("select * from request");
while(srs.next()) {
String id = srs.getString("id");
String name = srs.getString("name");
String addOrdelete = srs.getString("add/delete");
String content = srs.getString("content");
Object data [] = {id, name, addOrdelete, content};
model.addRow(data);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// insert request
public void insertRequest(String id, String name, String addDelete, String content) {
connect();
try {
sql = "insert into request values(?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, name);
pstmt.setString(3, addDelete);
pstmt.setString(4, content);
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
}
// delete request
public void deleteRequest(String id, String content) {
connect();
try {
stmt.executeUpdate("delete from request where content = '" + content + "'");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
}
벨로그는 동영상을 올리지 못하는 것으로 알고 있습니다. 따라서 시연 영상 보러가기 ☜ 클릭하셔서 확인해주시기 바랍니다.
코딩을 하며 살기로 마음 먹은 후 무언갈 스스로 만들어 본게 처음이었던 프로젝트여서 어렵고 힘든 점도 많았지만 그만큼 뿌듯했던 것 같아요. 실력도 훨씬 좋아진 것 같구요!
그러니까 저와 비슷한 상황에 있으신 분들! 겁먹지 마시고 일단 뭐라도 만들어 보세요! 저도 처음에는 지금 상태에서 뭘 할 수 있을까 했지만.. 본인이 직접 해야 확실히 늘더라구요. 뭐 모든 분야에서 그렇겠지만요 ㅎㅎ
암튼 저는 더 나은 성장을 위해 계속해서 노력하려 해요 모두 모두 화이팅! :)