오늘은 스프링의 삼각형이라고 불리는 세가지 핵심 프로그래밍 모델에 대해 간략하게 정리하고 가려고 합니다!
삼각형에는 loC/DI, AOP, PSA가 있습니다.
편의를 위해 설명은 반말로 진행합니다.
스프링이란
자바 애플리케이션 개발에 사용되는 프레임워크이다.
애플리케이션 바탕이되는 틀, 공통 프로그래밍 모델, 기술 API 등을 제공한다.
애플리케이션의 기본 틀 - 스프링 컨테이너
스프링컨테이너와 애플리케이션 컨텍스트라고 불리는 스프링 런타임 엔진을 제공한다.
설정정보를 참고로 해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리한다.
공통 프로그래밍 모델 - 스프링 삼각형
스프링은 코드가 어떻게 작성되야 하는지에 대한 기준도 제시한다.
흔히 스프링 삼각형이라 불리는 세가지 프로그래밍 모델을 지원한다.
1. loC/DI
- 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델
- 유연하고 확장성이 뛰어난 코드를 만들 수 있게 도와주는 객체지향 설계 원칙과 디자인 패턴의 핵심원리를 담고 있음
- 스프링이 제공하는 기술, API, 컨테이너도 이 방식으로 작성되어 있다. 가장 중요한 기술이다.
2. PSA(서비스 추상화)
- 환경이나 서버, 특정 기술에 종속되지 않고 이식성이 뛰어난 유연한 애플리케이션을 만들 수 있게 해주는 프로그래밍 모델
- 기술, 환경에 종속되지 않도록 유연한 추상계층을 두는 방법이다.
3. AOP
- 코드에 산재해 나타나는 부가 기능을 독립적으로 모듈화하는 프로그래밍 모델
- 깔끔한 코드를 유지할 수 있게 해준다. 협업하는 과정에서 정말 중요한 부분이다.
loC
loC를 가능하게 하는 오브젝트가 팩토리로 구성되어 있다.
팩토리란
객체 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 오브젝트
오브젝트를 생성하는 쪽과 생성된 오브젝트를 사용하는 쪽의 역할과 책임을 분리하는 목적으로 사용된다.
설계도 역할의 팩토리는 무슨 의미일까?
팩토리 적용 전 코드
public class A {
}
public class B {
// 직접적으로 class A를 생성한다.
A a = new A();
}
팩토리 적용 후 코드
public class A {
}
// 팩토리 오브젝트
public class AFactory {
public A getA() {
return new A();
}
}
public class B {
// 간접적으로 class A를 생성한다.
A a = new AFactory().getA();
}
오브젝트들의 관계를 분석해보자.
A와 B는 애플리케이션에서 로직을 담당하게 될 것이고, AFactory 는 오브젝트의 관계를 정의하는 설계도와 같은 역할을 한다.
설계도는 어떤 오브젝트가 어떤 오브젝트를 사용하는지 정의해놓은 코드라고 생각하면 된다.
위와 같이 분리시 로직이 있는 오브젝트와 구조를 결정하는 오브젝트를 분리했다는데 의미가 있다.
제어권 이전을 통한 제어관계 역전
일반적인 프로그램의 흐름은 main()메소드처럼 Entry Point라는 시작 지점에서 사용할 오브젝트를 결정, 생성, 오브젝트 속 메소드 호출.. 이 반복된다.
이런 프로그램 구조에서 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다.
모든 종류의 작업을 사용하는 쪽에서 제어하는 구조다.
제어의 역전은 제어 흐름의 개념을 거꾸로 뒤집는 것이다.
- 자신이 사용할 오브젝트를 스스로 선택, 생성하지 않는다.
- 자신도 어떻게 만들어지고 어디서 사용되는지 알 수 없다.
- 왜냐하면 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문이다.
흐름 제어의 권한으로 라이브러리와 프레임워크의 차이를 구분할 수 있다.
라이브러리를 사용하면 코드는 흐름을 직접제어한다.
단지 동작 중에 필요한 기능이 있을때 능동적으로 라이브러리를 사용한다.
반면 프레임워크는 코드가 프레임워크에 의해 사용된다. 보통 프레임워크 위에 개발한 클래스를 등록하고, 프레임워크가 흐름을 제어하면서 코드를 사용하도록 한다.
제어의 역전 개념이 적용되어 있어야 한다.
애플리케이션 코드는 프레임워크가 짜놓은 틀안에서 수동적으로 동작해야한다.
프로그래밍 모델로서의 loC
프레임워크만의 기술도 아니고 프레임워크가 꼭 필요한 개념도 아니다.
loC는 상당히 폭넓게 사용되는 프로그래밍 모델이다.
loC를 적용하면 설계가 깔끔해지고 유연성이 증가하며 확장성이 좋아지기 때문에 필요하면 언제든 코드를 만들어 사용하면 된다.
제어의 역전에서는 애플리케이션 컴포넌트의 생성과 관계설정, 사용, 생명주기 관리 등을 관장하는 존재가 필요하다.
그래서 애플리케이션 전반에 걸쳐 사용하려면 스프링과 같은 loC 프레임워크의 도움을 받는 것이 유리하다.
스프링 loC (빈, 빈 팩토리, 애플리케이션 컨텍스트)
스프링 loC 관련 필수 용어 정리
1. 빈(Bean)
- 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
2. 빈 팩토리(bean factory)
- 빈의 생성과 관계설정 같은 제어를 담당하는 loC 오브젝트
- 보통은 빈 팩토리보다 이를 확장한 애플리케이션 컨텍스트를 주로 사용한다.
3. 애플리케이션 컨텍스트(application context)
- loC 방식을 따라 만들어진 일종의 빈 팩토리
빈 팩토리 vs 애플리케이션 컨텍스트
- 빈 팩토리를 말할 때는 빈을 생성하고 관계를 설정하는 loC의 기본 기능에 초점을 둔 것이고, 애플리케이션 컨텍스트를 말할 때는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어작업을 담당하는 loC엔진이라는 의미가 부각된다.
애플리케이션 컨텍스트
- 별도의 정보를 참고해서 빈(오브젝트)의 생성, 관계설정 등의 제어 작업을 총괄한다.
빈 팩토리와의 관계
- 애플리케이션 컨텍스트는 ApplicationContext라는 인터페이스를 구현하는데, 빈 팩토리가 구현하는 BeanFactory 인터페이스를 상속했다. 그래서 애플리케이션 컨텍스트는 일종의 빈 팩토리인 셈
동작방식
- Factory 오브젝트처럼 직접 오브젝트를 생성하고 관계를 맺어주는 코드 대신,그런 생성정보와 연관관계 정보를 별도의 설정정보를 통해 얻는다.
스프링 컨텍스트를 사용하는 이유
1. 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없음
- 오브젝트 팩토리가 아무리 많아져도 이를 알아야 하거나 직접 사용할 필요가 없다.
- 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
- 단순한 방법으로 애플리케이션 컨텍스트가 사용할 설정정보를 만들 수 있다.
2. 종합 loC 서비스를 제공해준다.
- 오브젝트 팩토리가 아무리 많아져도 이를 알아야 하거나 직접 사용할 필요가 없다.
- 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
- 단순한 방법으로 애플리케이션 컨텍스트가 사용할 설정정보를 만들 수 있다.
3. 빈을 검색하는 다양한 방법을 제공한다.
- 애플리케이션 컨텍스트의 getBean() 메소드는 빈의 이름을 이용해 빈을 찾아준다.
- 타입만으로 빈을 검색하거나 특별한 애노테이션 설정이 되어 있는 빈을 찾을 수도 있다.
참고
https://phillnam.tistory.com/37
'Computer Engineering > Java & Spring' 카테고리의 다른 글
자바의 정석 : 13장 스레드 (0) | 2022.09.13 |
---|---|
[자바의 정석 2회독] 11챕터 : 컬렉션 프레임 웍 (0) | 2022.09.11 |
자바의 입력을 담당하는 BufferedReader와 StringBuilder (2) | 2022.08.24 |
[spring] 스프링 빈과 의존관계2- 자바 코드로 직접 스프링 빈 등록 (0) | 2022.06.26 |
[spring] 스프링 빈과 의존관계1 - 컴포넌트 스캔으로 자동 의존관계 설정 (0) | 2022.05.18 |