2-1. Spring 핵심 3대 요소 - IoC

rokong.me·2023년 5월 7일

Spring

목록 보기
2/5

1. IoC/DI

  • IoC와 DI를 한글로 번역하면 제어의 역전 원칙의존성 주입이다. 더욱 쉽개 말하면 대신 해준다 (IoC)대신 넣어준다 (DI)는 뜻이다.
  • 이 때 Spring에서 대신해주는 것은 미리 찜해놓은 객체를 생성하고 관계를 설정시켜주고 소멸시키는 것이다.

1.2 강한 결합

  • 객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조이다.
  • A 클래스 내부에서 B 라는 객체를 직접 생성하고 있다면, B 객체를 C 객체로 바꾸고 싶은 경우에 A 클래스도 수정해야 하는 방식이기 때문에 강한 결합이다.

예제 코드

// SoccerPlayer
class SoccerPlayer {
  private NikeSoccerBall nikeBall;

  public SoccerPlayer() {
    this.nikeBall = new NikeSoccerBall();
  }

  public void playSoccer() {
    System.out.println("축구선수가 공을 찼다!");
    this.nikeBall.touchBall();
  }
}

// AdidasSoccerBall, NikeSoccerBall
class AdidasSoccerBall {
  public void touchBall() {
    System.out.println("아디다스 축구공이 굴러간다!");
  }
}

class NikeSoccerBall {
  public void touchBall() {
    System.out.println("나이키 축구공이 굴러간다!");
  }
}

// Driver
public class Driver {
  public static void main(String[] args) {
    SoccerPlayer sp = new SoccerPlayer();
    sp.playSoccer();
  }
}
  • 상단의 코드에서 SoccerPlayerplaySoccer()를 실행하기 위해서는 NikeSoccerBall이 필요하고, SoccerPlayer 자신이 직접 NikeSoccerBall을 만들어서 사용하고 있다. 이 상태를 SoccerPlayerNikeSoccerBall에 의존하고 있다고 표현할 수 있다.
  • 만약 축구선수가 다른 축구공을 사용해야 할 경우. SoccerPlayer의 많은 부분을 수정해야 할 것이다.

1.3 느슨한 결합

  • 객체를 주입 받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해서 넘겨받는 것이다.
  • 이렇게 하면 결합도를 낮출 수 있고, 런타임시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.

예제 코드

// SoccerBall
interface SoccerBall {
  void touchBall();
}

class AdidasSoccerBall implements SoccerBall {
  public void touchBall() {
    System.out.println("아디다스 축구공이 굴러간다!");
  }
}

class NikeSoccerBall implements SoccerBall {
  public void touchBall() {
    System.out.println("나이키 축구공이 굴러간다!");
  }
}

// SoccerPlayer
class SoccerPlayer {
  private SoccerBall ball;

  public void setSoccerBall(SoccerBall ball) {
    this.ball = ball;
  }

  public void playSoccer() {
    System.out.println("축구선수가 공을 찼다!");
    this.ball.touchBall();
  }
}

// Driver
public class Driver {
  public static void main(String[] args) {
    SoccerPlayer sp = new SoccerPlayer();

    // NikeSoccerBall
    SoccerBall nikeBall = new NikeSoccerBall();
    sp.setSoccerBall(nikeBall);
    sp.playSoccer();

    // AdidasSoccerBall
    SoccerBall adidasBall = new AdidasSoccerBall();
    sp.setSoccerBall(adidasBall);
    sp.playSoccer();
  }
}
  • 이번에는 SoccerBall을 인터페이스로 만들었고 SoccerBallimplements하는 각각의 축구공 클래스를 만들었다.
  • 축구선수는 축구공을 자신이 만들어서 사용하는 것이 아니라. 외부에서 만들어 진 것을 받아서 사용하고 있다.
  • 또한 타입을 인터페이스로 바꾸었기에 어떤 공이든 코드에 변경없이 사용할 수 있다.
  • 축구선수가 축구공에 의존하고 있던 관계가 뒤집어진 것이다. 이 것을 DIP(의존 역전 원칙) 이라한다.

출처

0개의 댓글