DB 연결 소스 및 시연

JJangnaa·2023년 3월 6일
0

이번 글에서는 DB 연결 소스분석시연을 하도록 하겠습니다.
*MySQL 사용 했습니다.


1. DB 연결 소스

데이터 베이스와 관련된 메소드(및 쿼리문 등)을 한 곳에 모아 놓았고, 본 프로젝트에서 절대 뺄 수 없는 데이터베이스 연결이기도 해서 마지막으로 소개 드립니다.

!!! TMI 주의 !!!
여기저기 DB 연결 코드가 꼴보기 싫다 생각해 한 곳에 몰아 넣어야 겠다는 생각을 했습니다. 기똥차다고 생각해 뿌듯했지만, 중간 점검 때 선생님께서 이렇게 되면 메소드를 사용할 때마다 DB연결 코드가 실행(=DB호출)되기 때문에 좋지 않은 방법인 것 같다고 하셨습니다.
일단 계속 진행하고 있으면 다른 방법을 알려주시겠다고 했는데, 알려주시지 않았습니다..^^ 잘못된 거라면 고치고 싶었기 때문에 몇 번이고 물어봤지만 돌아오는 답변은 '잘 돌아간다면 괜찮다!' 였습니다..
찝찝하지만 괜찮다고 하시니 그대로 뒀던..! 그런 스토리가 있습니다.. ㅎㅎ

1) 전역변수 및 연결

사용 아이디와 비밀번호를 올바르게 입력해주어야 데이터 베이스와 연결이 성공합니다.

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());
	}
}

2) 메소드

본 프로젝트에 필요한 DB 관련된 모든 것을 하나로 모아 두었습니다. 그래서 메소드 개수가 많기 때문에 DB 내 테이블 기준으로 구분하여 소개하도록 하겠습니다.

★ 개인적으로 고통 받았던 것 공유 드립니다. ★
DB에 찾는 정보가 없다면 null 이 출력됩니다.. 그래서 'null'을 활용해 조건문으로 판단을 하려 했지만,,, 나오는 결과는 에러와 경고 문구들이었습니다. 왜?? 왜??? 도대체 왜지??? 약 이틀동안 머리 싸매고 구글링해서 원인과 해결방안을 찾았습니다.
이 문제에 대한 원인은 중복 값이 없을 경우 반환 값이 없어 null 이 되는데, 이 null 은 아예 값이 없는 경우값 비교가 불가합니다. (완전한 원인은 아닌 것 같습니다.)
이에 대한 해결방안으로 최대값을 뽑아 주는 max 함수를 사용해 주는 것입니다. 만약 최대 값이 없을 때는 null 을 출력해줍니다. 네, 우리가 원하는 그 null 이 들어오게 됩니다.

(1) 회원정보 테이블

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();
		}
	}

(2) 단어 테이블

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();
			}
	}

(3) 요청사항 테이블

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();
			}
	}

2. 시연

벨로그는 동영상을 올리지 못하는 것으로 알고 있습니다. 따라서 시연 영상 보러가기 ☜ 클릭하셔서 확인해주시기 바랍니다.

3. 후기

코딩을 하며 살기로 마음 먹은 후 무언갈 스스로 만들어 본게 처음이었던 프로젝트여서 어렵고 힘든 점도 많았지만 그만큼 뿌듯했던 것 같아요. 실력도 훨씬 좋아진 것 같구요!
그러니까 저와 비슷한 상황에 있으신 분들! 겁먹지 마시고 일단 뭐라도 만들어 보세요! 저도 처음에는 지금 상태에서 뭘 할 수 있을까 했지만.. 본인이 직접 해야 확실히 늘더라구요. 뭐 모든 분야에서 그렇겠지만요 ㅎㅎ
암튼 저는 더 나은 성장을 위해 계속해서 노력하려 해요 모두 모두 화이팅! :)

profile
귀여운게 좋아

0개의 댓글