1. IoC (Inversion Of Control)
제어의 역전이란?
정의(What?)
프로그램의 메서드나 객체를 개발자가 직접 제어하는 것이 아니라 외부(스프링 컨테이너)에서 관리하도록 하는 것
왜 써?(Why?)
개발자는 비즈니스 로직 구현에만 집중할 수 있기 때문
또한 제어의 역전을 통해 SOLID 원칙 중 DIP(의존관계 역전 원칙)를 준수할 수 있다.
SoccerPlayer라는 인터페이스가 있다고 가정해보자. 아래 코드는 DIP를 위반한 상태이다.
DIP는 추상화에 의존해야하지 구체화에 의존하면 안된다는 원칙인데, 아래 코드에서 Coach 클래스는 현재 체력 훈련 세션 객체를 의존하고 있다. 다른 훈련세션으로 변경하기 위해선 코드를 직접 수정해야하기 때문이다.
public class Coach {
private TrainingSession trainingSession = new TrainingSession("체력 훈련");
}
하지만 순수 자바에서는 위와 같은 더이상 코드를 발전 시킬 수 없다.
이런 문제를 스프링 컨테이너(Ioc 컨테이너)가 해결해준다.
스프링 컨테이너는 객체를 싱글톤 빈으로 저장하고 있기 때문에 아래처럼 베스트 일레븐 클래스가 추상화(인터페이스)에만 의존해도 컨테이너에서 알아서 객체를 주입해준다.
어떻게 주입하는지? -> DI를 이용한다.
public class Coach {
private TrainingSession trainingSession;
}
2. DI (Dependency Injection)
의존관계 주입이란?
정의(what?)
DI는 의존하는 객체를 직접 생성하는 것이 아닌 의존 객체를 전달받는 방식을 의미한다.
각 클래스 간 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결한다.
public class Coach {
private final TrainingSession trainingSession;
@Autowired
public Coach(TrainingSession trainingSession) {
this.trainingSession = trainingSession;
}
public void train(BestEleven bestEleven) {
trainingSession.run(bestEleven);
}
}
Coach라는 객체를 생성할 때 작성되어 있는 의존관계(여기서는 생성자)를 바탕으로 의존관계를 주입한다.
여기서는 생성자의 매개변수를 어떤 객체로 받는지에 따라 의존관계가 결정된다.
1) 생성자 주입
public class Coach {
private final TrainingSession trainingSession;
@Autowired
public Coach(TrainingSession trainingSession) {
this.trainingSession = trainingSession;
}
}
클래스 생성자가 1개이며 이 생성자로 주입받을 객체가 빈으로 등록되어 있다면 @Autowired를 생략할 수 있다.
생성자 주입은 최초 1번 일어나며 이후 불변하지 않기 때문에 자주 사용한다.
2) 필드 주입
public class Coach {
@Autowired
private TrainingSession trainingSession;
}
간단하게 바로 필드에 @Autowired를 붙이는 방법이다.
코드가 간결하긴 하지만 프레임워크에 의존적이며 외부에서 변경하기 힘들다.
3) setter 주입
public class Coach {
private TrainingSession trainingSession;
@Autowired
public void setTrainingSession(TrainingSession trainingSession) {
this.trainingSession = trainingSession;
}
}
setter를 사용하는 방식. 이는 언제든 setter를 통해 변경이 가능하므로 불변을 보장할 수 없는 방식이다.
'Development > Spring&Springboot' 카테고리의 다른 글
[Gasip] 게시글 조회수 중복 방지 처리 로직 구현 (2) | 2024.04.01 |
---|---|
스프링 빈이란?? (3) | 2024.02.28 |
[채팅] 채팅 메세지 전송 속도 개선 (3) | 2024.02.14 |
[채팅] 채팅방 리스트 최신화 속도 개선 (3) | 2024.02.09 |
SpringBoot 내 html 파일을 어떻게 불러오는지 모르겠다면 (0) | 2023.07.04 |