1.
주제
2.
원리, 개념
3.
방법
4.
결과 및 정리
5.
인용
주제: 스프링은 어떻게 오브젝트를 관리하는 것일까?
지금까지는 객체지향을 이용하여 어떻게 오브젝트를 설계하는지 알 수 있었다. 그럼 도대체 스프링은 어떻게 오브젝트를 관리는 하는 것일까?
개념 : 스프링은 Ioc/DI를 통하여 빈(오브젝트) 관리와 이러한 빈(오브젝트)에 IOC 서비스를 제공한다.
우리는 여기서 스프링이 IOC라는 것, DI라는 것을 통하여 빈(오브젝트)이라는 걸 관리한다는 걸 알 수 있다.
그럼 한마디로 대답할 수 있다. 스프링은 IOC/DI를 통하여 빈(오브젝트)를 관리한다라고! 그럼 이제부터 하나씩 IOC와 DI, 그리고 빈을 알아보자!
IOC? 란?
제어역전,제어역전 컨테이너? Inversion Of Control Container 라 부른다.
제어역전이란?
오브젝트가 자신이 사용할 오브젝트를 자신이 선택하는 것이 아닌 제 3의 대상으로 넘기는것 이라고 정의된다.
IOC의 예시?
팩토리 메서드에서 조금 찾아볼 수 있다.
public static void main(String[] args) throws ClassNotFoundException, SQLException {
ConnectionMaker connectionMaker = new DConnectionMaker(); // 클라이언트가 직접 결정
UserDao dao = new UserDao(connectionMaker);
...
Java
복사
팩토리 메서드가 적용되기 이전
public static void main(String[] args) throws ClassNotFoundException, SQLException {
UserDao dao = new DaoFactory().userDao();
...
public class DaoFactory { // 팩토리 클래스
public UserDao userDao() {
// 팩토리의 메소드는 UserDao 타입의 오브젝트를 어떻게 만들고.
// 어떻게 준비시킬지를 결정한다.
ConnectionMaker connectionMaker = new DConnectionMakerO; // 뭘 주입할지
UserDao userDao = new UserDao(connectionMaker); // 뭘 반환할지
return userDao;
}
}
Java
복사
팩토리 메서드 적용 이후
다음에서 볼 수 있듯이 팩토리 적용 이후 main() 메서드에서는 객체의 생성 관심사를 지니지 않게 된다. 즉, 제어권(관리권한?)이 팩토리 클래스에게 돌아간 것이다.
또다른 예시
public abstract class car {
public abstract void start();
public void stop(){
System.out.println("stop");
}
public void startstop(){
start();
stop();
}
}
...
public class bus extends car {
public void start(){
System.out.println("bus is starting");
}
}
...
public class main {
public static void main(String[] args) {
car myCar=new bus(); // 제어권이 bus의 상위 추상 클래스인 car로 넘어 갔다.
myCar.startstop(); // 실제 추상 클래스가 bus의 제어를 대리하고 있다.
}
}
// 출처: https://happygrammer.tistory.com/65 [happygrammer]
Java
복사
템플릿 메서드 패턴
다음 코드에서 볼 수 있듯 템플릿 적용 이후 bus라는 객체는 car라는 타입의 추상 클래스로 메서드의 제어권을 대리하도록 했다.
이렇듯 생성, 제어, 관리를 내가 아닌 다른 곳에서 도맡아 해주는 것이 제어역전이라는 개념이다.
IOC의 장점?
1.
구체적인 클래스를 사용하는 입장에서 알 필요 없다. (생성, 관리의 의무를 다해주는 특별한 녀석이 있기 때문에 우리는 사용만하면 된다.)
2.
종합 IOC 서비스를 제공받을 수 있다.(생성 할 때 무엇이 필요하고, 생성 시점에 무엇을 해주고는 내가 할 필요가 없다. 서비스를 받으면 되는 것이다.)
3.
내가 원하는 오브젝트의 이름만 알면 된다.(이건 스프링 IOC 컨테이너의 이야기다. 타입 검색, 이름 검색이 지원되어 편하게 검색하여 사용할 수 있다.)
빈이란?
스프링의 IOC에서 관리되도록 하는 객체를 의미한다. 단순히 생각하면 오브젝트이다. 우리가 앞에서 선행으로 공부했던 오브젝트는 어떻게 만들까? 에 대하여 고민했던 그 오브젝트들이다.
정말 단순하게 빈 == 오브젝트라고 일단은 생각해두자
DI란?
의존 관계 주입이다.
의존 관계 주입이란 쉽게 말해 A 라는 객체 생성을 위해서는 B라는 객체가 필요하다. 그럼 A라는 객체에 B라는 객체를 넣어주는 작업이다.
DI의 예시?
수정자, 생성자 주입이 있다.
class A{
private B b;
A(B b){ // A를 위해선 B가 필요하다.
this.b = b;
}
}
...
class B{}
Java
복사
생성자를 이용한 주입
class A{
private B b;
void setA(B b){ // A를 위해선 B가 필요하다.
this.b = b;
}
}
...
class B{}
Java
복사
수정자를 이용한 주입
DI의 조건?
DI가 단순히 class를 사용한다고 DI가 아니다. DI에는 몇가지 조건이 필요하다.
1.
클래스 모델 및 런타임 시점에 의존 관계가 드러나지 않아야 한다. 즉, 인터페이스를 사용한다.
2.
런타임 시점에 의존 관계는 컨테이너 또는 팩토리 메서드와 같은 제 3의 존재가 의존 관계를 결정한다.
3.
의존 관게는 사용할 오브젝트에 대한 레퍼런스를 외부(컨테이너, 빈팩토리)에서 주입 해줌으로써 만들어져야한다.
필자의 견해
1번의 경우 말은 어렵지만 간단히 클래스 다이어그램에 구체적인 사용 클래스 드러나지 않아야 한다는 것이다.
의존관계가 나타남
의존관계가 안 나타남
3가지를 통하여 스프링은 오브젝트, 즉 빈을 관리하게 된다.
잠깐 용어정리
빈 : 빈 또는 빈 오브젝트는 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻이다.
빈 팩토리 : 스프링이 IoC를 담당하는 핵심 컨테이너를 가리킨다.
애플리케이션 컨텍스트 : 빈 팩토리를 확장한 IoC 컨테이너이다. 빈 팩토리라고 부를 때는 주로 빈의 생성과 제어의 관점에서 이야기하는 것이고, 애플리케이션 컨텍스츠라고 할 때는 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기하는 것이라고 보면 된다.
설정정보/설정 메타정보 : 스프링의 설정정보란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다. 영어로 'configuration'이라고 하는데, 이는 구성정보 내지는 형상정보라는 의미다.
컨테이너 또는 IoC 컨테이너 : IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 한다. 컨테이너라는 말 자체가 IoC의 개념을 담고 있기 때문에 이름이 긴 애플리케이션 컨텍스트 대신에 스프링 컨테이너라고 부르는걸 선호하는 사람들도 있다.
싱글톤레지스트리
이러면 끝일까? 아니다. 지금 factory 클래스가 스프링의 IOC와 비슷한 개념을 가지고 비슷한 일을 하지만 근본적으로 다른 점이 있다. 그것은 factory에서 만들어주는 빈들은 싱글톤이 아니다.
그럼 왜 스프링은 싱글톤으로 빈을 생성해서 사용할까?
서버환경 이라서 그렇다. 서버 환경에서 요청이 들어올때마다 맨날맨날 빈을 생성하고 폐기하는건 비효율적이다. 그래서 성능상 하나의 오브젝트만 생성해서 사용하는 것이다.
하지만 실제 싱글톤을 만드는 방법은 싱글톤 패턴의 방법과는 다르다. 기존 싱글톤 패턴의 한계점이 너무 극명하기 때문에 스프링은 싱글톤레지스트리를 이용하여 빈을 만든다.(자세한 원리는 잘 감이 안 잡힌다.)
간략한 원리
ApplicationContext 가 로드될때 IOC/DI를 통해 빈을 생성(일반적 public 생성자 사용)하고 빈목록에 이를 저장해놓은 이후 ApplicationContext에서 가져다 사용하는 방식이다. 빈에 접근은 무조건 ApplicationContext를 이용하고 레지스트리라는 의미처럼 ApplicationContext가 구성 정보를 저장하는 일종의 데이터베이스 역할을 하는 것이다.
→ 최종 목차 가안
주제
어찌 스프링은 오브젝트를 관리할까?
서론
지금까지 스프링이 객체지향에 어떤 가치를 두는지 알았다. 그런데 이러한 객체지향을 스프링은 어떻게 활용하는지 알지 못했다. 그래서 그점을 알아보자.
개념
스프링은 IOC/DI 를 통하여 빈(오브젝트) 제어와 빈(오브젝트)에 다양한 IOC서비스를 제공한다.
•
어렵다. 사실 이것은 스프링이 만들어진 가장 큰 가치이다. 그래서 이것을 한번에 이해하긴 어렵다.
•
이 어려운걸 적용하려면 우리가 모르는 걸 찾아야한다. 그래서 차근차근 알아 보자
IOC DI Bean
방법 또는 설명
1절
IOC는 뭐야?
- IOC란?
- IOC의 예시 (팩토리 메서드, 템플릿메서드)
- 장점?
빈은 뭐야?
- 빈이란?
- 예시 일반 오브젝트
DI는 뭐야?
- DI란?
- 예시?
- 조건?
2절 주제 스프링에서의 IOC/DI를 통하여 빈 관리를 어떤 방식으로 해주는 걸까?
서론 우리는 이제 IOC/DI에 대해서 알았다. 빈도 뭔지 알았다. 그럼 이걸 스프링은 어떤 방식으로 활용하고 지원해줄까?
개념
스프링에서는 싱글톤레지스트리에 여러가지 빈의 등록 방법을 지원하고 여러 DI방법을 지원한다.
우리가 또 모르는 것들이 나왓다. 이것들을하나씩 알아보자
싱글톤레지스트리 DI 방법? 등록방법?
방법 및 설명
싱글톤레지스트리는 뭐야?
- 란?
- 간략한 원리
- 조건 (싱글톤) 무상태
DI 방법? 여러가지야?
- 일반적 주입
클라이언트 생성 시점에 같이 주입
주입되는 빈도 주입받는 빈도 전부 빈이어여함
- 검색에 의한 주입
클라이언트 생성이후 주입
주입받는 빈은 꼭 빈일 필요없다. 왜냐? 내가 검색해서 넣어주기때문
- 주입 활용?
기능교환 (pro, dev 버전 변경)
부가기능 추가
빈등록 방법?
- xml
- 자바 코드
정리
스프링은 Ioc컨테이너를 이용하여 스프링 빈의 생성, 생성 시점, 후처리리를 담당하게 하고 컨테이너를 통한 빈 검색 방법 또한 제공한다. 그리고 DI를 통하여 기능교환 부가기능 추가의 용이함을 가질 수 있게 해준다.
IOC와 DI를 이용하는 이유는 우리가 순수한 오브젝트 설계를 가능하게 해주기 위함이다.