Good Morning

Java 리플렉션을 이용한 간단한 의존성 주입 구현하기 본문

Back-End/Spring

Java 리플렉션을 이용한 간단한 의존성 주입 구현하기

욘쥰 2024. 8. 4. 21:32

Java의 리플렉션(Reflection)을 사용하여 간단한 의존성 주입(Dependency Injection) 시스템을 구현하는 방법에 대해 알아보겠습니다.

1. 기본 클래스 구조

먼저, 다음과 같은 기본 클래스 구조를 가정해봅시다:

class Car {}
class SportsCar extends Car {}
class Truck extends Car {}
class Engine {}

2. 설정 파일을 이용한 객체 생성

객체 생성을 위해 "config.txt" 파일에 다음과 같이 설정을 저장합니다:

car=com.fastcampus.ch3.diCopy1.SportsCar
engine=com.fastcampus.ch3.diCopy1.Engine

3. 동적 객체 생성 메소드

getObject 메소드를 사용하여 설정 파일에서 클래스 이름을 읽고, 리플렉션으로 객체를 생성합니다:

static Object getObject(String key) throws Exception {
    Properties p = new Properties();
    p.load(new FileReader("config.txt"));

    Class clazz = Class.forName(p.getProperty(key));

    return clazz.newInstance();
}

4. 메인 메소드

메인 메소드에서 getObject를 사용하여 객체를 생성하고 출력합니다:

public static void main(String[] args) throws Exception {
    Car car = (Car) getObject("car");
    Engine engine = (Engine) getObject("engine");
    System.out.println("car = " + car);
    System.out.println("engine = " + engine);
}

5. 실행 결과

car=com.fastcampus.ch3.diCopy1.SportsCar
engine=com.fastcampus.ch3.diCopy1.Engine

코드 분석

  1. 설정 파일 사용: "config.txt" 파일을 통해 생성할 객체의 클래스를 외부에서 지정할 수 있습니다.

  2. 리플렉션 활용: Class.forName()newInstance()를 사용하여 동적으로 객체를 생성합니다.

  3. 유연성: 코드 수정 없이 설정 파일만 변경하여 다른 구현 클래스로 쉽게 전환할 수 있습니다.

  4. 타입 안전성: getObject 메소드는 Object를 반환하므로, 적절한 타입으로 캐스팅이 필요합니다.

주의사항

  1. 예외 처리: 실제 프로덕션 코드에서는 더 세밀한 예외 처리가 필요합니다.

  2. 성능: 리플렉션은 직접 객체 생성보다 느릴 수 있으므로, 성능에 민감한 상황에서는 주의가 필요합니다.

  3. 보안: 리플렉션을 통해 private 멤버에 접근할 수 있으므로, 보안 측면에서 주의가 필요합니다.

결론

이 예제를 통해 Java의 리플렉션을 이용하여 간단한 의존성 주입 시스템을 구현해 보았습니다. 이는 스프링 프레임워크와 같은 고급 DI 컨테이너의 기본 원리를 이해하는 데 도움이 될 것입니다.

더 복잡한 시스템에서는 생성자 주입, 필드 주입 등 다양한 주입 방식과 함께 라이프사이클 관리, AOP 등의 기능이 추가될 수 있습니다. 이러한 고급 기능들은 스프링과 같은 프레임워크에서 제공되며, 이 예제는 그 기본 개념을 이해하는 데 좋은 시작점이 될 것입니다.