스프링
이름도 힘든 개발을 했던 겨울이 가고 개발하기 좋은 봄이왔다는 것을 의미한다.
프레임워크와 스프링부트
애플리케이션을 만들 때 프레임워크 없이 개발하는 것은 어렵고 고된일이다. 프레임 워크는 용도에 맞는 일반적인 기능들을 보편적인 방식으로 제공한다. 예를 들어 웹 애플리케이션은 HTTP 프로토콜을 사용하여 사용자 요청에 따른 적절한 응답을 한다. 그래서 웹 애플리케이션 프레임 워크는 HTTP 프로토콜 기반의 요청(request)과 응답(response) 울 처리할 수 있도록 특정 객체나 클래스등을 제공한다. 개발자는 프레임워크에서 제공하는 기능을 사용하면 보다 편리하고 쉽게 애플리케이션을 개발할 수 있으며, 이는 곧 개발자의 개발자의 생산성향상으로 이어진다.
프레임워크를 선택하는 방법도 다양하다. 상황에 따라 직접 만들어 사용하거나 이미 만들어진 오픈 소스 프레임워크 또는 상업 제품 프레임워크를 사용할 수 있다. 하지만 수많은 자바 개발자는 웹 어플리케이션을 개발할 때 스프링프레임워크를 가장 먼저 고려한다. 스프링 프레임워크는 사실살 자바 표준 프레임워크이며, 수많은 개발자가 사용하고 있다. 이런 이유로 많은 자바 개발자는 프레임워크를 선정할 때 별다른 고민을 하지 않는다.
프레임워크 선정
개발자는 프레임워크가 제공하는 기능을 활용하여 애플리케이션을 개발한다. 일반적인 기능을 프레임워크가 처리하고 개발자는 비지니스 로직을 개발한다. 개발된 애플리케이션을 실행하면 프레임워크의 코드가 개발자가 개발한 비즈니스 로직을 실행하는 형태이다. 결국 프레임워크를 사용하는 개발자는 프레임워크가 제공하는 기능과 개발 방법을 알아야 한다. 프레임워크마다 제공하는 기능과 방식이 다르므로 개발자가 개발하는 비지니스 로직 코드는 프레임워크 방식을 따라야한다. 이때 개발자의 코드는 프레임워크에 의존성이 생기는데 이 의존성 때문에 이미 개발된 애플리케이션의 프레임워크를 변경하는 일이 매우 어렵다, 특히 운영중인 애플리케이션의 프레임워크를 바꾸면 프레임워크 기능이 달라지므로 그 결과도 다를 수 있다.
스프링 프레임워크로 애플리케이션을 개발할 때 개발자가 개발한 코드가 얼마나 프레임워크에 의존성이 생기는지 알아보자. 개발자는 스프링 프레임워크가 제공하는 여러가지 유틸리티 클래스를 직접 사용할 수 있다. 또한 스프링 빈 컨테이너에 자신의 코드를 관리하기 위해 스프링 프레임워크에서 제공하는 애너테이션도 사용해야한다.
이렇게 스프링 빈으로 관리하면 ApplicationContext 가 제공하는 트랜잭션관리, 비동기 프로그래밍, AOP 등 여러 기능을 사용할 수 있다. 이 기능들 또한 스프링 프레임워크가 안내하는 방식에 따라 개발해야 한다. 그러면 개발자가 만들어낸 코드는 스프링에서 안내하는 구조로 개발되며, 코드 내부에 스프링의 애너태이션이 포함될 수 있다. 혹은 스프링 프레임워크의 관례에 따라 메서드의 매개변수 순서를 조정하거나 생성자를 생성해야한다. 이렇게 개발된 프로그램은 스프링 프레임워크에 적합한 코드가 되는 대신 다른 프레임워크를 사용하기 어려운 상태가 되는데 이를 락인(Lock-In) 이라고한다.
스프링 프레임워크의 특징
- POJO(Plain Old Java Object) 기반의 경량 컨테이너 제공
- 복잡한 비즈니스 영역의 문제를 쉽게 개발하고 운영하기 위한 철학
- 여러 개의 개별 단위로 구성되어 있는 모듈식 프레임워크
- 높은 확장성 및 범용성, 광범위한 생태계 시스템
- 엔터프라이즈 애플리케이션에 적합한 경량급 오픈 소스 프레임워크
POJO 기반의 경량 컨테이너
모든 스프링 애플리케이션은 POJO 객체와 스프링 컨테이너를 포함한다. 개발자는 POJO 클래스를 개발하고 스프링 컨테이너는 이 POJO 객체들을 관리한다. (POJO 객체의 생성과 의존성 주입, 객체 소멸까지 생명주기를 관리한다.) 이때 스프링 컨테이너가 관리하는 객체를 스프링 빈이라고 한다. 스프링 컨테이너는 o.s.context.ApplicationContext 인터페이스를 구현한 구현 클래스들을 의미한다. 스프링 컨테이너가 스프링 애플리케이션에서 가장 중요한 기능을 제공한다.
POJO 객체는 특정 기술에 종속되지 않는 순수 자바 객체를 의미한다. EJB 프레임워크를 사용하려면 javax.ejb 패키지에 포함된 인터페이스를 클래스에 구현하거나 특정 클래스를 상속받아 부모 클래스의 메서드를 오버라이드 해야 한다. 구현과 오버라이드 과정을 거치면 EJB 프레임워크의 메서드가 사용자 클래스에 구현되는데, 이를 프레임워크의 코드가 침투된다고 표현한다. 이를 통해 프레임워크와 개발자의 코드는 매우 강하게 결합된다. 이와 반대로 스프링 프레임워크를 사용하면 프레임워크 코드는 사용자의 코드에 최대한 적은 영향을 준다. EJB 처럼 특정 클래스의 메서드를 구현할 필요가 없다. EJB 와 비교하면 비침투적인 프레임워크로, EJB와 달리 개발자가 개발하는 클래스는 프레임워크의 코드와 분리되어 있고 비지니스 로직을 구현하는 데 집중되어 있어 복잡도가 낮다.
복잡한 비즈니스 영역의 문제를 쉽게 개발하고 운영하기 위한 철학
스프링 프레임워크의 세 가지 핵심 요소는 의존성주입, 관점지향프로그래밍, 서비스 추상화이다.
이들은 POJO 객체를 기반으로 동작하도록 설계되었다. 그리고 개발자가 도메인 영역의 문제에 집중할 수 있도록 설계되었다. 그리고 개발자가 도메인 영역의 문제에 집중할 수 있도록 환경을 만들어준다.
스프링 프레임워크의 핵심 요소 중 가장 중요한 의존성 주입을 확인해보자.
소프트웨어상에서 해결해야 할 비지니스 영역의 문제를 도메인이라고 한다. 예를들어 스프링 투어는 빠르고 정확하게 여러 상품을 한 번에 예약하는 문제를 비즈니스 영역에서 해결해야 한다. 이를 예약 도메인 영역이라고 한다. 통합 예약을 처리하는 클래스는 호텔 예약을 처리하는 클래스와 비행기 예약을 하는 클래스의 메서드를 사용해야하므로 의존성이 생긴다. 해결해야 하는 도메인 문제가 복잡하게 얽혀있다면 그만큼 클래스들의 관계가 복잡해진다. 스프링 프레임워크는 복잡한 클래스들의 관계를 해결하는데 의존성 주입기능을 제공한다.
관점지향 프로그래밍 역시 도메인 영역의 핵심 기능 코드를 작성할 수 있도록 해준다. 소프트웨어 공학에서 시스템이 사용자에게 직접 서비스하는 기능을 정리한 것을 기능적 요구사항이라고 한다. 이와 반대로 서비스 기능은 아니지만 개발에 필요한 기능들을 정리한 것은 비기능적 요구사항이라고 한다.
예를들어 여행상품을 한 번에 예약하기 위해 데이터를 조회하고 생성하는 작업은 기능적 요구사항을 위한 코드다. 하지만 로그를 남기거나 RDBMS 의 트랜잭션을 시작하고 커밋하는 코드들은 서비스를 위한 코드가 아니다. 사용자는 RDBMS 의 트랜잭션이 무엇인지 알 필요가 없다. 사용자가 사용하는 시스템이 RDBMS 의 트랜잭션을 사용하든 NoSQL 을 사용하든 간에 사용자 관심은 오직 편리하고 정확하게 예약하는 것이다. 사용자 관심 밖에 있는 이런 기능들이 바로 비기능적 요구 사항을 위한 코드다. 하지만 개발자는 이런 비기능적 요구사항을 위한 코드가 섞인다면 코드가 복잡해진다. 스프링 프로그래밍은 비기능적 요구 사항 기능을 핵심 기능과 분리하는 기능을 제공한다.
마지막으로 서비스 추상화는 트랜잭션 기능을 사용하여 설명한다, 스프링 프레임워크는 데이터를 저장소에 저장하는 다영한 프레임워크를 붙혀 사용할 수 있다. 데이터를 저장하여 객체를 유지할 수 있어 영속성이라고 하며, 이를 영속성 프레임워크라고 한다. 대표적인 영속성 프레임워크들은 스프링에서 제공하는 Spring-Data-JDBC, SQL 을 메서드와 매핑해주는 MyBatis , 객체와 관계형 데이터베이스를 매핑해주는 JPA 등이 있다.
여러 개의 개별 단위로 구성되어 있는 모듈식 프레임워크
스프링 프레임워크는 엔터프라이즈 애플리케이션을 개발할 수 있는 여러 기능을 포함하고 있다. 기능들은 성격에 따라 분류하여 모듈이라는 단위로 관리한다. 개발자는 필요한 모듈들을 레고 블록처럼 조합하여 필요한 기능만 사용할 수 있다. 그래서 스프링 프레임워크를 모듈식이라고 한다.
스프링 프레임워크는 약 20여개의 모듈로 구성되어있다.
높은 확장성 및 범용성, 광범위한 생태계 시스템
앤터프라이즈 애플리케이션이나 마이크로서비스 아키텍처로 확장되면서 용도에 맞는 여러 기술이 필요해진다. 예를들어 상품검색, 목적과 상황에 필요한 여러 가지 데이터 저장소와 배치 프로세스 등 다양한 형태의 애플리케이션이 있다. 스프링 프레임워크는 여러 형태로 확장할 수 있는 범용적인 애플리케이션을 만들 수 있도, 여러가지 기술과 연동 및 확장할 수 있는 다양한 형태의 프로젝트를 제공한다. 배츠 프로세스를 위한 스프링 배치 프레임워크를 제공하며, 스프링 프로젝트만으로도 웹 서비스나 REST-API 애플리케이션을 개발할 수 있다. 여기에 스프링 시큐리티 프레임워크를 웹 애플리케이션에 얹으면 인증 서버나 애플리케이견의 인증, 인가를 매우 쉽게 구현할 수 있다.
다양한 스프링 프로젝트 중 스프링 데이터 프로젝트는 여러 가지 데이터 저장소에 일관된 방법으로 데이터를 처리할 수 있는 방법을 제공한다.
스프링 데이터 프로젝트의 확장성은 아래와 같다.
프로젝트 이름 | 설명 |
Spring Data JDBC | 자바 애플리케이션이 데이터베이스에 연결하는 JDBC 를 사용하는 프로젝트 |
Spring Data JPA | JPA 를 사용하는 프로젝트 |
Spring Data LDAP | LDAP 프로토콜을 사용하는 프로젝트 |
Spring Data Mongo | MongoDB 를 사용하는 프로젝트 |
Spring Data Redis | 메모리 저장소인 Redis 를 사용하는 프로젝트 |
Spring Data GemFire | 인메모리 데이터 그리드인 GemFire 를 사용하는 프로젝트 |
Spring Data Couchbase | NoSQL 인 Couchbase 를 사용하는 프로젝트 |
Spring Data Elasticsearch | 검색 엔진 엘라스틱 서치를 사용하는 프로젝트 |
엔터프라이즈 애플리케이션에 적합한 경량급 오픈 소스 프레임워크
스프링 프레임워크는 외형적으로는 모듈 방식과 높은 확장성 덕분에 여러 형태의 애플리케이션을 개발할 수 있어 엔터프라이즈 애플리케이션의 요구 사항에 적합하다. 게다가 코드 또한 쉽고 간결하게 유지할 수 있는 스프링 트라이앵글 핵심 기술 세가지를 제공한다. 스프링 프레임워크를 이용하면 일관성있는 기술세트로 엔터프라이즈 애플리케이션을 개발할 수 있다.물론 마이크로 서비스 아키택쳐에서 상황에 따라 여러 언어로 개발하는 폴리글랏 프로그래밍을 할 수 있는 장점도 있지만 하나의 프레임워크와 일관성있는 프로젝트들로 마이크로서비스 아키텍쳐를 구성하는 것도 시스템 유지 보수 및 작은 팀 구성에 유리하다.
'개발중 > Spring' 카테고리의 다른 글
JWT 인증과 Session 인증의 차이 (2) | 2023.01.18 |
---|---|
[SpringBoot] SpringBoot Retrofit (2) | 2023.01.17 |
[Spring] 단일책임원칙을 지키고 있나요 (0) | 2022.12.16 |
intellij jdk 설정하는 방법 기록하기 ✍ (0) | 2022.12.04 |
[스프링] Intercepter 설정하는 법에 대해서 ✍ (0) | 2022.12.02 |