본문 바로가기
SPRING/개념

[ 개념 ] 스프링(spring)이란? 사용이유 IOC DI AOP

by hak0205 2021. 5. 30.
반응형

1. 스프링(Spring)이란

Java EE(Java Enterprise Edition) 개발을 편리하게 해주는 오픈소스 경량급 애플리케이션 프레임워크입니다.

 

1.1 JAVA Enterprise Edition

JAVA Enterprise Edition는 자바를 이용한 서버 측 개발을 위한 플랫폼입니다.

(Enterprise Edition은 웹 애플리케이션 서버에서 동작하는 장애 복구 및 분산 멀티미디어를 제공하는 자바 소프트웨어의 기능을 추가한 서버를 위한 플랫폼입니다.)


1.2  경량급

스프링이 가볍다고 하는 이유는 스프링은 불필요하게 무겁지 않다는 의미입니다. 코드에 불필요하게 등장하던, 프레임워크와 서버 환경에 의존적인 부분을 제거해주기 때문에 가볍다고 합니다. 즉, 빠르고 간편하게 작성하게 해 줌으로써 생산성과 품질 면에서 유리하다는 것이 바로 경량급이라는 말로 표현되는 스프링의 특징입니다.

스프링의 특징으로는 크기와 부하 측면에서 경량 시킨 것과, IOC 기술로 애플리케이션의 느슨한 결합을 도모시킨 것이 있습니다.

 

2. 스프링 사용이유

스프링 사용이유는 대표적으로 다음과 같습니다. Ioc(Inversion of Control, 제어의 역전), DI(Dependency Injection, 의존성 주입), Aop(Aspect-Oriented Programming, 관점 지향 프로그래밍)가 있습니다.

 

2.1 Ioc(Inversion of Control, 제어의 역전)

Ioc(Inversion of Control, 제어의 역전)란 객체에 대한 제어권이 바뀌었다는 것으로 객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너가 담당하는 것을 말합니다. 즉, 개발자가 직접 객체를 생성하고 의존 관계를 맺어줄 필요가 없습니다.

 

여기서 말하는 컨테이너는 ioc컨테이너인데 객체의 생성을 책임지고 객체를 관리하며 그리고 의존성을 관리하는 컨테이너이라고 말할 수 있습니다.


2.2 DI(Dependency Injection, 의존성 주입)

먼저, 의존이란 객체와 객체의 결합관계입니다. 하나의 객체에서 다른 객체의 변수나 메서드를 이용해야 한다면, 이용하려는 객체에 대한 객체 생성과 생성된 객체의 레퍼런스 정보가 필요합니다. 예를 들어 한 A클래스 내에서 B클래스의 객체를 생성해서 사용한다고 하면 A클래스는 B클래스에 의존하고 있다고 합니다.

 

그리고 의존성 주입이란 A라는 객체에서 B를 생성하는 것이 아니라 외부에서 생성된 B를 A에 주입하는 것입니다. 이것을 의존성 주입이라고 합니다.

 

2.2.1 의존성 주입 장점

1) 객체 상호 간 의존성 관계를 줄여줍니다.
2) 내부가 아닌 외부에서 의존성을 주입 하 때문에 코드의 재사용이 용이합니다.
- 재사용성 : 코드 재사용을 높여서 작성된 모듈을 여러 곳에서 소스코드의 수정 없이 사용할 수 있습니다.

3) 코드들이 분리되다 보니 가독성이 뛰어나 진다.

 

즉, 각 객체의 의존관계를 빈 설정 정보 바탕으로Ioc컨테이너가 자동으로 연결시켜주는 것이기도 합니다.

 

2.2.2 의존성 주입의 종류

(1) 생성자

  생성자에 인자로 주입하고자 하는 객체를 넣어줍니다.

- 생성자 주입은 딱 한 번만 실행되므로 이후에 호출될 일이 없다. 따라서 불변하게 설계할 수 있다.
- final 키워드 사용이 가능합니다. 혹시라도 값이 설정되지 않는 오류를 컴파일 에러를 통해 직접 막아줄 수 있습니다.
- 순환 참조 방지 객체를 생성하는 시점에서 빈을 주입하기 때문에 서로 참조하는 객체가 생성되지 않는 상태에서 그 빈을 참조하기 때문에 오류가 발생하여 순환 참조를 사전에 방지할 수 있다.


(2) setter(수정자) 주입

필드 값을 변경하는 Setter를 통해서 의존 관계를 주입하는 방법입니다. Setter 주입은 생성자 주입과 다르게 주입받는 객체가 변경될 가능성이 있는 경우에 사용합니다.

(3) 애노테이션 (필드 인젝션)

@Autowired라는 애노테이션을 이용하여 의존성을 주입합니다.

 

- 장점

 코드의 양이 줄어드는 장점이 있습니다.
- 단점
1. 불변성(Immutability)
Constructor Injection과 다르게 Field Injection은 final을 선언할 수 없습니다. 그래서 객체가 변할 수 있습니다
2. 순환 의존성
Constructor Injection에서 순환 의존성을 가질 경우 BeanCurrentlyCreationExeption을 발생시킴으로써 순환 의존성을 알 수 있습니다.
- 순환 의존성이란?
First Class가 Second Class를 참조하는데 Second Class가 다시 First Class를 참조할 경우 혹은 First Class가 Second Class를 참조하고, Second Class가 Third Class를 참조하고 Third Class가 First Class를 참조하는 경우 이를 순환 의존성이라고 부릅니다. (혹은 순환 참조라고 합니다.)


2.3 AOp(Aspect Oriented Programming)


- 핵심 기능과 공통 기능을 분리시켜놓고, 공통 기능을 필요로 하는 핵심 기능들에서 사용하는 방식의 AOP가 등장하였습니다. 기능을 핵심 비즈니스 기능과 공통 기능으로 '분리'하고, 공통 기능을 개발자의 코드 밖에서 핵심기능들이 필요한 시점에 적용하는 프로그래밍 방법이라고 할 수 있습니다.

즉, 기존에 작성한 핵심 비즈니스 로직의 변경 없이 AOP를 적용시켜 로그, 인증 등 공통적인 기능을 수행하는 것을 말합니다.

 

-Annotation

@Pointcut : 적용할 타깃을 정의해줍니다. (전체 컨트롤러의 함수대상, 특정 어노테이션을 설정한 함수대상, 특정 메소드 대상 등 개발자가 적용하길 원하는 범위를 정의하는 어노테이션)

@Before : 타깃 메서드가 실행되기 '전' 수행됩니다.

@After(Returning) : 적용할 타겟 메소드가 실행된 '후' 수행됨 (제일 마지막에 수행됨)

@Around : 타겟 메소드 전 후의 특정 로직을 수행해야 할 경우

@pointcut은 적용할 타깃을 정의해주고

@Before는 타겟 메서드 실행 전에 공통 로직을 적용하고 싶을 때, @After는 메서드 실행 후 공통 로직을 적용하고 싶을때, @Around는 메서드의 실행 전/후에 공통로직을 적용하고 싶을 때 사용합니다.

즉,  어느 시점에 적용할 것인지를 정의하는 것입니다.

 

감사합니다.

 

 
 
반응형

댓글