DI(Dependency Injection) 의존성주입
의존성이 무엇인지 먼저 알아봅시다.
의존성
현재 객체가 다른 객체와 상호작용을 하고 있다면 현재 객체는 다른 객체에 의존성을 가진다
public class A {
private B b = new B();
}
간단하게 말하자면 한 객체에서 다른 객체를 가지고 와서 쓰면 그게 바로 의존성이다
이 의존성에는 단점이 있는데, A 객체는 B객체의 생성을 제어하기 때문에 두 객체 간에는 긴밀한 결합이 생기고 이에 따라 A 객체를 변경하면 B의 객체도 변경된다 즉 A 객체가 변경되면 B 객체도 변경된다는 것이다 또한 이렇게 두 객체 사이에 의존성이 존재하면 단위 테스트 작성이 어려워진다
의존성주입
public class A {
private B b;
public void anyMethod() {
b.~
}
}
IoC(Inversion of Control) 제어의 역전
제어의 역전을 정말 간단하게 풀어보자면 개발자가 직접 객체를 생성하고 주입하던 것을 Framework가 대신해주는 것이다
스프링 프레임워크를 사용한다고 하면 B 라는 객체에 어노테이션으로 표시를 해놓고,
컨테이너가 알아서 두 객체를 생성하고 의존성 까지 주입시키는 것이다

개발자가 제어의 중심이지만 코드 전체에 대한 제어를 Framework가 대신한다고 이해해도 될 것이다
의존성 주입의 장점
SpringMVC 예외처리기법
📑 @ExceptionHandler
: Spring MVC 예외 처리
: ErrorResponse 클래스를 이용해 Reqeust Body에 대한 유효성 검증 실패시 필요한 에러 정보만 담아 클라이언트에게 응답으로 전송
(기존의 에러 메시지보다 자세한 내용의 에러 메시지)
[단점]
1) 각각의 Controller 클래스에서 ExceptionHandler 애너테이션을 사용하여 Request Body에 대한 유효성 검증 실패에 대한 에러 처리를 해야하기 때문에 각 Controller 클래스마다 코드 중복이 발생함
2) Controller에서 처리해야 되는 예외가 유효성 검증 실패에 대한 예외만 있는 것이 아니기 때문에 하나의 Controller 클래스 내에서 @ExceptionHandler를 추가한 에러 처리 핸들러 메서드가 늘어남
다양한 유형의 예외가 발생할 경우 부적절함
📑 @RestControllerAdvice
: 특정 클래스에 애너테이션 추가시 여러개의 Controller 클래스에서 @ExceptionHandler, @InitBinder 또는 @ModelAtrribut가 추가된 메서드를 공유해서 사용이 가능
즉, 예외 처리를 공통화 할 수 있음
: @RestControllerAdvice 를 사용할 경우 JSon 형식의 데이터를 Response Body로 전송하기 위해 ResponseEntiry로 매핑할 필요가 없음
: @ResponseStatus 애너테이션으로 HTTP Status를 대신 표현할 수 있음
Ref.https://maenco.tistory.com/entry/DIDependency-Injection-%EC%99%80-IoCInversion-of-Control
뛰어난 글이네요, 감사합니다.