1 minute read

스프링 싱글턴과 Autiwired

0. 들어가기전에

Java Static Singleton 과 스프링 Singleton에는 차이가 있다고 말했다.
그러면 스프링 내에서 싱글턴은 어떻게 사용되고 있을까? 이번장에서 코드를 보며 확인해보자, 이전장과 다소 겹치는 내용이 있을수 있으므로 겹치는부분은 그냥 넘어가면 된다.

1. 스프링 Singleton 사용범위 (ApplicationContext)

하나의 war파일 안에는 web.xml에 등록된 여러개의 Servlet이 있을 수 있는데, Spring은 DistpatcherServlet이라는 Servlet을 사용한다.

DistpatcherServlet은 여러개가 등록될 수 있고, 이 DistpatcherServlet은 각각 하나의 context를 갖는다.
여러 DistpatcherServlet을 서블릿으로 등록해줄 경우 각각은 독립된 context를 구성하며 서로간의 참조는 불가능해진다.
물론 classloader 같은 상위 root context에서는 서로 접근이 가능하다.

Spring Singleton은 하나의 Spring IOC Container안에서 하나만 생성된다. 여기 Spring Ioc Container가 사용범위 ApplicationContext라고 보면될것 같다.

web.xml에 선언하는 root context 또는 servlet context 하나하나의 context 들이 Spring 기준 SIngleton 범위가 된다.

지금은 하나의 web application에서 하나의 context 만 만들어 쓰는 추세이다.

Spring의 Singleton은 서로 다른 servlet context들 끼리는 참조가 불가능하다. 하지만 static 기반 Single톤은 서로 참조가 가능하다.

2. 의존객체 자동 주입 Autowired 란

생성자나 세터 등을 사용하여 의존성 주입을 하려고 할 때, 해당 빈을 찾아서 주입해주는 annotaion
@Autowired어노테이션은 각 상황의 타입에 맞는 IOC컨터에너 안에 존재하는 Bean을 자동으로 주입해준다.

2-1. @Autowired VS @Resource

자동적으로 의존 대상 객체를 찾아 해당 객체에 필요한 의존성을 주입해주는 어노테이션은 @Autowired만 있는것은 아니다. @Resource 어노테이션을 통해서도 이러한 기능을 사용할 수 있다. 하지만 이둘은 의존 객체를 찾는 방식에 있어 차이가 조금 있다.

  • @Autowired 어노테이션은 주입하려 하는 객체의 타입을 확인하고 객체를 자동으로 주입한다. 만약에 타입이 존재하지 않는다면 @Autowired 에 위치한 속성명이 일치하는 bean을 컨테이너 안에서 찾는다.
    • 타입 -> 이름 -> @Qualifier -> Fail
  • @Resource 어노테이션은 이름을 기준으로 객체를 찾는다.
    • 이름 -> 타입 -> Qualifier -> Fail

3. @Autowired 사용법

@Autowired를 사용하기 위해서는 xml 설정파일에 아래 구문을 추가 해줘야 한다.

<context:annotation-config/>

@Autowired는 생성자, 필드, 설정 메서드 모두에 붙일수 있다.

import org.springframework.beans.factory.annotaion.Autowired;

public class UserDao {
	//필드적용
	@Autowired
	private User user;
	
	//생성자 적용
	//@Autowired 여기도 가능
	public UserDao(User user){
		this.user = user;
	}
	
	//설정 메서드 적용
	//@Autowired
	public void setUSER(User user){
		this.user = user;
	}
	
}

위같이 @Autowired 어노테이션을 추가하면 그 의존대상은 xml설정에 의존 주입 관련 설정을 따로 하지 않는다.
construct-arg 또는 property 태그를 사용하지 않는다.

Categories:

Updated: