이 포스팅은 필자가 배운 내용을 정리하기 위한 목적이므로, 비유적인 표현이 많고 정석적인 정의와는 다를 수 있다.
그 점을 인식해주었으면 한다.
피드백 절대 환영!!!
필터란 무언가를 걸러내는 기능이다.
그렇다면 스프링에서의 필터도 같은 역할을 할까? 맞다!
예를 들어, A나라와 B나라가 전쟁 중이라고 하자.
A나라에는 성이 있고(톰캣), 이 성에 B나라 사람들이 몰래 들어오지 못하도록 필터(web.xml) 로 걸러내야 한다.
또한, 성 안에는 왕의 거주지(스프링 컨테이너) 가 있을 텐데,
이곳을 방문하려면 A나라 사람이라도 아무나 들어갈 수 없도록 필터(인터셉터, AOP) 가 추가로 필요하다.
즉,
톰캣 안에 스프링 컨테이너가 내장된 구조는 아니지만, 쉽게 이해하기 위해 이렇게 표현했다!
web.xml
public class Animal {
public void run() { }
}
public class Dog extends Animal {
@Override
run() { } // 오타! (오류 발생)
}
어노테이션이란 스프링에게 주석처럼 힌트를 주는 기능이다.
"이 부분은 해석하지 마"
라고 알리는 것 예를 들어, @Override
어노테이션은 "이 메서드는 부모 클래스의 메서드를 재정의한 것이다" 라는 의미다.
스프링이 매번 이를 직접 해석하기보다, 어노테이션을 보고 쉽게 이해할 수 있도록 힌트를 주는 것이다.
@Component // 클래스를 스프링 컨테이너에 등록
@Autowired // 스프링이 등록한 객체를 자동으로 주입 (DI)
다음 코드에서 어노테이션이 어떻게 작동하는지 살펴보자.
@Component
public class A { }
public class B {
@Autowired
A a;
}
@Component
가 붙은 클래스 A는 스프링이 관리하는 객체(Bean) 가 된다.
클래스 B에서는 @Autowired
를 사용하여, 스프링 컨테이너에서 A 객체를 찾아 자동으로 주입한다.
리플렉션은 런타임 시점에 클래스의 정보를 분석하는 기법이다.
프로젝트가 실행되면, 스프링 컨테이너는 @Component
가 붙은 클래스를 스캔해 Heap 메모리에 올린다.
이 과정에서 각 클래스가 어떤 필드, 메서드, 어노테이션을 가지고 있는지 확인한다.
컴파일 체킹이란, 리플렉션 과정에서 코드가 올바른지 확인하는 과정이다.
예를 들어, 다음 코드에서 @Override
를 사용했지만 부모 클래스에 fly()
메서드는 존재하지 않는다.
public class Animal {
public void run() { }
}
public class Dog extends Animal {
@Override
public void fly() { } // 컴파일 오류 발생! (부모 클래스에 fly() 없음)
}
이 경우, 스프링이 리플렉션 과정에서 확인한 후 오류를 발생시킨다.
즉, "정말로 Override가 맞는지 확인하는 과정" 이다.
개념 | 설명 |
---|---|
어노테이션 | 스프링에게 주석처럼 힌트를 주는 기능 |
리플렉션 | 런타임에 클래스의 필드, 메서드, 어노테이션 정보를 분석하는 기법 |
컴파일 체킹 | 리플렉션 과정에서 코드가 올바른지 확인 |