본문 바로가기

백엔드

[Spring Boot] Spring JDBC

728x90

 

/* Spring JDBC */

Spring JDBC를 이용해 Java 언어로 데이터베이스와 연동해 쿼리를 실행시킬 수 있다.

 

일단 테이블을 만들어야 하므로 resource 폴더에 schema.sql 이라는 파일을 만들고 다음과 같이 쿼리를 작성했다.

 

CREATE TABLE course (
    id bigint not null,
    name varchar(255) not null,
    author varchar(255) not null,
    primary key(id)
);

 

SPRING JDBC 의존성을 추가했으므로 스프링부트 실행 시에 이 쿼리도 실행이 될것이다.

 

그리고 Course라는 객체를 다음과 같이 만들자

 

@Getter
@Setter
public class Course {
    private Long id;
    private String name;
    private String author;

    public Course() {
    }

    public Course(Long id, String name, String author) {
        this.id = id;
        this.name = name;
        this.author = author;
    }

    @Override
    public String toString() {
        return "Course{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

 

** 주의할점은 Course 객체의 각 필드의 이름들이 schema.sql의 각 key들의 이름들과 같아야 한다.

 

그럼 이들을 실행시킬 쿼리들을 자바 파일에서 만들어 보자

 

@Repository
public class CourseJdbcRepository {

    @Autowired
    public CourseJdbcRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    private JdbcTemplate jdbcTemplate;

    private static String INSERT_QUERY =
            """
            insert into course values (?,?,?);
                   
            """;
    private static String DELETE_QUERY =
            """
            delete from course where id = ?;
                   
            """;
    private static String SELECT_QUERY =
            """
            SELECT * FROM course WHERE id = ? ;
                   
            """;

    public void insert(Course course){
        jdbcTemplate.update(INSERT_QUERY,course.getId(),course.getName(),course.getAuthor());
    }
    public void delete(Long id){
        jdbcTemplate.update(DELETE_QUERY,id);
    }
    public Course findById(Long id){
        //ResultSet -> Bean =? Row Mapper
        return jdbcTemplate.queryForObject(SELECT_QUERY, new BeanPropertyRowMapper<>(Course.class), id);
    }
}

 

생성자 안에 JdbcTemplate이라는 객체를 import 받았는데 이는 jdbc 의존성 안에 포함되어 있는 객체이다.

INSERT_QUERY, DELETE_QUERY, SELECT_QUERY 를 보면 ' ? ' 가 있다. 그 아래에 있는 메서드의 update메서드는 Insert, Delete, Update 쿼리를 실행하는데 이 메서드의 패러미터가 ' ? ' 에 자동으로 매핑을 한다.

 

findById메서드를 보면은 update가 아닌 queryForObject 메서드가 실행이 되었다. 이는 SELECT 문을 실행시키기 위한 메서드 이며 return 값으로는 객체가 되겠다. queryForObject의 두번째 패러미터는 BeanPropertyRowMapper를 사용했는데 이는 리턴값을 의미한다. 

 

** 리턴 값을 제대로 받으려면 Course 객체에 Setter를 생성해야 한다.

 

그 다음으로는 이러한 메서드들을 실행시킬 클래스를 만들어야 한다.

 

@Component
public class CourseJdbcCommandLineRunner implements CommandLineRunner {

    private CourseJdbcRepository courseJdbcRepository;

    @Autowired
    public CourseJdbcCommandLineRunner(CourseJdbcRepository courseJdbcRepository) {
        this.courseJdbcRepository = courseJdbcRepository;
    }

    //execute at the startup
    @Override
    public void run(String... args) throws Exception {
        courseJdbcRepository.insert(new Course(1L,"Learn AWS","SpringBoot"));
        courseJdbcRepository.insert(new Course(2L,"Learn Azure","SpringBoot"));

        courseJdbcRepository.delete(1L);

        System.out.println(courseJdbcRepository.findById(2L));
    }
}

 

위 자바 소스를 보면은 CommandLineRunner를 implements 했는데 이 인터페이스를 implements 하면 스프링부트 서버 실행시  override 된 run 함수를 자동으로 실행시켜준다. 

 

그러면 스프링부트를 실행하고 H2-Console을 들어가보자

 

 

 

run 메서드가 잘 실행된 것을 확인할 수 있다. 

 

 

콘솔 창 밑에 Course 객체가 잘 조회된 것을 확인할 수 있다.

728x90