본문 바로가기
공부/Spring Boot

JDBC를 이용해서 MySQL 데이터 저장하기

by son_i 2023. 9. 27.
728x90
  • JDBC (Java Database Connectivity)
    • SQL Mapper의 한 종류
    • 자바와 DB를 연결해주는 애. 그 이상/이하도 아님
    • JDBC로 데이터 저장하기 url = jdbc:DB_VENDER://IP_ADDR:IP_PORT/INSTACNE 

1. build.gradle 파일에 jdbc, mysql 관련 라이브러리 추가.

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.mysql:mysql-connector-j' //버전 바뀜에 유의

 

2. SpringBoot 실행시키면 APPLICATION FAILED TO START 뜰 거임. → DB 접속 정보가 없기 때문

 

3. application.properties에 DB 접속 정보 저장.

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3307/project?serverTimeZone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=

//1. 이 드라이버를 쓰겠다 의미
//2. 어떤 mySQL을 쓸 것인지. - localhost에 있는 것. port는 3307로 설정(3306은 마리아 db가 쓰고있음.)
//project는 mysql에서 사용할 DB명. 뒤에 시간 setting, 한글 인코딩에 적합한 UTF-8적용.
//3. user name    4. password
//복기해보면 DB접속에 필요한 5가지 ip,user(계정),password,인스턴스,포트번호

 

4. MySQL에 memo 테이블 만들기

create table memo(
	id INT not null primary key auto_increment,
  text VARCHAR(50) NOT NULL
 );

 

5. Memo 객체 만들기 (domain패키지 DB테이블 객체 Spring boot에 생성)

package zerobase.weather.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Memo {
    private int id;
    private String text;
}

 

6. JdbcMemoRepository 만들기 JdbcTemplate

package zerobase.weather.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import zerobase.weather.domain.Memo;

import javax.sql.DataSource;
import java.util.List;
import java.util.Optional;

@Repository
public class JdbcMemoRepository {
    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public JdbcMemoRepository(DataSource dataSource) { //여기의 DataSource는 application.properties에 적어둔 datasource 정보들
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public Memo save(Memo memo) {
        String sql = "insert into memo values(?,?)";
        jdbcTemplate.update(sql, memo.getId(), memo.getText());
        return memo;
    }

    public List<Memo> findAll(){
        String sql = "select * from memo";
        return jdbcTemplate.query(sql, memoRowMapper());
    }

    public Optional<Memo> findById(int id) {
        String sql = "select * from memo where id = ?";
        return jdbcTemplate.query(sql, memoRowMapper(), id).stream().findFirst();
				//결과값이 하나인데 스프링부트는 모르니까 .stream().findFirst()로 해주고 반환형 optionmal<Memo>로 변경.
				//이 메소드의 결과값이 null이어도 Optional이라는 객체로 매핑해줘서 정상동작 가능.
    }

    private RowMapper<Memo> memoRowMapper() { //ResultSet을 스프링부트에 메모라는 클래스로 대입을 시켜야함 -> RowMapper
        //jdbc를 통해 db에서 가져온 값의 타입은 ResultSet
        //ResultSet의 형태 -> {id = 1, text = 'this is memo~'}
        return(rs,rowNum) -> new Memo(
                rs.getInt("id"),
                rs.getString("text")
        );
    }
}

 

7. 테스트 코드 작성

package zerobase.weather.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import zerobase.weather.domain.Memo;

import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Transactional
class JpaMemoRepositoryTest {

    @Autowired
    JpaMemoRepository jpaMemoRepository;

    @Test
    void insertMemoTest() {
        //given
        Memo newMemo = new Memo(2, "hi");

        //when
        jpaMemoRepository.save(newMemo);

        //then
        List<Memo> memoList = jpaMemoRepository.findAll();
        assertTrue(memoList.size() > 0);

     }

     @Test
     void findByIdTest() {
         //given
         Memo newMemo = new Memo(11, "jpa");

         //when
         Memo memo = jpaMemoRepository.save(newMemo);
         System.out.println(memo.getId());

         //then
         Optional<Memo> result = jpaMemoRepository.findById(memo.getId());
         assertEquals(result.get().getId(), memo.getId());
         assertEquals(result.get().getText(), "jpa");
     }
}
728x90