ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java Swing 로그인 기능 query
    JAVA/JDBC 2024. 6. 10. 15:24

    ▤ 목차

       

      ✔ 로그인 기능

      👻발생 문제

      문제)

      사용자가 직원의 이름과 사번값을 입력 후 "로그인"버튼을 누르면

      모든 직원이 나오도록 해야한다.

       

       

      발생문제 )  데이터베이스에 없는 값(사번 혹은 이름)을 넣어도 전체 직원 목록이 나온다.

      sql문에 값이 잘못들어가면 테이블이 안나와야 정상이다.

      > 유효성 검사를 위해 if문을 사용했다.

      내 계획은 rs(resultSet)값이 null을 반환하면 null이 아닌 경우

      전체 직원 목록이 나오도록 하는 것이였다.

       

      우선 sql문으로 다른 값이 들어가는 경우를 위해 임의의 값(아무값)을 넣었다.

       

       

      당연하게 목록이 나오지 않았다.

       

      계획에 맞춰 if문을 사용했다.

      if (true != rs.equals(null)){
      
      }

      위와 같이 if문으로 감쌌다. equals()메서드의 반환값은 true 혹은 false이다.

      rs.equals(null)의 의미는 rs의 값이 null인 경우 true를 반환한다.

       

      위와 같이 값을 넣었다.

       

      데이터에 없는 값을 넣고 '로그인' 버튼을 누른다면 해당 sql문이 없기에 전체 직원 리스트가 안나오는게 정상인데

      리스트가 나왔다. 혹시몰라 값을 찍어봤다.

      아래와 같이 null을 반환하지 않았다. null값이면 true가 반환되어야하는데 false가 반환된다..

       

       

      🤔 데이터베이스에 값이 없어도 null값을 반환하지 않는다.

      sql = "select jikwon_no 사번, jikwon_name 직원명,jikwon_pay 연봉,jikwon_jik 직급,jikwon_rating 평가 from jikwon where jikwon_no = ? and jikwon_name = ?"

       

      구글링을 해보니 많은 사람들은 로그인 기능을 다른 메서드로 뺐다.

       

      💻 해결 방법

      SQL을 수정했다.

      원래 있던 sql문장은 조건을 걸기 위해 값을 가져왔다.

      조건을 위해 필요하는 값들을 가져오는 것이다.

      수정된 sql을 확인해보자.

      받은 직원 번호랑 같은 이름을 가져오면된다.

       

      #로그인 메서드

      private int login(String txtJikNo, String txtJikName) {
              try {
                  String okSql = "select jikwon_name from jikwon where jikwon_no = ?";
      
                  pstmt = conn.prepareStatement(okSql);
                  pstmt.setString(1, txtJikNo);
                  rs = pstmt.executeQuery();
      
                  if (rs.next()) {
                      if (rs.getString(1).equals(txtJikName)) { // 로그인 성공
                          return 1;
                      } else {
                          return 0;
                      }
                  }
                  return -1; //번호가 없음
              } catch (Exception e1) {
                  System.out.println("login err : " + e1);
              }
              return 2; // DB sql err
          }

       

      # actionPerformed 메서드

      int loginRes = login(txtNo, txtName);
      
                  if (loginRes == 1) { //로그인 성공시
                      // 전체 직원 이름 가져오기
                      sql = "select jikwon_no 사번, jikwon_name 직원명,jikwon_pay 연봉,jikwon_jik 직급,jikwon_rating 평가 from jikwon";
                      pstmt = conn.prepareStatement(sql);
                      rs = pstmt.executeQuery();
      
                      //결과 출력
                      txtArea.append("전체 직원\n");
                      while (rs.next()) {
                          txtArea.append(rs.getString("사번") + "\t" +
                                  rs.getString("직원명") + "\t" +
                                  rs.getString("연봉") + "\t" +
                                  rs.getString("직급") + "\t" +
                                  rs.getString("평가") + "\n");
                      }
                      //직급별 연봉평균
                      txtArea.append("\n\n직급별 연봉 평균\n");
                      sql = "select jikwon_jik 직급, Avg(jikwon_pay) as 평균  from jikwon group by jikwon_jik order by 직급";
                      pstmt = conn.prepareStatement(sql);
                      rs = pstmt.executeQuery();
      
                      while (rs.next()) {
                          String imsi = rs.getString("직급") + " : " +
                                  rs.getString("평균") + "    ";
                          txtArea.append(imsi);
                      }
      
                  } else if (loginRes == 0) {
                      txtArea.setText(null);
                      JOptionPane.showMessageDialog(this, "로그인에 실패했습니다.");
                  } else if(loginRes == -1) {
                      txtArea.setText(null);
                      JOptionPane.showMessageDialog(this, "직원이 아닙니다.");
                  }

      😊정리

      SQL의 중요함을 알게된 문제였다.

      SQL을 잘 사용하면 코드도 간편해진다.

      적절하게 데이터를 가져오는게 실력이라는 생각을 했다.

      문제를 많이 풀어보자.

    Designed by Tistory.