본문 바로가기
Back-end/카카오테크캠퍼스

[카카오테크캠퍼스] 데이터베이스 적용, JDBC

by 잔디🌿 2024. 6. 30.

    이제까지는 데이터베이스가 따로 없어서 해시맵에 저장해 두었었는데, 앱이 실용적으로 수행되려면 시스템을 껐다 켜도 데이터가 그대로여야한다. 

     

    데이터베이스는 데이터를 관리하기 위한 별도의 공간이고, 데이터베이스를 관리하고, 운영하는 소프트웨어를 DBMS라고 한다. DBMS에는 MySQL, 오라클 등이 있다.

     

    JDBC

     

    JDBC는 데이터베이스에 접속할 수 있도록 도와주는 자바 API이다.

    DBMS마다 접근 로직이 다르다. JDBC는 접근로직을 구현체로부터 분리하여 디비에 따라 코드 수정을 할 필요가 없도록 만들어준다.

     

    JDBC 구현하는 법

     

    1. 의존성 주입

    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    runtimeOnly 'com.h2database:h2'

    gradle의 의존성 부분에 위 코드를 추가한다.

     

    2.application.properties 설정 추가

    가끔 이 파일이 없는 경우가 있는데 src/main/resources에 추가하면 된다.

    # h2-console 활성화 여부
    spring.h2.console.enabled=true
    # db url
    spring.datasource.url=jdbc:h2:mem:test

    이렇게 하면 http://localhost:8080/h2-console 에서 데이터를 확인할 수 있다.

     

    JdbcTemplate

    JdbcTemplate는 스프링에서 SQL관계형 데이터베이스, JDBC와 쉽게 작업할 수 있도록 제공하는 객체이다.

    이를 사용하면 리소스 획득,연결 관리, 예외처리 등과 같은 작업은 고려하지 않고 쿼리와 응답처리만 고민할 수 있도록 해준다.

     

    테이블 생성

    package hello;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    @SpringBootApplication
    public class DemoApplication implements CommandLineRunner {
    
        public static void main(String args[]) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        @Override
        public void run(String... strings) throws Exception {
            
            jdbcTemplate.execute("DROP TABLE customers IF EXISTS");
            jdbcTemplate.execute("CREATE TABLE customers(id SERIAL, first_name VARCHAR(255), last_name VARCHAR(255))");
        }
    }

    테이블 생성 부분이다. 프로그램이 처음 실행되는 Appication 클래스 안에서 테이블을 만든다.

    우선 애플리케이션이 실행되면 바로 실행되는 부분을 구현하기 위해 CommandLineRunner을 인터페이스를 받는다.

    @Autowired를 사용하여 JdbcTemplate를 주입받는다. 애플리케이션이 실행될 때 스프링빈에 JdbcTemplate가 등록되기때문에 별도의 작업이 필요 없다.

    run메서드를 오버라이드하여  위에서 받은 객체를 사용해 테이블을 만든다. 

    jdbcTemplate.execute()메서드를 사용하여 sql문을 실행시킨다.

    만약 만들고자 하는 테이블이 이미 존재하면 삭제하고, 새로 테이블을 만든다.

     

    데이터 저장

      public void update(Long id, String name, int price, String imageUrl) {
            String sql = "UPDATE menus SET name = ?, price = ?,imageUrl = ? WHERE id = ?";
            jdbcTemplate.update(sql, name,price,imageUrl,id);
        }

    데이터를 저장하기 위해서는 우선 쿼리문을 작성한다.

    쿼리문에서 변수의 값은 ?로 남겨두면 된다. 그 다음 위와 같이 jdbcTemplate.update에, sql문과 ?에 들어갈 값을 차례로 넣으면 된다.

     

    데이터 조회

    public Menu findById(Long id) {
            String sql = "select id, name, price,imageUrl from menus where id = ?";
            return jdbcTemplate.queryForObject(
                    sql,
                    (resultSet, rowNum) -> new Menu(
                            resultSet.getLong("id"),
                            resultSet.getString("name"),
                            resultSet.getInt("price"),
                            resultSet.getString("imageUrl")
                    ),
                    id
            );
        }

    아까와 마찬가지로 해당 쿼리문을 만들고, jdbcTemplate.queryForObject에 넣어서 값을 조회한다.

    그 다음 위 쿼리문에서 나온 값이 resultSet에 저장되어있으니까 이를 꺼내서 새로운 객체를 만든다.

    rowNum은 현재 나오는 객체들의 값이 몇번째 데이터인지를 나타낸다. 여기서는 하나의 객체만 리턴하니까 사용하진 않는다.

     

    참고로 모든 데이터를 조회할 때에는

    public List<Menu> findAll(){
        String sql = "select id, name, price,imageUrl from menus";
        List<Menu> menus = jdbcTemplate.query(
                sql, (resultSet, rowNum) -> {
                    Menu menu = new Menu(
                            resultSet.getLong("id"),
                            resultSet.getString("name"),
                            resultSet.getInt("price"),
                            resultSet.getString("imageUrl")
                    );
                    return menu;
                });
        return menus;
    }

    위와 같이 jdbcTemplate.query()를 사용해서 구현한다.

     

    데이터 삭제

    public Long delete(Long id){
            var sql = "delete from menus where id = ?";
            jdbcTemplate.update(sql, id);
            return id;
        }

    delete쿼리문을 작성하고, 이를 jdbcTemplate.update를 사용하여 적용한다.

     

    데이터베이스 확인하기

     http://localhost:8080/h2-console에 접속한 후

    바로 connect를 누른다.

    그러면 이런 화면이 뜨고, 왼쪽에서 원하는 테이블명을 클릭하면 그에 맞는 SELECT문이 나온다. 여기서 RUN을 클릭하면 

    이렇게 데이터들이 출력되는 것을 볼 수 있다.