들어가며
JAVA를 메인 언어로 선택했다면 당연히 사용하게 될 스프링 프레임워크.
당연하다고 무조건 사용하는게 아니라 어떤 특징이 있고 장,단점은 무엇인지 알고 사용하는게 좋지 않을까?
예전 포스팅에서 다룬 적이 있지만 이번에는 조금 디테일하게 스프링 프레임워크에 대해 알아보기로 하자.
스프링 프레임워크의 탄생 배경
늘 말하는 거지만 공부 목적인 이 포스팅보다는 잘 정리된 글을 읽어보는걸 더 추천한다!
자바는 Spring을 씁니다!라고 해서 무작정 Spring을 쓰기 시작한 나같은 초보 개발자(지망생)은 자바EE 혹은 J2EE에 대해서는 잘 모르는게 당연하다. 최신 기술에게 자리를 빼앗긴 옛날 기술은 역사 속으로 묻히기 마련이기 때문이다.
J2EE(Java to Enterprise Edition)은 그때 당시(2000년 초반이라고..) 기업용 어플리케이션 개발을 위한 표준으로 Servlet, JSP, EJB등으로 구성된 기술들의 집합이다. 이 중에서 핵심 기술은 EJB(Enterprise Java Bean)인데, 김영한 강사님의 강의에 따르면 당시 자바당의 정파 기술이었다고 한다. EJB는 자바EE가 대체하는 미들웨어에서 구동되던 기업의 핵심 서비스를 만들기 위한 분산처리 및 트랜잭션, 보안 등을 지원하는 컴포넌트 모델을 제공하는 기술이라고 하는데... 많은 개발자의 주목을 받던 기술이었지만 시간이 지날 수록 많은 문제점들이 드러나기 시작한 것이다.
다양한 기능을 제공하는 종합선물세트급의 퍼포먼스를 가진 기술이었지만 일단 '비싸다'는 단점도 있었고, 원하는 기능을 구현하기 위해서는 끔찍한 설정 지옥에 빠지게 되는 것이었다. 심지어 느리기까지하고, 표준으로 정의되지 않는 기술을 각자 다른 방식으로 구현해서 판매한 기업들의 특정 제품을 사용하게 되면 그 제품에 종속되어버리는 문제까지 생겨버렸다.
EJB의 지저분하고 의존적인 성향에 질려버린 개발자들이 기존의 순수한 자바로 돌아가자며 오래된 방식의 간단한 자바 오브젝트라는 의미인 POJO(Plain Old Java Object)라는 단어를 만들어냈다고 하니 그들의 분노가 얼마나 컸는 지 알 수 있다.
스프링 프레임워크는 EJB보다 훨씬 단순하면서도 더 좋은 방법을 개발할 수 있다는 주제로 2002년 로드 존슨이 출판한 저서을 기반으로 만들어진 기술이다.
더 편리한 개발을 가능하도록 기여해준 지난 수 많은 개발자분들에게 감사하며 재미없는 역사 이야기는 여기까지 하기로 하고, 스프링 프레임워크에 대해 본격적으로 알아보자
스프링 프레임워크(Spring Framework)
스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 간단히 스프링(Spring)이라고도 한다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다.
출처 - 위키백과
스프링 프레임워크는 기존의 J2EE에서 제공하는 대부분의 기능을 제공하는 오픈소스 경량급 어플리케이션 프레임워크이다. 전통적인 J2EE(EJB)를 겨울이라고 지칭하고, 이를 넘어 새로운 '봄'의 시작이라는 뜻으로 Spring이라고 명명한게 그 시작이라고 한다.
경량급? 가볍다고?
경량급은 기존의 EJB처럼 툴의 도움 없이는 다루기 힘든 난해한 설정파일 구조와 까다로운 패키징, 불편한 서버 배치 등으로 인한 부담을 없애고, 쉽게 해당 기능들을 사용할 수 있게 되었음을 의미한다.
스프링과 스프링부트
최근에는 '스프링'이라고 하면 스프링 부트를 의미하는 경우가 대부분이다. 둘의 차이가 뭘까?
스프링 프레임워크가 기존의 J2EE에 비해 간단해졌다고 해도 여전히 설정 지옥에서 벗어날 수는 없었다.
개발자들은 Spring MVC의 최소한의 기능을 사용하는 프로젝트를 세팅하기 위해 다음과 같은 설정 코드를 작성했어야했고,
Hibernate를 사용하기 위해 다음과 같은 설정 코드를 또 작성해야했다.
스프링 부트는 대부분의 설정을 자동으로 해주고 그 외의 원하는 기능들은 Maven 혹은 Gradle에 의존성 추가를 해줌으로써 간단하게 프로젝트를 세팅할 수 있다.
결론적으로 Spring과 Spring Boot의 가장 큰 차이점은 설정코드를 개발자에게 위임하느냐, 자동으로 해주냐로 정리할 수 있겠다.
Spring Boot를 사용함으로써 스프링을 이용한 개발을 조금 더 편리하게 할 수 있다.
예전에 멘토링할 때 들은 말을 인용하자면
Spring : 맛없음
Spring boot : 덜 맛없음
이라고 한다. 덜 맛없는 맛으로 개발하자.
특징
- 생명주기 관리
스프링은 경랑 컨테이너로서 자바 객체를 직접 관리한다.
각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다. - POJO(Plain Old Java Object) 기반의 구성
위에서 잠깐 언급되었던 POJO.
POJO는 Java EE의 EJB 를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하며 나타난 용어이다.
스프링은 내부적으로 별도의 API를 사용하지 않고, 일반적인 Java 코드를 이용하여 객체를 구성하는 방식을 그대로 사용하고 있다. 이는 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않는다는 것을 의미한다. - 제어의 역전(IoC, Inversion of Control)
스프링은 IoC를 지원한다.
기존에는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. IoC는 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 개발자는 객체를 직접 생성하지 않으며, 필요에 따라 스프링 프레임워크가 개발자의 코드를 호출한다. - 의존성 주입(DI, Dependency Injection)
DI란 각각의 계층이나 서비스들 간의 의존 관계를 외부에서 설정을 통해 정의되는 방식이다. 즉, 각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것이다. DI를 통해 모듈 간의 결합도가 낮아지고 코드의 유연성이 높아진다. - 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)
스프링의 이러한 특징으로 인해 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다.
따라서 개발자는 핵심 비즈니스 로직에 집중하여 코드를 개발할 수 있고, 각 프로젝트마다 다른 관심사를 적용할 시 코드 수정이 최소화 되며, 유지보수가 수월한 코드 구성이 가능해진다.
장점
이런 특징을 바탕으로 생각하면 스프링의 장점은 강력하다.
제어의 역전과 의존성 주입, 관점 지향 프로그래밍은 그 자체로 개발자에게 용이한 단위 테스트, 빠른 속도, 유지보수가 쉬운 코드를 짤 수 있도록 보장해준다는 점이 가장 큰 장점으로 꼽을 수 있다.
그리고 일단 '프레임워크'라는 점에서 정형화된 기술은 일정한 수준의 어플리케이션을 기대할 수 있게 해준다.
또, 다양한 모듈을 제공하는 만큼 유연성 또한 좋다. 예를 들어, 스프링은 MyBatis나 JPA같은 영속성과 관련된 완성도 높은 데이터 처리 라이브러리나 인터페이스를 제공한다.
스프링 공식 홈페이지에서 말하는 스프링의 장점은 다음과 같다
“We use a lot of the tools that come with the Spring framework and reap the benefits of having a lot of the out of the box solutions, and not having to worry about writing a ton of additional code—so that really saves us some time and energy.”
"우리는 Spring 프레임워크가 제공하는 많은 툴을 사용하며, 바로 사용할 수 있는 많은 솔루션이 있다는 점, 그리고 많은 추가 코드를 작성할 필요가 없다는 점이 있습니다. 이러한 장점들로 우리는 시간과 에너지를 아낄 수 있습니다."
추가로 읽어보면 좋은 글
마치며
스프링 프레임워크가 강력한 툴임은 부정할 수 없지만, 분명 그 단점도 존재한다.
JAVA 언어를 선택했다면 Spring의 사용은 피할 수 없지만, 공부를 거듭하면서 다른 언어와 프레임워크를 습득하는 것도 좋은 개발자가 되는 길이라고 생각하며, 이번 포스팅을 마치도록 하겠다.
출처 및 참고
<스프링 핵심원리 기본편> 김영한 강사님, 인프런 제공
[Spring] 스프링 프레임워크(Spring Framework)란?
'Study > Spring boot' 카테고리의 다른 글
[JPA] JPA, Hibernate, Spring Data JPA의 차이점 (0) | 2022.06.20 |
---|---|
[Spring boot] RestControllerAdvice를 이용한 예외 처리 (0) | 2022.06.13 |
[JPA] ORM(Object-Relational Mapper) (0) | 2022.06.05 |
[Spring boot] Ajax로 보낸 JSON 서버에서 받기 (0) | 2022.04.12 |
[Spring boot] WebClient 사용해보기 (1) | 2022.04.05 |