공부만이 살길

Spirng은 왜 사용하는걸까 ? (1) - DI ( Dependency Injection ) 본문

Spring framework

Spirng은 왜 사용하는걸까 ? (1) - DI ( Dependency Injection )

공부만이 살길이야 2024. 1. 18. 16:02
반응형
SMALL

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강 ]

 

 

 

 

 

 

반응형
LIST