JdbcTemplate 빈을 이용해서 HellobootService에 데이터를 액세스하는 기능 추가
hello 테이블을 이용해서 helloAPI를 이용할 때마다 어떤 이름을 가진 사람이 몇 번 인사 했는지 카운팅해서 DB에 저장하는 기능 추가
인터페이스에 default 메서드, static 메서드를 넣어서 활용하는 방법 자바의 Comparator<T> 인터페이스 참고!
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();
}
}
@Repository
public class HelloRepositoryJdbc implements HelloRepository {
private final JdbcTemplate jdbcTemplate;
public HelloRepositoryJdbc(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public Hello findHello(String name) {
return jdbcTemplate.queryForObject("select * from hello where name='" + name + "'",
(rs, rowNum) -> new Hello(
rs.getString("name"), rs.getInt("count")
));
}
@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);
}
}
findHello() 메서드 작성시 조회결과가 없다면 어떤일이 발생하는지 아직은 알 수 없었기 때문에 이름에 해당하는 record가 없다면 어떻게 될지 테스트를 진행
@HellobootTest
public class HelloRepositoryTest {
@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
public void findHelloFailed() {
Assertions.assertThat(helloRepository.findHello("Toby")).isNull();
}
}
queryForObject() 메서드는 데이터가 없는 경우 null을 리턴하는 것이 아닌 EmptyResultDataAccessException
예외를 던지므로 예외처리를 하는 로직을 추가해줘야 됨