Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

쉽지않은 블로그

[Spring] DI & IOC (3) 스프링 IoC 컨테이너 본문

개발공부/스프링

[Spring] DI & IOC (3) 스프링 IoC 컨테이너

쉽지않네 2021. 4. 13. 21:32

전 페이지에서 IoC컨테이너를 이용하면 손쉽게 다음 코드와 같이 손쉽게

DI와 IOC 기능을 구현할 수 있다고 했었다.

public class A {
 
	@Autowired B b;
    
	public doSomeThing() {
		b.getDate();
		....
		....
	}
}
 
//***************************************
 
@Component
public class B {
	
	public int getData() {
		// TODO Auto-generated method stub
		return 10;
	}
}

IoC 컨테이너를 사용하여

DI (Dependency Injection 은 @Autowired 어노테이션을 이용하여 쉽게 처리해주었고

IOC (Inversion of Control) 제어 역전 기능 

모든 bean 들의 생성,생명주기등  Spring framework 가 관리해 주게 되는 것이 된다. 


IOC컨테이너에게 미리 알려주어야될것들

 

1. 스프링 IoC컨테이너가 어떤 빈을 생성해야 되는지

 

어떤 빈을 생성하는지 알려줘야 하는데 @Componenet 어노테이션을 사용하면 된다. (예시 코드 14번 line)

하지만 조금 더 구체화된 어노테이션을 이용하는 것을 추천한다.

 

@Controller : mvc에 사용되는 어노테이션이다 url요청을 mapping 할 때 사용된다.

@Service : 비즈니스 서비스 구성요소에 사용된다.

@Repository : DAO구성요소에서 사용된다, DB와 밀접하므로 트랜잭션 관리를 제공함.

 

 

2. 빈을 서로 연결하는 방법

 

의존하고 싶은 객체를 @Autowired 어노테이션을 지정하여 주입할 수 있다. (예시 코드 3번 line)

 

**new 연산자를 사용하여 만든 객체는 Bean이 아니다**


IoC컨테이너 생성하는 방법

 

1. 빈 팩토리를 이용하는 방법

2.ApplicationContext를 사용한다.

 

2번 방법이 권장되는 방법이다 (2번이 사용하기 더 쉽다고 생각한다)

 


스프링 의존성 관련 라이브러리들

 

  • spring-core
  • spring-context
  • spring-beans

 

메이븐 프로젝트를 이용한다면 해당 라이브러리들을 artifactId에 등록하여 maven update 해주면 된다.

	<dependencies>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>
        
    </dependencies>

 


ApplicationContext  사용하기

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.mastering.spring.beans.User;
import com.mastering.spring.business.BusinessService;

@Configuration
@ComponentScan(basePackages = { "com.mastering.spring" })
class SpringContext {

}

public class LaunchJavaContext {

  private static final User DUMMY_USER = new User("dummy");

  public static Logger logger = Logger.getLogger(LaunchJavaContext.class);

  
  public static void main(String[] args) {

    ApplicationContext context = new AnnotationConfigApplicationContext(SpringContext.class);

    BusinessService service = context.getBean(BusinessService.class);
    
    logger.debug(service.calculateSum(DUMMY_USER));
  
  }
}

 

  1. AnnotationConfigApplicationContext로 applicationContext를 시작하기 위해서 메인 메소드로 사용한다.
    (자바 구성을 기반으로 applicationContext 를 사용하기 위해 AnnotationConfigApplicationContext 사용)
  2. context 가 사용되면 비즈니스 서비스 빈을 가져와야 한다 getBean 메서드를 사용하여 빈을 가져온다
    이때 인수로는 내가 사용하고자 하는 빈의 유형을 정의해주면 된다.
  3. getBean을 사용해도 IoC컨테이너는 빈을 검색하는 위치를 알아야 한다.
    11번 line의 @Configuration 이 SpringContext 클래스가 구성요소들을 가지고 있는 Config 파일이라는것을 암시한다
    12번 line 의 @ComponentScan 어노테이션을 이용하여 bean으로 사용할 패키지 영역을 정의한다.

(bean) 빈의 생성 순서

의존관계가 없는 객체들부터 빈으로 등록이 된다.

 

또한 spring framework 내부적으로 여러 곳에서 빈을 호출하더라도 처음 등록된 bean 하나만을 사용하게 된다.
같은 종류의 bean 이 2개 이상 생성될 일을 사전에 spring 이 관리해주는 것이다.

 

 

 

참고 자료 : 

github.com/PacktPublishing/Mastering-Spring-5.1

www.amazon.com/Mastering-Spring-effective-enterprise-applications/dp/1789615690

Comments