[Spring] 스프링 @(어노테이션) 종류

2022. 6. 7. 15:16 Spring Framework/Spring 입문 - 개념 및 핵심
Spring framework Annotation 개념
 
XML : 분리
- 결합도를 낮추고 유지보수성을 높이기 위해 xml로 설정하였으나 xml이 너무 많아지면 오히려 유지보수성이 낮아지는 아이러니한 상황 발생
- 유지보수성에 방점
- 시스템 전체에 영향을 주고 이후에 변경 가능성이 있는 것은 xml로 설정.
https://medium.com/@2xel/spring-framework-annotation-%EA%B0%9C%EB%85%90-c26c15716538 
 
 
@Component
<context:component-scan> 태그를 추가하면 어노테이션이 적용된 클래스를 빈으로 등록하게된다.
 
<context:annotation-config>태그는 어노테이션과 관련해서 BeanPostProcessor를 함께 등록한다.
@Required(RequiredAnnotationPostProcessor)
@Autowired(AutowiredAnnotationBeanPostProcessor)
@Resource, @PostCounstruct, @PreDestory(CommonAnnotationBeanPostProcessor)
@Configuration(ConfigurationClassPostProcessor)
그 외 Repository, Service, Controller 포함
 
<context:component-scan base-package="xxx"/>
xxx 패키지 하위에 @Component로 선언된 클래스를 bean으로 자동등록(bean 이름 : 해당클래스 이름, 첫글자 소문자)
 
 
@Required
location :setter method
 
Required는 필수 프로퍼티임을 명시하는 것으로 설정하지 않을 경우 빈 생성시 예외를 발생
public class TestBean{
     @Required
     private TestDao testDao;

     public void setTestDao(TestDao testDao){
          this.testDao = testDao;
     }
}

 

RequiredAnnotationBeanPostProcessor 클래스는 스프링 컨테이너에 등록된 bean 객체를 조사하여 @Required 어노테이션으로 설정되어 있는 프로퍼티의 값이 설정되어 있는지 검사한다.
사용하려면 <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /> 클래스를 빈으로 등록시켜줘야 하지만 이를 대신하여 <context:annotation-config> 태그를 사용해도 된다.
 
@Autowired
의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. (해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시킨다.)
 
*option 
required : 필수여부
@Autowired(required=false)
Test test = new TestTwo();
// bean 객체가 존재하지 않을 경우 testTwo 생성
 
같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는, 이럴때 @Qualifier를 사용하여 특정빈을 사용하도록 한다.
@Autowired
@Qualifier("test")
private Test test;
 
@Qualifier
location : with @Autowired
 
@Autowired 동일 타입의 빈객체가 존재시 특정빈을 삽입할 수 있게 설정
 
*option
name : alias 명
 
@Resource
@Autowired와 흡사하지만 @Autowired(by type), @Resource(by name)으로 연결한다는 점이 다르다.
 
*option
name : 연결될 빈객체 이름 입력 @Resource(name="test")
 
@Scope
설정 : prototype, singleton, request, session, globalSession
기본적 빈의 범위 "singleton" 
 
@componet
@Scope(value="prototype")
public class User(){}
 
 
@PostConstruct
location : 해당 작업 메서드 앞
 
의존하는 객체를 설정한 이후에 초기화 작업을 수행하기 위해 사용. 스프링에 의해 인스턴스가 생성된 후 어노테이션이 적용된 메서드 호출. CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록(<context:annotation-config> 태그로 대신 가능)
 
@PostConStruct
public void init(){
     Sysout("init...");
}
 
@PreDestory
location : 해당 작업 메서드 앞
 
컨테이너에서 객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용
CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록(<context:annotation-config> 태그로 대신)
 
@Inject
Spring 3부터 지원하는 Annotation. 특정 framework에 종속되지 않은 어플리케이션을 구성하기 위해서 @Inject를 사용할 것을 권장.
 
@Service
비즈니스로직이 들어가는 Service 빈 등록
 
@Repository
version : 2.0
 
일반적으로 DAO에 사용되며 DB Exception을 DataAcessException으로 변환한다.
 
@Contoroller
pacakge : org.springframework.stereotype
version : 2.5
 
Spring MVC의 Controller 클래스 선언을 단순화. 스프링 컨트롤러, 서블릿을 상속할 필요가 없으며, @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다
(component-scan 이용)
 
Controller 메서드의 파라미터 타입
파라미터 타입
설명
HttpServletRequest, HttpServletResponse, HttpSession
Servlet API
java.util.Locale
현재 요청에 대한 Locale 정보
InputStream, Reader
요청 컨텐츠에 직접 접근할 때 사용
OutputStream, Writer
응답 컨텐츠를 생성할 때 사용
@PathVariable 적용 변수
URL 템플릿 변수
@RequestParam 적용 변수
HTTP 파라미터와 매핑
@RequestHeader 적용 변수
HTTP 헤더 매핑
@CookieValue 적용 변수
HTTP 쿠키 매핑
@RequestBody 적용 변수
HTTP RequestBody에 접근할 때 사용. HttpMessage Converter를 이용해 RequestBody 데이터를 해당 타입으로 변환
Map, Model, ModelMap
뷰에 전달할 모델 데이터를 설정할 때 사용
커맨드 객체(VO)
HTTP 요청 파라미터를 저장한 객체, 기본적으로 클래스 이름을 모델명으로 사용
Errors, BindingResult
HTTP 요청 파라미터를 커맨드 객체에 저장한 결과. 커맨드 객체를 위한 파라미터 바로 다음에 위치한다.
SessionStatus
폼 처리를 완료 했음을 처리하기 위해 사용 @SessionAttribute를 명시한 session 속성을 제거하도록 이벤트를 발생

 

Controller 메서드의 리턴 타입
리턴 타입
설명
ModelAndView
뷰 정보 및 모델 정보를 담고 있는 ModelAndView 객체
Model
뷰에 전달할 객체 정보를 담고 있는 Model을 리턴(뷰 이름은 요청 URL로 결정)(RequestToViewNameTranslator를 통해 뷰 결정)
Map, ModelMap
(RequestToViewNameTranslator를 통해 뷰 결정)
String
뷰 이름을 리턴
View
View 객체를 직접 리턴. 해당 View 객체를 이용해서 뷰를 생성
void
메서드가 ServletResponse나 HttpServletResponse 타입의 파라미터를 갖는 경우 메서드가 직접 응답을 처리한다고 가정. (RequestToViewNameTranslator를 통해 뷰 결정)
@ResponseBody 적용
@ResponseBody 어노테이션이 적용된 경우, 리턴 객체를 HTTP 응답으로 전송한다. HttpMessageConverter를 이용해서 객체를 HTTP 응답 스트림으로 변환한다.
 
@RequestMapping

@RequestParam

참고 : https://noritersand.tistory.com/156 

 

출처: https://cornswrold.tistory.com/8?category=755359 [평범한개발자노트:티스토리]