시뻘건 개발 도전기

#2 : DI 활용 본문

Framework/spring

#2 : DI 활용

시뻘건볼때기 2020. 5. 1. 21:45
반응형

  DI는 여러가지로 활용할 수 있다. 이전 글에서는 기본적인 DI의 설명이 있었으나 이번에는 여러가지 주입방법을 소개한다.

 

- 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"  <!-- constructor-arg namespace -->
	xmlns:p="http://www.springframework.org/schema/p"  <!-- property namespace -->
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="loggerUtil" class="ga.dotori.util.LoggerUtil" c:PREFIX="This is" c:POSTFIX="!!!" />

</beans>
String config = "classpath:appContext.xml";
GenericXmlApplicationContext appContext = new GenericXmlApplicationContext(config);
LoggerUtil logger = appContext.getBean("loggerUtil", LoggerUtil.class);

logger.log();

config = "classpath:appContext2.xml";
appContext = new GenericXmlApplicationContext(config);
logger = appContext.getBean("loggerUtil", LoggerUtil.class);

logger.log();

appContext.close();

 

 

 

  xml 파일로 주입하는 또 다른 방법은 namespace를 사용하는 것. 대표적으로 c namespace와 p namespace가 있다.

c는 constructor-arg의 약자이고 p는 property의 약자로, 각각 생성자, setter를 사용하겠다는 의미다. 해당 namespace를 사용하려면 다음과 같이 beans태그에 설정을 해주어야한다.

xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"

  코드를 보았을 때, 이전 글에서 작성한 xml과 같은 역할을 하는 것을 볼 수 있다. 그러나 namespace를 사용하는 것은 좋아보이지 않아 보인다. 협업에서는 어떤 것을 선호할지 모르겠지만 적어도 나는 상당히 불편했고 한 눈에 이해하기에 귀찮기도 했다. 보기 좋게 사용하지 않는 것이 읽기에도 쉬워보인다.

 

 

- java 내부적 주입 방법

@Configuration
public class JavaInjection {
	@Bean
	public LoggerUtil logger() {
		LoggerUtil loggerUtil = new LoggerUtil("[START]", "[END]");
		
		return loggerUtil;
	}
}
AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(JavaInjection.class);

LoggerUtil loggerUtil = appContext.getBean("logger", LoggerUtil.class);
loggerUtil.log();

appContext.close();

 

  DI를 사용하는 가장 큰 목적은 "java 소스 수정 최소화"이지 않을까? 그런데 java로 주입을 하다니 이런 모순인게 어딨어..ㅠㅠ 이 역시 협업에서 사용하는지는 모르겠지만 전혀 내키지 않는다. 가장 첫 번째로 소개했던 방법이 DI의도에 알맞게 적절한 사용 법인듯 하다.

반응형

'Framework > spring' 카테고리의 다른 글

#6 : AOP (Aspect Oriented Programming)  (0) 2020.05.03
#5 : bean setting  (0) 2020.05.02
#4 : Bean Scope  (0) 2020.05.01
#3 : Container Life Cycle  (0) 2020.05.01
#1 : spring의 핵심 DI(Dependency Injection)  (0) 2020.04.30
Comments