Spring 간단히

Woozy9ucci·2023년 12월 11일
0

Spring의 요청 전달 과정

  • ①Client의 Request(HTTP msg ..) 가 Dispatch Servlet에 도달
  • ②HandlerMapping로 부터 요청에 대응되는 Contoller 검색 요청후 응답수신
  • ③Handler Adapter를 통해 Controller에 Request에 대한 처리 요청
  • ④Controller -> Service -> Repository 비즈니스 로직 수행 후 Response
  • ⑤HandlerAdapter가 응답을 Servlet에게 전달
  • ⑥Servlet을 통해 응답이 Client에 전달
    (HTML을 함께 응답해야 한다면 ⑤~⑥ 사이에 받아온 Data와 HTML을 결합하는 과정 추가
    viewResolver & View)
    (자세한 내용은 Spring MVC 구조 이해 참고
    https://catsbi.oopy.io/f52511f3-1455-4a01-b8b7-f10875895d5b)

DI(Dependency Injection) & IoC(Inversion of Control)

Dependency Injection (의존성 주입)

  • 의존성이란?

    • 객체 간 파라미터나 리턴값 또는 지역변수 등으로 다른 객체를 참조하는 것을 의미
    • 객체 간에는 필연적으로 의존성이 발생
    • 의존성이 과하면 결합도가 높음
    • 결합도를 낮춰 변경이 용이하게 해야함
      참고: https://mangkyu.tistory.com/226 (의존성이란)
  • 의존성 주입(DI)

    • 객체가 필요로하는 의존성을 자체적으로 생성하는 것이 아니라 외부에서 주입받는 디자인 패턴
    • 결합도를 낮추기 위해 사용
    • 생성자 주입, 필드 주입, Setter 주입 등이 있으나 생성자 주입을 권장
      (객체 불변성 확보, 순환참조 방지, 테스트코드 작성 용이..)
      참고: https://mangkyu.tistory.com/125 (다양한 의존성 주입 방법 & 이유)
  • 예시
    PlayerInterface 를 상속받은 각각 고유의 역할이 있는 클래스들
    왼쪽은 DI가 적용되지 않은 예시 / 오른쪽은 DI 적용 (생성자 주입)
    왼쪽은 객체 내부에서 의존성을 생성하고 있다.
    반면 오른쪽은 생성자를 통해 외부에서 주입 받는 형태이다.
    양쪽 모두 공격수의 행동결과(Shot)를 얻는다.
    그러던 과정에서 변화가 생겼다. 이제는 수비를 해야하는 상황 수비수가 필요하다.
    DI를 적용하지 않은 왼쪽은 객체의 변화에 따라 새로운 클래스를 작성하고 호출해주어야 했다.(GameWithoutDI2)
    반면에 DI가 적용된 오른쪽은 외부에서 주입받는 객체 (Player) 만 바꿔주면 됐다.
    위의 경우가 DI(의존성 주입) Pattern을 통해 객체간 결합도를 낮추어 변경이 용이해진 예시이다.

Inversion of Control (제어의 역전)

  • 제어의 역전(IoC)이란?

    • 객체의 생성과 생명주기까지 외부(Framework..)에서 관리하여 프로그램의 제어권을 역전시키는 개념 (객체를 언제 생성하고 호출할 지 신경쓰지 않아도 됨)
      ex)Controller, Service, Repo...)
    • IoC를 구현하는 여러 방법 중 하나가 DI Pattern
      (DI 없이도 IoC를 만족시키는 프로그램을 구현할 수 있다)
    • 프로그램의 진행 흐름과 구체적인 구현을 분리시켜 개발자는 비즈니스 로직에 집중할 수 있음
    • 구현체 사이의 변경이 용이하며 객체 간 의존성이 낮아짐
  • IoC Container

    • 의존 관계 형성과 주입을 자동으로 처리해주는 프레임워크를 일컫는다.
    • 객체의 생성과 관리를 담당하며 객체 운용에 필요한 다양한 기능을 제공하는 것
    • Spring은 주로 DI Pattern으로 IoC를 제공하기 때문에 DI Container 라고도 불림

참고하면 좋을 자료: https://velog.io/@ohzzi/Spring-DIIoC-IoC-DI-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0

정리하자면 DI는 객체간 결합도를 낮추기 위해 외부에서 의존성을 주입받도록 설계하는 디자인패턴이고
IoC는 객체의 생명주기를 프레임워크 등에서 관리하여 프로그램의 제어권을 역전시키는 개념이다.
Spring은 DI Pattern 을 활용한 IoC Container를 가진다.
IoC컨테이너는 우리가 설계해 놓은 객체를 Spring Bean으로 관리하는데
이는 다음 포스트에서 다루도록 하겠다.

0개의 댓글