본문 바로가기

SpringBoot

ch3 01. Spring DI의 원리(1)

1. 변경에 유리한 코드(1) - 다형성, 추상화, factory method

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

SportsCar car = new SportsCar();

=>

Truck car = new Truck();

--> SportsCar() 클래스를 다른 클래스로 바꿀 때 두 군데를 고쳐야한다. 

 

Car car = new SportsCar();

=>

Car car = new Truck();

--> 코드를 이렇게 적으면 한 군데만 고치면 된다. (변경에 더 유리한 코드)

 

 

- 더 변경에 유리한 코드로 만드려면, 메소드로 작성

Car car = getCar();

static Car getCar() { 
	return new SportsCar();
}

static Car getCar() { 
	return new Truck();
}

변경 포인트가 SportsCar() 한군데이고, 만약 다른 클래스의 객체를 사용하고 싶으면 Truck()부분을 바꾸면 된다. 
Car car = getCar(); 처럼 사용하는 쪽은 여러 번 사용될 수 있지만, 제공하는 곳은 한군데만 고치면 되니까 

사용하는 곳이 여러군데 있다고 했을 때 이전 코드보다 이렇게 메소드를 이용해서 객체를 반환하는 쪽이 훨씬 더 
변경 포인트가 적어 유리하다.

 

 

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

 

[config.txt]

car=com.fastcampus.ch3.SportsCar
engine=com.fastcampus.ch3.Engine
Car car = (Car) getObject("car");
Engine engine = (Engine) getObject("engine");

static Object getObject(String key) throws Exception {
	// config.txt를 읽어서 Properties에 저장
    Properties p = new Properties();
    p.load(new FileReader("config.txt"));
    
    // 클래스 객체(설계도)를 얻어서
    Class clazz = Class.forName(p.getProperty(key));
    
    return clazz.newInstance(); // 객체를 생성해서 반환
}

Properties객체는 Map처럼 데이터를 Key, Value형태로 저장하며, Map과 달리 (String, String) 형태로 저장한다.

Key Value
"car" "com.fastcampus.ch3.SportsCar"
"engine" "com.fastcampus.ch3.Engine"

직접 new SportsCar()라고 적는건 하드코딩인데 이걸 안하고, Properties 객체에 우리가 생성할 객체의 클래스 정보를
저장한 다음 그걸 읽어서 동적으로 처리한다. 

car=com.fastcampus.ch3.Truck
engine=com.fastcampus.ch3.TurboEngine

나중에 이걸 이렇게 바꿔서 사용할수도 있다. 

Key Value
"car" "com.fastcampus.ch3.Truck"
"engine" "com.fastcampus.ch3.TurboEngine"

적용이 되면 이런식으로 바뀜!

 

 

<실습>

- 새로운 프로젝트 생성

설정 후 생성해준다. 

 

- di1패키지를 생성해서 Main 클래스 생성

package com.fastcampus.ch3.di1;

class Car {}

class SportsCar extends Car {}

class Truck extends Car {}
public class Main {
    public static void main(String[] args) {
        Car car = new Truck();
        car = getCar();
        System.out.println("car = " + car);
    }

    static Car getCar() {
        return new Truck(); // getCar(); 를 호출하는 부분이 많아도 여기만 수정하면 된다.
    }
}

 

- 다양한 객체를 반환할 수 있도록 수정해보자. 

- config.txt 파일 생성

car=com.fastcampus.ch3.di1.SportsCar
engine=com.fastcampus.ch3.di1.Engine
engine=com.fastcampus.ch3.di1.Door

 

'SpringBoot' 카테고리의 다른 글

ch3 03. Spring DI의 원리(2)  (0) 2023.07.29
ch3 02. Java Reflection API  (0) 2023.07.19
ch2 16. thymeleaf 사용하기  (0) 2023.07.18
ch2 15. forward와 redirect - 실습  (0) 2023.07.14
ch2 14. forward와 redirect - 이론  (0) 2023.07.14