[Spring] IoC, DI

김택준·2022년 10월 18일
0

Spring

목록 보기
1/3
post-thumbnail

백기선님의 "스프링 프레임워크 입문" 인프런 강의를 수강한 후, 여러 글들을 참고하여 쓴 글입니다.
문제가 될 시 삭제하겠습니다.

IoC(Inversion of Control)

IoC(Inversion of Control)란 "제어의 역전" 이라는 의미로, 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.

객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.

예제 코드

일반적으로 의존성에 대한 제어권은 객체 자기 자신이 갖는다. 아래의 코드는 OwnerController이라는 클래스에서 OwnerRepository 객체를 불러오는 예제이다. 의존관계는 간단히 말해 new라는 키워드를 통해 생성된다.

class OwnerController {
	private OwnerRepository repository = new OwnerRepository();
}

OwnerControllerTest라는 클래스에서 OwnerRepository 객체를 생성한 뒤 OwnerController 클래스의 생성자로 주입시켜 준다. 여기서는 OwnerController이 직접 OwnerRepository를 생성하는 것이 아니라 생성자로 주입받는다.
// IoC
class OwnerController {
	private OwnerRepository repo;
    
    public OwnerController(OwnerRepository repo) {
    this.repo = repo;
    }
    
    // repo를 사용합니다.
}

class OwnerControllerTest {
	@Test
    public void create() {
    	OwnerRepository repo = new OwnerRepository();
        // OwnerRepository란 의존성을 OwnerController한테 의존성 주입
        OwnerController controller = new OwnerController(repo);
    }
}

이처럼 첫 번째 예시에서는 OwnerRepository 객체의 제어권이 OwnerController에게 있었다면, 두 번째 예시에서는 OwnerController에게 있는 것이 아니라 OwnerControllerTest에게 있다.

DI(Dependency Injection)

DI(Dependency Injection)스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로,
객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다. (new 연산자를 이용해서 객체를 생성하는 것이라고 생각하면 된다)

의존성을 주입하는 방법

  • 생성자에서 주입
  • 필드에서 주입
  • setter 에서 주입

스프링에서 @Autowired 어노테이션filed, 생성자, setter 메소드 등에 붙여서 사용할 수 있습니다.

이는 의존성을 주입할 때 붙이게 되는데, 스프링 4.3 이상부터는 생성자로 의존성을 주입할 때에는 @Autowired 어노테이션을 생략할 수 있습니다.

1. 생성자 활용 : OwnerController에 OwnerRepository 의존성을 생성자를 통해 주입하고 있다.

public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
	this.owners = clinicService;
    this.visits = visits;
}

2. 필드에서 주입받을 때 :

@Autowired
private OwnerRepository owners;
// OwnerRepository가 이미 Bean으로 등록된 상태에서, owners에 의존성을 주입해 달라는 의미입니다.
// 필드가 final 변수일 경우 주입받을 수 없습니다.

3. setter 메소드 :

@Autowired
public void setOwners(OwnerRepository owners){
	this.owners = owners;
}

세 가지 방법스프링 레퍼런스에서 권장하는 방법1. 생성자에서 주입받는 것 입니다.

이것이 권장되는 이유는, 필수적으로 사용해야 하는 레퍼런스(객체, 의존성) 없이인스턴스를 만들지 못하도록 강제하는 역할을 할 수 있기 때문입니다.

가령 위의 1번 예시에서는 생성자의 인자에 OwnerRepository type의 객체를 받고 있기 때문에, OwnerController는 OwnerRepository 없이는 객체 생성이 불가능해집니다.

참고했던 블로그🙇‍♂️

henry-jo님의 티스토리 글
빅팜님의 티스토리 글
coco3o님의 티스토리 글
대학생Devlog님의 티스토리 글
ChanBlog님의 블로그 글

profile
핑계 대지 않기

0개의 댓글