.xml 파일을 이용하여 spring framework의 기본인 IOC를 알아보도록 하겠습니다.
https://pabeba.tistory.com/187
의존성을 스스로 생성한 프로그램과 spring framework의 application.xml 설정 파일을 이용하여 빈을 정의하고 의존성 주입 설정을 해보겠습니다.
의존성 스스로 생성 (Spring 사용 X)
<TestWorker.java>
public class TestWorker {
public static void main(String[] args) {
// 필요시 객체를 생성해 사용 (필요 없으면 삭제)
//Hammer tool=new Hammer();
// 필요로 하는 객체(컴포넌트 or Bean)를 직접 생성 ( 직접 제어 )
//이후 툴이 추가될때마다 코드 변경은 불가피한 구조 , 결합도가 높다, 유지보수성이 낮다
Poclain tool=new Poclain();
tool.work();
}
}
<Hammer.java>
public class Hammer {
public void work() {
System.out.println("망치 도구로 일하다");
}
}
<Poclain.java>
public class Poclain {
public void work() {
System.out.println("포크레인으로 일하다");
}
}
이렇게 망치와 포크레인 도구로 일을 하는 일꾼이 있다고 생각해 보면 일꾼은 하루는 망치를 쓰고 싶어 망치 객체를 가져와서 사용하고 하루는 포크레인이 필요하여 망치객체를 없애고 포크레인 객체를 생성해서 일을 해야 합니다.
그러면 어떤 도구를 사용하냐에 따라 코드의 변경이 일어나겠죠. 또한 다른 도구가 더 많이 생성되면 코드가 정말 엉망진창이 되어버릴 것입니다.
따라서 저희가 applicationContext.xml 파일을 생성해서 Spring에서 제어의 역전이 일어나게 해 보겠습니다.
제어의 역전
<applicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean class="model.Hammer" id="tool"></bean>
</beans>
설정 파일에 bean을 보시면 model 파일에 Hammer 객체를 사용하고 id는 tool을 이용하겠다고 작성되어 있습니다.
이 코드 어디서 본 것 같지 않나요? HTML이나 JSP 파일에 태그로 이렇게 많이 사용하잖아요!
그거와 유사하게 설정파일을 만든다고 생각하면 마음이 조금 편안해집니다.
그다음 다시 일꾼이 일하는 test 파일을 만들어 볼게요
<TestWorker.java>
public class TestWorker {
public static void main(String[] args) {
/*****IOC 적용 제어방식****/
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("spring ioc container start");
System.out.println(ctx.getBean("tool"));
System.out.println(ctx.getBean("tool"));//동일한 객체의 주소값이 출력 : 스프링 컨테이너는 Singleton 방식으로 객체bean를 운용
Tool tool=(Tool)ctx.getBean("tool");
tool.work();
ctx.close();
}
}
아... 이 코드를 사용하기에 앞서 라이브러리를 사용해야 하는데 솔직히 이 과정은 그냥 지나가는 과정이라 생각하시고 직접 따라 하시지는 마세요. 라이브러리를 다운로드하지 않고 링크로 불러오는 기술(Maven)을 조금 있다가 알아갈 예정이니 잠시만 참고 읽어주세요.
1. ClassPathXmlApplicationContext 객체(ctx)를 생성하여 저희가 만든 applicationContext.xml 파일을 불러옵니다.
2. ctx 객체에서 id 값이 tool인 Bean을 어떻게 가져오는지 확인해 봅니다.
3. 가져온 객체에 있는 메서드를 실행해 봅니다.
결괏값을 보면 같은 객체의 번호로 생성되고 있고,
망치 도구로 일하다가 아주 잘 나옵니다.
컨테이너에 아이디 값으로 잘 저장해 놓으면 자신이 필요할 때 가져와서 사용할 수 있습니다.
그리고 아까 전에 알아보자고 했던 Maven 관련 내용도 작성해 볼게요
Maven이란?
사전적 의미는 전문가입니다. 저희도 이제 전문가라는 소리겠죠???
위의 예시는 사실 라이브러리가 없으면 사용할 수 없는 것인데 그냥 예시를 위해 들어놨습니다. 그렇지만 이제 이것을 알게 되면 더 이상 라이브러리를 어디서 다운로드하여서 넣고 Configure build Path 할 필요가 없습니다.
일단 기존의 Project를 Maven Project로 변경을 해야 합니다.
1. Project에서 오른쪽 마우스 클릭 - Configure - Conver to Maven Project를 누릅니다.
2. pom.xml 파일이 생성될 것입니다.
뭐 엄청나게 긴 설정파일이 생길 것인데 저희는 일단 외부 라이브러리를 가져오는 작업만 할 것이기 때문에 간단하게 들어가 볼게요.
3. pom.xml 파일 가장 밑 </project> 윗줄에 dependencies를 작성합니다.
....중략....
</build>
<dependencies>
</dependencies>
</project>
이렇게 말이죠.
4. Maven Repository 사이트에 들어가서 저희가 사용할 라이브러리를 검색합니다.
5. 검색하고 Spring Context를 클릭하면 버전들이 나오는데 저는 5.3.20 버전을 이용했어요. 각자의 맞는 버전을 이용하세요.
6. 들어가면
이런 곳이 있는데 저기 텍스트를 살짝 한번 클릭하면 복사가 됩니다.
7. 복사한 저 문장은 dependencies 안에 넣으면.... maven dependencies라는 라이브러리가 생기면서 저희가 사용할 객체들이 자동으로 생성됩니다.
<dependencies>
<!--
https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
</dependencies>
이곳에는 아주 유용한 jar 파일들이 많으니 선조들이 만들어주신 것들을 잘 채택해서 사용해야겠습니다.
소감
이렇게 해서 applicationContext를 이용한 IOC를 알아보았습니다. 아직 저도 막 와닿지는 않네요. 설정파일을 변경하면서 사용하는 것도 약간 번거로운 것 같은데 왜 이렇게 하지 라는 생각은 듭니다.
하지만 조금 더 배우다 보면 알게 되겠죠?
너무 조급해하지 말고 천천히 알아가 보아요. 왜냐하면 조급하면 안 좋게 되더라고요.
다음 시간에는 이것보다 더 많이 사용하는 annotation을 알아가 보아요.
'코딩 개발 > Spring' 카테고리의 다른 글
Spring - @Configuration , @ComponentScan, @Repository, @Service, @Autowired (2) | 2023.07.07 |
---|---|
applicationContext.xml - @Component Annotation 사용하기 (0) | 2023.07.07 |
Spring FrameWork 에 대하여 (+ IOC / DI, 간단한 용어 정리) (0) | 2023.07.07 |
Eclipse 에서 Spring 사용하기 (0) | 2023.07.07 |
SOLID (객체 지향 설계 원칙) (0) | 2023.07.06 |