바닥코딩

코드로 익혀보는 spring 기초2(Annotation통해 의존성 주입) 본문

Spring Framework/스프링 기초

코드로 익혀보는 spring 기초2(Annotation통해 의존성 주입)

개발공부개발공부 2020. 2. 14. 15:39

Annotation 활용해서 type에 맞게 자동으로 의존성 주입 하는법

먼저 이전의 포스팅 했던 내용과 같이 Man, Woman , 클래스를 만들어 xml 파일에 빈을 추가 해 보겠습니다

프로젝트 디렉토리 구조

package kr.dkkm.spring.di;

public interface Gender {
 public void print_gender();
}

Gender interface

package kr.dkkm.spring.di;

public class Man implements Gender {

	private String myName;
  
	public void setMyName(String myName) {
		this.myName = myName;
	}
	
	@Override
	public void print_gender() {
		// TODO Auto-generated method stub
		System.out.println(myName +" 의 성별은 남자입니다!");

	}

}

Man 클래스

package kr.dkkm.spring.di;

public class Woman implements Gender {

	private String myName;
	
	public void setMyName(String myName) {
		this.myName = myName;
	}

	@Override
	public void print_gender() {
		// TODO Auto-generated method stub
		
		System.out.println(myName+" 의 성별은 여자 입니다");

	}

}

Woman 클래스

package kr.dkkm.spring.di;

public class Gender_Distunction {
	
	private Gender gender;

	public Gender_Distunction(Gender gender) {
		this.gender = gender;
		
	}
	
	public void Diestinction() {
		
		gender.print_gender();
	}
	
	

}

Gener_Distinction 클래스에는 생성자 함수를 통해 인터페이스 객체를 주입해 주는 코드를 작성해 줍니다

Man과 Woman 클래스는 이전 포스팅 내용과 같이 bean을 주입해 주고 생성자 함수가 있는 Gender_Distictionn은 위와 같이 입력해준다음 finish

만든 객체 우클릭 후 insert<constructor-arg> elemanet클릭하면

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


	<bean id="man" class="kr.dkkm.spring.di.Man">
		<property name="myName" value="철수"></property>
	</bean>
		<bean id="woman" class="kr.dkkm.spring.di.Woman">
		<property name="myName" value="영희"></property>
	</bean>
		<bean id="GD" class="kr.dkkm.spring.di.Gender_Distunction">
			<constructor-arg></constructor-arg>
		</bean>
</beans>

 

위와 같은 xml이 설정이 됩니다 여기서 생성자 함수를 통해 어떤 값을 전달 받을지 결정을 하기 위해 참조를 해줍니다 저는 man읕 통해 참조를 받아 보겠습니다

위와 같이 xml에 ref 를 추가하면 

<constructor-arg ref="man"></constructor-arg>

이부분에 ref="man"이 추가된 것을 확인할 수 있습니다 이제 MainApp에서 실행을 해보겠습니다

package kr.dkkm.spring.di;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
	
	public static void main(String[] args) {
		
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				"kr/dkkim/spring/di/beans/gender.xml");
		
		Gender_Distunction G_D = (Gender_Distunction)context.getBean("GD");
		
		G_D.Diestinction();
		context.close();
		
	}

}

실행결과

이렇게 생성자 함수를통해 bean 객체 내 내용을 주입 시킬 수 있습니다.  이번에는 이 과정을 더 간단하게 Annotation을 통해 진행 해보겠습니다

<constructor-arg ref="man"></constructor-arg>

먼저 xml내부 위에 문장을 지워 줍니다  오류가 나는게 당연하기 떄문에 무시하고 일단 진행합니다 

그 다음 Gender_Distinction의 생성자 함수를 지워 줍니다 

다시 xml 파일로 넘어가 Namespaces 에 context를 체크 해주면 아래와 같은 context란이 생성이 됩니다

context란에서 beans 우클릭 후  isnert <context:annotation-config> element 를 선택해줍니다 

<context:annotation-config></context:annotation-config>

그렇게 된다면 xml제일 아래 줄에 해당 코드가 추가 된 것을 확인 할 수 있습니다

이제부터는 Gender_Distiction을 통해 어떻게 bean 객체를 주입 받는지 코들르 통해 확인해 볼 수 있습니다

package kr.dkkm.spring.di;

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

public class Gender_Distunction {
	
	
	@Autowired
	private Gender gender;
	public void Diestinction() {		
		gender.print_gender();
	}
	

}

 

처음은 @Autowired 어노테이션을 추가해 줍니다 @Autowired 어노테이션은 Gender에 걸 맞는 bean 을 알아서 찾아 주입해줍니다 그렇지만 해당 코드는 에러를 발생시킵니다 왜냐면 @Autowired가 적당하다고 찾는 bean은 man 과 woman 두가지 이기 때문에 두가지중 어느것을 선택해야할지 결정한느 과정에서 에러를 발생 시킵니다 따라서 @Qualifier를 통해 주입하고자 하는 Bean을 명시해 보겠습니다.

package kr.dkkm.spring.di;

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

public class Gender_Distunction {
	
	
	@Autowired
	@Qualifier(value="woman")
	private Gender gender;
	public void Diestinction() {		
		gender.print_gender();
	}
	

}

 

위와 같이 명시를 해주면 해당 코드는  혼동되는 타입 없이 woman 이라는 하나의 bean만을 선택하게 됩니다 따라서 아래와 같은 결과값을 출력하게 됩니다 

마직막으로는 Bean 의 name 값을 통해 의존성 주입을 하는 방법에 대해 알아보겠습니다 name값을 통해 의존성을 주입하기 위해서는 @Resoruce라는 어노테이션을 추가 해주면 됩니다

package kr.dkkm.spring.di;

import javax.annotation.Resource;

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

public class Gender_Distunction {
	
	
	//@Autowired
	//@Qualifier(value="woman")
	@Resource(name="man")
	private Gender gender;
	public void Diestinction() {		
		gender.print_gender();
	}
	

}

 

위와 같이 @Resource annotation을 통해 의존성을 주입할 수 있습니다

위에서는 3가지의 Annotation을 사용했지만 실재로는 훨씬 많은 annotation이 있습니다 annotation을 통해 모듈의 결합도를 낮추기 위해 적절하게 Annotation을 활용하는 방향으로 코딩을 공부해봅시다