[Spring Boot] IoC와 DI

mi-fasol·2023년 4월 6일
0

Spring

목록 보기
2/4

스프링 부트 하면 빠질 수 없는 개념이 있다. 바로 DI(의존성 주입)과 IoC(제어의 역전)이다.

오늘은 이 두 가지 개념에 대하여 알아보도록 하겠다.

IoC

IoC부터 살펴보도록 하자.

IoC는 제어의 역전을 의미한다.

객체와 메소드를 호출하는 작업은 보통 개발자가 하게 되는데, IoC를 사용하면 스프링 컨테이너가 이에 대한 제어권을 가지게 되어 제어가 역전되는 것이다.

우리가 보통 객체를 제어하려면 어떤 코드가 필요할까?

class Example{

	private Test test;
    
    Example(){
    	this.test = new Test();
    }
}

이렇게 new를 통해 직접 객체를 생성한 후 객체를 할당해야 한다.
이제 IoC를 활용하여 적은 코드의 예시를 보자.

public class Example{
	
    @Autowired
    private Test test;
    
}

위의 코드를 살펴 보면, 클래스에서 @Autowired 어노테이션을 통해서 객체를 주입 받았다.

Test 객체가 스프링 컨테이너(IoC 컨테이너)에게 관리받는 대상인 빈(Bean)일 경우, 이 @Autowired 어노테이션을 사용해 객체 주입이 가능해진다.

컨테이너가 객체를 생성해서 해당 객체에 주입시킨 것인데, 이것이 제어 역전의 예시다.

IoC의 장점

  • 객체 간 결합도 감소
  • 코드의 유연성
  • 코드 해석의 용이성
  • 개발 및 유지보수의 용이성

IoC를 사용할 경우, 객체를 일일이 클래스에 생성하고 사용할 필요 없이 그냥 주입받아서 사용하면 된다.

그럼 객체를 주입받는 것은 무엇인가?

DI

여기서 필요한 개념이 DI다.

의존성이란 무엇인가?
스프링에서 생성되는 객체 간의 관계를 뜻한다.
한 객체가 다른 객체에 의존한다는 것은, 의존대상인 객체가 변할 때 그것이 다른 객체에도 영향을 미친다는 것을 의미하는 것이다.

DI의 장점

  • 재사용성 향상
  • 테스트의 용이성
  • 유지보수의 용이성
  • 코드 해석의 용이성
  • 코드의 단순화
  • 종속성 감소
  • 결합도는 감소시키면서 유연성 및 확장성 향상
  • 객체 간 의존 관계 설정

DI는 위처럼 개발 및 유지보수가 편해지고, 결합도가 낮아지며 유연해진다는 장점이 존재한다.

그렇다면 의존성을 주입하는 방법은 어떤 것이 있을까?

의존성 주입의 세 가지 방법

  • 생성자 주입: 가장 권장되는 방법
    • 필요한 의존성을 포함한 클래스 생성자를 만든 후, 이 생성자를 통해 의존성 주입
  • 필드 주입: 필드에 의존 관계를 주입하는 방법
    • 프레임워크에 의존적이고, final 선언이 불가하므로 권장되지 않는 방법
  • 수정자 주입: setter 메소드를 통해서 의존성을 주입
    • 현재는 주입 받는 객체가 변경될 수 있는 경우에 사용

위의 세 가지 방법으로 의존성을 주입한다고 한다.

예시 코드를 확인해보자.

생성자 주입

@Component
public class TestController {

   private TestRepository testRepository;
   
   public TestController(TestRepository testRepository) {
       this.testRepository = testRepository;
   }
}

필드 주입

@Component
public class TestController {
    @Autowired			// 필드에 직접 @Autowired 어노테이션 선언
    private TestRepository testRepository;
}

수정자 주입

@Component
public class TestController {

   private TestRepository testRepository;
   
   @Autowired 		// setTestRepository로 setter 생성하여 의존성 주입
   public void setTestRepository(TestRepository testRepository) {
       this.testRepository = testRepository;
   }
}

오늘은 이렇게 간단하게 DI와 IoC에 대하여 알아보았다.

전에 학교에서 수업을 들을 때 잠깐 다뤄본 기억이 있는데, 시간이 지나고 다시 글로 작성해보니 기억하고 있던 개념을 직접 코드로 볼 수 있어서 좋은 것 같다.

다음 게시물도 스프링에 관한 글을 적어보겠다.

profile
정위블

0개의 댓글