[Spring]Spring Framework 기본
Framework란?
소프트웨어의 구체적인 부분에 해당하는 설계와 구현을
재사용이 가능하게끔 일련의 협엽화된 형태로 클래스들을 제공하는 것
- Ralph Johnson -
우리가 벽에 거는 그림이나 사진 등의 액자를 프레임이라고 부른다. 그리고 자동차의 뼈대가 되는 강판으로 된 껍데기 역시 자동차의 프레임으로 부른다. 이처럼 Frame은 어떤 대상의 큰 틀이나 외형적인 구조를 의미하는데 프로그래밍 세계에서의 Frame 역시 이와 비슷한 의미를 가지고 있다.
결론적으로 프로그래밍 상에서의 Framework는 기본적으로 프로그래밍을 하기 위한 어떠한 틀이나 구조를 제공한다는 걸 알 수 있다.
장점
- 효율적으로 코드를 작성할 수 있다.
- 밑바닥부터 일일이 전부 개발하는 것이 아니라 서로 다른 애플리케이션 간의 통신이나, 데이터를 데이터 저장소에 저장하는 등의 다양한 기능들 역시 Framework 라이브러리 형태로 제공함으로써 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중할수 있도록 해준다.
- 정해진 규약이 있어 애플리케이션을 효율적으로 관리할 수 있다.
- 사용하는 Framework의 규약에 맞게 코드를 작성하기 때문에, 유지보수가 필요한 경우 더 빠르고 쉽게 문제점을 파악해 수정할 수 있다. 다른 사람이 수정할 경우에도 이미 규악에 맞게 작성된 코드이기 때문에 빠르게 코드를 파악하고 수정하기 용이하다. 유지보수 이외에도 비슷한 기능을 개발할때 코드의 재사용이 용이하고 기능의 확장 또한 쉽게 확장이 가능하다.
단점
- 사용하고자하는 Framework에 대한 학습이 필요하다.
- Framework에서 정하는 규약들을 학습할 시간이 필요하다는 의미이다.
- 자유롭고 유연한 개발이 어렵다.
- 규약을 벗어나기 어렵다. 집의 구조자체를 변경하게 될 경우 이미 만들어진 것들을 허물고 새롭게 구조를 만들어야하는 것처럼 Framework도 동일하다. 이미 만들어진 애플리케이션에서 Framework를 변경하거나 유연한 개발을 위해 사용하지 않게 변경할 경우 정말 많은 시간과 노력이 필요하다.
Framework와 Library의 차이
Library는 애플리케이션을 개발하는데 사용되는 일련의 데이터 및 프로그래밍 코드이다. 소프트웨어의 관점에서도 Library는 애플리케이션을 개발할 때 필요한 기능을 미리 구현해놓은 집합체라고 생각할 수 있다.
@SpringBootApplication
@RestController
@RequestMapping(path = "/v1/message")
public class SampleApplication {
@GetMapping
public String getMessage() { // (2) 프레임워크
String message = "hello world";
return StringUtils.upperCase(message); // (1) 라이브러리
}
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
- (2)과 같이 개발자가 짜 놓은 코드내에서 필요한 기능이 있으면 해당 라이브러리를 호출해서 사용하는 것이 바로 Library이다. 즉, 애플리케이션 흐름의 주도권이 개발자에게 있다.
- (1)과 같이 메서드 내부의 코드처럼 개발자가 메서드내에 코드를 작성해두면, Spring Framework에서 개발자가 작성한 코드를 사용해서 애플리케이션의 흐름을 만들어낸다. 즉, 애플리케이션 흐름의 주도권이 개발자가 아닌 Framework에 있다.
Spring Framework란?
자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션이다. 스프링 프레임워크는 경량 컨테이너로 자바 객체를 담고 직접 관리한다. 객체의 생성 및 소멸 그리고 라이프 사이클을 관리하며 언제든 스프링 컨테이너로부터 피룡한 객체를 사용할 수 있다. 이는 스프링이 IOC 기반의 프레임워크임을 의미한다.
특징
- POJO(Plan Old Java Object)기반의 구성
- DI(Dependency Injection)지원
- AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
- Java 언어를 사용함으로써 얻는 장점
POJO(Plain Old Java Object)
Java로 생성하는 순수한 객체를 의미한다.
POJO프로그래밍이란?
POJO를 이용하여 프로그래밍 코드를 작성하는 것을 의미한다. 그런데 단순히 순수 자바 객체만을 사용해서 프로그래밍 코드를 작성한다라고해서 POJO 프로그래밍이라고 볼 수는 없다. 크게 두 가지 정도의 기본 규칙을 지켜주어야 한다.
- Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
- 특정 환경에 종속적이지 않아야 한다.
POJO 프로그래밍이 필요한 이유
- 특정 환경이나 기술에 종속적이지 않으면 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
- 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거 함으로써 코드가 깔끔해진다.
- 코드가 깔끔해지기 때문에 디버깅하기도 상대적으로 쉽다.
- 특정 기술이나 환경에 종속적이지 않기 때문에 테스트 역시 단순해진다.
- 객체지향적인 설계를 제한없이 적용할 수 있다.(가장 중요한 이유)
POJO와 Spring의 관계
Spring은 POJO 프로그래밍을 지향하는 Framework이다. 그리고 최대한 다른 환경이나 기술에 종속적이지 않도록 하기위한 POJO프로그래밍 코드를 작성하기 위해서 Spring에서 세 가지 기술을 지원하고 있다.
- IoC/DI
- AOP
- PSA
핵심 포인트
- POJO란 순수한 Java 객체를 의미한다.
- POJO 프로그래밍이란 순수 Java 객체가 다른 기술이나 환경에 종속되지 않도록 하기 위한 프로그래밍 기법이다.
- POJO 프로그래밍을 효과적으로 적용하기 위해서는 특정 기술에 대한 지식보다는 JDK의 API에 대한 지식과 객체지향적인 사고방식과 설계를 위한 훈련이 우선시 되어야 한다.
- Spring Framework은 POJO 프로그래밍을 지향하기 위해 IoC/DI, AOP, PSA 라는 기술을 제공한다.
IoC
Inversion of Control로 애플리케이션 흐름의 주도권을 Spring이 갖는 것을 의미한다.
- 개발자가 작성한 코드를 순차적으로 실행하는게 일반적인 제어흐름이다.
- 서블릿 컨테이너의 경우 클라이언트의 요청이 들어올 때마다 서블릿 컨테이너 내의 컨테이너 로직이 서블릿을 직접 실행시키기 때문에 'main()'메서드가 필요없다.
- 위 경우 서블릿 컨테이너가 서블릿을 제어하고 있기때문에 애플리케이션의 주도권은 서블릿 컨테이너에 있다. IoC개념이 적용되어 있다.
- DI를 통해 Spring에 IoC개념이 적용되어 있다.