
1. IoC/DI
- IoC와 DI를 한글로 번역하면 제어의 역전 원칙과 의존성 주입이다. 더욱 쉽개 말하면 대신 해준다 (IoC)와 대신 넣어준다 (DI)는 뜻이다.
- 이 때 Spring에서 대신해주는 것은 미리 찜해놓은 객체를 생성하고 관계를 설정시켜주고 소멸시키는 것이다.
1.2 강한 결합
- 객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조이다.
- A 클래스 내부에서 B 라는 객체를 직접 생성하고 있다면, B 객체를 C 객체로 바꾸고 싶은 경우에 A 클래스도 수정해야 하는 방식이기 때문에 강한 결합이다.
예제 코드
class SoccerPlayer {
private NikeSoccerBall nikeBall;
public SoccerPlayer() {
this.nikeBall = new NikeSoccerBall();
}
public void playSoccer() {
System.out.println("축구선수가 공을 찼다!");
this.nikeBall.touchBall();
}
}
class AdidasSoccerBall {
public void touchBall() {
System.out.println("아디다스 축구공이 굴러간다!");
}
}
class NikeSoccerBall {
public void touchBall() {
System.out.println("나이키 축구공이 굴러간다!");
}
}
public class Driver {
public static void main(String[] args) {
SoccerPlayer sp = new SoccerPlayer();
sp.playSoccer();
}
}
- 상단의 코드에서
SoccerPlayer가 playSoccer()를 실행하기 위해서는 NikeSoccerBall이 필요하고, SoccerPlayer 자신이 직접 NikeSoccerBall을 만들어서 사용하고 있다. 이 상태를 SoccerPlayer가 NikeSoccerBall에 의존하고 있다고 표현할 수 있다.
- 만약 축구선수가 다른 축구공을 사용해야 할 경우.
SoccerPlayer의 많은 부분을 수정해야 할 것이다.
1.3 느슨한 결합
- 객체를 주입 받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해서 넘겨받는 것이다.
- 이렇게 하면 결합도를 낮출 수 있고, 런타임시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.
예제 코드
interface SoccerBall {
void touchBall();
}
class AdidasSoccerBall implements SoccerBall {
public void touchBall() {
System.out.println("아디다스 축구공이 굴러간다!");
}
}
class NikeSoccerBall implements SoccerBall {
public void touchBall() {
System.out.println("나이키 축구공이 굴러간다!");
}
}
class SoccerPlayer {
private SoccerBall ball;
public void setSoccerBall(SoccerBall ball) {
this.ball = ball;
}
public void playSoccer() {
System.out.println("축구선수가 공을 찼다!");
this.ball.touchBall();
}
}
public class Driver {
public static void main(String[] args) {
SoccerPlayer sp = new SoccerPlayer();
SoccerBall nikeBall = new NikeSoccerBall();
sp.setSoccerBall(nikeBall);
sp.playSoccer();
SoccerBall adidasBall = new AdidasSoccerBall();
sp.setSoccerBall(adidasBall);
sp.playSoccer();
}
}
- 이번에는
SoccerBall을 인터페이스로 만들었고 SoccerBall을 implements하는 각각의 축구공 클래스를 만들었다.
- 축구선수는 축구공을 자신이 만들어서 사용하는 것이 아니라. 외부에서 만들어 진 것을 받아서 사용하고 있다.
- 또한 타입을 인터페이스로 바꾸었기에 어떤 공이든 코드에 변경없이 사용할 수 있다.
- 축구선수가 축구공에 의존하고 있던 관계가 뒤집어진 것이다. 이 것을 DIP(의존 역전 원칙) 이라한다.
출처