일단 기본적으로 id와 name, email을 가진 엔티티를 하나 만들어 줬다.
회원 서비스이다.
회원을 저장하는 join, 중복을 확인하는 validateDuplicateUser, 모든 유저를 찾는 findUsers, 한 명을 찾는 findOne 코드를 작성해줬다.
레파지토리는 DB와 연결되어 데이터를 처리하는 영역이다. 서비스는 레파지토리를 관리하는 영역인데, 둘이 나눈 이유가 정확하게 뭔지 궁금하다. 아마 내 프로젝트처럼 작은 크기가 아닌 거대한 프로젝트는 한 번에 관리하기 어려워서 그런가.
일단 EntityManager을 이용해서 @Entity를 달고 있는 엔티티 객체들을 관리하도록 한다. 이때는 @PersistenceContext로 빈을 주입해준다.
save로 유저를 저장하고 findOne으로 id를 이용해서 유저를 찾아 온다. findall은 모든 유저를 찾을 때 사용한다. 그리고 findByName은 이름을 가지고 와서 찾아주는 건데, 이 함수가 필요한 이유는 User Service에서 필명 중복을 확인할 때 사용한다.
회원 가입과 중복회원예외를 테스트 해줬다. 이때 나는 junit5를 사용하기에 Runwith가 아닌 ExtendWith(SpringExtension.class)를 사용했다. 또한 예외가 나오는 부분에서는
Assertions.assertThrows(IllegalStateException.class, () -> userService.join(user2));
로 예외가 터지도록 했다.
처음에 테스트를 하려고 했더니 자꾸만 위의 에러가 났다. 에러 내용을 찬찬히 읽어보니 bean을 찾을 수 없다는 내용 같은데...
구글링을 통해서 @Autowired에 문제가 있으면 위의 에러가 나온다는 것을 알게 됐다. bean주입이 안 되면 spring이 해당 bean을 찾지 못한다는 것이다. 그러나 나는 @Autowired를 정확하게 써줬고 @Service, @Repository, @Entity 또한 제대로 넣어 줬다.
도대체 뭐가 문제일까?
바로... 패키지 위치에 있었다. 해당 엔티티와 레파지토리, 서비스의 피키지가 모두 기본 패키지(이걸 정확하게 뭐라고 설명해야 할지 모르겠다. 기본 application이 들어 있는 패키지 말이다) 밖에 나와 있었다. 이렇게 되니까 spring이 어노테이션들을 인식하지 못한 것이었다.
때문에 해당 패키지들을 기본 패키지 안에 넣으니까 잘 돌아갔다.
위의 사진처럼 기본 패키지 안에다가 넣어줘야 spring이 어노테이션들을 인식한다.
굉장히 해결 방법이 간단한데 이것때문에 상당히 골치 아팠다. 제대로 썼는데 왜 인식을 못하니... ㅠㅠ 이러면서...
도움된 블로그 링크
https://kim-jong-hyun.tistory.com/62
시험의 기간 4월이 다가오기 전에 미리 만들어 놓은 프로젝트가 있었다. 그러나 한 달이라는 시간 동안 신경을 안 썼더니, 내가 왜 이걸 이렇게 구현했는지도 헷갈리고 또한 한 번에 구조를 다 만들어 버려서 에러가 생기니 어디서부터 고쳐야 할지 막막했다.
그래서 새로 만들어서 이번에는 기능을 하나 구현하고 테스트하고 하나 구현하고 테스트할 예정이다. 역시 단위 테스트라는 개념이 괜히 있는 게 아니었다.