IOC란 무엇인가?
IOC는 Inversion Of Control의 약자로 제어의 역전을 의미한다.
다음 예시로 설명을 해보려고 한다.
PostService, PostRepository는 인터페이스이며 PostServiceImpl, PostRepositoryImpl은 각 인터페이스를 구체화 한
구체 클래스이다.
PostServiceImpl은 PostRepository를 의존하고 있는 상황이다.
[PostServiceImpl]
public class PostServiceImpl implements PostService {
private final PostRepository postRepository;
public PostServiceImpl(PostRepository postRepository) {
this.postRepository = postRepository;
}
@Override
public Long write(Post post) {
postRepository.save(post);
return post.postId;
}
}
여기서 주의깊게 봐야할 점은 PostServiceImpl 이
PostRepositoryImpl
을 의존하고 있는 것이 아닌 PostRepository
인터페이스를 의존하고 있는 것이다.
외부의 도움 없이는 PostRepositoryImpl을 의존할 수가 없다.
따라서 다음 그림과 같이 외부에서 PostRepositoryImpl을 주입시켜주어야 한다.
[Configuration]
public class Configuration {
public PostRepository postRepository() {
return new PostRepositoryImpl();
}
public PostService postService() {
return new PostServiceImpl(postRepository());
}
}
Configuration 에서 PostServiceImpl에 postRepositoryImpl을 주입시켜주고 있다.
프로그램에 대한 제어흐름에 대한 권한은 모두 Configuation이 가지고 있다.
이와 같이 프로그램의 제어 흐름을 직접 하는 것이 아닌 외부에서 관리하는 것을 IOC (제어의 역전)이라고 한다.
DI란 무엇인가?
DI는 Dependency Injection의 약자로 객체간의 의존성을 외부에서 설정해주는 방법을 말한다.
public class PostServiceImpl implements PostService {
private final PostRepository postRepository;
public PostServiceImpl(PostRepository postRepository) {
this.postRepository = postRepository;
}
@Override
public Long write(Post post) {
postRepository.save(post);
return post.postId;
}
}
위 코드에서 PostServiceImpl은 PostRepository 인터페이스에 의존하고 있다.
하지만 Configuration 파일 설정 덕에
런타임 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해 클라이언트와 서버의 실제 의존관계가 연결되는 것을
의존관계 주입이라고 한다.
의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고 클라이언트가 호출하는 대상의 타입을 변경할 수 있고, 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다는 장점이 있다.
'Spring' 카테고리의 다른 글
Enum Validation (0) | 2023.04.24 |
---|---|
Spring Bean의 생명주기 (0) | 2023.04.21 |
싱글톤에 대해서 (2) | 2023.04.10 |
Dependency Injection (의존 관계 주입) (0) | 2023.04.10 |
Spring Rest Docs Tutorial (0) | 2023.04.06 |