DevBoi

[Spring] 스프링 기초 개념 및 공부 (DI 개념, 기초 익히기) 본문

Develop/[Spring]

[Spring] 스프링 기초 개념 및 공부 (DI 개념, 기초 익히기)

HiSmith 2022. 1. 7. 15:18
반응형

스프링의 코어는 제어 역전의 원칙을 기반으로한다.

Ioc : 컴포넌트의 의존성의 생성 및 관리를 외부화 하는 기법이다.

 

Ioc란, 예를 들어 특정 A라는 클래스에서, B라는 클래스의 인스턴스를 사용하는 경우, 가져오는 경우이다.

전통적인 방법으로는 Foo가 new 연산자를 사용해 인스턴스를 생성하거나, 팩토리를 이용해 인스턴스를 가져온다.

 

하지만 Ioc 접근 방식을 통하면, 런타임 시점에 Foo에게 제공된다.

이런 런타임 시점에 의존 관계에 대해서 주입을 하는건 DI라는 이름으로 바뀐다.

 

DI : 자바빈과 인터페이스를 근간으로 한다.

 

스프링 DI 제공자로 사용하면 애플리케이션 내에서 여러가지 방식으로 의존성 설정을 유연하게 설정할수 있다.

(외부 xml 파일, 스프링 사바 설정 파일, 어노테이션 등등)

 

1. 자바빈 (POJO라고도 한다.)

다양한 방식으로 설정할 수 있는 자바 리소스를 생성하는 표준 매커니즘을 제공한다.

사실 스프링에서 관리하는 모든 리소스는 빈이라고 부르기도한다.

 

2. 인터페이스

DI와 서로 도움이 되는 기술이다. 인터페이스를 DI 없이 사용하면, 애플리케이션 개발에 추가적인 코딩부담이 있다.

하지만 DI를 사용하면, 애플리케이션에서 인터페이스 기반의 설계를 사용하는데 필요한 코드량을 0에 가깝게 해준다.

인터페이스는 특정 메소드의 상세내용을 구현하지 않고 기능의 정의만 구현한 추상체이다.

이 추상체를 각 필요한 곳에서 의존성을 주입받아서 (DI) 구현을 하고, 이를 가져다가 쓰면 되기 때문이다.

 

DI는 스프링 프레임워크 보다는 컨테이너 역할을 한다.

애플리케이션의 클래스 인스턴스에 필요한 의존성을 모두 제공하는 역할을 한다. (강압적이지 않고 간단하게)

스프링 클래스를 상속 하지 않아도 되고 고유의 명명 스키마를 따르지 않아도 된다. 다만 DI를 사용하는 애플리케이션에서 수정할 부분이 있다면, 런타임 시점에 더 많은 의존성을 주입할수 있게 프로퍼티를 노출하면 된다.

 

DI의 장점을 간단하게 생각해보자

 

1. 접착 코드를 줄인다.

각각 다른 컴포넌트를 연결하기 위한 코드량을 줄인다. 이는 인터페이스에서 얘기했던 부분과 동일하다.

인터페이스를 구현하기 위한 코드를 0으로 해줌으로써, 불필요한? 인터페이스 설계를 위한 사용을 위한 코드의양을 줄여준다.

JNDI 저장소나, 원격의 리소스를 접착하는 경우에는 코드가 복잡해질수 있지만, 자동 프록시 기능을 통해 접착 코드를 단순화 할 수 있다.

 

2.애플리케이션 설정이 단순화 된다.

DI를 도입하면, 애플리케이션을 설정하는 과정이 매우 단순해진다.

즉 애노테이션과 xml 파일로 어떤 클래스에서 주입받을 클래스 설정을 할수 있고, 이 기법을 사용해 주입시 올바른 인스턴스와,

빈 속성, 특정 속성등에 대해 주입도 가능하다.

또한 이는 주입 변경의 용이성에서도 같은 맥락으로 이점으로 활용된다.

예를 들면, DB에 대한 변경으로 인해 인스턴스 변경이 필요할때, 변경할 인스턴스로 주입 설정을 간단하게 바꾸면 되기 때문이다.

 

3.단일 저장소를 통한 공통 의존성 관리

전통적인 접근 방식으로 자주 사용하는 서비스 (트랜잭션이나 디비 연결 원격 서비스 연결) 을 관리 하려면

필요한 코드에서 의존성 인스턴스를 생성 해야한다.

이렇게 하면 의존성이 여러 클래스에 분포되기 떄문에 추후 관리나 변경이 생겼을때 쉽지 않다.

DI를 사용하면 단일 설정 파일에 해당 정보가 전부 존재하기 때문에 편하게 변경 및 관리를 할수 있다.

즉 단일 저장소에 공통 의존성에 대한 정보가 저장되기 때문이다.

 

4. 테스트가 쉽다.

아까 말했던 디비나 트랜잭션 같은 전통적인  방법을 쓸때는 비즈니스 객체가 DAO 인스턴스 자체를 가져오는 책임까지 맡고있음으로

테스트하기 쉽지않다. 왜냐면 테스트 객체는 Mock 구현체이고, 이 DAO를 해당 구현체로 변경하는 작업은 쉽지 않다.

하지만 DI로 변경하게되면, 해당 DAO구현체를 쉽게 Mock구현체로 변경해줄수 있다.

 

5. 좋은 애플리케이션을 촉진한다.

DI에 맞게 설계한다는 것은 인터페이스를 기준으로 설계한다는 뜻이다. 의존성 주입을 지향하는 애플리케이션은 보통 주요 컴포넌트가 인터페이스로 정의 되어있고, 이는 DI 컨테이너를 사용해 생성하고 연결한다. 이런 설계는 DI나 스프링 같은 컨테이너가 나오기 전에도 자바에서 할수 있는 설계였다.하지만 DI를 위한 코드를 공짜로 스프링을 통해 얻게 되었고

개발자들은 이제 애플리케이션 로직 자체를 개발하는 데만 집중 할수 있게 되었다.

 

단점으로는 내부코드를 잘 모르는 사람들은 DI가 어떤식으로 연결되어있는지 한번에 알기 어렵지만,

이는 시간이 조금 지나면 자연스럽게 익히는 부분이기 때문에 상쇄 된다고 볼수있다.

반응형