SPRING

스프링의 등장

스프링의 등장

옛날 옛적에 Java 엔터프라이즈 애플리케이션을 만들기 위해서 많은 노력을 기울였습니다.

특히 Java 진영에서는 EJB(Enterprise Java Beans)라는 컴포넌트 모델을 통해 이를 만들기 시작했죠. 

(EJB는 Java EE의 자바 API 중 하나입니다. 주로 비즈니스 로직을 제작하는데 중점을 둡니다.) 이를 통해 개발한 서버를 여러분이 잘 아는 WAS(Web Application Server)라고 하죠! EJB에서는 크게 세가지 역할을 가집니다.

  • 세션 빈 (Session Bean) : DB 연동이 필요 없음
  • 엔티티 빈 (Entity Bean)
    • 데이터베이스의 데이터를 관리하는 객체
    • Insert(삽입), Update(수정), Delete(삭제), Select(조회)
    • DB 관련 쿼리는 자동으로 만들어지고 개발자는 고급 업무 처리에 집중할 수 있음
    • DB가 수정되면 코드 수정 없이 다시 배포(설정 문서 만들어서 복사)
  • 메시지 구동 빈 (Message-driven Bean) : JMS로 빈을 날려줌

이렇게 다양한 역할을 가지는 EJB는 무적으로 보입니다. 하지만 문제가 있었으니....

첫번째로 어마어마한 가격대와, 두번째로는 엄청난 진입장벽입니다! 마지막으로는 분산처리가 되지 않기 때문에 코드가 지저분해질 뿐 아니라, 한 컴포넌트를 실행하는데 엄청난 시간을 소모하게 됩니다.

 

이를 버티지 못하고 EJB를 어떻게든 간소화하려는 노력을 기울이기 시작합니다. (Back To the Java)

여기서 탄생한 오픈소스들이 바로 SpringHibernate 입니다! (여기서는 Spring만 다루겠습니다.)

 

 

1. 스프링의 역사와 진화

Spring은 초기 EJB(J2EE)의 복잡성을 지적하며 2003년에 등장했습니다. (도서 : J2EE Design and Development)

이 책의 저자가 자신의 책을 기반으로 오픈소스를 만든 것이 바로 Spring입니다! (EJB라는 겨울을 넘어 Java의 새로운 시작을 알린다해서 Spring으로 지었다고 들었습니다.)

 

Java EE와 Spring이 경쟁 관계에 있다고 생각하지만 실제로 Spring은 Java EE를 보완해주는 역할을 수행합니다. 다음 기능들을 지원합니다! (이러한 기능들을 차례차례 알아가볼 예정입니다!)

  • 서블릿 API
  • 웹소켓 API
  • 동시성 유틸리티 (Concurrency Utilities)
  • JSON 바인딩 API
  • 빈 유효성 검사 (Bean Validation)
  • JPA
  • JMS
  • 필요한 경우 트랜잭션 조정을 위한 JTA/JCA 설정
  • Dependency Injection
  • Common Annotation

꾸준한 업데이트로 Spring은 최신 API와 즉시 사용 가능한 통합을 제공해 완벽한 호환성을 유지합니다!

오늘날에는 Spring Boot의 도움으로 Servlet 컨테이너가 포함되고 변경하기 쉬운 데브옵스 및 클라우드 친화적인 방식으로 애플리케이션이 생성됩니다. Spring Framework 5부터 WebFlux 애플리케이션은 Servlet API를 직접 사용하지도 않고 Servlet 컨테이너가 아닌 서버(예: Netty)에서 실행할 수 있습니다.

 

Spring은 계속해서 혁신하고 진화하고 있습니다. Spring만의 유연성으로 가장 핵심(Core)가 되는 Spring Framework 외에도 필수적인 Spring Boot와 부수적인 Spring Security, Spring Data, Spring Cloud, Spring Batch와 같은 다른 프로젝트를 통해 확장성을 늘려가고 있습니다!

 

 

2. Spring이 어떤걸 지원하나?

크게 스프링은 두가지 요소로 나뉩니다.

필수적인 Spring Framework와 Spring Boot

부수적인 Spring Security, Spring Data, Spring Cloud, Spring Batch, 등등...

하나하나 알아봅시다.

 

Spring FrameWork

Spring FrameWork는 가장 근간(Core)이 되는 프레임워크입니다. EJB의 한계를 극복하는 기능들 대부분이 여기서 나온다고 보시면 됩니다.

분류 기능
핵심 기술 Spring DI 컨테이너, AOP, 이벤트, 기타
웹 기술 Spring MVC, Spring WebFlux
데이터 접근 기술 트랜젝션, JDBC, ORM, XML
기술 통합 캐시, 이메일, 원격접근, 스케줄링
테스트 스프링 기반 테스트 지원
언어 JVM을 통해 코틀린그루비를 지원합니다.

 

Spring Boot

스프링을 더욱 편리하게 사용할 수 있도록 지원해줍니다. 현재는 기본으로 사용됩니다.

특히 단독으로 실행할 수 있는 스프링 애플리케이션을 생성해주고, Tomcat 내장 웹 서버를 통해 별도의 웹 서버 설치 없이도 테스트를 위해 간단한 실행이 가능합니다. 추가적으로 서드파티 라이브러리를 자동 구성해줘 개발자들의 접근성이 더욱 용이해지게 만들었습니다!

 

 

번외. Spring 제작자의 디자인 철학

항상 프레임워크에 대해 배울 때에는 프레임워크가 수행하는 작업뿐만 아니라 프레임워크가 따르는 원칙을 아는 것이 중요합니다. Spring Framework의 기본 원칙을 살펴봅시다!

 

1) 모든 수준에서 선택을 제공합니다. Spring을 사용하면 디자인 결정을 가능한 늦게 연기할 수 있습니다. 예를 들어 코드를 변경하지 않고 구성을 통해 지속성 공급자를 전환할 수 있습니다. 다른 많은 인프라 문제와 타사 API와의 통합도 마찬가지입니다.

 

2) 다양한 관점을 수용합니다. Spring은 유연성을 포용하며 일을 어떻게 해야 하는지에 대해 의견이 분분하지 않습니다. 다양한 관점에서 다양한 애플리케이션 요구 사항을 지원합니다.

 

3) 강력한 하위 호환성을 유지합니다. Spring의 진화는 버전 간의 주요 변경 사항이 거의 없도록 주의 깊게 관리되었습니다. Spring은 Spring에 의존하는 애플리케이션 및 라이브러리의 유지 관리를 용이하게 하기 위해 신중하게 선택된 범위의 JDK 버전 및 타사 라이브러리를 지원합니다.

 

4) 항상 API 디자인에 신경써야 합니다. Spring 팀은 직관적이고 많은 버전과 수년에 걸쳐 유지되는 API를 만드는 데 많은 생각과 시간을 투자합니다.

 

5) 코드 품질에 대한 높은 표준을 설정합니다. Spring Framework는 의미 있고 최신이며 정확한 javadoc에 중점을 둡니다. 패키지 간에 순환 종속성이 없는 깨끗한 코드 구조를 주장할 수 있는 몇 안 되는 프로젝트 중 하나입니다.

 

이렇게 여러가지를 다 제쳐두고 스프링의 가장 큰 철학은 두가지로 나눌 수 있습니다.

단순함

Spring은 앞에서 설명했듯이 EJB의 복잡성을 지적하면서 등장했습니다. EJB가 점점 많은 기능을 구현하면서 복잡해져 자바가 가지고 있는 객체지향성을 잃게 만들었기 때문이죠.

Spring은 이렇게 잃어버린 Java의 본질을 살릴 수 있는 강력한 도구입니다. 그래서 가장 강력히 주장하는 것은 제일 단순하고, 객체지향적인 개발 모델인 POJO 프로그래밍입니다.

 

유연성

추가적으로 스프링은 유연성과 확장성이 매우 뛰어나 앞서 설명한 많은 프레임워크와 편리하게 접목시킬 수 있습니다.

이를 접착 프레임워크라고도 합니다. (여러 프레임워크를 함께 사용이 가능한 프레임워크)

 

마지막으로.. 시작하기

Spring을 처음 시작하는 경우 Spring Boot 기반 애플리케이션을 생성하여 Spring Framework 사용을 시작할 수 있습니다. 이 Spring Boot는 생성 준비가 된 Spring 기반 애플리케이션을 생성하는 빠른 방법을 제공합니다. Spring Framework를 기반으로 하고 구성보다 규칙을 선호하며 가능한 한 빨리 시작하고 실행할 수 있도록 설계되었습니다. start.spring.io 페이지를 사용하여 기본 프로젝트를 생성하거나 RESTful 웹 서비스 구축 시작하기와 같은 "시작하기" 가이드 중 하나를 따를 수 있습니다. 또는 IDE에서도 직접 생성이 가능합니다.

'SPRING' 카테고리의 다른 글

컴포넌트 스캔, 의존관계 자동 주입  (0) 2021.10.07
IoC(2) - 빈(Bean)  (0) 2021.10.07
IoC(1) - IoC 개념 및 컨테이너  (0) 2021.10.05