Hello Repositoty를 만들어 JDBC를 사용해 DB에 값을 넣어보고 테스트까지 해보겠습니다.
간단하게 3개의 기능을 하는 조회를 만들어 보겠습니다.
countOf
는 디폴트 메서드입니다!
findHello
: 이름을 기준으로 조회
increaseCount
: 객체의 Count를 1개 증가
countOf
: Count를 확인
public interface HelloRepository {
Hello findHello(String name);
void increaseCount(String name);
default int countOf(String name) {
Hello hello = findHello(name);
return hello == null ? 0 : hello.getCount();
}
}
JDBC를 사용해 쿼리를 작성했습니다.
queryForObject
를 사용하여 rowMapper
인터페이스를 람다식과 같이 활용하여 조회한 값을 Hello객체로 만들어 반환하였습니다.ResultSet
: 조회 데이터가 담겨있습니다.rowNum
: 말 그대로 행의 갯수입니다.@Repository
public class HelloRepositoryJdbc implements HelloRepository{
private final JdbcTemplate jdbcTemplate;
public HelloRepositoryJdbc(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public Hello findHello(String name) {
try {
return jdbcTemplate.queryForObject("select * from hello where name = '" + name + "'",
(rs, rowNum) -> new Hello(
rs.getString("name"), rs.getInt("count")
));
} catch (EmptyResultDataAccessException e) {
return null;
}
}
@Override
public void increaseCount(String name) {
Hello hello = findHello(name);
if (hello == null) jdbcTemplate.update("insert into hello values (?, ?)", name, 1);
else jdbcTemplate.update("update hello set count = ? where name = ?", hello.getCount() + 1, name);
}
}
기존에 했던 테스트와 같이 실행하였습니다!
@HellobootTest
public class HellowReposirotyTest {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
HelloRepository helloRepository;
@BeforeEach
void init(){
// 테이블 생성
jdbcTemplate.execute("create table if not exists hello(name varchar(50) primary key, count int)");
}
@Test
void findHelloFailed() {
assertThat(helloRepository.findHello("Toby")).isNull();
}
@Test
void increaseCount() {
assertThat(helloRepository.countOf("Toby")).isEqualTo(0);
helloRepository.increaseCount("Toby");
assertThat(helloRepository.countOf("Toby")).isEqualTo(1);
helloRepository.increaseCount("Toby");
assertThat(helloRepository.countOf("Toby")).isEqualTo(2);
}
}
기능들이 잘 작동하는것을 확인하였습니다!