Spring Boot - IoC, Bean, AOP 예제
Inversion of Control (IoC)
ioc - 객체의 의존성을 역전시켜, 객체 간의 결합도를 줄이고 유연한 코드를 작성하게 하여 가독성 및 코드의 중복, 유지보수를 편하게 할 수 있게한다.
di - 객체를 직접 생성하는 것이 아니라, 외부에서 생성한 후 주입을 시켜주는 방식
일반적으로 의존성에 대한 제어권은 객체 자기 자신이 갖지만, 첫번째 코드는 Sample이라는 클래스에서 Apple 객체를 불러오는 예제이다. 의존관계는 간단히 말해서 new라는 키워드를 통해 생성
첫번째 코드는 Apple 객체의 제어권이 Sample에게 있다는 의미,
두번째 예시는 Sample에게 있는게 아니라 SampleTest에게 있다는 것
이처럼 의존성을 역전시켜 제어권을 직접 갖지 않는 것을 IoC라고 하며, 의존성을 외부에서 주입 시켜주는 것을 DI라고함
Bean
@Configuration 어노테이션은 스프링 IoC Container에게 해당 클래스를 Bean 구성 Class임을 알려줌
@Bean 어노테이션과 @Component 어노테이션 둘 다 Spring Container에 Bean을 등록하도록 하는
메타데이터를 기입하는 어노테이션
첫번째 Bean 어노테이션의 경우 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려 할때 사용함
ArrayList같은 라이브러리를 빈으로 등록하기 위해서 별로도 해당 라이브러리 객체를 반환하는 메서드를 만들어서 bean 어노테이션을 붙힌다.
의존관계가 필요할때 Student 객체의 경우 생성자에서 ArrayList를 주입 받도록 해놨고, 이럴때 Bean으로 선언된 array() 메서드를 호출해서 의존성 주입이 가능함
@Component 어노테이션의 경우 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션
Student 클래스는 개발자가 사용하기 위해서 직접 작성한거고 이 클래스를 Bean으로 등록하기 위해 상단에 컴포넌트 어노테이션을 사용
컴포넌트를 사용한 빈의 의존성 주입은 @AutoWired 어노테이션을 이용하여 할 수 있음
Student가 Pencil에 대한 의존성을 가지고 있는 경우 @Autowired 어노테이션을 사용하여 의존성을 자동으로 주입가능
AOP
AOP 는 공통되어있는 흩어진 관심사(부가기능, 주기능) 을 한번의 코드를 작성하여
분리해주어 코드를 중복으로 기재하는 것을 방지합니다.
해당 클래스 두개에서 각 메서드마다 AAAA와 BBBB가 중복되어 나타나는데 다음 코드를 보면
중복되어있는 AAAA와 BBBB를 AOP를 적용시켜 묶어서 처리할 수 있습니다.