✏️ [Spring] IoC(Inversion of Control)

박상민·2024년 5월 25일

Spring

목록 보기
5/12
post-thumbnail

⭐️ IoC란?

  • IoC, Inversion Of Control: 뒤바뀐 제어권, 제어의 역행
  • 인스턴스의 생성 및 소멸을 개발자 대신 스프링 컨테이너가 한다.
  • 따라서 낮은 결합도를 유지한다.
    • 사용 안한다면, 객체 사이의 의존관계를 개발자가 직접 코딩하지 않으므로 코드에 의존관계가 명시되지 않아 결합도가 떨어져 유지보수 하기 좋다.

IoC는 Spring 외에서도 사용된다.

객체의 생성이나 객체 사이의 의존 관계를 개발자가 직접 자바 코드로 처리해야 했었다. 이런 상황에서는 의존관계에 있는 객체를 변경하려면 반드시 자바 코드를 수정해야 한다. 이는 높은 결합도를 유발하고 유지보수가 어려워진다.

하지만 IoC가 적용되면 객체 생성과 의존관계를 컨테이너가 처리하게 된다.
결과적으로 소스에 의존관계가 명시되지 않으므로 결합도가 떨어져서 유지보수가 편리해진다.

조금 더 스프링의 관점으로 작성하자면 IoC는 객체의 생성과 생명주기 관리를 개발자가 아닌 프레임워크가 담당하는 것을 의미한다.
이는 스프링 프레임워크의 핵심 원리 중 하나이다.
왜냐하면 IoC를 통해 개발자는 더이상 객체의 생성과 생성주기 관리를 신경쓰지 않아도 되고, 비즈니스 로직에 더 집중할 수 있다.
또한, 프레임워크가 제공하는 서비스를 효율적으로 활용할 수 있다.

스프링 컨테이너는 어플리케이션의 객체들을 생성하고 관리하는 역할을 한다.
@Conponent, @Service, @Repository 등의 어노테이션을 사용하여 스프링 컨테이너에 객체를 등록하면, 스프링이 자동으로 객체를 생성하고 관리한다.

📌 구현 방법

스프링은 두가지 어노테이션을 지원해서 IoC를 구현한다.

  • @Component
  • @Autowired

@Component

  • 간단하게 말해서 스프링 프레임워크가 관리해야하는 Bean이라는 것을 알려주는 어노테이션이다.

@Autowired

  • 간단하게 말해서 스프링 프레임워크에게 타입과 일치하는 Bean을 주입해달라고 요청하는 어노테이션이다.

의존성이 삽입된다는 의미로 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줄이 개발자의 편의성과 개발의 효율성을 높여주고 낮은 결합도를 만들어낸다.

📌 일반 제어권 vs IoC

  • 일반 제어권: 내가 사용할 의존성은 내가 만든다
public class OwnerController {
  private OwnerRepository repository = new OwnerRepository();
}
  • IoC: 내가 사용할 의존성은 누군가 알아서 줄거야
    • 내가 사용할 의존성의 타입만 일치한다면 상관없다
    • 코드 테스트가 편리하다
  • 각 개체들의 강한 의존성을 유연하게 만든다.

출처
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

0개의 댓글