[Item5] Resource 를 직접 명시하지 말고, Dependency Injection을 사용하라

Sera Lee·2022년 2월 21일
0

EffactiveJava

목록 보기
4/9
post-thumbnail

클래스 내부에 직접 자원을 정의하지 않는다.

@Configuration 을 선언한 클래스를 예시로 들어본다.

이유1. 환경(live, dev, local) 별로 다른 값들이 들어가야 할 때 적절하지 않다.

잘못된 예시

@Configuration
public class Config {
	private static final String ADDRESS = "서울시";
	public Config() {
		this.ADDRESS = "서울시 강남구";
	}

좋은 예시

properties를 주입하여 위의 코드를 변경하였다

application.yml

address: '서울시 강남구'
@Configuration
public class Config {
	@Value("${address")
	private String address

이유2. 테스트하기 어렵다.

생성자를 통해 리소스를 주입하면 TestCode 작성시 Injection 하기 편하다.

public class PhonePatternChecker {
	private final String pattern;

	public PhonePatternChecker(String pattern) {
		this.pattern = pattern;
	}

	public boolean isValid(String phone) { ...   }
}

각 나라마다 전화번호 패턴이 다를 수 있다.

이렇게 다국어를 처리하게 됐을 때 변경여지가 있는 pattern을 외부주입으로 받으면 손쉽게 다른국가에 대한 PhonePatternChecker로 교체할 수 있다.

❗️ 결론

DI는 아주아주 중요하다. 클래스 내부에 직접 객체를 생성하는 방식은 의존받는 객체에 의존성이 너무 높다. 외부에서 객체의 하위클래스를 교체하여 확장성을 높이거나 테스트코드를 작성하기 쉽게 해주는 등 객체지향설계가 가능하게 해준다. Spring 개발자라면 DI 의 장점을 꼭 이해하고 넘어가는게 좋다.

0개의 댓글