Spring - DI 성격을 가진 예시 코드들(Map과 외부파일)

김도형·2023년 1월 29일
0

Spring - DI 에서 스프링 DI의 성격을 설명했는데,
변경에 유리한 코드(다형성)을 설명하는 예시 코드들을 설명하려고 한다.

변경에 유리한 코드(Map과 외부 파일)

요구사항

SportsCar, Truck 의 객체들 중 원하는 객체만 생성하려고 한다. 단, 변경에 유리한 코드로 구성해야한다.(계속 객체를 생성해서 관리점이 많아지는 코드가 아닌 단순히 key 값만 변경해서 가져 오는 변경점이 적은 코드를 만들어야한다)

외부 파일

config.txt 파일 생성 후 key, value 설정(SportsCar 객체)

car=di.SportsCar

Map

Keyvalue
cardi.SportsCar

코드

변경하고 싶은 대상(SportsCar, Truck)은 같은 객체(Car)에 상속받아야 한다.

import java.io.FileReader;
import java.util.Properties;

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


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

    static Car getCar() throws Exception {
        Properties p = new Properties();
        File file = new File("src/di/config.txt");
        p.load((new FileReader(file)));

        Class clazz = Class.forName(p.getProperty("car"));

        return  (Car)clazz.newInstance();
    }
}

결과(SportsCar 객체 생성)

car = di.SportsCar@22f71333

객체 변경(SportsCar -> Truck)

config.txt

car=di.Truck

결과(Truck 객체 생성)

car = di.Truck@22f71333

결론

config.txt 의 value 변경만으로 객체를 변경할 수 있어, 관리 포인트가 줄어 드는 것을 알 수 있다.

config.txt 객체 추가

Engine 이라는 key를 가진 객체도 추가할 수도 있다.

config.txt

car=di.SportsCar
engine=di.Engine

Map

Keyvalue
cardi.SportsCar
enginedi.Engine

코드

import java.io.FileReader;
import java.util.Properties;

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


public class main1 {
    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);
    }

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

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

        return  (Car)clazz.newInstance();
    }
}

결과

car = di.SportsCar@22f71333
engine = di.Engine@13969fbe

출처 : 남궁성 저자의 스프링의 정석(패스트 캠퍼스)(https://fastcampus.co.kr/dev_academy_nks)

profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글