ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRING] Day1 (Class05. 어노테이션 기반 설정)
    SPRING 2021. 7. 30. 21:23

    프레임워크는 xml 설정이 매우 중요하다.

    그러나 그만큼 xml파일의 과도한 설정에 대한 부담도 크다. 

    그래서 프레임워크는 어노테이션을 이용한 설정을 지원한다.

     

     

    1. Context 네임스페이스 추가와 component-scan 설정

    <?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:p="http://www.springframework.org/schema/p"
    	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.2.xsd">
    
    
    <context:component-scan base-package="polymorphism"></context:component-scan>
    <!--  
    <bean id="tv" class="polymorphism.SamsungTV" p:speaker-ref="sony" p:price="2700000">
    </bean>
    
    <bean id="sony" class="polymorphism.SonySpeaker"></bean>
    <bean id="apple" class="polymorphism.AppleSpeaker"></bean>
    -->
    
    </beans>

    Context 네임스페이스를 추가해주고 componet-scan 엘리먼트를 등록한다.

    이때 base-package 속성을 "polymorphism"이라고 설정한다.

    이것은 polymorphism이라는 이름의 패키지를 탐색하는데 이 안에서 @Component로 등록된 클래스의 객체를 자동으로 생성한다.

     

    이때 인터페이스는 탐색 대상에서 제외되는데 인터페이스는 객체 생성이 불가능하기 때문이다.

    자료형만 파악한다.

     

    package polymorphism;
    
    import org.springframework.stereotype.Component;
    
    @Component("tv") //객체 생성 annotation("이름 정의 속성")
    public class LgTV implements TV{
    
    	public void powerOn() {
    		System.out.println("LgTV---전원 켠다");
    	}
    	public void powerOff() {
    		System.out.println("LgTV---전원 끈다");
    	}
    	public void volumeUp() {
    		System.out.println("LgTV---소리 올린다");
    	}
    	public void volumeDown() {
    		System.out.println("LgTV---소리 내린다");
    	}
    }

    다음과 같이 어노테이션을 등록하여 주면 bean등록을 하지 않아도 자동으로 객체생성이 이루어진다.

    이때 객체를 요청할 때의 편의를 위해서 괄호 안에 이름을 지정해주어 id속성과 같은 역할을 하게 해준다.

     

    만약 이런 이름을 지정하지 않는다면 클래스 이름의 첫 글자를 대문자에서 소문자로 변경하여 이름을 지정해준다.

     

     

    2. 의존성 주입 어노테이션

    어노테이션 설명
    @Autowired Default인 ByType으로 자동 주입
    @Qualifier ByName으로 자동 주입
    @Inject ByType으로 자동 주입
    @Resource ByName으로 자동 주입

     자료형이 충돌이 나면 @Qualifier로 이름을 통해 주입을 받는다.

     

    3. @Autowired

     

    package polymorphism;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component("tv")
    public class LgTV implements TV{
    	@Autowired
    	private Speaker speaker;
    	
    	public void powerOn() {
    		System.out.println("LgTV---전원 켠다");
    	}
    	public void powerOff() {
    		System.out.println("LgTV---전원 끈다");
    	}
    	public void volumeUp() {
    		speaker.volumeUp();
    	}
    	public void volumeDown() {
    		speaker.volumeDown();
    	}
    }

    @Autowired 어노테이션을 통해 LgTV가 Speaker 객체를 주입받는다.

    다만 객체 주입을 할 객체가 메모리에 생성이 미리 되어있어야 한다.

    그러므로 주입할 객체를 bean 엘리먼트나 @Component 어노테이션으로 객체 생성을 시켜두도록 한다.

     

    실무에서는 어노테이션과 XML 설정을 병행하여 사용한다.

     

    * 추가 어노테이션

    어노테이션 의미
    @Service 비즈니스 로직을 처리하는 Servoce 클래스
    @Reposition 데이터베이스 연동을 처리하는 DAO 클래스
    @Controller 사용자 요청을 제어하는 Controller 클래스

     

     

Designed by Tistory.