DevBoi

[Spring] 주요 어노테이션 총 정리 본문

Develop/[Spring]

[Spring] 주요 어노테이션 총 정리

HiSmith 2022. 3. 3. 13:40
반응형

스프링 관련 주요 어노테이션을 정리하면서 스프링 전반적인 개념을 좀더 쌓아보자

 

1. @Configuration 

스프링에서 설정 클래스를 선언하는 어노테이션이다.

우선 스프링 빈을 만드는 방법은 @Bean, @Configurtaion, @Component 3가지 어노테이션을 사용하면 된다.

Configuration을 클래스 파일에 달게 되면, 이 클래스는 빈등록하기 위한 파일이라는 것을 가시적으로 알려준다.

 

@Configuration을 붙인 class를 java config파일이라고 생각한다면

@Configuration에 대한 클래스 파일 하위에 객체에 대한 return을 해주는 메소드에 빈을 해주면,

ApplicationContext 중, AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어 IOC와 DI를 적용하게 된다.

쉽게말하면, Configuration에 대한 어노테이션은 빈 설정들을 위한 파일 임을 알리는 어노테이션이다.

@Bean으로 스프링 빈을 등록하면, 빈 등록은 된다.

하지만 스프링의 싱글턴에 대해서는 적용이 안된다.

이는 CGLIB라는 라이브러리가 @Configuration을 적용한 클래스를 상속받은 임의의 다른 클래스를 만들어 스프링 빈으로 등록하기 때문이다.

특정 빈을 호출할때 자바라면, 호출 하는 곳마다 new라는 연산자를 붙여서 호출을 하지만

스프링에서는 다 새로운 객체를 만들지 않는다.

새로운 빈을 만들기 전, 컨테이너를 확인할때 intercept된다.

다시 말하면 우리가 특정 빈을 3번 호출해도, 첫번째 호출에만 빈을 생성하는  것이다.(다른 호출때는, 컨테이너에 있는 기존 빈들만 가져온다.) 

=> 무튼 한개 이상의 @Bean을 제공하는 클래스라면, 해당 어노테이션을 명시한다.

 

해당 config를 불러와서, 프린트하면, CGLIB라는 객체로 된 것을 볼수있다.

이 CGLIB라는 객체는 좀더 다른 포스팅에서 상세히 살펴보기로 하고, 무튼 configuration을 활용하면 해당 프록시 객체로 config를 생성한다.

configuration에 대한 어노테이션을 주석 처리하면, CGLIB라이브러리 빈가 아닌 일반 빈이 생성이 된다.

그러면 이제, 해당 설정으로 진짜 싱글 톤이 되는지를 확인해보자

 

 

해당 과 같이 클래스들을 만들어봤다.

Member관련 된 내용과 order관련된 내용이라고 생각하면된다.

각 Service들은 생성자에서 MemberRepository를 주입받는다.

 

 

 

 

 

 

 

해당 config에서 각각 서비스에 대해서 생성을 하고, 해당 신규 객체를 return 해준다.

return에서는 각각의 다른 의존성을 주입하기 위해서 함수호출로 넘겨준다.(사실 그냥 다 new해도 되긴한다.)

이렇게 될 경우에, program에서 orderService,MemberService에 대한 걸 호출하게 되고

해당 빈이 생성되기 위해서는 각각의 신규 빈을 생성하여 return 되는 config 가 동작한다.

orderservice는 new MemoryMemberRepository와, new RateDiscountPolicy를 주입받고

memberService도 new MemoryMemberReopsitory를 주입받는다

 

자바같으면 new를 두번했기때문에 당연히 해당 두개의 객체의 주소는 다르다.

configuration을 지우고 확인한 결과 진짜 다르게 나온다.

configuartion을 붙이면 정상

 

또한 해당 config에서 생성될때, 생성된다는 sysout을 하면 이렇다.

1)configuaration아닐때

2) configuation일때

 

자 그러면 이해가된다.

bean으로 메소드에서 생성하는 것들에 대해서 configuration을 붙이면, 최초1회 호출시에 생성되고

프록시에 저장이되고, configuation을 붙이지 않으면 매 호출 때마다 빈생성 메소드가 실행되는것을 볼수있다.

 

해당 프록시 관련은 아까 CGLIB라는 개념이 적용되기 떄문이다.

해당 내용에 대한 자세한 포스팅은, 추후에 진행하도록 하자

 

 

 

2.@ComponentScan 

이 클래스는 자바 빈 설정 클래스이며, 이 @ComponentScan 어노테이션에서 제공하는 package 속성을 통해 스프링 빈 범위를 정의할수있다.해당 어노테이션은 springbootapplication어노테이션에도 존재한다.

해당 스캔범위를 지정한 어노테이션을 따라서, 패키지 단위 혹은 다른 단위로 컴포넌트들을스캔해서 빈으로 등록한다.

 

 

 

3. @Import

스프링 설정 클래스를 가져오는 역할, 클래스명을 기입하면 된다.

예를 들면 DB 빈 설정과 DB를 활용하는 빈을 같이 써야할 경우 사용하면 된다.

빈 선언시, 실행순서도 보장되기 때문에 가끔 튀어나오는 빈 선언 오류도 막을수 있다.

 

 

 

4. @Component

빈을 선언하는 클래스를 작성하기 위해 넣는 어노테이션이다. @ComponentScan의 주요 스캔 대상이다.

@configuration에 대한 어노테이션 상세에는, Component에 대한 내용이 포함 되어있다.

즉, 컴포넌트를 좀더 확장하여 구현한것이 Configuration이다.

또한, 개발자가 직접 작성한 클래스를 빈으로 등록하기 위한 어노테이션이기도 하다.

 

5. @Bean

빈선언을 담당하는 어노테이션으로 메소드에만 넣을수있다.

메소드 이름이 곧 빈 이름으로 탄생한다.

컴포넌트랑 다른점은, Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 빈으로 만들려고할때 사용된다.

 

 

 

 

6.@Autowired

스프링 빈을 가져오는 기본적인 방법이다.

등록된 빈에서 클래스에 맞는 타입 체크를 해서 가져오는데, 2개이상인 경우, Qualifier를 통해서 가져온다.

물론 두가지 다 해당안되면 오류를 발생한다.

 

 

7.@WebFilter

 

 

 

해당 과 같이, 필터를 걸수 있다.

해당 필터는 url에 대한 패턴으로도 걸수있다.

 

단, WebFilter의 경우, 일반 컴포넌트가 아니라 Servlet 컴포넌트 스캔으로 검색을 해야한다.

 

@EnableTransactionmanagement

@Transactional 어노테이션을 찾아, 해당 트랜잭션의 범위를 활성화 하는 어노테이션이다.

해당 관련 트랜잭션은 별도 포스팅에서 자세히 공부 예정이다.

 

 

 

@ConfigurationProperties

해당 과 같이, 특정 클래스에 해당 어노테이션을 붙이면, 

해당 항목의 속성 내 값을 application.properties에서 설정이 가능하다.

 

@EnableWEbMvc

일반적으로 webConfig.class라는 것을 별도로 명시해서 해당 클래스에 붙인다.

사용하는 이유는 2개의 인터셉터를 포함한 여러개의 자동설정을 지원해준다.

DispathcherServlet은 생성될때 webapplicationcontext를 인자로 받는다

해당 인자로 받는 webapplicationcontext는 어떤 config파일을 사용할지를 명시해줘야하는데.

일반적으로 webconfig파일을 받는다.

 

@Transactional

메소드 단위, 클래스 단위로 트랜잭션을 설정할수 있다.

해당 관련되서도 딥한 포스팅 예정이다. (전파 범위 관련)

@SpringBootApplication

스프링 부트 시작 클래스에 붙어있는 어노테이션 해당 어노테이션에는 

위와 같은 어노테이션들이 자동으로 포함되어있다.

 

@ServletComponentScan

  • 필터: @WebFilter
  • 서블릿: @WebServlet
  • 리스너: @WebListener

위의 서블릿 컴포넌트를 사용하는 경우, 해당 클래스들을 빈으로 등록해준다. 이는 스프링 부트 내장 톰캣을 사용할떄만 가능하다.

 

@Before

테스트 메소드 작성시에, 사용하는 어노테이션, 항상 테스트 데이터를 이전에 세팅할때 주로 사용한다.

 

@ControllerAdvice, RestControllerAdvice

모든 컨트롤러에서 발생할수있는 예외 처리를 할때 주로 쓰인다. (Rest는, responseBody에 응답값을 실어줄수있다.)

대부분 하나의 클래스의 예외 처리인, ExceptionHandler와 같이 쓰이는데

해당 어노테이션은 컨트롤러 단위로 전역으로 설정이 된다.

해당 advice는 주로, exception 별 처리에 대한 상세 구현 용으로 사용한다.

 

 

 

@ResponseStatus : 해당 클래스 혹은 컨트롤러에 대한 http 응답 상태를 Return 할수 있다.

 

@Primary

@Qualifier와 비슷한 용도로 사용된다. 의존 빈 타입이 여러개인 경우, 우선순위를 갖는 빈이라는 명시를 해주기 위해서 사용한다.

 

 

@Required

특정 메소드에 붙이면, 해당 빈을 생성할때, 해당 프로퍼티에 대한 설정을 하지 않으면 예외 처리 된다.

 

@Dependson : 빈이 등록되는 순서를 설정할수있다. 의존한다는 의미로, 해당 빈이 생성 된 후에 해당 빈을 사용하는 것이다.

만약에 해당 빈이 존재하지 않으면, 오류 발생

 

 

@Lazy

빈을 생성할떄, 해당 빈을 구동 시점에 초기화 하는 것이 아닌, 실제로 사용할때 빈을 생성하는 것을 의미한다.

테스트 해보자

실제로 초기에 시작하지 않고, 메인 함수 기동시점, 즉 메인 함수가 실행되고

해당 빈을 사용할떄 빈이 생성되는것을 확인할 수 있다.

 

 

@Value : 특정 빈내 속성에 대한 value를 지정할수 있다.

 

@Profile

각 환경별로, application에 등록된 환경 별로, 빈을 생성할수 있다.

 

 

@Scope

해당 빈의 범위를 설정할수있다.

스프링에서는 기본 싱글톤으로 설정되어있다.

해당 과 같이하면, 빈을 요구할떄마다 새롭게 생성한다.

 

@PathVariable

경로에 대한 것도동적으로 변경하면서 설정할수있다.

대부분 게시물에 대한 탐색을 할때 사용할수있으면, 무조건 파라미터를 받아야 하니, 해당 파라미터를 받아서 사용한다.

url 부분과 pathvariable의 부분은 같아야 한다.

 

 

 

 

 

 

 

 

반응형