JdbcTemplate 빈을 이용해서 HellobootService에 데이터를 액세스하는 기능 추가

hello 테이블을 이용해서 helloAPI를 이용할 때마다 어떤 이름을 가진 사람이 몇 번 인사 했는지 카운팅해서 DB에 저장하는 기능 추가

HelloRepository 인터페이스

인터페이스에 default 메서드, static 메서드를 넣어서 활용하는 방법 자바의 Comparator<T> 인터페이스 참고!

HelloRepository

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();
    }
}

HelloRepositoryJdbc

@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);
    }
}

HelloRepositoryTest

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();
    }

}

image.png

queryForObject() 메서드는 데이터가 없는 경우 null을 리턴하는 것이 아닌 EmptyResultDataAccessException 예외를 던지므로 예외처리를 하는 로직을 추가해줘야 됨