문제
- Spring Lv.2 과제 도중, 튜터님이 저번에 VoyagePost로 네이밍을 하면 알아보기 힘들다고 하셔서 그냥 Post로 바꾸던 도중에, 다른 모든 Entity, Dto, Service, Repository는 전부 Voyage를 Post로 바꾸었는데 Controller에서 Service를 주입하는 도중에 "Could not autowire. No beans of 'PostService' type found." 라는 에러 메시지가 나왔다.
- Application을 실행시키려고 하는데 Run이 되지 않아서 실행을 하지 못하는 에러가 발생하였다.
시도
- 생성자를 직접 만들어서 "public PostController(PostService postService) {this.postService = postService;}" 하지말고 lombok의 @RequiredArgsContructor를 사용하면 고쳐지지 않을까?
- Constructor with '1' parameter is already defined 라는 에러메시지가 새로 생김...
- Run 자체를 누르지 못하기 때문에 혹시 Configuration에 문제가 있나 싶어서 Select Run / Debug Configuration에 들어가서 새로 PostApplication을 등록하였다.
-> 안됨
- 그러면 Configuration 자체의 문제는 아닌 거 같고... 기존 프로젝트를 이름만 수정을 해서 하는 거라 실행 과정에서 인식을 못하는 것이라고 생각하였다.
- build.grable을 다시 실행시키면 되지 않을까?
해결
- 다시 껐다 키니까 빨간줄이 사라져있음...
- 검색해보니 인텔리제이에서 가끔 일어나는 오류인데, 파일 명을 바꾸거나, 이클립스에서 실행하던 프로젝트를 인텔리제이로 옮기면 가끔 발생하는 오류라고 한다.
- 아무런 문제가 없이 프로젝트가 실행 될 수도 있고, 아니면 @ComponentScan을 통해서 주입받지 못하는 Bean을 등록하는 방법이 있다고 한다.
- cmd를 켜서 gradlew이 있는 폴더로 이동
- gradlew build 명령어를 통해서 새로운 jar 파일들을 생성
- java -jar voyage-0.0.1-SNAPSHOT.jar 명령어를 입력해서 jar 파일들을 새로 실행
-> 해결
알게 된 점
- Spring의 장점이 많이 구현되어 있어서 쓰기 편하다고 했지만, 단점으로 너무 많이 구현되어 있어서 세세하게 알기 어렵다고 강의에서 들었던 거 같은데, 이런 문제였던 거 같다. 한번 문제가 발생하면 내가 스프링에서 비롯된 어노테이션이나 코드가 어떻게 만들어졌고, 어떻게 실행되는지 모르면 에러를 해결할 수가 없다.
-> 어노테이션 같은 거를 사용하지 않고 구현하는 방법도 알아보고 시도해보자.
- 프로젝트의 이름을 변경해서 실행하는 경우 gradlew 자체도 다시 실행해야 하는 것을 잊지 말자.