[Spring]Spring Framework 란? - 스프링 개념 및 특징 정리
★ 스프링(Spring) 이란?
스프링은 Java 기반의 경량급 오픈소스 어플리케이션 프레임워크입니다.
정확한 표현은 스프링 프레임워크(Spring Framework) 입니다.
여기서 경량급이란 스프링을 사용했을 때, 개발자가 작성해야 할 코드가 상대적으로 단순하다는 것을 의미합니다.
스프링을 사용함으로써 기존 기존에 불가피하게 작성해야만 했던 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있습니다.
★ 스프링의 특징
1. 경량 컨테이너
스프링은 크기와 부하의 측면에서 경량 컨테이너로서 자바 객체를 직접 관리합니다.
각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며, 스프링으로부터 필요한 객체를 얻어올 수 있습니다.
2. 제어의 역전 IoC: Inversion of Control
제어의 역전은 객체의 생명주기를 컨트롤하는 제어권이 사용자가 아닌 스프링 프레임워크에 있어, 필요에 따라 스프링에서 사용자의 코드를 호출하는 것을 의미합니다.
일반적인 자바 프로그램에서는 각 객체가 프로그램의 흐름을 결정하고, 사용자는 각 객체를 직접 생성하고 조작하는 작업을 했습니다. 예를 들어 A 객체에서 B 객체의 메소드를 사용하고자 할 때에는 B 객체를 직접 A 객체 내에서 생성한 뒤 해당 메소드를 호출해야 합니다.
스프링에서는 사용자가 객체를 직접 생성하지 않고, 그 제어권을 특별한 관리 위임 주체에게 맡기게 됩니다.
즉, 사용자의 제어권을 다른 주체에게 넘기는 것을 IoC, 제어의 역전이라고 합니다.
3. 의존성 주입 DI: Dependency Injection
의존성 주입은 각각의 계층이나 서비스들 간에 의존성이 존재할 경우, 개발자가 아닌 프레임워크가 서로를 연결 시켜주는 것을 의미합니다.
즉, 개발자가 객체 내부에 의존 객체를 직접 만들어(new 연산자) 사용하는 것이 아니라 스프링 컨테이너에서 생성된 객체를 주입 받아 사용하는 방법입니다.
외부에서 두 객체 간의 관계설정을 해주는 디자인 패턴으로, 인터페이스를 사이에 두어 클래스 레벨에서는 의존관계가 고정되지 않도록 하고, 런타임시 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 합니다.
@Autowired
생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어주는 의존성 주입이 이루어집니다.
@Controller
public class Controller{
private Service service;
@Autowired
public Controller(Service service){
this.service = service;
}
}
4. 관점 지향 프로그래밍 AOP: Aspect-Oriented Programming
관점지향 프로그래밍은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 보고 그 관점을 기준으로 각각을 모듈화하는 것을 의미합니다.
이때 모듈화 시켜놓은 블럭을 Aspect 라고 합니다.
트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있습니다.
5. POJO: Plain Old Java Object
POJO 는 순수한 자바 객체를 의미하며 Getter/Setter 를 통해 캡슐화된 객체를 의미합니다.
다른 기술을 사용하지 않는 순수 Java 만을 사용하여 만든 객체이므로 특정 기술이나 환경에 종속되지 않습니다. 때문에 외부 기술이나 규약의 변화에 얽매이지 않아 보다 유연하게 변화와 확장에 대처할 수 있습니다.
// 필드, Getter, Setter 로 이루어진 기본적인 POJO
public class Person {
private int age;
private String name;
public int getAge() {
return this.age;
}
public String getName() {
return this.name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
6. 컨테이너 Container
스프링은 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너라고 할 수 있습니다.
7. 모델-뷰-컨트롤러 MVC 패턴
DispatcherServlet 이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며, 이를 각 서비스들이 처리를 하여 결과롤 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있습니다.