Spring Bean은 Spring IoC컨테이너가 관리하는 자바 객체로, 컨테이너에 의해 생명주가기 관리되는 객체를 의미합니다.
기존 Java 에서는 Class를 생성하고 new 를 사용하여 객체를 직접 생성해 사용했는데, Spring에서는 IoC컨테이너 안에 들어있는 객체(Spring Bean)를 필요할 때마다 IoC컨테이너에서 가져와 사용합니다.
어노테이션인 @Bean 을 사용하거나, xml 설정을 통해 일반 객체를 Bean으로 등록이 가능합니다.
즉, Sping 에서 Bean은 ApplicationContext가 알고 있는 객체이며, ApplicationContext가 생성하고 직접 관리해주는 객체를 의미합니다.
객체 생성 → 의존성 주입 → 초기화 → 사용 → 소멸 과정의 생명주기를 가지고 있습니다.
Bean은 스프링 컨테이너에 의해 생명주기를 관리합니다.
스프링 컨테이너가 초기화 될 때 먼저 빈 객체를 설정에 맞춰 의존 관계를 설정한 뒤 해당 프로세스가 완료되면 빈 객체가 지정한 메소드를 호출해서 초기화를 진행합니다.
객체를 사요해 컨테이너가 종료될 때 빈이 지정한 메소드를 호출해 소멸 단계를 거칩니다.
스프링은 InitializingBean 인터페이스와 DisposableBean을 제공하며 빈 객체의 클래스가 InitializingBean Interface 또는 DisposableBean을 구현하고 있으며 해당 인터페이스에서 정의된 메소드를 호출해 빈 객체의 초기화 또는 종료를 수행합니다.
어노테이션을 이용한 빈 초기화 방법에는 @PostConstruct와 빈 소멸에서는 @PreDestory를 사용합니다.
Annotation은 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 합니다. Annotation을 활용하여 Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며, 자동으로 getter나 setter를 생성하기도 합니다.
특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있습니다.
이러한 Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가됩니다.
@Component : 개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation입니다. Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록합니다.
참고로, @Component와 동일한 기능을 가지면서 좀 더 명확한 의미를 부여할 수 있는 태그들로 @Repository, @Service 등이 있습니다.
@ComponentScan : Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록합니다. @ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록해줍니다.
@Bean : @Bean Annotation은 개발자가 제어가 불가능한 외부 라이브러리와 같은 것을들 Bean으로 만들 때 사용합니다.
@Controller : 컨트롤러 클래스에 @Controller 어노테이션을 작성합니다. bean으로 등록되며 해당 클래스가 Controller로 사용됨을 Spring Framework에 알립니다.
@Repository : 저장소라는 뜻으로 DAO(Database Access Object)에 부여합니다.
@Service : 서비스라는 뜻으로 DAO와 컨트롤러를 연결하는 서비스에 부여합니다.
@RequestMapping : @RequestMapping(value=”“)와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가 실행됩니다. Controller 객체 안의 메서드와 클래스에 적용 가능합니다.
@RequestParam : URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 Annotation입니다.
@RequestBody : Body에 전달되는 데이터를 메소드의 인자와 매칭시켜, 데이터를 받아서 처리할 수 있는 Annotation입니다.
@ModelAttribute : 클라이언트가 전송하는 HTTP parameter, Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 연결(바인딩)합니다. RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형태를 요구합니다.
@GetMapping : RequestMapping(Method=RequestMethod.GET)과 똑같은 역할을 하며, @RequestMapping("/ ") 의 형태로 사용합니다.
@PostMapping : RequestMapping(Method=RequestMethod.POST)과 똑같은 역할을 하며, @PostMapping("/ ") 의 형태로 사용합니다.
@Value(“값”) : VO 클래스의 멤버 필드 바로 위에 붙여 사용합니다.
Component(“아이디”) : 기본 아이디 외에 새로운 아이디를 지정합니다.
@Scope(“prototype”) : 싱글턴 패턴을 사용하고 싶지 않을 때 지정하며, @Component 밑에 붙여 사용합니다.
@Autowired : 프로젝트 내부 전체를 검색해서, 해당 타입의 인스턴스가 1개만 있는 경우 그 인스턴스를 자동으로 연결합니다.
@Autowired @Qualifier(“아이디”) : 프로젝트 내 같은 타입의 인스턴스가 2개 이상 있는 경우 어떤 인스턴스를 선택해서 사용할 지 결정합니다.
@Override: 이 메소드는 상위 클래스에서 오버라이딩 된 메소드라는 것을 명시적으로 보증하는 역할을 합니다. 잘못된 오버라이딩이거나 혹은 오버라이딩이 아닌데 이 어노테이션을 붙이면 컴파일 에러가 발생합니다.
@Deprecated: 프로그램을 만들 때 특정 메소드(기능)에 부여하며 호환성 문제 때문에 일단 사용은 가능하도록 했지만 옛날 방식, 옛날 기술 등이라 사람들에게 점차적으로 사용하지 않도록 유도하고자 할 때 사용하는 기능입니다. 외부 라이브러리를 사용하다 보면 많이 볼 수 있습니다.
@SuppressWarnings: 컴파일 경고를 무시합니다.
[참조]
https://developer-ellen.tistory.com/198
http://yoonbumtae.com/?p=740