[개발]/Spring WEB

Spring 삼각형 - "IoC / DI" 개념을 예제로 알아보기

John-Co 2022. 11. 9. 15:34

Spring 삼각형

Spring 삼각형에는  "AOP", "IoC / DI", "PSA" 개념을 가지고 있다 라고 설명을 드렸습니다. 이번 글에서는 예제 코드를 통해서 "IoC / DI" 에 대해 조금 더 자세하게 알아보겠습니다.

 

Spring 에서는 IoC 개념을 가지고 있어, 객체의 생성/소멸 등 라이프 싸이클을 개발자가 아닌 프레임워크에서 직접 제어를 한다고 설명을 드렸습니다. 또한, DI 개념으로 Spring 에서 관리하는 객체, 즉 Bean 들의 관계를 설정 및 관리하고 각 Bean 들을 필요에 따라 자동으로 주입시켜줍니다.

 

그렇다면 Spring Container 에는 정말로 Bean 이라고 불리는 객체들이 생성이 되어 있을까요?

다음 예제 코드를 통해서 Bean 이 생성 되어있는지, 생성이 되어 있다면 가져와서 사용을 해보도록 하겠습니다.

 

Bean 들이 모여있는 공간인 Bean Factory 에 접근하기 위해서는 "ApplicationContext" 객체가 필요하며, 해당 객체를 통해서 원하는 Bean 을 전달받아 사용할 수 있습니다.

 

ApplicationContext

스프링 어플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진


1. 프로젝트 생성

IntelliJ 프로젝트 생성

Java 11 버전을 활용했고, Dependency 는 "Spring WEB" 한 개만 적용하였습니다.


2. "ApplicationContext" 를 받아오기 위한 Class 생성

🔗 위치 : "com.example.springioc"

💻 line : 9

ApplicationContextAware 를 상속받으면, "setApplicationContext" 메소드를 구현해야하는데 이때 "applicationContext" 를 전달받을 수 있습니다.

💻 line : 10

전달 받은 ApplicationContext 를 담아둘 변수를 선언했습니다.

💻 line : 17

외부에서 ApplicationContext 를 전달받을 수 있도록 메소드를 구현했습니다.


3. Bean 에 등록할 클래스 생성

IEncoder 인터페이스를 만들고, 이를 상속받아 Bean Factory 를 테스트할 클래스 2종류를 만들어보도록 하겠습니다.

특정 문자열을 Encode 하는 예제로, "Base64Encoder" 와 "URL Encoder" 2종류로 구성했습니다.

 

🔗 위치 : "com.example.springioc.sample"

Code Review

단순히 기존 Java Library 내에 있는 Encoder 2종류를 받아와 전달받은 String 데이터를 Encode 하고 반환해주는 함수입니다.

 

💻 line : 9 ("Base64Encoder")

💻 line : 8 ("UrlEncoder)

위에서 공통적으로 보아야할 부분은 "@Component" 부분입니다.

@Component 어노테이션을 붙여줌으로서, 해당 클래스를 BeanFactory 에 등록하겠다라는 의미를 가집니다.


4. Bean 을 얻어와 활용하기

위 클래스들을 모두 생성하고나면, 다음과 같은 디렉토리 구조를 가질 수 있습니다.

 

프로젝트 디렉토리 구조

이제 ApplicationContext 를 얻어와 Bean 을 전달받아 사용하는 예제 코드를 작성해보겠습니다.

Application Code

💻 line : 16

Encoder 를 통해 테스트할 변수를 생성합니다.

💻 line : 17

ApplicationContext 를 담을 변수입니다.

💻 line : 18

Bean 을 담을 변수입니다.

💻 line : 23

Application Context 를 받아옵니다.

💻 line : 26

Bean 에 등록된 객체들 중, "Base64Encoder" 클래스와 관련한 Bean 을 가져옵니다.

💻 line : 30

Bean 에 등록된 객체들 중, "UrlEncoder" 클래스와 관련한 Bean 을 가져옵니다.

 

각각의 Bean 을 가져와 Encoding 을 하고 이를 출력하는 예제 코드입니다. 다음은 결과화면 입니다.

결과화면

💻 출력 결과물

Base 64 Encode : aHR0cDovL3d3dy5uYXZlci5jb20=
URL Encode : http%3A%2F%2Fwww.naver.com

반응형