본문 바로가기
공부/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