2022.10.03-09WIL

SUADI·2022년 10월 9일
0

스프링 입문 주차는 수요일 전까지는 지옥에 가까웠다. 낯선 개념들 때문에 따라가기 바쁜데 동기들 중엔 벌써 과제까지 마무리하신 분도 있었다. 비교하는건 의미가 없지만 그래도 기분이 다운되는건 어쩔수가 없었다. 근데 뒤쳐지면 안되겠다는 마인드가 동기부여가 되서 결국 입문 주차를 잘 마무리 짓게 되었다. 여전히 어렵고 혼동되는 개념이 많기 때문에 WIL 에서 정리해보려고 한다.

{1} IOC 예시

Inversion of Control의 약자로 한국말로는 제어의 역전이라는 의미이다. 번역된 의미를 들어도 무슨말인지 하나도 못알아먹겠다. 어떤걸 제어하고 제어된걸 왜 역전해야하는지 한번 알아보자.
subway에서 이탈리안비엠티를 주문한다고 해보자. 이탈리안비엠티 레시피를 담은 클래스를 만들어 보자.

package com.sparta.springsecurity.subway;

public class ItalianBMT {
    WhiteBread whiteBread;
    MozzarellaCheese mozzarellaCheese;
    ChiliSause chiliSause;
    MayonaiseSause mayonaiseSause;
    
    public ItalianBMT() {
        this.whiteBread = new WhiteBread();
        this.mozzarellaCheese = new MozzarellaCheese();
        this.mayonaiseSause = new MayonaiseSause();
        this.chiliSause = new ChiliSause();
    }
 
}

이탈리안비엠티 클래스에서 생성자를 통해 각 재료들의 객체를 생성해서 재료를 조합해 이탈리안비엠티를 만들었다. 이런 상황을
필드에 대한 제어권이 내부에 있다고 한다. 내부에 있던 제어권을 외부로 바꿔서 외부에서 들어오는 재료가 신선한 재료이든 상한 재료이든 받는 입장에서 알 수 없도록 하는 것이 제어의 역전이다.

package com.sparta.springsecurity.subway;

public class ItalianBMT {
    WhiteBread whiteBread;
    MozzarellaCheese mozzarellaCheese;
    ChiliSause chiliSause;
    MayonaiseSause mayonaiseSause;

    public ItalianBMT(WhiteBread whiteBread,
                      MozzarellaCheese mozzarellaCheese,
                      ChiliSause chiliSause,
                      MayonaiseSause mayonaiseSause) {

        this.whiteBread = whiteBread;
        this.mozzarellaCheese = mozzarellaCheese;
        this.chiliSause = chiliSause;
        this.mayonaiseSause = mayonaiseSause;
    }

}

{2} IOC 의미

제어의 역전이란 객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너라는 객체 관리 프로그램이 대신 해주는 것이다. 객체의 제어를 개발자가 하게 된다면 위의 예시처럼 강한 의존성 때문에 코드를 하나 수정하면 의존 관계에 있는 코드를 모두 수정해야 하는 상황이 오게 된다. 강한 의존관계에 있는 것들의 역할과 관심을 분리해 응집도를 높이고 결합도를 낮추면 변경에 유연한 코드를 작성할 수 있는 구조가 되고, 결과적으로 객체지향적인 코드가 된다.

{3} DI

IOC와 DI는 비슷한듯 다르다. Dependency Injection의 줄임말로 의존성 주입이라는 의미이다. 의존성은 뭐고 주입은 왜 주입하는걸까?

또 예를 들어 보자. 이탈리안비엠티를 만들기 위해서는 각 재료들이 필요하다. 그래서 맨 위의 코드를 보면 이탈리안비엠티 레시피(클래스)에 재료(생성자에 객체 생성)를 정해놔 버렸다. 이렇게 레시피를 만들게 되면 손님들의 다양한 요구사항에 맞춰서 만들어주기가 힘들어진다. 그때그때 레시피를 또 만들어야만 하기 때문에다. 이러한 상황을 상위모듈이 하위모듈에 의존하고 있다고 한다. 이탈리안비엠티를 만들려면 꼭 특정 재료들이 있어야만 만들 수 있기 때문이다. 이를 해결하기 위해서는 의존성 분리를 통해 해결할 수가 있다.

package com.sparta.springsecurity.subway;

public class ItalianBMT {
    Bread Bread;
    Cheese Cheese;
    List<Sause> Sauses;

    public ItalianBMT(Bread bread,
    				  Cheese cheese,
                      List<Sause> sauses) {
                      
        this.bread = Bread;
        this.cheese = Cheese;
        this.sauses = sauses;
    }
}

다음 코드와 같이 빵, 치즈, 소스들 이라는 추상화된 재료를 받아서 이탈리안비엠티를 만들면 손님이 어떤 빵을 요구를 하든 외부(손님)에서 지정한 재료를 전달해주면 되니까 의존 관계가 느슨해진다.

이처럼 상위 모듈과 하위 모듈이 서로 영향을 끼치는 것이 아니라 중간에 추상화된 인터페이스에 의존적인 상태가 되어야 객체지향적인 코드라고 할 수 있다.

참고 자료 : https://www.youtube.com/watch?v=8lp_nHicYd4

0개의 댓글

관련 채용 정보