인프런의 '신입 프로그래머를 위한 자바 스프링(Spring) 프레임워크 강좌' 를 수강하고 요약한 내용입니다.
스프링 프레임워크는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크다.
동적인 웹사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.
DI, AOP, MVC, JDBC 등을 제공한다.
객체 지향 언어가 가진 장점을 최대한 활용할 수 있도록 돕는 프레임워크라고 볼 수 있다.
스프링에서 객체를 생성하고 조립하는 컨테이너(Container)로, 컨테이너를 통해 생성된 객체를 빈(Bean)이라고 부른다.
1) 객체 생성 및 속성 데이터 작성
2) 스프링 컨테이너에서 객체(빈) 생성 및 조립
3) 애플리케이션 구현
제어의 역전. 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라 외부에서 결정하는 것을 의미.
일반 main 메소드에서 시작해서 개발자가 정한 순서에 따라 객체가 생성되고 실행된다.
그러나 서블릿을 생각해보자. 서블릿을 개발해서 서버에 배포할 수는 있지만 배포하고 나서는 개발자가 직접 제어할 수 있는 방법은 없다. 대신 서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 객체를 만들고 그 안의 메소드를 호출한다.
이를 제어의 역전이라 표현한다.
일반적으로 프레임워크가 사용되는 방식을 제어의 역전이라 보면 된다.
pom.xml
에 정의해놓으면 해당 라이브러리를 네트워크를 통해 자동으로 다운받아준다.소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
만약 우리가 만들었던 DI 컨테이너인 요청을 할 때마다 새로운 객체를 생성한다면. 요청이 엄청나게 많은 트래픽 사이트에서는 계속 객체를 생성하게 되면 메모리 낭비가 심하다. 이런 이유로 스프링은 모든 빈에 대하여 싱글톤으로 유지되도록 한다.
스프링 컨테이너에서 생성된 빈 객체의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성이 되며, getBean()
메소드로 호출될 때 동일한 객체가 반환된다.
싱글톤 범위와 반대의 개념.
설정 파일(applicationContext.xml
)에서 빈 객체를 정의할 때 scope 속성을 명시해줌으로써 구현 가능하다.
Dependency Injection의 약자. 의존성 주입
제어의 역행이 일어날 때 스프링이 내부에 있는 객체들 간의 관계를 관리할 때 사용하는 기법
의존적인 객체를 직접 생성하거나 제어하는 게 아니라
특정 객체에 필요한 객체를 외부에서 결정해서 연결하는 것
즉, 우리는 클래스 기능을 추상적으로 묶어둔 인터페이스를 갖다 쓰면 되는 것.
나머지는 스프링이 객체를 주입해주기 때문.
모듈 간 결합도를 낮추고 유연성을 높일 수 있다.
예) 배터리 일체형 : 배터리가 떨어지면 장난감을 새로 구입해야 한다.
public class ElectronicCarToy {
private Battery battery;
public EletronicCarToy() {
battery = new NormalBattery();
}
}
예) 배터리 분리형 : 배터리가 떨어지면 배터리만 교체하면 됨
public class ElectronicCarToy {
private Battery battery;
public EletronicCarToy() {}
public void setBatter(Batter battery) {
this.battery = new NormalBattery();
}
}
예) 배터리 분리형 : 배터리가 떨어지면 배터리만 교체하면 됨
public class ElectronicCarToy {
private Battery battery;
public EletronicCarToy(Battery battery) {
this.battery = new NormalBattery();
}
public void setBatter(Batter battery) {
this.battery = new NormalBattery();
}
}
스프링 설정 파일에서 의존 객체를 주입할 때 <contructor-org>
또는 <property>
태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 해당 객체가 필요한 객체에 주입해 주는 기능.
@Autowired
: 타입이 일치하는 객체를 자동으로 주입. required 속성을 사용하면 해당 빈(의존대상객체)이 없어도 Exception 처리하지 않는다.@Inject
: 타입이 일치하는 객체를 자동으로 주입. required 속성 지원 X@Resource
: 이름이 일치하는 객체를 자동으로 주입@Qualifier
: 사용할 의존 객체를 선택할 수 있게 함.아키텍쳐 패턴 중 하나. 서브 시스템을 model, view, controller로 구조화하는 패턴
controller가 요청을 받으면 핵심 기능과 데이터를 보관하는 model을 이용하여 view에 정보를 출력