티스토리 뷰

Lookup Method


이번에는 정말 신기한 이야기를 해드리려고 합니다.
그동안 Java에서는 추상 클래스를 상속(extends)받아서 완전한 메서드로 구현하거나 인터페이스를 구현(implements)해야만 객체를 생성할 수 있었습니다.
그런데, 스프링에서는 룩업 메서드를 이용하면 추상클래스일지라도 스프링에 해당 추상 메서드만 일러주면 알아서 객체를 생성하여 반환해 줍니다.
정말 쇼킹할 만한 일 아닌가요?
추상클래스 주제에 메서드가 구현되지도 않았는데 어떻게 객체를 반환한담?

이번에는 학교, 학생 주제에서 좀 떠나서 새로운 주제로 클래스를 작성해보도록 하겠습니다.

클래스 구성

  • 폰.java
public class SmartPhone {

    private String os;

    public String getOs() {
        return os;
    }

    public void setOs(String os) {
        this.os = os;
    }

    @Override
    public String toString() {
        return super.toString() + "번째 " + os + "폰";
    }

}
  • 폰공장.java (추상 클래스)
public abstract class SmartPhoneFactory {
    //분명히 abstract가 들어간 "추.상.메.서.드"이자 "추.상.클.래.스"
    public abstract SmartPhone makeIPhone();
    public abstract SmartPhone makeAndroidPhone();
}
  • 소비자(실행 클래스).java
public class Customer {
    public static void main(String[] args) {

        AbstractApplicationContext context = new GenericXmlApplicationContext("classpath:com/di/factory/xml/lookup/applicationContext.xml");

        try {
            SmartPhoneFactory f = context.getBean("smartPhoneFactory", SmartPhoneFactory.class);
            SmartPhone ios = f.makeIPhone();
            SmartPhone android = f.makeAndroidPhone();
            System.out.println(ios);
            System.out.println(android);
        } finally {
            context.close();
        }
    }
}
  • 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:c="http://www.springframework.org/schema/c"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">

    <bean id="iosPhone" class="com.di.factory.xml.lookup.SmartPhone">
        <property name="os" value="iOS" />
    </bean>
    <bean id="androidPhone"
        class="com.di.factory.xml.lookup.SmartPhone">
        <property name="os" value="Android" />
    </bean>

    <bean id="smartPhoneFactory"
        class="com.di.factory.xml.lookup.SmartPhoneFactory">
        <lookup-method name="makeIPhone" bean="iosPhone" />
        <lookup-method name="makeAndroidPhone" bean="androidPhone" />
    </bean>

    <bean id="customer" class="com.di.factory.xml.lookup.Customer" />

</beans>

그런데 이렇게 xml에서 룩업 메서드로 설정을 해버리면 아래처럼 객체가 생성되어 무사히 출력되는 것을 볼 수 있습니다.
아니... 내가 어디서 상속받은 것도 아닌데 어떻게 이렇게 추상클래스 주제에 구현도 안 했는데 객체를 반환해주지? 말이 안 되지 않습니까?

그것은 바로 스프링 컨테이너가 관리하는 빈의 메서드를 재정의하고 컨테이너에 있는 다른 빈을 찾을 수 있도록 내부적으로 구현했기 때문입니다.
저는 추상클래스를 예시로 들었지만 이것은 인터페이스에서도 가능한 부분입니다.
하지만 다음의 규칙을 따라야만 한답니다.

룩업 메서드 인젝션 규칙

  1. 접근제어자는 반드시 public, protected여야 할 것
  2. 메서드의 반환 자료형이 void이지 않을 것.
  3. 인잣값(매개변수)는 없을 것.
  4. 추상 메서드이거나 구현부가 존재하지 않는 인터페이스일 것.
  5. final 예약어를 사용하지 않을 것

이것은 사실 메서드의 반환형에 맞게 객체를 반환"만"을 수행해 주기 때문에 직접적으로 메서드의 내용을 기술할 수는 없는 노릇입니다.
그렇다고 하더라도 이미 해당 객체를 생성해 두고 적절한 값을 입혀둔 상태에서 메서드별로 객체를 반환하게끔 하는 것은 처음입니다.

이번 시간에는 룩업 메서드에 대해서 살펴보았습니다.

 

digest1.zip
0.04MB

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함