Programming/Spring

Spring (3) - Container에 객체(Bean) 설정하기3 : Annotation

코딩하는 포메라니안 2022. 4. 23. 13:54

0. Annotation

1. Stereotype Annotation

Stereotype Annotation은 Bean을 등록할 때 사용할 수 있는 annotation이다.

Stereotype 적용 대상
@Controller MVC Controller에 사용
@Service Service 계층
@Repository DB에 접근하는 계층 ex) DAO
@Component 위의 계층에 속하지 않은 경우 ex) DTO 등

 

 

2. 의존 관계 설정 Annotation

Annotation 설명
@Autowired Spring에서만 사용 가능

멤버 변수, setter, constructor, 일반 method에 사용 가능하며 타입에 맞춰서 연결함
예시 => 2022.04.20 - [웹프로그래밍/Spring] - Spring (2) - IoC와 Container
@Qualifer("name") 같은 타입의 bean이 여러 개여서 Autowired한 객체들을 식별해야 할 때

 

 

 

1. Annotation 읽어서 객체(Bean)를 등록할 XML 파일 생성

 

앞서 본 "Container에 객체(Bean) 설정하기2 : XML"의 1번 과정과 동일하다.

이 글만 볼 경우를 위해 아래 더보기로 작성해놓았다.

 

더보기

src 우클릭 > [New] > [Spring Bean Configuration File]

 

 

파일 이름은 보통 application.xml을 사용한다. [Next] > beans 선택 > [Finish]

 

 

 

 

2. Annotation 작성하기

 

TestService.java, TestDaoImpl1, TestDaoImpl2에 annotation을 붙여준다.

Interface인 TestDao는 실제로 생성해야 할 객체가 아니므로 붙여주지 않는다.

 

 

1) TestService.java

@Autowired = 의존 관계 설정

@Qualifier("구현한 객체 이름") = 주입할 객체가 동일한 Interface를 구현해서 타입이 같을 때 구분하기 위해 사용

 

private TestDaoImpl1 td1;을 작성해도 같은 작업이 필요하다.

이유는 Container는 타입으로 객체를 구분해서, TestDao타입으로 TestDaoImpl1과 TestDaoImpl2로 2개가 있는데 어느 것을 주입해줘야 하는지 알려줘야 한다.

 

//TestService.java
package com.test.di1;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service("ts")
public class TestService {
	
	@Autowired
	@Qualifier("d1")
	private TestDao td1; //private TestDaoImpl1 td1;을 해도 같은 작업 필요
	
	@Autowired
	@Qualifier("testDaoImpl2")//default는 맨 첫문자가 소문자인 클래스 이름
	private TestDao td2;
	
	public TestService() {
		System.out.println("TestService 생성자!");
	}
	
	public void TestPrint() {
		td1.testPrint();
		td2.testPrint();
	}
}

 

 

2) TestDaoImpl1 & TestDaoImpl2

Dao는 @Repository로 annotation을 붙이며, 이름을 지정할 수 있다.

//방법1
@Repository(value = "d1")

//방법2
@Repository("d1")

 

TestDaoImpl1에는 이름을 붙여주었고, TestDaoImpl2는 이름을 붙여주지 않았다. 이름을 지정하지 않으면 default는 클래스 이름에서 첫 문자가 소문자인 문자열이 된다. 즉, testDaoImpl2가 이름이다.

//TestDaoImpl1.java
import org.springframework.stereotype.Repository;

@Repository("d1")
public class TestDaoImpl1 implements TestDao { ... }

 

//TestDaoImpl2.java
import org.springframework.stereotype.Repository;

@Repository
public class TestDaoImpl2 implements TestDao { ... }

 

 

 

3. application.xml 설정 파일에 작성

먼저, [Namespaces] > [context]를 체크하고 Source로 돌아온다.

 

 

 

application.xml에 한 줄만 작성해주면 된다. base-package에 작성한 범위 안에 있는 @Annotation을 스캔해서 객체를 등록하겠다는 의미이다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<context:component-scan base-package="com.test.di1"></context:component-scan>
	
</beans>

 

 

 

결과 Console창

ts1과 ts2의 hashcode가 같으므로 singleton으로 생성된 것도 확인할 수 있다.