본문 바로가기

모각코

[백엔드]자바 스프링부트 이해하기

== 상세 ==
로드 존슨(Rod Johnson)이 2002년에 출판한 저서 Expert One-on-One J2EE Design and Development에서 선보인 소스 코드를 시작으로 점점 발전하게 되었다. 2003년 6월에 최초로 공개되었다. 스프링 프레임워크 프로젝트를 간편하게 설정할 수 있도록 도와주는 서브 프로젝트 스프링 부트가 있으며, 현재는 스프링 부트 위주로 기능이 추가되고 있다.

'스프링'이라는 이름의 유래는 이전에 Java EE(엔터프라이즈 에디션)의 스펙을 구현한 EJB가 기술의 복잡도가 증가해서 성능이 느렸던 것을 탈피하여, EJB 시절을 '겨울'에 빗대어 겨울 후의 '봄'으로 새로운 시작한다는 것을 의미하는 스프링(봄)이 되었다. --그러나 아직 춥다-- [[Java Virtual Machine]]에서 작동하며, [[아파치 라이선스]] 2.0을 따르는 [[오픈 소스]] [[프레임워크]]이다.

한국 [[전자정부표준프레임워크]]의 기반 기술이며 [[한국정보화진흥원]]에서는 공공 기관의 웹 서비스 제공 시 스프링을 권장하고 있다.

이게 무슨 소리인가 싶은 사람들을 위해 간단하게 설명하자면 군대로 비유하자면 위에서 명령을 내리는 지휘관이라기보다는 [[작전장교]]/[[행정보급관]]처럼 '''주변'''에서 정보를 일러주고 필요한 물건이나 인력을 가져다주는 부관, 참모라고 보면 된다. 그래서 용어도 Advice라는 용어를 사용한다.

여러 가지 문제점을 해결하기 위한 디자인 패턴, 아키텍처가 적용되어 있어서 어려운 용어가 많이 사용되는 프레임워크인데, 책을 보고 공부하기보다는 '스프링으로 게시판 만들기' 같은 것의 예제를 병행하면서 공부하는 게 더 이해가 빠를 것이다. 스프링은 프레임워크, 즉 제품이기 때문이다.

Spring에서 공식 제공 하는 [[이클립스(통합 개발 환경)|이클립스]] 기반의 [[통합 개발 환경|IDE]][[https://spring.io/tools|Spring Tools]]를 제공 중이며, [[Visual Studio Code]] 버전으로도 제공하고 있다. 또한 [[JetBrains]][[IntelliJ IDEA]]도 Spring 프레임워크를 훌륭하게 지원하는 [[통합 개발 환경|IDE]]이다.


 

== 주요 특징 ==
스프링 프레임워크의 특징은 아래와 같다.[* 난이도가 높기에 Okky 같은 커뮤니티에서도 이해의 어려움을 토로하는 경우가 많다.]
 * '''POJO(Plain Old Java Object) 방식''': POJO는 Java EE의 EJB 를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하며 나타난 용어다. 별도의 프레임워크 없이 Java EE를 사용할 때에 비해 특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기가 용이하고, 객체가 가볍다.
 * '''[[관점 지향 프로그래밍]](Aspect Oriented Programming, AOP)''': 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다. AspectJ를 포함하여 사용할 수 있고, 스프링에서 지원하는 실행에 조합하는 방식도 지원한다. 이 분리 관리 한다는 개념이 처음에 이해하기가 어려운데, 추상/부모/클래스나 인터페이스로 관리된다는 게 아니라 모듈을 관리해 주는 모듈을 상하/인터페이스 관계없이 따로 마련한다는 개념에 가깝다. 더 쉽게 이야기하자면 군대에서 보급품을 받는다고 가정하자. 상급 부대(연대, 사단)에서 보급품을 내려 받는 게 아니라. 국군복지단이나/군수사령부 아저씨가 직접 가져오는 것을 생각해 보면 쉽다. 당연히 군수사령부 예하 부대 아저씨도 대대 소속이므로 상하 관계가 없지만 보급품에 한해서만 배부해 주는 것이다.
 * '''의존성 주입(Dependency Injection, DI)''': 프로그래밍에서 구성 요소 간의 의존 관계가 소스 코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 코드 재사용을 높여 소스 코드를 다양한 곳에 사용할 수 있으며 모듈 간의 결합도도 낮출 수 있다. 계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜 준다.
 * '''제어 역전(Inversion of Control, IoC)''': 전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
 * '''Bean 생명 주기 관리''': 스프링 프레임워크는 Bean이라는 이름으로 프레임워크에서 사용되는 Java 객체(혹은 Component)의 생성, 소멸을 직접 관리한다. 우선순위 설정, Configutaion을 통해 코드로 작성해 두고, 필요한 객체만을 사용할 수도 있다.