Developments/Spring & SpringBoot

[Spring Boot] 프레임워크와 라이브러리

9low_28 2022. 9. 20. 17:33

 프레임워크?    라이브러리? 

 

프레임워크란 뼈대나 기반 구조를 뜻한다. 제어의 역전(IoC) 개념이 적용된 대표적인 기술이며,

소프트웨어에서의 프레임워크는

 

'소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합' 

 

이라 할 수 있다.

완성된 어플리케이션이 아닌 프로그래머가 완성시키는 작업을 해야한다.

 

 

라이브러리는 단순 활용가능한 도구들의 집합이라 할 수 있다.

즉, 개발자가 만든 클래스에서 호출하여 사용,

클래스들의 나열로 필요한 클래스를 불러서 사용하는 방식을 취하고 있다.

 

 

 

라이브러리는 특정하게 정의된 클래스를 호출하여 사용한다는 것은 쉽게 이해가 가지만, 프레임워크는 '제어의 역전(IoC)'이라는 개념을 모르고 있다면 이해하기가 쉽지 않다. 순전히 뼈대나 기반 구조라고 추상적으로 생각한다면 더욱이 감이 오지 않을 것이다.  우선 제어의 역전을 이해하기 전에 흐름에 대해 살펴보자.

 

여기서 관건은 애플리케이션의 흐름을 누가 주도하느냐가 될 것이다. 프레임워크는 전체적인 흐름을 쥐고 있으며 사용자는 그 안에서 필요한 코드를 작성해넣지만, 라이브러리는 사용자가 전체적인 흐름을 만들면서 필요한 라이브러리를 가져다 쓰는 것이라고 할 수 있다. 다시 말해, 라이브러리나 작성된 코드는 라이브러리를 가져다가 사용하고 호출하는 측에 전적으로 주도성이 있으며 프레임워크는 그 틀안에 이미 제어 흐름에 대한 주도성이 있다는 것이다.

 


 

 스프링 프레임워크(Spring Framework)란? 

 

스프링 프레임 워크를 가장 잘 정의한 표현은

자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크

라고  생각한다.

 

※ 경량 프레임워크 (light-weight framework)
90년대 말에 복잡한 구동 환경과 하드웨어적인 구성이 필요한 프레임워크에 반대되는 개념으로 등장했습니다. 이전의 J2EE 기술은 너무나 복잡하고 방대하여 전체를 이해하고 개발하기엔 어려운 점이 많다고 판단하였고, 이러한 문제를 해결하기 위해 특정 기능을 위주로 간단한 jar 파일 등을 이용하여 모든 개발이 가능하도록 구성된 프레임워크를 의미합니다.

출처: [FREESTROKES DEVLOG:티스토리]

 

 

 

프레임워크가 무엇인지 위에서 다루었지만, 그냥 프레임워크가 아닌 '애플리케이션 프레임워크'까지는 아직 파악하지 못했는데,

이 부분도 짚고 넘어가보자.

 

 

일반적으로 라이브러리나 프레임워크는 특정 업무 분야나 한 가지 기술에 특화된 목표를 가지고 만들어진다. 그래서 프레임워크는 애플리케이션의 특정 계층에서 주로 동작하는 한가지 기술 분야에 집중된다.


이와 달리, '애플리케이션 프레임워크'는 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애츨리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말한다. 즉, 애플리케이션 프레임워크는 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 두는 프레임워크이다.

 

 

 

► 스프링이 갖는 타 프레임워크와의 차별성

1. 복잡함에 반기를 들어서 만들어진 프레임워크
- 엔터프라이즈급의 시스템이 실패하는 이유를 '복잡성'으로 보고 이를 해결하기 위해 나온 경량화된 프레임워크
- 일반적인 Java 클래스와 인터페이스를 이용하는 구조를 사용하고 EJB에 비해 가벼움
- 진입 장벽이 높지 않고 빠른 시간에 엔터프라이즈급의 시스템 구축이 가능

2. 프로젝트 전체 구조 설계에 유용한 프레임워크
- 이전에 다른 프레임워크들은 웹이나 데이터베이스 등의 전문적인 영역에 대해서만 지원하는 경우가 많았음
- 스프링은 어느 한 분야에만 집중하지 않고 전체를 설계하는 용도로 사용 가능
- 제어의 역전(IoC) 개념

3. 다른 프레임워크들의 포용
- 전체 구조에 집중하여 설계되었기 때문에 다른 프레임워크와 공존하는 방식으로 사용 가능
- 다른 프레임워크들과의 통합을 지원하여 최소한의 수정이 가능
- 기본 뼈대를 흔들지 않고 여러 종류의 프레임워크를 혼용해서 사용 가능

4. 개발 생산성과 도구의 지원
- 스프링은 이론적으로 개발자가 이해해야하는 부분이 많지만 결과적으로 코드의 양은 줄어둠
- XML 설정을 이용하여 유지보수가 용이함
- STS, Eclipse, Intellij 등의 플러그인도 지원하여 새로운 개발 도구에 대한 별도의 적응 없이도 개발이 가능

출처: [FREESTROKES DEVLOG:티스토리]

 

 


 제어의 역전(IoC)과 의존성 주입(DI)

 

 

 제어의 역전이란?

 

보통의 Java 프로그래밍에서는 사용하려는 객체를 선언하고, 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용한다.

즉, 개발자가 객체를 생성하고 사용하는 작업들을 직접 제어하는 것이다.

 

하지만 Spring은 기존 자바 개발 방식과 다르게 객체를 직접 생성하지 않고 컨테이너(container)에 맡긴다.

컨테이너에 제어권이 넘어간 것을 제어의 역전(IoC)이라고 한다.

객체의 제어권이 컨테이너로 넘어가면 개발자는 비즈니스 로직을 작성하는데 더 집중할 수 있기 때문에 좋다.

 

의존성 주입(DI)를 사용하면 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용할 수 있다. 다른 방식과 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문에 장점이다.

 

 

► IoC 컨테이너란?

스프링을 실행하면 컴파일을 하면서 annotation이 붙은 코드로부터 생성하는데 이것을 Bean이라고 한다.
이 Bean을 모아두고 관리하는 공간을 IoC 컨테이너라고 한다.

@autowired 라는 어노테이션을 붙이면 스프링이 의존성 주입을 시켜준다.

 컨테이너에 관한 내용과 대표적인 어노테이션은 추후 자세히 다루겠다.

 

 

 

 

 의존성 주입(DI)이란?

객체를 직접 생성하지 않고, 스프링컨테이너가 외부에서 가져와 자동으로 연결해주는 방식이다.

 

 의존성 주입을 해야하는 이유

자바는 클래스간 의존성이 높다. 의존성이 높은 객체를 생성하게 되면 클래스간의 결합도가 높아지는데 때문에 코드의 재활용성이 떨어지고, 클래스가 수정되었을때 의존되어있는 클래스들을 수정해야하는 단점이 생긴다.

 

※  그렇다면 의존성 주입의 장점은

  • 코드의 재활용성이 높아진다.
  • 코드를 단순화한다.
  • 클래스간 결합도가 낮아져 유연성과 확장성이 높아진다.