코드프레소 백엔드 개발자 양성 과정

스프링 프레임워크

스프링 프레임워크를 소개하고 주요 개념을 알아본다.

H Lee
5 min readDec 27, 2019
Image by Ngo Minh Tuan from Pixabay

웹 애플리케이션의 규모가 커질 수록 개발자가 기능을 처음부터 만드는 것보다 표준화된 방법을 빌려쓰는 것이 유리하다. 이를 가능케 하는 프레임워크라는 것에 대해 배워보고, 그 중에서도 스프링이라는 프레임워크를 소개하겠다.

프레임워크란?

일반적으로 프레임워크라는 단어는 어떤 것을 구성하는 구조나 뼈대를 말한다. 소프트웨어에선 기능을 클래스나 인터페이스 등으로 미리 만들어 제공하는 반제품을 가리킨다. 프레임워크를 이용하면 다음과 같은 장점이 있다.

  • 개발자가 처음부터 개발할 필요 없이 비교적 짧은 시간 내에 애플리케이션을 만들 수 있다.
  • 이미 품질이 검증된 틀 속에서 개발을 하기 때문에 유지보수가 쉽고 기능을 확장하기 좋다.

스프링 프레임워크

기존의 서버 측 개발을 위한 플랫폼이었던 J2EE라는 ‘겨울’을 지나 새로 출발하는 ‘봄’ 같은 프레임워크란 의미에서 스프링이라고 불리는 스프링 프레임워크는 현재 국내에서 가장 많이 사용되는 프레임워크 중 하나이다. 스프링의 특징은 다음과 같다.

  • 비즈니스 로직을 처리하기 위해 기존에 사용했던 소프트웨어 컴포넌트인 EJB(Enterprise JavaBeans)에 비해 배우기도 쉽고 무게도 가볍다.
  • 제어 역전 기술로 애플리케이션 간의 느슨한 결합을 제어한다.
  • 의존성 주입 기능을 지원한다.
  • 관점 지향 기능을 이용해 자원을 관리한다.
  • 영속성과 관련된 다양한 서비스를 지원한다.
  • 각종 라이브러리와의 연동 기능을 지원한다.

이런 기술들은 EJB에서부터 사용되어 스프링 고유의 것만은 아니다. 하지만 스프링의 주요 개념으로서 개발을 편리하게 해주는 것만은 분명하므로 짚고 넘어갈 필요가 있다.

제어 역전 (Inversion of control)

프로그램상에서 서로 관련이 깊은 데이터와 연산을 ‘객체’라는 하나의 단위로 묶어 개발하는 방식을 객체 지향 프로그래밍이라고 한다. 이런 논리적 단위로 정리했음에도 불구하고 개발자의 임무는 끝나지 않는다. 여전히 이 객체들을 제어하고 순서화해야 하기 때문이다. 하지만 개발자가 수만 가지 가능성이 있는 일련의 제어 과정에서 일일이 코드를 짜 자원을 관리할 수는 없다.

이때, 제어 역전이란 개발자의 통제권을 프레임워크에 넘김으로써 개발자의 부담을 대폭 줄여주는 기술을 뜻한다. 프레임워크의 제어 역전은 라이브러리의 작동 방식과 대조를 이룬다. 라이브러리를 사용할 때는 개발자가 메서드를 호출해서 사용하는 반면, 제어가 역전된 프레임워크 환경에서는 프레임워크가 사용자의 코드를 호출한다.

프레임워크가 프로그래머의 코드를 호출한다는 것이 정확히 어떻게 이루어지는 것인지 와닿지 않을 수도 있다. 제어 역전이 프로그램의 통제권이라는 추상적인 개념을 둘러싸고 있다면, 이를 구체적으로 실현하는 방법으로는 아래에서 살펴볼 의존성 주입이 있다.

의존성 주입 (Dependency injection)

기존의 프로그래밍에서는 한 클래스가 다른 클래스의 기능을 사용하려면 개발자가 직접 코드에서 사용할 클래스의 생성자를 호출해서 사용했다. 당연하게도 사용하는 클래스와 사용되는 클래스 사이에서 개발자가 직접 코드를 부여해야 했다.

위에서 다룬 제어 역전의 연장선상에서, 의존성 주입은 개발자가 아닌 컨테이너가 연관 관계를 자동적으로 규정하는 설계 패턴이다. 이렇게 하면 명시적으로 코드상에서 직접적인 연관 관계가 맺어지지 않으므로 각 클래스들의 변경이 자유로워진다. 이를 약한 결합이라고 하고 바로 위 문단에서 언급한 생성자를 이용한 명시적 객체 생성은 강한 결합이라고 한다.

프로젝트의 규모가 커지고 복잡해질 수록 강한 결합을 많이 맺는 일은 구조적으로 불리한 일이다. 스프링 프레임워크는 의존성 주입을 통해 느슨한 결합을 허용하여 개발 중 변경 사항이 생겨도 빠르게 대처할 수 있게 한다.

관점 지향 (Aspect orientation)

관점 지향은 관심을 분리함으로써 문제 영역을 독립적인 모듈로 분해하는 프로그래밍 패러다임이다. 절차 지향이나 객체 지향처럼 그 자체로 프로그램을 이룰 수는 없으며, 하나의 방법론으로서 객체 지향을 보조하는 역할을 한다.

전산학의 태초에, 단순히 한 소스 코드를 위에서 아래로 훑으며 작동하던 절차 지향 방식은 크고 복잡한 문제를 해결할 수 없었다. 이를 모듈 단위로 나누어 복잡한 구조에서도 유지보수를 가능케 한 것이 객체 지향 방식이었다.

객체 지향 방식은 모듈이라는 단위로 프로그램을 부품화하여 코드의 중복을 낮추고 재사용성을 높인다. 하지만 객체 지향에도 맹점은 있다. 바로 모듈들 사이에서도 중복되는 코드가 발생한다는 점이다. 이렇게 코드 중복을 유발하고 효율성을 떨어뜨리는 사안들을 횡단 관심사라고 하며, 이를 또 따로 모듈 단위로 묶는 방법론을 관점 지향이라고 한다.

아래 도표와 예시를 보며 정리하겠다.

은행 업무를 처리하는 프로그램이 있다고 했을 때, 해당 시스템의 핵심 가치와 목적이 그대로 드러난 관심 영역을 핵심 관심사라고 한다. 은행의 경우 계좌 이체, 입출금, 이자 계산 등의 항목이 있다. 핵심 관심사는 기존의 객체 지향 설계를 통해 쉽게 모듈로 정리할 수 있다.

하지만 로깅, 보안, 트랜잭션, 성능 분석 따위의, 위 세 모듈을 모두 가로지르는 횡단 관심사들은 객체 지향을 통한 모듈화가 쉽지 않다. 이는 횡단 관심사 모듈이 핵심 관심사 모듈과 매우 긴밀하게 결합되어 있기 때문이다.

가령 위 도표에서 가로로 누워있는 보안 모듈을 따로 떼어 세로로 구성한다면 보안 모듈은 의미를 상실하고 만다. 보안은 그 구현 시점에서 계좌 이체면 계좌 이체, 입출금이면 입출금 기능과 상호작용을 했을 때 의미가 있기 때문이다.

스프링 프레임워크는 핵심 기능 중의 한 가지로 관점 지향 설계를 손쉽게 지원해준다.

이상으로 스프링 프레임워크가 무엇인지, 중요한 관련 개념은 무엇이 있는지 알아보았다.

--

--

No responses yet