[시행착오] @Valid를 썼는데 왜 Null이에요?

khyojun·2023년 4월 7일
1

시행착오

목록 보기
1/6
post-thumbnail

제목 그대로 왜 했는데 안될까? 에 봉착했다.

📌 Controller 관련 부분

@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";
    }
}

📌 TmdbApiClient(Service 부분)

@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();
        
        .
        .
        .
        .
        .
        .
        .
        .
        

📌 application.properties

ttkey=API_KEY

뭐 일단 이런 코드였다. 그런데 내가 너무 궁금했던 것은 @Value(${ttkey}) 왜 안들어가냐? 였다. 여러가지 찾아보기도 하였고 하였다. 그래서 계속 @Service가 있던 TmdbApiClient에서 오류를 찾고 있었지만 보이지 않았다. 그러다 크나큰 오류를 발견하게 되었다.

바로... Controller에 있는 부분



    @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 컨테이너안에서 스프링이 관리하여주는 친구를 사용하여야지 관련된 기술들도 적용된다는 것이었다.

결국은 기본기가 제일 중요한 법.... 다시 한 번 느낀다.

출처

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글