IoC는 Spring 외에서도 사용된다.
객체의 생성이나 객체 사이의 의존 관계를 개발자가 직접 자바 코드로 처리해야 했었다. 이런 상황에서는 의존관계에 있는 객체를 변경하려면 반드시 자바 코드를 수정해야 한다. 이는 높은 결합도를 유발하고 유지보수가 어려워진다.
하지만 IoC가 적용되면 객체 생성과 의존관계를 컨테이너가 처리하게 된다.
결과적으로 소스에 의존관계가 명시되지 않으므로 결합도가 떨어져서 유지보수가 편리해진다.
조금 더 스프링의 관점으로 작성하자면 IoC는 객체의 생성과 생명주기 관리를 개발자가 아닌 프레임워크가 담당하는 것을 의미한다.
이는 스프링 프레임워크의 핵심 원리 중 하나이다.
왜냐하면 IoC를 통해 개발자는 더이상 객체의 생성과 생성주기 관리를 신경쓰지 않아도 되고, 비즈니스 로직에 더 집중할 수 있다.
또한, 프레임워크가 제공하는 서비스를 효율적으로 활용할 수 있다.
스프링 컨테이너는 어플리케이션의 객체들을 생성하고 관리하는 역할을 한다.
@Conponent, @Service, @Repository 등의 어노테이션을 사용하여 스프링 컨테이너에 객체를 등록하면, 스프링이 자동으로 객체를 생성하고 관리한다.
스프링은 두가지 어노테이션을 지원해서 IoC를 구현한다.
@Component
@Autowired
의존성이 삽입된다는 의미로 IoC를 DI라는 표현으로 사용한다.
아래 예시 코드는 스프링 컨테이너가 Department 객체를 생성하고, Student 객체에 주입하는 과정을 보여준다.
예시 코드
@Component
public class Student{...}
@Service
public class Department{
@Autowired
private Engine engine;
public Department() {}
}
이처럼 IoC는 객체의 생성부터 생명주기 관리까지 프레임워크가 담당함으로써, 개발자가 보다 효율적으로 어플리케이션을 개발할 수 있도록 돕는다.
이런 부분들이 스프링을 사용하는 개발자라면 IoC의 원리를 이해하고, 스프링 컨테이너의 관리 아래에서 어플리케이션을 개발하는 것이 중요하다. 그렇지 않는다면 엄청난 고난이 기다린다.
좋은 경험일수도?
IoC를 사용할 때의 이점을 IoC 사용 전, 후로 비교해서 알아보자.
public interface StudentRepository {
List<Student> findAll();
Student findById(Long id);
}
IoC 사용 전
public class StudentRepositoryImpl implements StudentRepository {
...
}
@Controller
public class StudentController {
//Controller에서 Repository를 직접 생성
private StudentReposisoty repository = new StudentRepositoryImpl();
...
}
IoC 사용 후
@Component
public class StudentRepositoryImpl implements StudentRepository {
...
}
@Controller
public class StudentController {
@Autowired // StudentController를 셋팅할 때 Spring framework가 자동으로 StudentRepository의 객체를 생성해서 주입해준다.
private StudentRepository repository;
...
}
위 예시 코드에서 IoC 사용 전, 후 코드의 차이는 단 1줄이지만 이 1줄이 개발자의 편의성과 개발의 효율성을 높여주고 낮은 결합도를 만들어낸다.
public class OwnerController {
private OwnerRepository repository = new OwnerRepository();
}
출처
https://github.com/devham76/tech-interview-study/blob/master/contents/spring.md
https://devham76.github.io/spring/Spring-IoC/#ioc
https://f-lab.kr/insight/understanding-spring-di-and-ioc?gad_source=1&gclid=Cj0KCQjwmMayBhDuARIsAM9HM8dAaaGOJ7tX-Hs5pH2N1OQjlT_o4Xy_eWrULDWokmjgrrUUP-XcbOIaAlP5EALw_wcB