스프링 프레임워크(Spring FrameWork) 란 자바 기반의 애플리케이션 프레임워크로, 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공합니다.
스프링은 다양한 목적에 따라 다양한 프로젝트를 제공하는데, 그 중 하나가 스프링 프레임워크(Spring FrameWork) 입니다.
스프링 프레임워크(스프링)는 자바에서 가장 많이 사용하는 프레임워크 입니다.
현재 우리나라의 '전자정부 표준 프레임워크' ( https://www.egovframe.go.kr/ ) 의 기반 기술로 채택되어 공공기관 웹 서비스를 개발할 때도 사용됩니다.
스프링의 핵심 가치는 다음과 같습니다.
애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것.
일반적인 자바 개발의 경우 다음과 같은 코드를 사용합니다. 즉, 사용하려는 객체를 선언하고, 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용합니다. 객체를 생성하고 사용한느 일련의 작업을 개발자가 직접 제어하는 구조입니다.
package com.javaex.hello;
import org.springframework.stereotype.Controller;
@Controller
public class TestController {
public MyService service = new MyService();
public String getHello() {
System.out.println("TestController.getHello");
return service.getHello();
}
}
package com.javaex.hello;
public class MyService {
public String getHello(){
System.out.println("MyService.getHello");
return "Hello";
}
}
하지만 제어 역전을 특징으로 하는 스프링은 기존 자바 개발 방식과 다르게 작동합니다.
제어 역전을 적용한 환경에서는 사용할 객체를 직접 사용하지 않고 객체의 생명주기 관리를 외부에 위임합니다.
여기서 "외부"는 스프링 컨테이너(Spring Container) 또는 Ioc 컨테이너(Ioc Container)를 의미합니다.
객체의 관리를 컨테이너에게 맡겨 제어권이 넘어간 것을 제어 역전이라 부르며, 제어 역전을 통해 의존성 주입, 관점 지향 프로그래밍 등이 가능해집니다.
의존성 주입이란 제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미합니다.
스프링에서 의존성을 주입받는 방법은 세 가지가 있습니다
스프링에서는 @Autowired 라는 어노테이션을 통해 의존성을 주입할 수 있습니다. 스프링 4.3 이후 버전부터는 생성자를 통해 의존성을 주입할 때 @Autowired 어노테이션을 생략할 수도 있습니다. 하지만 스프링을 처음 다룰 때에는 가독성을 위해 어노테이션을 적는 게 좋습니다.
@Controller
public class TestController {
MyService service;
public String getHello() {
System.out.println("TestController.getHello");
return service.getHello();
}
}
@Controller
public class TestController {
@Autowired
private MyService service;
public String getHello() {
System.out.println("TestController.getHello");
return service.getHello();
}
}
@Controller
public class TestController {
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
}
스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식입니다. 다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이는 객체를 초기화 할 수 없기 때문입니다.