Java/Spring

[Spring] 11. Annotation - Component

담크 2021. 6. 26. 13:23

오늘은 지난번 포스팅에 이어서 spring의 어노테이션 중 하나인 Component에 대해 공부해볼까 합니다.

이번에는 <context:component-scan>이라는 태그를 사용해서 객체생성과 값 연결을 같이 해보도록 하겠습니다.

패키지를 만들러 가봅시다.

TV.java(interface)

package com.test03;

public interface TV {

	void powerOn();
	void powerOff();
	void volumeUp();
	void volumeDown();
}

IgTV.java

package com.test03;

public class IgTV implements TV {
	
	public IgTV() {
		System.out.println("ig tv 생성");
	}

	@Override
	public void powerOn() {
		System.out.println("ig tv power on");
	}

	@Override
	public void powerOff() {
		System.out.println("ig tv power off");
	}

	@Override
	public void volumeUp() {
		System.out.println("ig tv volume up");
	}

	@Override
	public void volumeDown() {
		System.out.println("ig tv voluem down");
	}

}

SamsongTV.java

package com.test03;

public class SamsongTV implements TV{
	
	public SamsongTV() {
		System.out.println("samsong tv 생성");
	}

	@Override
	public void powerOn() {
		System.out.println("samsong tv power on");
	}

	@Override
	public void powerOff() {
		System.out.println("samsong tv power off");
	}

	@Override
	public void volumeUp() {
		System.out.println("samsong tv volume up");
	}

	@Override
	public void volumeDown() {
		System.out.println("samsong tv volume down");
	}

}

MTest.java

package com.test03;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/applicationContext.xml");
		
		TV samsong = factory.getBean("samsong", TV.class);
		samsong.powerOn();
		samsong.volumeUp();
		samsong.volumeDown();
		samsong.powerOff();
		
		TV ig = (TV) factory.getBean("igTV");
		ig.powerOn();
		ig.volumeUp();
		ig.volumeDown();
		ig.powerOff();
	}

}

applicationContext.xml

<?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.test03"></context:component-scan>
</beans>

오늘의 코드 실행결과는 가장 마지막에 쓰겠습니다.

 

저번에 공부했던 내용을 잠시 복습해보자면

Spring framework에서 annotation을 사용하기위한 4가지의 설정이 있었는데

1. CommonAnnotationBeanPostProcessor 클래스를 설정파일에 bean객체로 등록

 

2. <context:annotation-config> 태그를 이용

 

3. <context:componet-scan base-package="" /> 태그를 이용

 

4. <mvc:annotation-driven /> 을 이용

 

이 중에서 3번을 이용하여 오늘 annotation을 사용해보겠습니다.

 

가장먼저 applicationContext.xml 파일에서 package를 지정해줘야 하는데 위에서 보면 알 수 있듯

<context:component-scan base-package="com.test03"> 태그를 사용하여 com.test03 패키지 밑에있는 파일은 다 읽어서 annotation이 있으면 그에 맞는 기능을 쓰겠다 라는 의미입니다.

 

위를 실행하면 바로 에러가 납니다.

바로 'samsong', 'igTV'이라는 bean 객체가 생성이 되지 않았기 때문인데요

기존에 해왔던대로라면 applicationContext.xml에 <bean>태그를 넣고 객체를 만들고 그 객체에 값을 넣고 해야합니다.

하지만 annotation을 사용하면 보다 간편하게 객체를 만들고 값을 넣어줄 수 있습니다.

이 때 사용해야할 것은@Component라는 annotation입니다.

@Component는 해당 클래스를 bean으로 등록을 시켜줍니다.

사용방법은 해당 클래스 위쪽에 @Component만 써주면 됩니다. ㅎㅎ 참 쉽죠

이렇게 써주면 IgTV igTV = new IgTV( ); 형태를 사용해 주는것과 같은 의미를 가집니다.

이 때 객체명은 class이름에서 맨 앞철자만 소문자로 합니다.

 

그렇다면 객체이름을 바꿔서 넣고싶을 땐 어떻게 해야할까요??

 

마찬가지로 @Component를 써주고 괄호안에 자신이 설정하고싶은 이름을 지정해주면 됩니다.

이는 마찬가지로 SamsongTV samsong = new SamsongTV( ); 형태의 객체를 만들어 준다고 할 수 있습니다.

 

그렇다면 이제 코드 실행결과를 볼까요?

 

applicationContext에 객체를 따로 생성하지 않아도 잘 작동하는것을 볼 수 있습니다.