티스토리 뷰
스프링은 엔터프라이즈 애플리케이션(많은 사용자의 요청을 동시에 처리하는 애플리케이션)이 나옴으로서 서버 성능과 안전성 및 보안을 원활하게 만들기 위해 들장한 프레임워크입니다.
프레임워크의 특징답게 다른 것들을 신경쓰지 않고, 오직 개발에만 집중할 수 있게 만들어진 도구였습니다.
스프링은 장점이 많은 개발 도구이지만, 설정이 매우 복잡하다는 단점이 있습니다. 그래서 2013년 개발팀은 이 단점을 보완하기 위해 스프링 부트를 출시했습니다. 스프링 부트는 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어줍니다. 의존성 세트라고 하는 스타터를 이용해서 간편하게 의존성을 상요하거나 관리할 수 있습니다.
- 스프링 부트의 주요 특징 - 톰캣, 제티, 언더도우 같은 WAS가 내장되어 있어 독립적으로 실행 가능
- 필드 구성을 단순화하는 스프링 부트 스타터 제공
- XML 설정을 하지 않고도 자바 코드로 모두 작성 가능
- JAR을 이용해서 자바 옵션만으로도 배포 가능
- 애플리케이션 모니터링 관리 도구 스프링 엑츄에이터 제공
스프링 부트는 스프링에 속한 도구이고, 개발할 때의 몇 가지 차이점만 있습니다.
차이점
1. 구성의 차이
스프링은 애플리케이션 개발 환경을 수동으로 구성하고 정의한다.
스프링 부트는 스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드하므로 개발환경 구성이 편리하다.
2. 내장 WAS 유무
스프링은 톰캣과 같은 WAS에서 배포되는데, 스프링은 WAS를 따로 해야 하나, 스프링 부트는 WAS를 자체적으로 가지고 있습니다. 그래서 jar 파일만 만든다면 별도로 WAS를 설정하지 않아도 애플리케이션 실행이 가능합니다.
스프링 : XML 일부 직접 생성하고 관리, 인메모리 데이터베이스 미지원, 프로젝트 서버에 WAS 별도 설정 필요
스프링 부트 : XML 사용하지 않음, 인메모리 데이터베이스 지원, WAS 별도 설정 필요 없음
스프링의 콘셉트
제어의 역전(IoC)
Inversion of Control
자바에서는 자바 코드를 작성해 객체를 생성할 때 객체가 필요한 곳에서 직접 생성합니다.
public class TEST {
student = new STUDENT(); 클래스 TEST에서 student 키워드로 클래스 STUDENT의 객체를 직접 생성한다.
}
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 게 아니라 외부에서 관리하는 객체를 가져와 사용하는 것입니다.
이 때 스프링 컨테이너가 객체를 관리, 제공하는 역할을 합니다.
public class TEST {
private STUDENT student; 어디선가 받아온 객체를 student에 할당한다.
}
그리고 이런 제어의 역전을 구현하기 위해 사용하는 방법이 의존성 주입(Dependency Injcetion) 입니다.
의존성 주입
의존성 주입은 어떤 클래스가 다른 클래스에 의존한다는 뜻으로 해석됩니다.
@autowired 에너테이션이 스프링 컨테이너에 있는 빈을 주입하는 역할을 합니다.
빈은 스프링 컨테이너에서 관리하는 객체를 말합니다.
public class TEST{
@Autowired
STUDENT student;
}
위의 코드를 보면 클래스 test에서 STUDENT라는 객체를 생성하지는 않고 객체를 어딘가에서 주입받습니다.
이렇게 코드를 작성해도 프로그램이 잘 작동합니다. 스프링 컨테이너가 STUDENT 객체를 대신 만들어서 test 클래스에게 나눠 준 것이기 때문입니다.
이 제어의 역전과 의존성 주입 개념은 스프링의 핵심 개념이기 때문에 이해하고 넘어가는 게 좋습니다.
빈과 스프링 컨테이너
스프링 컨테이너는 빈을 생성하고 관리합니다.
빈이 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너가 관리하고, 에너테이션을 사용해 빈을 주입받을 수 있게도 합니다.
빈은 스프링 컨테이너가 생성하고 관리하는 객체입니다. 앞의 코드에서의 STUDENT가 빈입니다.
스프링은 빈을 스프링 컨테이너에 등록하기 위해서 XML 파일 설정, 에너테이션 추가 등의 방법을 제공하고 빈을 등록하는 방법에는 여러가지가 있습니다.
예를 들어서 TEACHER 클래스에 @Component 에너테이션을 붙일 시 TEACHER 클래스는 빈으로 등록되고, 스프링 컨테이너에서 이 클래스가 관리됩니다.
이제 빈은 클래스 이름의 첫을자를 소문자로 바꿔 관리됩니다.
어렵게 생각할 필요 없이 스프링에서 제공해주는 객체라고 생각하면 됩니다.
관점 지향 프로그래밍
스프링의 개념으로 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 걸 의미합니다.
계좌 이체 및 고객 관리 프로그램이 존재할 때 핵심 관점은 계좌 이체, 고객 관리이고, 부가 관점은 로그 기록, 데이터 베이스 연결의 코드입니다.
여기에 관점 지향 프로그래밍을 적용해서 부가 관점에 해당하는 코드를 모듈화한다면 부가 관점 코드를 핵심 관점 코드에서 분리할 수 있을 겁니다. 스프링은 그렇게 해서 프로그램의 변경과 확장에도 유연하게 대응할 수 있습니다.
이식 가능한 서비스 추상화(PSA)
스프링에서 제공하는 다양한 기술들을 추상화하여 개발자가 쉽게 사용하는 인터페이스를 일컫습니다.
스프링에서 데이터베이스에 접근하기 위한 기술로 JPA, MyBatis, JDBC 같은 것들이 있고, 일관된 방식으로 데이터 베이스에 접근하도록 지원합니다.
WAS도 마찬가지로 코드는 그대로 두고 톰캣이 아니 언더토우, 네티와 같은 다른 곳에서 실행해도 기존 코드를 그대로 사용할 수 있습니다.
이처럼 코드는 그대로지만 다른 곳에서도 사용할 수 있도록 한 것이 이식 가능한 서비스 추상화입니다.
이제 스프링에 대해서 알아보았으니, 다음 편에서는 스프링 부트에 대해서 알아봅시다.