궁금한게 많은 개발자 노트

[ Spring ] Java Config, Configuration Annotation 본문

Back End

[ Spring ] Java Config, Configuration Annotation

궁금한게 많은 개발자 2022. 10. 24. 18:52

Spring Tool Suite(STS)를 통해 생성하는 Spring Legacy Project의 경우 xml을 기반으로 Setting을 하는데, xml문서의 경우 길어지면 가독성이 안좋아지고, 이후에 나온 Java Config에 비해 Human Error를 많이 발생시킬 수 있습니다.

그리고, 에러를 발견하는 과정도 Java Config를 이용하여 런타임에 알 수 있는 것에 비해 찾기가 힘들 수 있습니다.

 

 

XML 설정 단독 사용의 특징

- resource디렉토리에 Bean이 추가될 때 마다 관련 설정을 xml파일에 등록해주어야 합니다.

- 모든 Bean 을 명시적으로 XML 에 등록하는 방법으로. 생성되는 모든 Bean 을 XML 에서 확인할 수 있다는 장점이 있으나
  Bean 의 개수가 많아지면 XML 파일을 관리하기 번거로울 수 있습니다.
- 여러 개발자가 같은 설정 파일을 공유하여 개발하다 보면 설정 파일을 충돌이 발생 가능
- DI에 필요한 적절한 setter 메서드 또는 constructor 가 코드 내에 반드시 존재해야 합니다.
- 개발 중에는 Annotation 설정 방법을 사용하고, 운영 중에는 관리의 편의성을 위해 XML 설정으로 변경하는 전략도 가능

 

# Spring Container의 Bean객체들은 기본적으로 Singleton Pattern으로 만들어집니다. 이러한 방식으로 객체를 대신 생성해주고 관리해주는 기능등을 IoC((Inversion of Control)라고 한다.

 

 

 

Java Config를 이용한 설정과 Annotation

Java Config란 말그대로 Java Class에서 file을 설정파일로 사용한다는 의미입니다. 이러한 방법을 사용하면 xml file의 가독성문제나 Human error를 방지할 수 있습니다. (IDE에서 Java Class 자동 완성 기능 등을 사용)

Spring에서는 Java Config로 사용하는 Class에 @Configuration Annotation을 붙여 표시해줍니다.

해당 Class에서 정의된 정보를 바탕으로 IoC와 DI가 적용됩니다. 기본적으로 Singleton Pattern으로 관리되며, getBean에 method이름이나 Class정보를 바탕으로 얻어낼 수 있습니다.

(@scope annotation으로 return 방식 변경 가능 - ex) prototype(요청 마다 할당), request(HTTP request마다 할당), session(HTTP session마다 할당))

 

 

 

[ Bean 등록 및 의존 관계 설정 Annotation ]

@Configuration: -> @Controller, @Service, @Repository, @Component Annotation이 붙은 Class를 찾아 DI 컨테이너에 등록 (xml파일에 <context: component-scan base-package="package name"/>선언)

@Bean: Spring에서 사용할 Bean을 정의

@Componet: Component Scan의 대상이 되는 Annotation중 하나로, util 기타 지원 클래스(Bean과 동일)

@Repository: Persistance Layer, 영속성을 가지는 속성(file, database)을 가진 클래스

@Service: Service Layer, Business Logic을 가진 클래스

@Controller: Presentation Layer, web application에서 요청과 응답을 처리하는 클래스

@Autowired: 정밀한 DI가 필요한 경우에 유용하다. <property>, <constructor-arg>와 동일한 역할. 객체의 Type을 기반으로 의존하는 객체를 주입하며 @Resource Annotation과 동일하지만 @Resource는 이름을 기반

@Value: 단순한 값을 주입할 때 사용하는 Annotation <property .. value = ""/>와 동일한 역할

@Qualifier: @autowired Annotation과 같이 사용되며, Autowired가 Type으로 찾아서 주입하므로 동일한 Type의 Bean이 여러 개 존재할 때 특정 Bean을 찾기 위해서 필요한 Annotation

-> @Component Annotation선언 시에 @Qualfier를 함께 선언하여, 여러 Bean검색 시에 유일성을 보장 (xml에서 bean id)

 

'Back End' 카테고리의 다른 글

RDBMS와 NoSQL의 차이  (0) 2023.05.09
[ Spring ] JPA란?  (0) 2022.10.24
[ FastAPI ] Middleware에서 request body 사용 불가  (2) 2022.10.05
[ Python ] FastAPI - Depends  (0) 2022.06.03
SQLalchemy  (0) 2022.05.26
Comments