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
'공부 > Spring Boot' 카테고리의 다른 글
Spring Boot 3.x 버전에서 Spring Security 적용기 (2) | 2024.08.13 |
---|---|
Spring Boot) 회원가입 시 PasswordEncoder 이용해 비밀번호 암호화 (0) | 2024.08.12 |
SpringBoot 3.x 버전에서 RestDocs + SwaggerUI 사용하기 (0) | 2024.08.01 |
OpenAPI 데이터 받아오기 (0) | 2023.09.29 |
JPA를 이용해서 MySQL에 데이터 저장하기 (0) | 2023.09.27 |