본문 바로가기

#2 Framework ✍️/2-1 Spring

[Spring] 어노테이션 (Annotation) 정리

Annotation이란? 

  • 자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술
  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
  • 런타임시 특정 기능을 실행하도록 정보를 제공
Annotation 종류

@ComponentScan

  • @Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation
  • @Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성

@ Component

  • 개발자가 직접 작성한 Class를 Bean으로 등록할 때 사용
  • Spring에서 @Component로 따 쓰지 않고 @Repository, @Service, @Controller 등을 사용하는 이유는 예를 들어 @Repository는 DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문
    • 또한, 가독성에서도 해당 Annotation을 갖는 클래스가 무엇을 하는지 한 번에 알 수 있음
  • @Bean과 다르게 name이 아닌 value를 이용해 Bean의 이름을 지정

@ Bean

  • 개발자가 직접 제어 불가능한 외부 라이브러리등을 Bean으로 만들때 사용
  • ArrayList와 같은 라이브러리 등을 Bean으로 등록하기 위해서는 별도로 해당 라이브러리 객체를 반환하는 메소드를 만들고 @Bean을 사용하면 된다.
  • @Bean에 아무런 값을 지정하지 않으면 메소드 이름을 camelCase로 변경한 것이 Bean id로 등록 됨
  • ex) 메소드 이름이 arrayList()인 경우 arrayList가 Bean id
  • @Bean에 name이라는 값을 이용하면 자신이 원하는 id로 Bean을 등록할 수 있음
@Bean(name="apple")
public class ArrayList<String> array(){
    return new ArrayList<String>();
    }
}

 

@ Autowired

  • 속성, setter 메소드, 생성자에서 사용하며 Type에 따라 알아서 Bean을 주입해줌
  • 무조건적인 객체에 대한 의존성을 주입시킴
  • 스프링이 자동적으로 값을 할당
  • Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용
  • 찾는 순서
    • Type -> Name-> @Qualifier -> 실패
  • Type을 먼저 확인한 후 못 찾거나, Type이 중복이 되는게 있으면 Name에 따라 주입 
    • Name으로 강제하는 방법: @Qualifier을 같이 명시
  • Bean을 주입받는 방식
    • @Autowired
    • setter
    • 생성자

@ Inject

  • @ Autowired와 동일하게 작동하지만 찾는 순서가 다름
    • Type -> @Qualifier -> Name -> 실패
  • maven이나 gradle에 javax 라이브러리 의존성을 추가해야 함

@ Resource

  • Java에서 지원하는 어노테이션, 특정 프레임 워크에 종속적이지 않음
  • 찾는 순서
    • Name -> Type -> @Qualifier -> 실패
  • 사용할 수 있는 위치
    • 멤버변수, setter 메소드
  • @ Autowired와 차이점
    • @ Autowired는 Type으로, @Resource는 Name으로 연결

@ Qualifier

  • @ Autowired와 같이 쓰이며, 같은 Type의 Bean 객체가 있을 때 해당 Name을 적어 원하는 Bean이 주입될 수 있도록 하는 어노테이션
  • 같은 Type의 Bean이 두 개 이상 존재하는 경우, Spring이 어떤 Bean을 주입해야 할지 알 수 없어 Spring Container를 초기화하는 과정에서 예외를 발생시킴
  • 이 경우 @Qualifier을 @Autowired와 함께 사용해 정확히 어떤 Bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 함

@ Controller

  • Spring에서 Controller를 의미, Spring MVC에서 Controller Class에 사용
  • API와 View를 동시에 사용하는 경우에 사용

@ RestController

  • Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미
  • 메소드의 반환 결과를 JSON 형태로 반환
  • @RestController Controller의 메소드는 HttpResponse로 바로 응답 가능
  • @ResponseBody 역할을 자동적으로 해줌
  • @Controller + @ResponseBody를 사용하면 @ResponseBody를 모든 메소드에서 적용
💡@Controller@RestController는 뭐가 다를까??

@Controller
API와 View 동시에 사용
API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환
View(화면) return이 주목적

@RestController
View가 필요없는 API만 지원하는 서비스에서 사용
@RequestMapping 메소드가 기본적으로 @ResponseBody 의미를 가정
data(json, xml 등) return이 주목적

결론
@RestController = @Controller + @ResponseBody

@ Serive

  • Service Class에서 사용
  • 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도

@ Repository

  • Database에 접근하는 메소드를 가지고 있는 Class에서 사용 (ex DAO)

@ EnableAutoConfiguration

  • Spring Application Context를 만들 때 자동으로 설정하는 기능을 킴
  • classpath의 내용에 기반해서 자동으로 생성
  • 만약 tomcat-embed-core.jar가 존재하면 톰캣 서버가 setting 됨

@ Configuration

  • @Configuration을 클래스에 적용하고 @Bean을 해당 Class의 메소드에 적용하면 @Autowired로 Bean을 부를 수 있음
//이 클래스를 설정파일로 읽어드리는 어노테이션
@Configuration
//설정내용을 어느 파일에서 읽어올 것인지 결정
//classpath: src/main/resource
@PropertySource("classpath:/application.properties")
public class DataConfiguration {
	@Autowired
	//스프링 컨테이너: 스프링 설정 파일등을 읽어와서 사용 가능
	private ApplicationContext applicationContext; 
	
	//Bean객체로 생성해주는 어노테이션
	@Bean
	//applictaion.properties 파일에서 spring.datasource.hikari로 시작하는 설정들만 읽어오는 설정
	@ConfigurationProperties(prefix="spring.datasource.hikari")
	public HikariConfig hikariConfig() {
		return new HikariConfig();
        }
    }

@ ConfigurationProperties

  • yaml 파일을 읽음
  • default로 classpath:application.properties 파일이 조회
  • 속성 클래스를 따로 만들어두고 그 위에 (prefix="mail")을 써서 프로퍼티의 접두사를 사용할 수 있음
//Bean객체로 생성해주는 어노테이션
	@Bean
	//applictaion.properties 파일에서 spring.datasource.hikari로 시작하는 설정들만 읽어오는 설정
	@ConfigurationProperties(prefix="spring.datasource.hikari")
	public HikariConfig hikariConfig() {
		return new HikariConfig();
	}

 

@ RequestMapping

  • 요청 URL을 어떤 메소드가 처리할지 mapping해줌
  • Controller나 Controller 메소드에 적용됨
  • 요청 받는 형식인 GET, POST, PATCH, PUT, DELETE를 정의하기도 함
  • 요청 받는 형식을 정의하지 않으면 자동으로 GET으로 설정됨
  • @RequestMapping에 대한 모든 mapping 정보는 Spring에서 제공하는 HandlerMapping Class가 가지고 있음

@GetMapping

  • @RequestMapping(Method=RequestMethod.GET)과 동일
  • 동일하게 @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping 등 있음

@ModelAttribute

  • view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation
  • binding 기준은 <input name = "id"/> 처럼 어떤 태그의 Name값이 해당 Class의 멤버 변수명과 일치해야 하고 setmethod명도 일치해야 함

@ CookieValue

  • 쿠키 값을 parameter로 전달 받을 수 있는 방법
  • 해당 쿠키가 존재하지 않으면 500 에러를 발생시킴

@ SessionAttributes

  • Session에 data를 넣을 때 사용
  • @SessionAttributes("name")이라고 하면 Model에 key값이 "name"으로 있는 값은 자동으로 세션에도 저장되게 함

@ Valid

  • 유효성 검증이 필요한 객체임을 지정

@ InitBinder

  • @Valid 어노테이션으로 유효성 검증이 필요하다고 한 객체를 가져오기전에 수행해야 할 메소드를 지정

@ RequestAttribute

  • Request에 설정되어 있는 속성 값을 가져올 수 있음

@ RequestBody

  • 요청이 온 데이터 (JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위해 사용
  • POST, PUT, PATCH로 요청 받을 때, 요청에서 넘어온 body 값들을 자바 타입으로 파싱해줌
  • HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매핑
  • RequestData를 바로 Model이나 클래스로 매핑

@ RequestHeader

  • Request의 header값을 가져올 수 있음. 메소드의 파라미터에 사용

@ RequestParam

  • request의 parameter에서 가져오는 것
  • 메소드의 파라미터에 사용됨
  • HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어감
  • URL 뒤에 붙는 parameter 값을 가져올 때 사용 됨
  • http://localhost:8080/home?index=1&page=2
@GetMapping("/home")
public String show(@RequestParam("page") int pageNum {
}

@ ResponseBody

  • HttpMessageConverter를 이용하여  JSON 이나 xml로 요청에 응답할 수 있게 해줌
  • View가 아닌 JSON 형식의 값을 응답할 때 사용하는 어노테이션으로 문자열을 리턴하면 그 값을 Http response header가 아닌 response body에 들어감
  • 이미 @RestController가 있다면 쓸 필요 없음
  • @Controller라면 HttpResponse로 응답 할 수 있게 해줌
  • 객체를 return하는 경우, JACKSON 라이브러리에 의해 문자열로 변환되어 전송

@ Transactional

  • 데이터베이스 트랜잭션을 설정하고 싶은 메소드에 어노테이션을 적용하면 메소드 내부에서 일어나는 데이터베이스 로직이 전부 성공하게되거나 데이터베이스 접근 중 하나라도 실패하면 다시 롤백할 수 있게 해주는 어노테이션
  • 전체 로직에 한 번 커밋이 아닌, 한 줄 한 줄 메소드마다 커밋하고 싶을 때
LIST