DI / SpringMVC 예외처리

마동찬·2023년 7월 20일

DI(Dependency Injection) 의존성주입

의존성이 무엇인지 먼저 알아봅시다.

  • 의존성

    현재 객체가 다른 객체와 상호작용을 하고 있다면 현재 객체는 다른 객체에 의존성을 가진다

     public class A {
         private B b = new B();
     }

    간단하게 말하자면 한 객체에서 다른 객체를 가지고 와서 쓰면 그게 바로 의존성이다

    이 의존성에는 단점이 있는데, A 객체는 B객체의 생성을 제어하기 때문에 두 객체 간에는 긴밀한 결합이 생기고 이에 따라 A 객체를 변경하면 B의 객체도 변경된다 즉 A 객체가 변경되면 B 객체도 변경된다는 것이다 또한 이렇게 두 객체 사이에 의존성이 존재하면 단위 테스트 작성이 어려워진다

  • 의존성주입

    • 필요한 자원을 외부에서 생성자를 통해 넣어주는게 바로 의존성 주입이다
      쉽게 말해서 A 클래스의 b라는 객체 자체가 아니라 Constructor(생성자) 또는 Setter 같은 Framework를 사용하여 b에게 의존성을 주입한다
    • 더 쉽게 이해해봅시다. "객체지향에서 두 클래스간의 관계"를 의미하는 의존성과 "생성자 또는 메서드 등을 통해 외부로부터 생성된 객체를 받는 것"인 주입이 합쳐진 것입니다.
    public class A {
        private B b;
       
        public void anyMethod() {
        	b.~
        }
    }

IoC(Inversion of Control) 제어의 역전

제어의 역전을 정말 간단하게 풀어보자면 개발자가 직접 객체를 생성하고 주입하던 것을 Framework가 대신해주는 것이다

스프링 프레임워크를 사용한다고 하면 B 라는 객체에 어노테이션으로 표시를 해놓고,
컨테이너가 알아서 두 객체를 생성하고 의존성 까지 주입시키는 것이다

개발자가 제어의 중심이지만 코드 전체에 대한 제어를 Framework가 대신한다고 이해해도 될 것이다


의존성 주입의 장점

  1. 코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
  2. 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다
  3. 유지보수가 쉬우며 테스트가 용이해진다
  4. 확장성을 가진다

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

profile
새내기개발자 성장기록

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

뛰어난 글이네요, 감사합니다.

답글 달기