[DEV] J-Jay

스프링 Concept (1) 본문

Back-end/Spring

스프링 Concept (1)

J-Jay 2023. 8. 30. 22:10
728x90

IoC(Inversion of Control) 제어의 역전

public Class Main {
	Sample sample = new Sample(); //클래스 Main에서 new 키워드로 클래스 Sample 생성
}

자바코드 작성시 객체를 생성할 때는 객체가 필요한 곳에서 직접 생성을 했다. 위의 예제를 보면 클래스 Sample 객체를 사용하기 위해 클래스 Main에서 객체를 직접 생성한다.

 

위 예제에 제어의 역전을 적용하면 다음과 같은 코드가 된다.

public class Main {
	private Sample sample; // 코드에서 객체를 생성하지 않음, 어디선가 받아온 객체를 sample에 할당
}

제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다. 이전과는 다르게 클래스 Sample 객체를 직접 생성하는 것이 아니므로, 어딘가에서 받아와 사용하고 있다고 추측이 가능하다. 실제로 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 한다.


DI(Dependency Injection) 의존성 주입

앞에서 설명했듯이 스프링에서는 객체들을 관리하기 위해 IoC를 사용한다. 그리고 제어의 역전을 구현하기 위해 사용하는 방법이 바로 DI이다.

DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻이다. 조금 어려우니 코드를 통해서 알아보자.

다음은 IoC/DI를 기초로 하는 스프링 코드이다. 여기에서 사용되는 @Autowired  어노테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할을 한다 (빈은 스프링 컨테이너에서 관리하는 객체를 뜻한다)

 

IoC의 예제 코드에서는 개발자가 직접 Sample 객체를 생성했지만 다음 코드는 어딘가에서 Sample sample; 라고 선언 했을 뿐 직접 객체를 생성하지는 않고 있다. 다시 말해 객체를 주입 받고 있다.

public class Main {
	// Main에서 Sample을 주입받음
	@Autowried
	Sample sample
}

이렇게 코드를 작성해도 프로그램을 잘 동작한다. 이유는 스프링 컨테이너라는 곳에서 객체를 주입했기 때문이다.

쉽게 말해, 스프링 컨테이너가 Sample 객체를 말들어서 클래스 Main에게 준 것이다.

그림처럼 기존의 자바 코드는 클래스 Main에서 Sample 객체를 쓰고 싶은 경우 직접 생성했지만, 

스프링의 경우 클래스 Main에서 Sample 객체를 쓰고 싶은 경우 객체를 직접 생성하는 것이 아니라 스프링 컨테이너 에서 객체를 주입받아 사용한다. 이 IoC/DI 개념은 스프링의 핵심 개념이라고 할 수 있다.


스프링 컨테이너란?

앞서 언급한 것처럼 스프링은 스프링 컨테이너를 제공한다. 

스프링 컨테이너는 앞서 본 것처럼 빈을 생성하고 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기(Life Cycle)를

스프링 컨테이너가 관리 하는 것이다. 또한 개발자가 @Autowried 같은 어노테이션을 사용해 빈을 주입 받을 수 있도록 DI를 지원하기도 한다.


빈(Bean)이란?

빈은 스프링 컨테이너가 생성하고 관리하는 객체이다. 바로 앞에서 본 코드에서 Sample이 바로 빈이다.

스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 어노테이션 추가 등 여러 방법을 제공한다. 다시 말해 빈을 등록하는 방법은 여러가지가 있다는 뜻이다.

예시로 MyBean이라는 클래스에 @Component 어노테이션을 붙이면 MyBean 클래스가 빈으로 등록된다.

이후 스프링 컨테이너에서 이 클래스를 관리한다. 이때 빈의 이름은 클래스 이름의 첫 글자로 소문자로 바꿔 관리한다. 

현재의 경우 MyBean → myBean이 된다.

@Component // 클래스 MyBean을 빈으로 등록
pbulic class MyBean {
}

빈:스프링의 객체! 라고 생각하면 된다.

 

 

'Back-end > Spring' 카테고리의 다른 글

스프링 부트 스타터  (0) 2023.08.31
스프링 Concept (2)  (0) 2023.08.31
스프링과 스프링 부트  (0) 2023.08.30
Spring Boot 프로젝트 생성  (0) 2023.08.28
Build system의 Gradle과 Maven 차이  (0) 2023.08.28