스프링은 간단하게 말하면 개발 하기에 편리한 기능들을 제공하는 프레임워크이다.
이런 스프링의 핵심을 꼽자면 의존성 주입(DI)과 제어의 역전(Ioc)를 말하고 싶은데 이 글에서는 두개의 개념을 설명해보고자 한다.
1. 의존성 주입(DI, Dependency Injection)
스프링에서 제공하는 의존성 주입이 무엇이고 어떤 문제를 해결해주는지 알아보는데 결론을 먼저 말하자면
프로젝트가 커질수록 관리하는 객체가 많아질수록 생성이 복잡해지고 할애하는 시간이 늘어나는데 이런 경우에 의존성 주입을 받으면 객체 생성과 관리를 효율적으로 할 수 있다.
public class MainService {
TodoService todoService;
Service1 service1;
Service2 service2;
Service3 service3;
}
public class subService {
SubService1 subService1;
SubService2 subService2;
SubService3 subService3;
SubService4 subService4;
}
public class userService {
UserService1 userService1;
UserService2 userService2;
UserService3 userService3;
UserService4 userService4;
}
위에 코드를 보면 각각 여러 기능들이 담긴 클래스들(mainService, suvService, userSerive)을 생성했다.
해당 서비스들을 사용하려면 메인이나 이 서비스들을 사용하는 클래스에서 객체를 생성해야한다. 아래처럼 . .
TodoService todoService = new TodoService(...);
Service1 service1 = new Service1(...);
Service2 service2 = new Service2(...);
Service3 service3 = new Service3(...);
SubService1 subService1 = new SubServie1(...);
SubService2 subService2 = new SubServie2(...);
SubService3 subService3 = new SubServie3(...);
SubService4 subService4 = new SubServie4(...);
UserService1 UserService1 = new UserServie1(...);
UserService2 UserService2 = new UserServie2(...);
UserService3 UserService3 = new UserServie3(...);
UserService4 UserService4 = new UserServie4(...);
이런 클래시들이 많으면 100개가 된다고 생각해보자 . . 답이 없을 것이다 . . 이렇게 생성하는데 쓰는 시간을 줄이고 간단하게 만들어주는 것이 바로 스프링의 핵심 기능인 의존성 주입(DI)다. 귀찮은 작업은 대신해주고 우리는 내부의 기능만 짜면 된다.
이런 의존성 주입을 활용하려면 어노테이션이나 자바코드를 이용하여 객체(Bean 이라고 부름)간 의존성을 명시, 등록 할 수 있고 등록한 후에는 스프링 컨테이너에서 객체를 생성 및 관리(Bean)해준다.
위에코드를 스프링의 어노테이션을 이용하여 써본다면
@Service
public class MainService {
@Autowired TodoService todoService;
@Autowired Service1 service1;
@Autowired Service2 service2;
@Autowired Service3 service3;
}
@Service
public class subService {
@Autowired SubService1 subService1;
@Autowired SubService2 subService2;
@Autowired SubService3 subService3;
@Autowired SubService4 subService4;
}
@Service
public class userService {
@Autowired UserService1 userService1;
@Autowired UserService2 userService2;
@Autowired UserService3 userService3;
@Autowired UserService4 userService4;
}
이처럼 @Service 어노테이션을 사용할 경우 따로 객체 생성을 하지 않아도 된다.
2. 제어의 역전
기존에는 개발자가 직접 new연산자로 객체생성, 의존성 연결 등 제어를 했어야 했는데
스프링 프레임워크에서는 XML 또는 어노테이션으로 스프링 컨테이너에 객체(Bean)을 등록하면 컨테이너에서 객체의 생명주기(생성 -> 의존성 연결 -> 초기화 -> 소멸)을 전부 관리하게 된다.
이러한 객체 관리들을 컨테이너에서 맡게되므로 제어의 역전(IoC)라 부르게 된다.
제어의 역전으로 인해 개발자들은 객체 관리에 신경쓰지 않아도 돼서 유지보수성과 재사용성이 높아지게 된다.
- 스프링 프레임워크가 제어의 역전을 지원하여 스프링 컨테이너에서 객체(Bean)들을 개발자 대신 제어함
- 객체(Bean)의 생명주기(생성 -> 의존성 연결 -> 초기화 -> 소멸)를 관리해주며 의존성 주입도 해줌
- 코드의 유지보수성과 재사용성 증가
스프링을 쓰다보면 설정하면서 Bean등록을 하게 되고 많은 어노테이션들을 쓰게 되는데 이것들이 어떤 기능들이며 왜 필요하고 어떤 기능들을 제공하는지 알고 쓴다면 복잡한 스프링프레임워크를 이해하는데 도움이 될 것이다.