스프링 프레임워크의 간략한 역사
✔ 프레임워크? '뼈대나 근간을 이루는 코드들의 묶음'
: 개발에 필요한 구조를 이미 코드로 만들어 놓았기 때문에, 실력이 부족한 개발자라 하더라도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능.
스프링과 다른 프레임워크들의 차별성
✔ 복잡함에 반기를 들다
- 엔터프라이즈급 프레임워크들의 가장 큰 문제점은 '복잡성'
- 스프링은 일반적은 Java의 클래스와 인터페이스를 이용하는 구조
- *경량화된 프레임워크로, 빠르게 엔터프라이즈급의 시스템 작성 가능
경량 프레임워크 (light-weight Framework)
과거 J2EE 기술은 너무 복잡하고 양이 방대했기 때문에, 그 전체를 이해하고 개발하기에는 어려운 점이 많아서, 특정 기능을 위주로 간단한 jar 파일 등을 이용해서 모든 개발이 가능하도록 구성된 프레임워크
✔ 프로젝트 전체 구조를 설계할 때 유용
- 다른 프레임워크들은 웹 영역이나 데이터베이스 영역 등의 전문적인 영역에 대해서만 지원하는 경우가 다반사
- 반면 스프링은 어느 한 분야에 집중하지 않고, 전체를 설계하는 용도로 사용
- 근본적인 사상 자체는 OOP 구조를 뒷받침하고 구조를 설계
✔ 다른 프레임워크들의 포용
- 스프링은 다른 프레임워크들과의 통합을 지원했기 때문에 최소한의 수정 가능
- 스프링의 최대 장점: 기본 뼈대를 흔들지 않고, 여러 종류의 프레임워크를 혼용해서 사용할 수 있음.
✔ 개발 생산성과 개발도구의 지원
스프링 변화
- Spring 2.5버전: 어노테이션(annotation)을 활용하는 설정을 도입. 편리한 설정과 개발이 가능하도록 지원
- Spring 3.0버전: 별도의 설정 없이 Java 클래스만으로 설정 파일을 대신할 수 있게 지원
- Spring 4.0버전: 모바일 환경과 웹 환경에서 많이 사용되는 REST 방식의 컨트롤러 지원
- Spring 5.0버전: Reactor를 이용한 Reactive 스타일의 개발 환경 지원
스프링의 주요 특징
- POJO 기반의 구성
- 의존성 주입(DI)를 통한 객체 간의 관계 구성
- AOP(Aspect-Oriented-Programming) 지원
- 편리한 MVC 구조
- WAS의 종속적이지 않은 개발 환경
✔ POJO 기반의 구성
- 스프링의 성격 자체가 가벼운(light-weight) 프레임워크지만, 그 내부에는 객체 간의 관계를 구성할 수 있는 특징을 가지고 있음.
- 이 관계를 구성할 때 POJO(Plain Old Java Object)의 구성만으로 가능하도록 제작.
- 즉, 일반적인 Java 코드를 이용해서 객체를 구성하는 방식을 스프링에서 그대로 사용
- 개발자는 가장 일반적인 형태로 코드를 작성하고 실행할 수 있기에 생산성에서도 유리하고, 코드에 대한 테스트 작업이 보다 유연해짐.
✔ 의존성 주입 (DI)
-
의존성 (Dependency): 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다.
-
주입 (Injection): 외부에서 '밀어 넣는 것'을 의미
-
의존성 + 주입: 어떤 객체가 필요한 객체를 외부에서 밀어 넣는다.
스프링은 'ApplicationContext'라는 존재가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 해 줌.
따라서 스프링을 이용하면 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고, 이러한 객체들을 엮는(wiring) 작업을 하는 형태의 개발을 하게 됨.
스프링에서 ApplicationContext가 관리하는 객체들을 '빈 (Bean)'이라는 용어로 부르고, 빈과 빈 사이의 의존관계를 처리하는 방식으로 XML 설정, 어노테이션 설정, Java 설정 방식을 이용할 수 있음.
의존성 주입은 매우 중요하고, 한번에 이해하기 어려우므로 다음 포스팅에서 집중적으로 다루도록 하겠습니다.
✔ AOP의 지원
횡단 관심사(cross-concern)
대부분의 시스템이 공통으로 가지고 있는 보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분
- 스프링은 횡단 관심사를 분리해서 제작하는 것이 가능
- AOP (Aspect Oriented Programming)은 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍의 패러다임
- 스프링은 APO를 AspectJ의 문법을 통해서 작성할 수 있는데, 이를 통해서 개발자는 1) 핵심 비즈니스 로직에만 집중해서 코드 개발 가능 2) 각 프로젝트마다 다른 관심사를 적용할 때 코드 수정 최소화 3) 원하는 관심사의 유지보수 수월한 코드 작성이 가능해짐.
✔ 트랜잭션의 지원
- 데이터베이스를 이용할 때 반드시 신경써야 하는 부분은 하나의 업무가 여러 작업으로 이루어지는 경우의 트랜잭션 처리
- 스프링은 트랜잭션의 관리를 어노테이션이나 XML로 설정할 수 있기 때문에 개발자가 매번 상황에 맞는 코드를 작성할 필요가 없음
트랜잭션이란?
- 데이터베이스의 완전성을 보장하기 위한 것
- 상태를 변화시키키 위해서 수행하는 하나의 작업의 단위를 뜻함.**
트랜잭션을 사용하며 주의해야 할 점
- 트랜잭션은 데이터를 완전성을 보장하기 위해 많은 자원들을 사용하게 된다.
- 자원을 사용하며 Lock을 걸게 되면 다른 사용자들은 Lock이 해제될 때까지 기다려야한다.
- 기다린다는 것은 성능에 좋지 않다는 의미이다. 따라서 Transaction의 범위를 최소화하여 적용하는 것이 좋다.