우디의 개발스터디

[SpringFramework] 스프링 어노테이션(Spring Annotation)

by 개발자 우디

Annotation 이란 사전적 의미로 주석이라는 뜻이다.

자바에서는 클래스나 인터페이스 바로 상단에 기지하며, 특별한 의미, 기능을 수행하도록 돕는다.

프로그램에게 내가 설정한 정보를 제공해주는 메타데이터인 셈이다.

사용자 정의 어노테이션도 있지만 일반적으로 잘 사용하지 않으므로 스프링에 원래 포함되어 있는 어노테이션들을 정리하려고 한다(차차 추가해나갈 예정)


@Configuration

  • @Configuration을 클래스에 적용하고
  • @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.

 

 

@EnableAutoConfiguration

  • Spring Application Context를 만들 때 자동으로 설정하는 기능
  • classpath의 내용에 기반해서 자동으로 생성한다.

 

 

@ComponentScan

  • @Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 어노테이션이다.
  • base-package를 넣으면 해당 패키지 아래에 있는 컴포넌트들을 찾고 그 과정을 spring-context-버전(4.3.11.RELEASE).jar에서 처리한다.
  • Spring Framework에서 @Component로 다 쓰지 않고 @Repository, @Service,@Controller등을 사용하는 이유는, DAO(Service)의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문이다.

 

 

@Component

  • 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.
  • @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.

 

 

@Bean

  • 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 어노테이션이다.
  • ArrayList같은 라이브러리등을 Bean으로 등록하기 위해서는 별도로 해당 라이브러리 객체를 반환하는 Method를 만들고 @Bean 어노테이션을 사용하면 된다.
  • 아래 첫 번째 코드블럭의 경우 @Bean에 아무런 값을 지정하지 않았으므로 Method 이름을 camelCase로 변경한 것이 Bean id로 등록된다.method 이름이 arrayList()인 경우 arrayList가 Bean id 이다.

 

@Configuration
public class ApplicationConfig {    
    @Bean
    public ArrayList<String> array(){
        return new ArrayList<String>();
    }   
}

 

@Configuration
public class ApplicationConfig {    
    @Bean(name="testArray")
    public ArrayList<String> array(){
        return new ArrayList<String>();
    }   
}

위와 같이 @Bean에 name이라는 값을 이용하면 자신이 원하는 id로 Bean을 등록할 수 있다.

 

 

@Autowired

  • 속성(field), setter method, constructor(생성자)에서 사용하며 Type에 따라 알아서 Bean을 주입 해준다.
  • 무조건적인 객체에 대한 의존성을 주입시킨다.
  • 이 Annotation을 사용할 시, 스프링이 자동적으로 값을 할당한다.
  • Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용한다.
  • 필드, 생성자, 입력 파라미터가 여러 개인 메소드(@Qualifier는 메소드의 파라미터)에 적용 가능하다.
  • Type을 먼저 확인한 후 못 찾으면 Name에 따라 주입한다(Name으로 강제하는 방법: @Qualifier을 같이 명시)
@Controller
@RequestMapping("/adm/adminuser")
public class AdminAdmUserController {
	@Autowired
	private PasswordEncoder passwordEncoder;

	@Autowired
	private AdminUserService service;

	@Autowired
	private AuthService authService;

......중략
}

* Bean을 주입받는 방법 5가지

  • @Autowired
  • @Inject
  • @Resource
  • Setter
  • 생성자(@AllArgsConstructor사용)

 

 

@Controller

Spring Framework 에서 서블릿 파일의 역할을 수행하게 하는 어노테이션

 

 

@RestController

  • Spring 에서 Controller와 달리 View를 리턴하지 않는 Controller 를 의미한다.
  • 리턴 값은 JSON 타입의 데이터로 반환한다.
  • 이 Annotation이 적혀있는 Controller의 method는 HttpResponse로 바로 응답이 가능하고, @ResponseBody 의 역할을 자동으로 해주는 어노테이션이다.

 

 

@Service

비즈니스 로직을 수행하는 Class 이라는 의미이다.

 

 

@Repository

DB에 접근하는 메소드를 포함한 Class에서 사용된다.

 

 

@Required

  • Setter 메소드에 적용해주면 Bean 생성시 필수 프로퍼티 임을 알린다.
  • @Required 어노테이션을 사용하여 optional 하지 않은, 반드시 필요한 속성들을 정의한다.
  • 영향을 받는 bean property를 구성할 시에는 XML 설정 파일에 반드시 property를 채워야 한다.
<!-- Definition for user bean -->
<bean id = "user" class = "com.tutorialspoint.User">
    <property name = "name" value = "User1" />
    <property name = "age"  value = "29"/>
</bean>

 

 

@Qualifier

  • @Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 하는 Annotation이다.(같은 타입이 존재하는 경우 ex) 동물 = 원숭이, 닭, 개, 돼지)
  • 같은 타입의 Bean이 두 개 이상이 존재하는 경우에 Spring이 어떤 Bean을 주입해야 할지 알 수 없어서 Spring Container를 초기화하는 과정에서 예외를 발생시킨다.
  • 이 경우 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 한다.

 

 

@Resource

  • @Autowired와 마찬가지로 Bean 객체를 주입해주는데 차이점은 Autowired는 타입으로, Resource는 이름으로 연결
    해준다.
  • 어노테이션 사용으로 인해 특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서는 @Resource를 사용할 것을 권장한다.

 

 

@SpringBootApplication

  • @Configuration, @EnableAutoConfiguration, @ComponentScan 를 하나로 합쳐놓은 어노테이션

 

 

@RequestMapping

  • 요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation이다.
  • Controller나 Controller의 method에 적용한다.
  • 요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다.
  • 요청 받는 형식을 정의하지 않는다면, 자동적으로 GET 방식으로 정의 된다.
@Controller
@RequestMapping("/adm/adminuser")
public class AdminAdmUserController {
	@ResponseBody
	@RequestMapping(method = RequestMethod.POST ,value = "/update")
	public DefResult update(HttpServletRequest req, HttpServletResponse res ,@RequestBody AdminUser adminUser) throws Exception{
		
    	// ...중략
    }
}

 

 

@CrossOrigin

CORS 보안상의 문제로 브라우저에서 리소스를 현재 Origin 에서 다른 곳으로의 AJAX요청을 방지하는 것이다.

//기본 도메인이 https://coding-plant.tistory.com 인 곳에서 온 ajax요청만 수용가능
@CrossOrigin(origins = "https://coding-plant.tistory.com", maxAge = 7200)

 

 

@RequestBody

  • HTTP 요청 몸체를 자바 객체로 전달받음
  • HTTP 요청의 body 내용을 자바 객체로 매핑하는 역할
@RequestMapping(method = RequestMethod.POST ,value = "/update")
public DefResult update(@RequestBody AdminUser adminUser, HttpServletRequest req, HttpServletResponse res) throws Exception{
	// 예시파일 내용은 지움
	return result;
}

 

 

@RequestHeader

  • Request의 header값을 가져올 수 있다. 메소드의 파라미터에 사용한다.
//ko-KR,ko;q=0.8,en-US;q=0.6
@RequestHeader(value="Accept-Language")String acceptLanguage 로 사용

 

 

@PathVariable

method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.

@RequestMapping(value = "/any/path/{id}", method = RequestMethod.GET)
public ResponseEntity<?> any(@PathVariable int id) {
}

 

 

@ResponseBody

  • 자바 객체를 HTTP 응답 몸체로 전송함
  • 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할
  • 하지만 @RestController 를 사용하면 @ResponseBody 를 따로 기재하지 않아도 됨.
@ResponseBody
@RequestMapping(method = RequestMethod.POST ,value = "/join")
public DefResult join(HttpServletRequest req, HttpServletResponse res, AdminUser param)
throws Exception {

  // 예시파일 내용은 지움
  return result;
}

 

 

@Transactional

데이터베이스 트랜잭션을 설정하고 싶은 method에 Annotation을 적용하면 method 내부에서 일어나는 데이터베이스 로직이 전부 성공하게되거나 데이터베이스 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 어노테이션이다.

@Transaction(readOnly=true, rollbackFor=Exception.class)에서 readOnly는 읽기전용임을 알리고 
rollbackFor는 해당 Exception이 생기면 롤백하라는 뜻이다.

@Transaction(noRollbackFor=Exception.class)는 해당 Exception이 나타나도 롤백하지 말라는 뜻이다.

@Transaction(timeout = 10)은 10초안에 해당 로직을 수행하지 못하면 롤백하라는 뜻이다.

 

 


참조

 

스프링부트 애노테이션 정리, annotation 간단 요약 (자세한 내용은 검색해서 확인하고 용도 파악하

스프링/스프링부트 애노테이션(Annotation) 정리 스프링 부트와 스프링에서 사용하는 애노테이션에 대한 내용을 간략하게 정리하고 자세하게 알아볼 때는 키워드를 가지고 공부할 수 있도록 유도

jeong-pro.tistory.com

 

[Spring] Spring Annotation의 종류와 그 역할 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

 

 

 

 

 

블로그의 정보

우디의 개발스터디

개발자 우디

활동하기