규턴의 개발블로그
article thumbnail

 

안녕하세요

이번시간에는 저번 시간에 다루었던 DI에 이어 DI와 연관되어 있는 IOC에 대해 알아보겠습니다.

 

IoC(Inversion of Control)??

IOC?  IOC=Inversion Of Control 입니다.

직역하면 제어의 역전입니다.

 

우선 IoC가 적용되지 않은 코드를 보겠습니다.

1
2
3
4
5
public interface Fruit {
 
    //인터페이스 관한 함수들
}
 
cs
1
2
3
4
public class Apple implements Fruit{
 
    //Fruit 관한 함수구현
}
cs
1
2
3
4
public class Food {
    private Fruit fruit = new Apple();
}
 
cs

이와 같이 사용자가 직접 Fruit에게 (new 등을 사용하여) 의존성을 부여합니다.

 

반대로 IoC 가 적용된 사례를 보기 전에 스프링 컨테이너에 대해서 알아야 합니다.

 

Spring에서의 IoC

 

우선 스프링은 컨테이너를 가지고 있습니다. 

컨테이너는 말 그대로 무엇을 담을 수 있는 성질을 가지고 있습니다.

이러한 특징을 이용해 spring Bean을 담고 Bean의 생성과 관계, 사용, 생명 주기 등을 다루게 됩니다.

위의 사진을 보면 어느 정도 이해가 가시겠지만 더욱 구체적인 예시인 코드로 보겠습니다.

1
2
3
4
5
@Repository
public class FoodRepository {
    //repository에 대한 구현
}
 
cs

 

1
2
3
4
5
6
@Service
public class FoodService {
    @Autowired
    private FoodRepository foodRepository
}
 
cs

 

@Repository, @Service는 spring에서 사용하는 annotation입니다.

이것을 사용하면 spring container에 등록되게 됩니다.

그리고 IoC의 가장 대표적인 annotation인 @Autowired가 있습니다.

 

 

일반적으로 사용자가 foodRepository의 값에 대입하려면, (생성자가 있다고 가정)

1
2
3
public static void main(String[] args) {
        FoodService foodService =new FoodService(new FoodRepository());
    }
cs

와 같이 직접 foodRepository를 대입해줘야 합니다.

 

하지만 @Autowired가 되어있다면 spring container에 있는 FoodRespository가 자동으로 FoodService의 foodRepository에 대입되게 됩니다.

       컨테이너에 foodRepository와 foodService는 (@Repository, @Service annotation에 의해) 빈으로 등록되어 있는 그림입니다.

 

이와 같이 현재 FoodService의 FoodRepository의 제어는 사용자에게 있는 것이 아니라 spring Container에게 있습니다.

이것을 Spring에서의 IoC(제어의 역전)이라고 합니다.

 

이것으로 IoC에 대하 설명을 마치겠습니다.

 

다음에는 spring에서의 annotation에 관해 포스팅해보도록 해보겠습니다.

 

감사합니다.

profile

규턴의 개발블로그

@규턴이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!