ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA - JDBC 사용해 db서버와 데이터 요청/응답 받기
    CS/JAVA 2024. 6. 5. 00:25

    웹에서 클라이언트가 데이터를 요청하면, 서버는 DB서버에 데이터를 요청해 받아서 보내줘야 한다. 

    이번 포스팅에서는 JDBC를 이용해 DB에 데이터를 요청해 받아볼 것이다. 

    사실 나중에는 spring을 사용할 것이기 때문에 이런 과정을 하나하나 알 필요는 없지만, 어떤 식으로 서버가 db로부터 데이터를 주고받는지 이해하기 위해 이런 과정을 직접 해보는 것이다. 

     

    먼저, JDBC가 뭔지 알아보자.

    JDBC(Java Database Connectivity)는 Java에서 데이터베이스에 접근하고 SQL 문을 실행하기 위한 표준 API이다. JDBC를 사용하면 Java 애플리케이션이 데이터베이스와 상호작용할 수 있으며, 이를 통해 데이터를 조회, 삽입, 업데이트 및 삭제하는 등의 작업을 수행할 수 있다. 

     

    JDBC를 사용하기 위해서는 JDBC 드라이버를 추가해 줘야한다. DBMS마다 java코드와 통신하는 방법이 다른데, 내가 사용하는 DBMS에 맞게 실행될 수 있도록 해주는 것이 JDBC 드라이버다. 

    JDBC 드라이버는 각 DBMS 벤더에서 제공해주므로, 내가 사용할 DBMS에 맞는 드라이버를 찾아 라이브러리에 추가해주면 된다.

     

    실습 - JDBC 사용해 java 어플리케이션과 데이터베이스 연결하기

    기술 환경

    DBMS : mariaDB

    IDE : intelliJ

     

    실습 전 준비할 것

    1. mariaDB 서버를 만들어 mariaDB를 실행시킨다. 

    2. 해당 서버에 데이터 베이스를 만든다

    3. 데이터베이스 사용자를 만든다.

    4. table을 만든다. 

     

    < user 테이블 >

    idx name age
    1 철수 20
    2 영수 29

     

    JDBC Driver 설정

    1. mariaDB 홈페이지에 들어가서 mariadb-java-client.jar 파일을 다운받는다.

        https://mariadb.com/kb/en/installing-mariadb-connectorj/

     

    Installing MariaDB Connector/J

    Learn various ways to install Connector/J. Download Connector/J with MariaDB here and learn how to intall.

    mariadb.com

    2. 다운받은 파일을 인텔리제이의 라이브러리에 추가해준다.

        File -> Project Structure -> Libraries -> + 버튼 -> JAVA선택 -> 파일 선택 -> Open -> Ok

     

    Java 코드 작성

    public class JDBCTest {
    
    	//user목록을 받아오는 메서드 - SELECT문 사용
    	public void userList(){
        	Connection connection = null;
            Statement stmt = null; // 데이터베이스에 SQL명령문을 전송하는 객체(SQL문 실행)
            ResultSet rs = null; // select문의 결과를 저장하는 객체
    
            try {
                connection = DriverManager.getConnection( // db와 연결
                        "jdbc:mariadb://[DB서버 ip주소]:3306/[database 이름]",
                        "[db 사용자]", "[db 접속 비밀번호]"
                );
                stmt = connection.createStatement(); //Statement 객체를 생성하는데 사용
                rs = stmt.executeQuery("SELECT * FROM user"); // select문의 결과를 rs에 저장
    
                while (rs.next()) { // next() - 읽어온 결과를 한 행씩 읽는다.
                	// 지정한 필드의 값을 String으로 불러오기.
                    String name = rs.getString("name");
                    String age = rs.getString("age");
    				
                    // 받아온 값 출력해보기
                    System.out.println(name);
                    System.out.println(age);
                }
                
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        
        // 회원가입 하는 메서드 - INSERT문 사용
        public Boolean create(PostMemberReq dto) {
            Connection connection = null;
            PreparedStatement pstmt = null;
            Integer result = null;
            try {
                connection = dataSourceConfig.getConnection();
                pstmt = connection.prepareStatement("INSERT INTO mojalex.member (email, password, nickname, talent) VALUES (?,?,?,?)");
                pstmt.setString(1, dto.getEmail());
                pstmt.setString(2, dto.getPassword());
                pstmt.setString(3, dto.getNickname());
                pstmt.setString(4, dto.getTalent());
                result = pstmt.executeUpdate();
                System.out.println("result : "+result);
    
    
                if (result > 0) {
                    return true;
                }
                
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            return false;
        }
    
    }
    💡SELECT문과 나머지 DML을 사용할 때의 차이

    SELECT문은 결과로 테이블 형식의 결과값을 반환해준다. 하지만 INSERT, DELETE, UPDATE는 쿼리문을 실행하면 결과로 영향을 받은 행의 수를 반환한다. 따라서 SELECT문의 결과는 결과값인 테이블을 저장할 ResultSet객체가 필요하고, 나머지 쿼리문은 int형 변수에 결과값을 저장하면 된다.
    💡Statement vs PreparedStatement

      Statement PreparedStatement
    쿼리 컴파일 실행 시마다 컴파일 한 번 컴파일 후 재사용
    매개변수 사용 직접 문자열로 쿼리 작성 매개변수를 사용하여 쿼리 작성
    보안 SQL 인젝션에 취약 SQL 인젝션 방지
    성능 반복 실행 시 성능 저하 반복 실행 시 성능 향상
    유연성 단순 쿼리에 적합 복잡한 쿼리 및 반복 작업에 적합
    💡setString()

    pstmt = connection.prepareStatement("INSERT INTO mojalex.member (email, password, nickname, talent) VALUES (?,?,?,?)");
    pstmt.setString(1, dto.getEmail());

    => 1번째 물음표에 dto.getEmail()을 문자열로 바꿔서 넣어라!

     

    코드 실행

    코드를 실행시킨 후 db 연결이 잘 되면 콘솔창에 요청한 쿼리 결과가 나올 것이다!

    'CS > JAVA' 카테고리의 다른 글

    JVM(Java Virtual Machine)  (4) 2024.09.02
    JAVA - Tomcat, Servlet 으로 클라이언트 요청받기  (2) 2024.06.17
    JAVA - 오버로딩, 오버라이딩  (3) 2024.06.04
    JAVA - 상속, 생성자  (0) 2024.06.04
    JAVA - static , 접근제어자  (1) 2024.06.03
Designed by Tistory.