Wanna be Brilliant Full-Stack Developer

no clue of FIlter, @Annotation & Spring 개념 잡기 2 본문

Some Memos/Spring 개념

no clue of FIlter, @Annotation & Spring 개념 잡기 2

Flashpacker 2022. 2. 11. 16:30


목표

스프링은 엄청나게 많은 필터를 가지고 있다는데 이게 무슨 소리인가? 한번 이번 기회를 통해 이해를 해보자!

 

Example

A라는 성이 있는데 왕의 집이 있다. 이 상황에 B나라가 있는데 B나라는 A나라와 전쟁중이다. 

근데 B나라의 스파이들이 A나라의 성에 진입해서 들어올려고해서 

A나라는 이 심각성을 깨닫고 이것을 못들어오게 막기 위해서 가장 좋은 방법인 입구에서부터 막는 방법을 선택한다

입구에서 너는 어디 나라사람인지 Id카드를 확인하고 A나라사람이면 들어오고 B나라 사람이면 못들어오게 하는 이부분이 지금 검열의 기능을 하고 있는데 이게 필터이다. 

 

수 많은 A나라 사람중에서 성안에 들어오면 여러 군데로 이동할수 있는데 어떤 특정의 사람은 왕에게 가서 용무를 봐야하는 사람도 있을것이다. 

그러면 A나라의 모든 사람이 왕의 집에 들어갈 수 있는것이 아니라 어떤 특정 권한을 가진 사람만 왕의 집에 들어올수 있게 할 수 있다. 이떄도 똑같이 왕의집 입구에 필터가 필요하다. 

이 필터를 통해 권한이 있는 사람만 들어오고 없는 사람은 못들어 오는것이다. 

 

쉽게 이야기하면 이 필터를 문지기라고 볼수 있다. 이 문지기에게 어떤 임무를 주는데 A나라사람 들 말고 B나라 사람이면 다 걸러내고 왕의 집에 특정권한이 없는 사람도 걸러내 라는 임무를 직접 줄수 있고 Spring 자체가 기본적으로 가지고 있는 필터 기능들도 있다. 

이러한것을 사용해도 되고 그 많은 필터중에도 사용되지 않고 있는 필터를 사용하겠다고 설정할수도 있다.

혹은 내가 직접 필터를 만들어서 사용할 수 도 있다.

 

 

엄밀히 말하면 성이 톰캣이라 말할수 있고 왕의 집을 Spring Container 라고 볼수 있다.

사실 스프링 컨테이너가 톰캣 안에 있는것은 아닌데 톰캣을 거쳐서 들어가는것인데 이것은 중요한것이 아니다!

중요한건 톰캣 과 스프링 컨테이너가 가지고 있는 각각의 필터들은 다르게 불리고 있다. 

톰캣이 가지고 있는 필터는 실제로도 필터라고 불리고 이 필터의 기능으로 하는 파일이 있는데 

이것을 바로 Web.xml이라고 한다!

 

스프링 컨테이너가 이 필터는 인터셉터(Intercepter)라고 부른다!

AOP라는 개념이 있는데 나중에 코드 작성을 통해서 설명하려고한다. 

인터셉터도 필터와 같이 비슷한 기능을 하는데 누가 들어올떄 그 권한을 체크한다!

 


목표2

스프링은 엄청나게 많은 어노 테이션을 가지고 있다 (리플렉션, 컴파일 체킹) 

컴파일 체킹은 무엇인가? 

어노테이션에대한 이해가 먼저 있어야한다. 

자바에서는 // 로 글을 적으면 주석이라고 부르는데 어노테이션은 주석인데 

주석은 컴파일러가 무시하는게 주석인데

어노테이션의 주석은 컴파일러가 무시하는것이 아니라 컴파일러가 먼가를 체킹할수 있게 힌트를 주는 주석

 

사용 방법!

example

Animal 이라는 클래스 run() 메서드가 있고 Dog이라는 클래스가 Animal을 상속하게 되면 

Dog이 run()이라는 메서드를 재정의 할수 있는데  그위에 @override라고 어노테이션을 붙이면 

나중에 자바가 실행될때 컴파일을 할떄 여기에 어노티에션이 붙어 있다는것을 확인하고 애니멀이라는 부모가 런이라는 메서드를 가지고 있겠지 예상하고 확인하고 있으면 정상!

만약에 Dog 이 클래스가 Run이라는 메서드가 아니라 fly라는 메서드를 가지고 있으면 

어노테이션이 오버라이드라고 적혀있으면 애니멀한테 fly 메서드가 있는지 확인하고 없으면 컴파일 체킹시 오류가난다.

 

스프링은 어노테이션을 통해 주로 객체를 생성한다.

@Component ,@Bean, @Controller와 같은 어노테이션들을 직접 생성하고 

어노테이션이 어떤 역할을 하는지 미리 약속을 한다.

ex) @Component 어노테이션이 붙어 있는 클래스를 메모리에 로딩해!

@Component 어노테이션을 보고 스캔하여 heap메모리에 할당한다!

@Autowired -> 어노테이션이 붙어 있으면 로딩된 객체를 해당 변수에 집어넣어라는 약속이 되어있으면

어떤 클래스가있을때 A라는 클래스가 있는데 A라는 클래스를 개발자가 직접 new하는것을 사용하는것 보다는

SPring은 IOC 를 사용한다고 헀다

그래서 @Component 라고 붙어 있으면 스프링이 해당 클래스를 스캔해서 (읽어서) 자기가 가지고 있는 메모리 공간(heap) A라는 클래스를 로드한다. 왜냐하면 @Component 은 클래스 메모리에 로딩 한다는 약속이 있기떄문이다.

이게 제어의 역전  IOC이다. 스프링이 객체를 생성한다. 그떄 사용하는 기법 어노테이션 기법이다.

 

이 메모리에 뜬 A 객체를 어딘가에서 사용하고 싶다 만약에 클래스 B에서 사용하고 싶으면 Class B {

@Autowired   

  A a;  // 만약에 java 였으면 A a = new A();  이렇게 되면 a는 원래저장하고 있는 A 객체가 아니라 또다른 heap영역제 저장 되도록 만드는것

}   

나중에 스프링이 B클래스를 읽어 드릴때 B클래스 내부에 있는 어떤 애가 있는지 분석하는 기법을 리플렉션(Reflection) 이라고 한다. 리플렉션을 통해 어떤 특정 클래스 내부에 있는 메서드 ,필드 , 어노테이션을 체킹할 수 있다. 있는지 체킹하고 이게 없다면 무엇인가를 하라고 설정할 수 있다. 

리플렉션을 통해서 @Autowired를 확인하고 로딩된 객체를 해당변수에 넣으라는 약속을 체크 하고 

스프링이 IOC를 통해 직접 집어넣은 이 객체가 A 말고도 수많은것들이 많을텐데 그 중에서 쭉 읽어 드려서 해당 타입 A와 동일한 타입의 객체가 떠있는지 확인한다. A가 없으면 결과는 Null이고 만약에 있으면 저 a에 스프링에서 A가 쏙 들어간다 이것이 DI이다. 


정리: 어노테이션은 주석 + 힌트이다. 

리플렉션은 어떤 해당의 클래스가 어떤 필드, 어떤 메서드, 어떤 어노테이션 어떤것들 을 들고 있는지 분석하는 기법인데

이게 런타임시에  분석한다.