인프런 스프링부트 개념정리(이론)
이 글은 다음 강의의 이론 정리 글 입니다.
필터는 검열을 하는 도구로 B나라(외부)에서 A나라의 성로 못들어오게 입구에서 ID카드를 확인해서 A나라 사람만 출입할 수 있게 하는 문지기(Tomcat-web.xml
)라는 임무를 가지고 있다. 또한, A나라 안에서도 왕의 집에 들어가려면 권한이 있는 사람만 들어갈 수 있기 때문에 여기서도 필터(Spring Container-Intercepter
)가 적용된다.
실제로 Tomcat안에 Spring Container가 있는 것은 아니고, Tomcat의 필터를 거쳐서 Spring Container로 간다는 것을 표현한 것이다. Tomcat에 있는 필터는 말 그대로 filter라고 부르고 web.xml이라는 필터의 기능을 하는 파일이 있다. Spring Container에 있는 필터는 intercepter라고 부르고 AOP라는 개념과 함께 쓰인다. 권한을 체크하고 있으면 허용, 없으면 거부하는 역할을 한다.
따라서, 스프링 자체에 자동으로 사용되는 필터도 있고, 사용되고 있지 않은 필터를 사용하겠다고 설정할 수도 있고, 직접 필터를 생성할 수도 있다.
우리가 흔히 아는 주석은 다음과 같다.
// 어쩌구저쩌구 주석
이 주석이 하는 일은 컴파일러가 해당 statement를 무시하도록 한다.
java에서의 어노테이션은 주석을 의미하지만 컴파일러가 무시하도록 하지 않고 컴파일러에 힌트를 준다.
만약 다음과 같은 코드가 있다고 생각해보자.
Animal{
run();
}
Dog inherits Animal{
@override
run();
@override
fly(); // 컴파일 체킹 시에 에러뜸
}
Dog class를 컴파일 할때 run() 위에 @override라는 어노테이션이 있으므로 상속한 Animal class에 run()이 있는지 살펴본다. fly()도 동일하게 @override 어노테이션이 있으므로 Animal class에 fly()가 있는지 살펴봤는데 없다! 이렇게 되면 컴파일 체킹시에 에러가 뜬다.
Spring에서는 어노테이션으로 객체를 생성한다. 예를 들어, 다음과 같은 어노테이션을 본 적이 있을 것이다.
@Component
: 클래스 메모리에 로딩한다.
@Autowired
: 로딩된 객체를 해당 변수에 집어넣는다.
(@Bean
, @Controller
, ... )
@Component
부터 살펴보자. 우리는 이전 글에서 IoC에 대해 배웠다. Spring은 객체들을 스캔해서 heap 메모리 공간에 로드한다. 이때 @Component가 붙어있는 객체들을 heap 메모리 공간에 로드하는 것이다. 다음 코드에서 A class는 Spring에 스캔돼서 메모리 공간에 로드되었을 것이다.
@Component
Class A {
}
그렇다면 A 객체를 Class B에서 쓰고 싶다면 어떻게 해야할까?
예전에는 이렇게 B 안에서만 쓸 수 있는 새로운 A 객체를 메모리에 올렸다.
Class B {
A a = new A();
}
하지만 Spring에서는 다음과 같이 적으면 된다.
Class B {
@Autowired
A a;
}
이렇게 쓰면 스프링이 B 객체를 스캔할 때 B 클래스 내부에 어떤 친구(메서드, 필드, 어노테이션)가 있는지 분석한다. 이를 리플렉션이라고 한다. 만약 어떤 친구가 있다면 무엇인가 해라!라고 설정할 수도 있다.
즉, heap 메모리에 A가 있다면 a에는 DI가 된다. 없다면 a에 null이 들어간다.
다시 정리하면, 어노테이션은 주석이자 힌트를 주는 역할을 하고, 리플렉션은 런타임시 해당 클래스의 내부를 분석하는 기법인 것이다.
런타임은 나중에 코드로 설명