[JDBC/MySQL] XML로 JDBC 다뤄보기 (1)

Dev.Hammy·2024년 3월 11일
0

Etc

목록 보기
16/20

MySQL 워크벤치로 스키마와 테이블 생성

School이라는 스키마에 STUDENT라는 테이블을 생성했습니다. 그리고 ROLE_NO, STUDENT_NAME, STUDENT_ADDRESS 라는 세 개의 컬럼을 만들었습니다.

이제 MySQL 에디터를 사용하지 않고 인텔리제이에서 프로젝트를 생성하여 테이블을 채워보도록 하겠습니다.

인텔리제이 프로젝트 생성

스프링 이니셜라이저로 Spring Boot Dev Tools, Lombok, Spring Web, Spring Data JDBC를 의존성 추가 해줍니다. MySQL Driver도 추가할 수 있지만 다른 방법을 사용하도록 하겠습니다.

File > Project Settings > Libraries 에서 라이브러리 추가하기를 선택하고, connector-j가 설치된 경로까지 이동하여 connector-j jar 파일을 외부 라이브러리로 추가합니다.

xml 파일에는 아직 의존성으로 추가되지 않았지만 라이브러리로 드라이버가 추가되어 있는 것을 확인할 수 있습니다.

POJO 클래스 생성

Student라는 단순한 클래스를 생성해보도록 합시다
이 클래스를 활용하여 테이블을 채울 것이기 때문에 클래스의 프로퍼티로는 테이블의 각 컬럼에 해당하는 것들을 사용합니다.

public class Student {

    private int role_no;
    private String name;
    private String address;

    public int getRole_no() {
        return role_no;
    }

    public void setRole_no(int role_no) {
        this.role_no = role_no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "role_no=" + role_no +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

Student Object 생성

POJO 클래스를 생성했으니, 이제 테이블에 채워넣을 "객체" 를 만드는 클래스를 생성합니다.

public class Populate {

    public static void main(String[] args) {
        Student student_A = new Student();
        student_A.setRole_no(001);
        student_A.setName("Kim");
        student_A.setAddress("Seoul");
    }
}

그런데 이 Poulate가 데이터베이스에 영향을 주려면 이들을 연결하는 API가 있어야 할 것입니다. Spring에서 제공하는 JdbcTemplate이 그 역할을 합니다.

DAO(Data Access Object) 인터페이스를 생성하고 Student 클래스를 삽입하는 JdbcTemplate을 구현할 것입니다.

public interface StudentDAO {
    void insert(Student student);
}
import org.springframework.jdbc.core.JdbcTemplate;

public class StudentDAOImpl implements StudentDAO {
    private JdbcTemplate jdbcTemplate;
    @Override
    public void insert(Student student) {

        String sql = "INSERT INTO STUDENT VALUES (?, ?, ?)";
        jdbcTemplate.update(sql);
    }
}

? 자리 표시자를 사용하여 동적으로 값을 할당하는 sql 쿼리를 JdbcTemplate update 메소드의 인자로 전달하고 있습니다.

다시 Populate 클래스로 이동하여 DAO 구현체를 main 함수에 집어넣고 insert 함수의 인자로 아까 학생 정보를 set했던 인스턴스 student_A를 제공합니다.

public class Populate {

    public static void main(String[] args) {
        Student student_A = new Student();
        student_A.setRole_no(001);
        student_A.setName("Kim");
        student_A.setAddress("Seoul");

        StudentDAO studentDAO = new StudentDAOImpl();
        studentDAO.insert(student_A);
    }
}

StudentDAOImpl 클래스로 돌아가 코드를 마저 작성하도록 합니다.

import org.springframework.jdbc.core.JdbcTemplate;

public class StudentDAOImpl implements StudentDAO {
    private JdbcTemplate jdbcTemplate;
    @Override
    public void insert(Student student) {

        String sql = "INSERT INTO STUDENT VALUES (?, ?, ?)";

        Object[] arg = {student.getRole_no(), student.getName(), student.getAddress()};

        jdbcTemplate.update(sql, arg);
    }
}

student 인스턴스로부터 가져온 정보를 update 함수에 전달하여 쿼리문의 자리표시자의 위치에 맞게 할당할 것입니다.

JdbcTemplate 초기화

현재까지는 JdbcTemplate을 초기화하지 않은 상태이므로 이대로 코드를 실행하면 NullPointerException 에러가 발생할 것입니다.

앞서 살펴본 javadoc에 따르면, JdbcTemplate을 초기화 하기 위해서는 DataSource 인스턴스가 필요합니다. DataSource는 Connection을 생성해주는 인터페이스인데 DataSource의 구현체로 우리는 DriverManagerDataSource를 우선 사용해보기로 합니다.

해당 구현체에 대한 javadoc에는 url, 드라이버 매니저의 username, password를 인수로 받는 생성자가 있습니다.

이 생성자로 만든 인스턴스를 JdbcTemplate 생성자의 인수로 제공하는 코드를 StudentDAOImpl 클래스에 추가합니다.

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

public class StudentDAOImpl implements StudentDAO {
    private JdbcTemplate jdbcTemplate = new JdbcTemplate(getDataSource());

    public DataSource getDataSource() {
        String url = "jdbc:mysql://localhost:3306/School";
        String username = "사용자이름";
        String password = "비밀번호";

        DataSource dataSource = new DriverManagerDataSource(url, username, password);

        return dataSource;
    }


    @Override
    public void insert(Student student) {

        String sql = "INSERT INTO STUDENT VALUES (?, ?, ?)";

        Object[] arg = {student.getRole_no(), student.getName(), student.getAddress()};

        int noOfRowInserted = jdbcTemplate.update(sql, arg);
        System.out.println("No of row inserted is "+noOfRowInserted);
    }
}

실행하기

insert 함수가 실행되면서 row가 1개 추가되었다는 메시지가 출력됩니다.

워크벤치에서 SELECT 문을 실행하면 새로이 추가된 데이터를 확인할 수 있습니다.

0개의 댓글