인프런에서 김영한 선생님의 수업을 열심히 듣다가 문득 깨달았다.
설명 너무 잘 해주셔서 원리가 잘 이해된다! 너무 재밌어.
그런데, 내가 저 코드들을 내 머리에서 꺼내서 칠수있을까?
쉽게 금방 할 수 있을 줄 알았는데. 자만이었다.
그래서 복습 프로젝트를 시작하기로 했다.
노션에 정리해둔 모든 개념을 자주 복습하기로 했다.
영한쌤이 수업 때, 따라치라고 해서 정말 단세포마냥 따라치기만 했던 코드들을 내가 직접 구현해보기로 했다.
item 객체를 만들고, 간단한 리포지토리를 만들고, MainController를 만들고..
아주 간지나게 @Controller를 달고, @Repository를 달고, 아! 영한쌤이 @PostConstruct를 통해 미리 데이터를 저장해뒀었지! 생각나서 뿌듯해하며 응용도 해봤다.
그리고, 리포지토리의 save와 findById, findAll에 대한 Test코드도 짜보았다.
모두 성공적이었다.
내가 공부를 헛되이 하지 않았구나! 뿌듯해하며 서버를 올리고 상품조회 페이지를 들어갔지만,
NullPointException이 날 반겨줬다.
그치. 다 한줄 알았겠지. 근데 개 큰거 놓쳤지? 아주 기본인 Dependency injection을 신경쓰지 않았네?
그래서 DI를 하려고했는데, 과거의 나라는 놈은 애꿎은 리포지토리에 생성자를 만들고있었다ㅋㅋㅋㅋ 주는쪽은 리포지토리인데 왜 거기서 만들고있었을까? 받는 쪽이 컨트롤러인데 말이다. ㅋㅋㅋ
itemRepository를 MainController에서 사용하고자 했는데,
ItemRepository itemRepository; 이렇게만 적어뒀으니 DI가 안되는 것은 당연한 처사였다.
사람은 복습을 해야한다.
진짜 널선생 만났을 때, 생성자 주입이 안된 것 같은데 어떻게 하는거더라..? 싶더라고..
결국 위의 내용을 한 50분 태워서 깨닫고, 아래 코드를 추가하고 해결되었다.
(사실 중간에 Controller에서 new repository하고 생쇼를 다했는데, 그땐 PostConstruct가 안됐었음.. DI를 추가해주니 이것도 해결됨.^^.. 왜냐 DI가 끝나야만 구동되는 애니까^^...)
ItemRepository itemRepository;
@Autowired
public MainController(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
}