본문 바로가기

Java/Spring Framework

기본 개념 Spring

반응형

Spring 의 기본부터 차근차근 정리해나가겠습니다.

 

1. IoC 컨테이너

IoC 란 Inversion of Control의 약어로 의존관계 주입이라고도 합니다.

어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는 것이 아닌, 주입 받아 사용하는 방법입니다. 

IoC는 Spring 없이도 사용 가능합니다. 그러나 그렇게 사용하지 않고 Spring을 사용하는 이유는 DI 방법의 노하우가 쌓여있는 방법이기 때문입니다. 초기에는 xml 방식으로 주입을 했었지만 현재는 annotation방식으로 주입하고 있습니다.

Bean을 담고있는 것을 Container라 합니다. IoC 컨테이너가 관리하는 객체를 Bean이라 합니다.

Bean으로 등록하는 이유는 의존성을 주입하고 싶거나 싱글톤으로 관리하고 싶은 경우 등록하게 됩니다.

(싱글톤 이외에도 프로토 타입(매번 다른 객체)도 있습니다.)

무엇보다 가장 큰 장점은 라이프 사이클을 관리할 수 있단 점입니다. 예를 들어 Bean 이 생성되는 시점에 원하는 작업을 지시할 수 있습니다.

 

Spring IoC 컨테이너의 가장 최상위 인터페이스는 BeanFactory 입니다. 

 

ApplicationContext

BeanFactory를 상속받은 인터페이스 중에 가장 중요한 인터페이스가 ApplicationContext 입니다. 메시지 소스 처리, 이벤트 발행 등 BeanFactory에 비해 다양한 기능을 가지고 있습니다.

BeanFactory 기능을 비롯해 MessageSource , EventPublisher, ResourceLoader , Evironment 다루기 등등의 기능을 가지고 있습니다.

 

2. Bean

IoC 컨테이너가 관리하는 객체입니다.

의존성 주입(DI)을 받으려면 Bean으로 들어가있어야 받을 수 있습니다.

어플리케이션 전반적으로 오직 하나만 사용해도 되는 class는 singleton 으로 관리하는 것이 편하며 이때에도 IoC 컨테이너로 관리하면 굉장히 편합니다.

Spring IoC 컨테이너에 등록되는 Bean들은 기본적으로 싱글톤 *Scope으로 Bean으로 등록됩니다.

 

* Scope 

  • Singleton :싱글톤이란 하나만 만들어서 사용하는 것으로 기본적으로는 Singleton Scope으로 등록 됩니다. 싱글톤을 사용하게 되면 메모리도 효율적이고 하나의 객체를 사용하기 때문에 Runtime시 성능 최적화에도 유리합니다. 
  • Prototype : 매번 다른 객체를 사용하는 것입니다.

 

 

의존성 관리

라이프사이클 인터페이스를 지원해줍니다. 어떤 빈이 만들어졌을 때 추가적인 작업을 하고 싶다 >> PostConstruct 

 

그럼 지금부터 실제 프로젝트를 통해 살펴보도록 하겠습니다.

먼저 STS를 열어 Spring boot project를 만듭니다. 이때 Spring Web Dependency를 아래와 같이 추가해줍니다.

이렇게 Dependency를 추가해주면 pom.xml 파일에 dependency 가 자동 주입되고 주로 사용해주는 모듈들이 자동으로 Maven Dependency에 추가됩니다. 

pom.xml

굳이 xml에 원하는 모듈을 추가하여 의존성 설정을 하지않아도 아래와 같이 사용할 모듈이 추가되어 있습니다.

 

이제 각 class간의 의존성을 주입해보도록하겠습니다. 

처음에는 xml파일을 통해 의존성 주입하는 방식을 먼저 보여드리겠습니다. 

Book, BookService, BookReposiory 라는 클래스가 있고BookService 는 BookRepository 와 의존관계라고 해보겠습니다. 

우선 resource 위치에 appliation.xml 을 만들고 bean들을 입력합니다.

application.xml

이때 BookService Bean 생성에 property 속성을 주목해주세요

name 안의 book Repository 는 setter에서 가져온 것이며 setter에서 주입받을 클래스를 ref안에 넣어줍니다. 

이때 ref 안의 bookRepository 는 bean의 id 가 bookRepository인 애를 가져온 것입니다.

BookService 클래스 안의 setter

이런식으로 설정하게되면 bean설정 및 DI 가 가능합니다.

이런 경우 ClassPathXmlAppliationContext 객체를 생성해 ApplicationContext 객체를 확인해 볼 수 있습니다.

 

혹은 @Configuration 어노테이션을 사용하여 확인해 볼 수 도 있습니다.

서비스에는 @Service, 리파지토리에는 @Repository 그리고 주입을 받을 부분에서 @Autowired 를 사용해 bean을 주입합니다. 그 뒤 아래 처럼 직접 AnnotationConfigApplicationContext 객체를 생성해 ApplicationContext 를 확인할 수 있습니다.

ApplicationConfig 클래스에는 @Configuration, @ComponentScan 을 붙여 설정과 ComponentScan을 사용했습니다.

 

하지만, Spring boot 에서는 어노테이션을 사용하여 이를 해결할 수 있습니다.

이렇게 어노테이션 방식을 사용하면 보다 편리하게 bean 설정 및 의존성 주입이 가능합니다.

반응형

'Java > Spring Framework' 카테고리의 다른 글

Scope  (0) 2020.10.19
Autowired & Component  (0) 2020.10.18
RESTful API 웹서비스 테스트  (0) 2020.03.11
REST에서 CRUD 구현  (0) 2020.03.06
Spring MVC로 RESTful API 서비스 구현  (0) 2020.03.04