4주차는 1주차~3주차에 했던 과제들을 바탕으로 도메인 부터 Service, Controller, 테스트 코드 까지 작성하는 과제였다. 과제 설명만 봤을때는 크게 어려움이 느껴지지 않아서 금방 할 것같은 느낌이 들었지만 아무것도 찾아보지 않고 소스코드를 작성해보니 어떤 부분이 명확하게 이해가 되지 않았고 부족한지 알 수 있었다.
가장 먼저 JPA 공부를 해야겠다 생각만 하고 실행에 옮기지 않았었다. 이 과정에서 JPA를 처음 써보면서 어려움이 있어 잘 사용을 못했었다.
두번째로 인터페이스에 대한 지식이 많이 부족했다. 인터페이스는 상속받아 사용할 때 클래스에서는 그 인터페이스에 대한 메소드를 모두 오버라이드 하여 구현을 해야한다고 알고 있었지만
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {}
이런 방식으로 사용을 해본건 처음인것 같다. 클래스가 아닌 인터페이스를 만들어 JpaRepository 를 상속받아 사용하는데 동작이 엄청 잘 되었다. 나는 구현체가 어디 있는거지? 생각을 하면서 누구에게 물어보기가 참 부끄러웠다. 찾아보니 JPA의 실 구현은 하이버네이트 같은 서드파티에서 구현하고 있다는 것을 알게 되었고 JPA에 대해 더 자세히 공부할 필요성을 느끼게 되었다.
given 메소드는 그 안에 명시하는 메소드에 대해서만 실행여부를 판단하는 것을 알게되었다. 또한 given에 얽매이지 않고 다양하게 테스트코드를 작성하는 습관들 들이는게 좋을 것 같다는 생각을 하게 되었다.
Repository를 단순히 무언가 저장하는 저장소로만 알고 있었다.
Repository는 데이터 베이스 접근 기술과 전략을 캡슐화 한 것이며 DB 자체를 말하지는 않는다. 데이터 저장소에서 데이터를 삽입하고 제거하는 연산을 캡슐화하여 모델이 영속화 기술과 다수의 데이터베이스 전략 및 데이터 소스로부터 애플리케이션과 도메인 설계를 분리할 수 있게 해준다. 라고 리뷰어 님께서 친절하게 설명을 해주셔서 Repository의 개념을 다시한번 정리할 수 있게 되었다.
예외 처리를 해줄 때 사용자에게 전달되는 메세지를 알기 쉽고 자세히 작성해야 한다는 것을 알게 되었다.