com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.example.week02.domain.CourseRequestDto
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 2, column: 3]
자바의 객체들은 자존심이 쎄다. 다른 객체의 도움을 받는 것을 싫어한다는 뜻이다. 이런 경우를 의존도나 결합도가 높다고 하는데, 예를 들어서 스마트폰 두 개가 있다. 1번 우주폰, 2번 사과폰. 우주폰은 배터리가 분리가 되고, 사과폰은 배터리가 분리되지 않는다. 이 때 배터리가 방전되거나 고장났을 때, 우주폰은 배터리만 교체하면 되지만, 사과폰은 어쩌면 배터리만 교체하는 것이 불가능 하기에 스마트폰 전체를 교체하거나 서비스센터를 가야 하는 상황이 생긴다. 이런 경우 사과폰은 배터리와의 결합도도 높고, 배터리에 의존적이라 할 수 있다.
DI는 의존성 주입으로 번역되는 이 때 이런 생각을 할 수 있다. "아니, 의존성 높으면 안 좋다며! 근데 왜 의존성을 주입해?" 우리가 의존성을 주입해야 하는 이유는 얘네가 자존심이 쎈 애들이라서 서로 도우기 싫어하고, 도움 받기도 싫어하지만 결국 얘네는 스스로 다 할 수 없고 서로의 도움을 받아야 프로그램이 돌아가기 때문에, 억지로 화해를 시켜서 의존성을 주입을 시키는 것이다!
문제!! 근데 왜 오토와이어드쓰고 아래처럼 선언하면 의존도가 낮아지는거죵?
private final ProductService productService;
@Autowired
public ProductController(ProductService productService) {
this.productService = productService;
}
스프링은 다해준다. 지가 알아서 다 해준다. 그래서 나는 스프링의 비서 같은 존재다. 내가 프로그래밍의 주체가 아니라 스프링이 주체다. 지가 알아서 객체도 생성하고, 지가 알아서 값도 넣는다. 얘가 짱이다. 난 노예다.
프로그래밍의 주체가 개발자에서 스프링으로 넘어갔다고 해서 IoC는 제어의 역전으로 번역된다. 이건 정말 개발자로서 자존심이 상하는 일이다. 하지만 어쩔 수 없다. 스프링 없이 서버를 구현하는 것은 내 역량으로는 아직 불가능하기 때문이다. 사실 스프링 없이 서버를 구현하게 될 일이 있을 확률도 현저히 적고, 그러고 싶지도 않다.
결국 스프링이 짱짱이다. 나중에 스프링이 일을 어떻게 하는건지 하나하나 뜯어볼 것이다. 그 전까지 난 스프링의 노예로 걔가 @Service 붙이라고 하면 붙이는거고, repository 만들라고 하면 만드는거다. ㅠㅠ
이 놈이 내 담당일진이다. 결국 IoC가 가능한건 이 놈이 내가 만든 객체와 클래스를 죄다 가져가서 지가 관리하기 때문이다. 마치 숙제를 뺏기는 것 같다. 얘한테 클래스를 뺏기는 방법은 여러가지가 있다고 하는데, 직접 상납하는게 있고, (xml 같은걸로 설정한다고 한다.)
얘가 하라는대로 셔틀을 하는 방법이 있다. @Component 어노테이션을 붙이는 것이다. 이 경우 얘는 @Component 붙은 애를 골라서 알아서 가져간다. 물론 @Component 어노테이션을 안 붙였다고 방심할 순 없다. @Service @Controller 등 알고보면 @Component가 붙어 있는 애들이 있기 때문이다. (속에 들어가면 보인다) 그럼 이제 빈한테 열심히 만든 클래스를 뺏길 일만 남았다. 걔는 내가 만든 클래스인데 지 혼자 생성하고 값 넣어서 DB랑도 친구먹고, 프론트랑도 친구 먹는다. 나쁜놈이다ㅠ