| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- servlet
- GIT
- 깃
- oracle
- Interface
- di
- iterm2
- URLmapping
- Spring
- IoCContainer
- 설정파일분리
- xml
- Sts
- github
- git커스텀
- 자바
- Java
- springframework
- 깃커스텀
- annotation
- 인터페이스
- 스프링프레임워크
- 객체지향프로그래밍
- 스프링
- 아이텀2
- 객체지향
- macoracle
- 프레임워크
- 깃허브
- viewResolver
- Today
- Total
공부만이 살길
Spirng은 왜 사용하는걸까 ? (1) - DI ( Dependency Injection ) 본문

Spring framework는 java를 기반으로 한 서버 프로그래밍 프레임워크이다.
spring의 핵심 기능을 알면 spring을 사용하는 이유를 이해할 수 있다.
1. Dependency Injection (종속성 주입)
2. Transaction management (트랜잭션 관리)
위 두가지는 spring의 핵심 기능이고, 하나씩 천천히 이해하면서 진행하도록 하자.
웹을 개발할때는 기본적으로 "MVC", "트랙잭션 처리", "웹 사이트 사용자 인증과 권한" 을 위주로 진행된다.
이 3가지를 충족한다면 왠만한 웹은 개발할 수 있다고 할 수 있다.
그렇다면 웹 개발자로서 성장하기 위해선 위 3가지를 공부해야 하는데, 각각을 공부하기 위해서는 선행되어야 하는 지식이 있다.
MVC - DI
트랜잭션 처리 - AOP
인증과 권한 - servelt filter
이 중 DI ( Dependency Injection ) 를 시작하기 전 알아야 할 느슨한 결합력과 인터페이스에 대해 먼저 설명하고 시작하겠다.
" 느슨한 결합력, Interface "
웹에서는 user가 요청을 보내는 UI, 해당 서비스를 진행하는 service, 그를 처리하는 기술인 DAO 가 존재한다.
프로그램은 항상 수정이 필요한데, DAO 내 메소드 A1이 수정이 필요하다고 가정하자.
어떤 방법이 있을까? A1을 새롭게 변화시키거나, 새로운 A2를 만들어 덮어쓰는 방법이 있다.
그러나 이 두가지의 방법은 결국 service에서 사용할 때, DAO.A1을 수정하거나, 새로운 DAO.A2 생성자를 생성해야 한다.
하지만 우리는 덮어쓰기를 하더라도, service단에서의 코드를 바꾸고 싶지 않다. 왜냐하면 DAO에 수정이 있을 때
service의 코드를 변경해야 하는 것은 결합력이 높다고 판단하고 이는 좋은 개발이 아니기 때문이다.
이럴 때 사용할 수 있는 방법이 바로 "Interface" 이다.
인터페이스를 활용하여 service와 DAO가 직접적으로 연결되지 않고
Interface의 A혹은 B와 연결되어 service는 Interface의 A를 사용하고,
DAO는 Interface와 연결되어 있기 때문에 service에서는 변경없이 변동된 A를 사용할 수 있다.
아래 예제는 service에서 사용자의 요청에 의해 A1이 호출될 때이다.
A a = new A1();
service.setA(a);
위 코드는 만약 A2로 변경하게 된다면, service의 코드를
A a = new A2();
로 변경을 해야할 것이다.
그러나 외부파일 setting.txt 를 만들어 패키지의 경로 + 변경할 클래스 name을 넣고
(예를들면 src/package1/exam.A2)
FileInputStream fis = new FileInputStream(“…. setting.txt”);
Scanner scan = new Scanner(fis);
String className = scan.nextLine();
Class clazz = Class.forName(className);
A a = new A();
X x = (X) clazz.newInstance();
a.setA(x);
a.print();
예제일 뿐 실제 코드가 아닌점은 양해부탁드립니다.
파일 내 클래스 이름을 가져와 인스턴스를 만들어 진행하게되면, 새로운 클래스를 만들었을 때
위 service의 코드를 하나하나 변경하지않아도 setting.txt의 클래스이름만 변경해도 변함없이 진행할 수 있을 것이다.
이를 느슨한 결합력을 갖게하는 Interface라고 하고 이제 DI에 대해서 알아보도록 하자
" Dependency Injection (DI) "
번역하자면 '종속성 주입' 이라고 나오지만, 쉽게 생각하면 조립을 한다 라고 볼 수 있다.

A class는 B를 사용하기 위해, A가 생성될 때 b라는 인스턴스를 생성하여 사용하고 있다.
다만 이러한 사용 방법은 A안에 B가 존재하고, B부품 대신 다른 부품을 사용할 수 없다.

위 코드처럼 A, B를 나누고, a.setB를 사용해서 조립을 하게되면,
각자의 부품은 별도로 존재하게 되고, 다른 부품으로 사용하고 싶을 때는 다른 부품을 사용할 수 있게된다.
A입장에서 B는 부품이므로 이 때, new B();를 Dependency (종속성) 이라고 하고,
a.setB(b); 를 Injection (주입) 이라고 한다.
이러한 DI는 수정이 용이하지만, 매번 Injection을 해주어야 한다는 단점이 존재한다.
이러한 Injection (주입) 을 해주는 방법에는 두가지가 있다.
1. setter : a.setB(b);를 통해 생성되어 있던 부품들을 직접 조립해주는 방법.
2. construction : 생성자를 생성할 때 A a = new A(b); 를 통해 조립하는 방법.
이 때 ! spring 의 장점이 나온다.
spring 은 어떤 부품을 원하는지, 어떤 결합을 원하는지를 미리 셋팅한다면
Dependency Injection을 스프링이 해준다.
해당 객체를 조립할 때에는 container가 필요한데, 그것이 바로 IoC Container이다.
바로 부품을 담아내는 박스와도 같다고 볼 수 있는데, 왜 Dependency Container라 하지 않고
IoC Container라고 부르는지와, 이에 대한 설명은 다음 포스팅에서 진행하겠다.
모두들 공부만이 살길! 화이팅 !
공부자료 : youtube 뉴렉처 [ 스프링 프레임워크 강좌 1강~3강, 자바 객체지향 강의 33강 ]
'Spring framework' 카테고리의 다른 글
| DI 지시서 Setting.xml 에서 DI를 작성하는 다양한 방법 (0) | 2024.01.31 |
|---|---|
| ApplicationContext - DI를 생성하고 조립 및 활용할 수 있게하는 객체 (1) | 2024.01.31 |
| STS, MarketPlace Plugin 다운로드 없이 Eclipse로 Spring Project 생성하기 (0) | 2024.01.24 |
| Spring은 왜 사용하는걸까? (2) - IoC Container ( Inversion of Control ) (0) | 2024.01.24 |
| 2024년 1월 스프링 공부 시작합니다. (0) | 2024.01.18 |