본문 바로가기

Back-End/토비의 스프링3

#8. 스프링이란 무엇인가?

스프링의 정의




 자바 엔터프라이즈 개발을 도와주는 오픈소스 경량급 애플리케이션 프레임워크


( 1 ) 애플리케이션 프래임워크

먼저 프레임워크에 대해 생각해보면, MVC나 DB 등 특정 기술을 도와주는 역할로 알고 있다. 하지만 스프링은 JavaEE 전반을 도와주는 것이기 때문에 에플리케이션 프레임워크라고 불린다.


 Spring의 개발 배경을 살펴보면, JavaEE 개발을 하던 로드 존슨이 불편함을 느끼고 스스로 개선방법을 고안하다 나온 것이다. 로드 존슨은 항상 "프레임워크 기반으로 접근하라"의 전략을 가지고 코딩을 하였다 한다. 


( 2 ) 경량급

라이브러리처럼 특정 기술만 포함하고 있어 무게가 가볍다는 뜻이 아니다.

 Spring 전 EJB에서 개발환경을 구성하려면 EJB 컨테이너를 가진 WAS를 준비해야 했다. Tomcat이나 Jetty와 같이 단순한 서버환경에 비하면 너무나도 무거운 서버환경이였다.

 그러면서 자연스럽게 서버환경을 구성하기 위한 코드들이 필요없어지고, 코드량이 줄어들게 되었다.



스프링의 목적



 IoC/DI를 위한 프레임워크라고 생각하면 마치 Java를 절차지향적으로 짜 본질적인 목적을 취하지 못하는 것 과 같다. 
 스프링은 "JavaEE 개발 편하게"가 목적이다. 그럼 도대체 뭐가 불편했던건가?


 엔터프라이즈 개발의 복잡함

1) 기술적인 제약조건과 요구사항의 증가

 예를 들어, DB 다중을 하나의 트랜잭션으로 처리하여 하고, 보안, 안정성 등 많은 요구사항이 있다.


2) 비즈니스 로직의 복잡함의 증가

 단순 계산 뿐만 아니라 모든 영역에서 IT 시스템을 사용함


두 가지 이유를 보면 단순히 코딩이 어렵다는 얘기로만 볼 수 있다. 더 큰 문제는 이 어려운 두 가지 문제가 섞인다는 것이다. 1번 구현과 2번 구현이 섞여 복잡함이 배로 증가한다. 예를 들면, 상품 추천 로직(2)을 수정하려 하는데

(1)을 건드려 다른 버그가 발생할 수 있다.

 

 Example )

 고객의 기존 거래내역을 분석하여 상품을 추천하는 서비스를 작성

  - 리모팅 서비스를 받기 때문에 고객의 ID와 정보를 추출하기 위해 파싱 라이브러리를 사용

  - 고객에 관련된 정보를 DB에서 조회하기 위해 JDBC API 사용
  - 로그 라이브러리 등등....

  - 이 모든 것을 하나의 트랜잭션에서 작동하기 위해 JTA 사용



 복잡함을 해결하려는 도전


1번과 2번 이유 자체를 없애면 좋겠지만, 이는 필요한 기능이여서 제거될 수 없는 근본적인 복잡함이다. 즉, 해결해야 하는 부분은 1번과 2번 구현 분리이다.


 실패한 해결책 : EJB


 일부분은 복잡함을 해결하였지만 다른 큰 단점을 가졌다. 복잡함을 해결하기 위해 EJB의 구현체를 상속받아야 해 JAVA 언어 자체의 장점을 잃어버렸고, 다형성 적용을 근본적으로 막아 버렸다. 


 비침투적인 방식을 통한 효과적인 해결책 : 스프링


  스프링은 EJB의 실패를 보고 출발하였다. EJB처럼 어떤 기술을 적용했을 때 그 기술과 관련된 코드가 비즈니스 로직에 등장하는 것을 침투적인 방식이라 한다. 

 하지만, 스프링에서는 비침투적인 방식을 통해 코드에 불쑥 등장하지 않도록 하였다. 물론, 특정 기능을 하기 위해 어디선가는 설정해야 겠지만, 비즈니스 로직과 이 작업의 분리를 취할 수 있게 된다. 



 복잡함을 상대하는 스프링의 전략




 비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략


 증권사를 예로 들어보자.

거래 사이트가 사용자 증가로 인하여 서비스가 느려지는 문제가 발생하면 서버를 증설하거나, 시스템을 리셋하면 된다. 이는 애플리케이션 로직부분이다.

 반면, 주식 매매를 하였는데 실제로 거래가 되지 않았다면??? 고객들은 난리가 날 것이다. 이는 비즈니스 로직부분이다. 

 위의 예를 살펴보면, 비즈니스 로직의 중요성을 알 수 있다. ( 기존에는 비즈니스 로직을 DB에 담아 두었지만, 테스트의 어려움, 가격문제(아무래도 Database에 담는게 더 비쌈) 등 문제가 많아 서버로 옮겨가었다. ) 이처럼, 비즈니스 로직은 중요하고 많은 요구사항을 받아들여야 한다. 즉, 확장성과 유연성을 가질 수 있어야 한다. 이는, 객체지향을 지향하는 자바로 해결할 수 있다. 스프링은 자바 고유의 장점을 살릴 수 있도록 비즈니스 로직에 들어나지 않는다. 즉, 스프링은 EJB과 다르게 비침투적인 기술을 통해 은밀히 도와줄 뿐이다.


 혹시 이 글을 읽다 스프링만 제대로 알면 자바 엔터프라이즈 개발을 잘할 수 있을거라고 하면 오산이다. 이는 단지 자바 언어 자체나 객체지향 설계와 개발 실력을 발휘할 수 있도록 깔끔한 환경을 제공했을 뿐이다.

'Back-End > 토비의 스프링3' 카테고리의 다른 글

1.2-IoC 컨테이너 : 빈 설정하기  (0) 2018.09.22
1.1-IoC 컨테이너 : 빈 팩토리와 애플리케이션 컨텍스트  (0) 2018.09.21
스프링 공부방법  (0) 2018.09.16
#6. AOP  (0) 2017.08.29
#5. 서비스 추상화  (0) 2017.08.17