@Controller
public class MovieController {
@GetMapping("/")
public String getMovieName(Model model) {
TmdbApiClient tmdbApiClient1 = new TmdbApiClient();
Map<String, String> movieAndPoster = tmdbApiClient.getMovieAndPoster();
System.out.println("hi");
model.addAttribute("movieInfo", movieAndPoster);
return "hi";
}
}
@Service
public class TmdbApiClient {
@Value("${ttkey}")
public String API_KEY;
private final String BASE_URL =
"https://api.themoviedb.org/3/discover/movie?api_key=";
public Map<String, String> getMovieAndPoster() {
System.out.println(BASE_URL+API_KEY);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
.
.
.
.
.
.
.
.
ttkey=API_KEY
뭐 일단 이런 코드였다. 그런데 내가 너무 궁금했던 것은 @Value(${ttkey})
왜 안들어가냐? 였다. 여러가지 찾아보기도 하였고 하였다. 그래서 계속 @Service가 있던 TmdbApiClient
에서 오류를 찾고 있었지만 보이지 않았다. 그러다 크나큰 오류를 발견하게 되었다.
@GetMapping("/")
public String getMovieName(Model model) {
TmdbApiClient tmdbApiClient1 = new TmdbApiClient(); // 너가 문제다 이놈아!
Map<String, String> movieAndPoster = tmdbApiClient.getMovieAndPoster();
System.out.println("hi");
model.addAttribute("movieInfo", movieAndPoster);
return "hi";
}
TmdbApiClient tmdbApiClient1 = new TmdbApiClient();
이 친구가 문제였다. 왜냐하면 애초에 @Valid
는 spring에서 제공해주는 기능이다. 그런데 애초에 내가 새롭게 @Service로 스프링 컨테이너에서 관리하여주는 객체가 아닌 따로 인스턴스를 만들어서 사용하고있으니 스프링에서 관리를 해주지 않아 적용이 되지 않는 문제였다. 그래서 위 부분을 다음과 같이 고치면 해결이 되었다.
@Controller
public class MovieController {
@Autowired
TmdbApiClient tmdbApiClient;
@GetMapping("/")
public String getMovieName(Model model) {
//TmdbApiClient tmdbApiClient1 = new TmdbApiClient();
Map<String, String> movieAndPoster = tmdbApiClient.getMovieAndPoster();
System.out.println("hi");
model.addAttribute("movieInfo", movieAndPoster);
return "hi";
}
}
그냥 장난으로 만들어보려고 딱히 신경을 쓰지도 않고 만들다가 봉착한 오류여서 상당히 당황을 하였다. 아무튼 @Autowired
를 통하여서 DI 컨테이너
안에서 스프링이 관리하여주는 친구를 사용하여야지 관련된 기술들도 적용된다는 것이었다.