스프링 파트로 넘어가서, DI와 AOP에 대해 배웠다.
우선 오늘 배운 DI에 대해서 정리하다 보니 자연히 DI, DIP, IoC 등등을 연관지어 정리하게 되었다. 그러던 중 어느 블로그에 라이브러리와 프레임워크의 차이를 IoC로 설명할 수 있다고 하는 글을 발견하게 되었다. 예전에도 궁금증을 가지고 찾아본 적이 있는 주제였는데, 명확한 답을 얻지 못했다. 그런데 이번엔 다음과 같이 명확하게 정리할 수 있었다.
누가 물어봤을 때 명확한 답변을 못했던 ‘프레임 워크와 라이브러리의 차이는 무엇인가?’ 에 대해 IoC 관점으로 설명이 가능하다. 라이브러리는 내 코드가 라이브러리를 이용한다. 즉, 제어권이 내 코드에 있다. 반면 프레임 워크는 프레임 워크가 나의 코드를 실행한다. 즉, 제어권은 프레임워크에게 있다.
인용 : [Study]IoC, DI, DIP 개념 잡기
예를 들면, java.util.LinkedList에 있는 LinkedList는 내가 직접 new LinkedList()를 통해 생성하여 사용한다.
하지만 스프링에선 내가 @Bean클래스를 작성하면, 프레임워크가 이를 싱글톤 객체로 생성해 @Autowired에 주입해주는 등 사용한다.
그리고 예전부터 쭉 궁금했던 것 중 하나이기도 하고, 이번에 AOP를 구현하는 실습을 하던 중 도저히 못 참겠어서 Annotation이 대체 어떻게 동작하는건지 Annotation에 대해서 한 번 찾아보았다. (요즘 애용&애청하는게 유튜브의 10분 테코톡 시리즈이다. 각종 Reference를 긁어모아 깔끔하고 알기 쉽게 요약, 설명해주는게 너무 좋다ㅋㅋ 개중에 부정확한 정보도 있긴 하다)
어노테이션을 사용하는 프로그램에게 정보를 전달함(스프링 등)
1. 컴파일 시 사용하는 정보 전달(@Override)
2. 빌드 툴이 코드를 자동으로 생성할 때 정보 전달(@Data)
3. 런타임 시 특정 기능을 처리할 때 사용하는 정보 전달(@Autowired)
Annotation은 정보를 전달할 뿐이지, 그 자체로 어떤 동작도 하지 않음!
@Target({ElementType.TYPE}) //해당 어노테이션을 사용 위치 //TYPE - 클래스, //METHOD - 메서드, //PARAMETER - 파라미터, ... @Retention(RetentionPolicy.RUNTIME) //RUNTIME - 컴파일 이후에도 JVM에게 계속 참조됨, //SOURCE - 컴파일 전까지 유효, //CLASS - 컴파일러가 클래스를 참조할때까지 유효 (위의 용도에 따라) public @interface MyAnnotation{ //@interface : 특별한 interface라는 뜻 String name(); int count() default 1; } //사용 @MyAnnotation(name = "kim") //count는 default값이 있으므로 생략 가능 //name은 default값이 없으므로 반드시 명시다른 예시
public @interface MyAnnotation{ String value(); int count() default 1; } //사용 @MyAnnotation("HelloWolrd!") //value 속성은, 속성명을 빼고 값만 명시 가능 @MyAnnotation(value = "HelloWolrd!", count = 3) //다른 속성과 함께 명시하려면 value도 속성명을 명시 해야 됨
Reflection기술을 이용해 동작함
ex) Annotation정보와 그 Value를 가져와서 사용할 수 있음
그럴 것 같았다, 그게 아니고서야..
@Target(ElementType.TYPE) //클래스단위에 사용되므로
@Retention(RetentionPolicy.RUNTIME) //런타임동안 사용되므로
@Documented
@Component
public @interface Controller{
@AliasFor(annotation = Component.class)
String value() default "";
//value속성을 가지고 있고, default값은 ""
}
A. 리플렉션 기술로 @Controller 애노테이션이 붙은 걸 전부 다 찾아내서 사용함
+어쩌다보니 참고한 영상을 그대로 써버린 꼴이 됐다
보통 정리하다 보면 좀 달라지고 그러는데, 이 영상이 너무 잘 정리되어 있어서 그런 것 같다
참고 영상 : [10분 테코톡] 초롱의 Annotation