Learn/KH정보교육원

[KH정보교육원 당산] 67일(SpringFramwork - DI)

Dahoon06 2021. 6. 16. 20:59
728x90
반응형

Items인터페이스를 구현받는 StarBucks클래스 생성

StarBucks 클래스
Items 인터페이스

오늘 예제에서는 기존에 사용했던 방식이 아닌 어노테이션을 통하여 객체를 주입시키는 방법이다.

 

그러기 위해서는 먼저 context.xml파일 설정 -> Namespaces -> context 설정

 

<!-- 따로 bean을 만들지 않고 자동으로 객체를 생성하기 위해서는 context:component-scan에 요소 정의 -->
beans 태그 내부에
xmlns:context="http://www.springframework.org/schema/context" 추가된것을 볼 수 있다.
<context:component-scan base-package="com.jdh.test"></context:component-scan>
패키지 경로는 베이스가 되는 패키지로 설정(그러면 그 패키지 안의 모든 클래스를 사용)

컴포넌트 스캔을 통하여 빈 객체를 등록하지 않고도 사용할 객체들을 자동으로 생성한다.

사용할 클래스에 @Component("이름") 설정 => 그러면 컴포넌트 스캔에서 해당 어노테이션을 찾아서 객체 생성

@Component("starbucks")
public class StarBucks implements Items {

사용할 메인 클래스에 해당 컴포넌트 명을 맞춰야한다.

AbstractApplicationContext context = new GenericXmlApplicationContext("context.xml");
// Spring Container로부터 빈 객체 요청
Items item = (Items)context.getBean("starbucks");

 

의존성 주입 어노테이션

@Autowried 주로 멤버변수를 지정 // 해당 타입의 객체를 찾아서 자동으로 할당

=> 타입을 이용하여 의존성 주입
즉, 동일한 타입의 객체가 여러개일 경우, @Autowried는 @Qualifier ("carrot")
@Qualifier 특정 객체의 이름을 이용하여 의존성 주입
@Inject  Autowried와 동일한 기능
@Resource => Autowried와 Qualifier을 합친것

@Resource(name="carrot")와 같이 한번에 지정할 수 있다.

=> 객체 이름을 이용하여 의존성 주입

 

** 따라서 @Autowried가 있는 멤버변수의 타입과 동일한 타입을 갖는 객체가 1개만 존재할 경우에는
@Autowried  를 사용.
여러개일 경우에는 @Resource 사용

 

 


@Autowried

생성자나 메서드, 멤버변수 위에 모두 사용가능, 하지만 주로 멤버변수 위에 선언하여 사용

 ex)스타벅스 클래스의 전역변수

@Component("starkbucks")
public class StarkBucks implements Items {
 	
    @Autowired
    private Cake cake

@Autowired를 사용하기 때문에 위의 스타벅스 클래스에서 setter메서드는 필요가없다.

또한 현재 Cake cake에 대한 메모리 설정을 하지 않았기 때문에 xml파일에 해당 객체에 대한 정보를 주입해야한다.

<bean id="chessCake" class="com.jdh.test.CheeseCake"></bean>

치즈케이크에 대한 정보를 cake객체에 주입

마찬가지로 @Component('id이름")를 통하여 해당 객체를 찾은 후에 @Autowired가 붙은 객체를 찾아간다.

 

Autowired는 이처럼 객체가 하나일때는 사용이 가능하지만 값이 2개이상이 된다면 에러가 발생한다.

정확히 어떤 정보를 주입한다는 정의를 하지 않았기 때문.

 

그럴때 사용하는 어노테이션이 @Qualifier

 


@Qualifier("사용할id값")

=> 주로 @Autowired와 같이 사용된다.

 

만약 xml파일에 빈 객체가 이와같이 등록되어있다면.

<bean id="chessCake" class="com.jdh.test.CheeseCake"></bean>
<bean id="carrot" class="com.jdh.test.CarrotCake"></bean>

스타벅스 클래스에 Autowired로 설정된 변수에 값이 제대로 주입되지 않는다.

정확히 어떤값을 주입시키겠다는 설정을 하지 않았기 때문

 

@Component("starkbucks")
public class StarkBucks implements Items {
 	
    @Autowired
    @Qualifier("carrot")
    private Cake cake

이와같이 사용하여 carrot객체가 주입 받을 수 있게 설정!!!

 

이 두 어노테이션을 합친게 @Resource(name="사용할아이디값")

위 코드를 이와같이 수정할 수 있다.

@Component("starkbucks")
public class StarkBucks implements Items {
 	
    @Resource(name="carrot")
    private Cake cake

기능은 동일하다.

 


XML 설정과 어노테이션을 병행하면서 사용하기

XML파일(치즈케이크 클래스 사용)

<context:component-scan base-package="com.jdh.test"></context:component-scan>
	
<bean class="com.jdh.test.CheeseCake"></bean>

치크케이크 상단에 @Component("cheeseCake") 추가되어있는거 확인했고,

 

스타벅스 클래스의 멤버변수의 어노테이션을 다시 @Autowired로 바꿔준다.

 

CheeseCake클래스를 사용하는데 이때 선언했던 @Component("cheeseCake") 지워준다.

빈 객체에 이름이 설정되어있지않기 때문에 지우지않고 실행시키면 에러가 나온다.

 

 

스타벅스 클래스

케이크 부분을 보면 객체를 사용하지 않아도 해당 메서드를 호출 할 수 있다.

 

메인 클래스

 

 

결과화면


추가 어노테이션

 

Controller 관련 => @Controller

:  사용자의 요청을 제어하는 Controller클래스에 설정
Service 관련 => @Service

:  비즈니스 로직을 처리하는 Service클래스에 설정
DAO 관련 => @Respository

:  데이터베이스 연동을 처리하는 DAO클래스

 

** 위 3가지 어노테이션은 @Component를 상속 받는다.

 

Spring에서는 각각의 영역이 확실하게 분리되어있다.

Presentation Layer(MVC)에서는 사용자의 요청을 제어(Controller)

Bussiness Layer(IoC,AOP)에서 실질적인 비즈니스 로직 처리(ServiceImpl)

 


추가 어노테이션 실습)

 

 

 

728x90
반응형