Verity's Daily Logs_

[Spring-Framework]Spring Annotation 본문

Spring Framework

[Spring-Framework]Spring Annotation

johye0 2022. 2. 7. 22:46
반응형

Spring framework에서 주로 사용하게 되는 Annotaion들을 정리해 둔다.

 

Spring bean / DI


*의존 객체 자동 주입(Automatic Dependency Injection): 스프링 설정 파일에서 혹은 태그로 의존 객체 대상을 명시하지 않아도 스프링 컨테이너가 자동적으로 의존 대상 객체를 찾아 해당 객체에 필요한 의존성을 주입하는 것을 말한다.

 

@ComponentScan

: @Component 계열 어노테이션이 붙은 클래스 Bean들을 찾아서 Context에 bean 등록을 해주는 Annotation

 

@Component

: 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation. 별도 설정이 없다면 Class의 이름이 Bean ID로 사용된다.

@Component(value = "myComponent")
public class TempClass {
	...
}

 

@Bean

: 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려 할 때 사용되는 Annotation.

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

 

@Controller

: Spring 의 Controller임을 명시하는 어노테이션

 

@RestController

: Spring Controller 중 View로 응답하지 않는 Controller를 의미한다. 보통 method의 반환 결과를 JSON으로 반환함

= @Controller + @ResponseBody

 

@Service

: 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도이다.

 

@Repository

: DAO Class (DataBase에 접근하는 method를 가지고 있는 Class)라는 것을 의미한다.

 

@Autowired

: 속성(field), setter, method, constructor에 type에 따라 알아서 Bean을 주입해준다.

 

@Qualifier

: @Autowired와 함께 쓰이며, 같은 타입의 Bean이 여러개 있을 때 원하는 아이디를 적어 원하는 Bean이 주입될 수 있도록 하는 Annotation.

 

@Resource

: @Autowired와 비슷하나, 타입으로 Bean객체를 주입하지 않고 이름으로 연결하는 Annotation이다.

 

@PostConstruct, @PreConstruct

: 의존하는 객체를 생성한 이후 초기화 작업을 위해 객체 생성 전/후에 실행해야 할 method 앞에 붙인다.

 

💡 빈 생명주기 - 스프링 빈의 이벤트 라이프 사이클
: 스프링컨테이너생성 ⇒ 빈 생성 ⇒ 의존관계 주입 ⇒ 초기화 콜백 ⇒ 사용 ⇒ 소멸 전 콜백 ⇒ 스프링 종료

스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.
1. 인터페이스(InitializingBean, DisposableBean)
2. 설정 정보에 초기화 메서드, 종료 메서드 지정
3. @PostConstruct, @PreDestory 애노테이션 지원

 

@PreDestroy

: 객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용한다.

 

@Inject

: @Autowired 어노테이션과 비슷한 역할을 한다.

 

@Lazy

: 지연로딩을 지원한다.

⇒ @Component나 @Bean Annotation과 같이 쓰는데 Class가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법이다.

 

Spring 설정


@SpringBootApplication

: @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 Annotation

 

@EnableAutoConfiguration

: Spring Application Context를 만들 때 자동으로 설정하는 기능을 켠다.

 

@Configuration

: @Bean 어노테이션을 붙인 메서드를 가진 클래스에 @Configuration을 적용하면 @Autowired로 Bean을 부를 수 있다.

 

@PropertySource

: 해당 프로퍼티 파일을 Environment로 로딩하게 해 준다. @Configuration과 함께 사용되어야 한다.

클래스에 @PropertySource("classpath:/settings.properties") 라고 적고 클래스 내부에 @Resource를 Environment타입의 멤버 변수 앞에 적으면 매핑된다.

 

@ConfigurationProperties

: yaml파일을 설정파일로 읽어 들이며, default로 classpath:application.properties 파일이 조회된다. 속성 클래스를 따로 만들어두고 그 위에 (prefix="mail")을 써서 프로퍼티의 접두사를 사용할 수 있다.

 

@Value

: proerties에서 값을 가져와 적용할 때 사용한다.

⇒ 예시

@Value("${value.from.file}")
@Value(#{systemProperties['priority'] ?: 'some default'})
public class TestClass {
	private String valueFromFile;
}

 

Controller


@RequestMapping

: 요청 URL을 어떤 method가 처리할지 mapping 해주는 Annotation이다. Controller나 Controller의 method에 적용한다.

요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다.

@RequestMapping("/list"), @RequestMapping("/home, /about");
@RequestMapping("/admin", method=RequestMethod.GET)

 

@CrossOrigin

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

@RequestMapping이 있는 곳에 사용하면 해당 요청은 타 도메인에서 온 ajax요청을 처리해준다.

//기본 도메인이 <http://jeong-pro.tistory.com> 인 곳에서 온 ajax요청만 받아주겠다.
@CrossOrigin(origins = "<http://jeong-pro.tistory.com>", maxAge = 3600)

 

@GetMapping, @PostMapping 등등등

: @RequestMapping(Method=RequestMethod.GET) 과 동일한 Annotation (자매품: @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping)

 

@Required

: Optional하지 않은, 꼭 필요한 속성들을 정의한다. ⇒ 값 없이 Bean호출 시 BeanInitializationException 예외 발생

 

Parameter


@RequestParam

: ?moviename=thepurge 와 같은 쿼리 파라미터를 파싱 해주는 Annotation

 

@PathVariable

: method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다. ⇒http://localhost:8080/index/1

@PostMapping("/index/{idx}")
@ResponseBody
public boolean deletePost(@PathVariable("idx") int postNum) {
return postService.deletePost(postNum);
}

 

@RequestBody

: 요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation

 

@ModelAttribute

: view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation이다.

⇒ Binding기준: 태그의 name값이 해당 Class 멤버 변수명과 일치해야 되고, Setter 메서드 명도 일치해야 한다.

 

@CookieValue

: 쿠키값을 파라미터로 전달받을 수 있는 Annotation

// 쿠키의 key가 auth에 해당하는 값을 가져옴
public String view(@CookieValue(value="auth")String auth){...};

 

@SessionAttributes

: Session에 data를 넣을 때 쓰는 Annotation

 

@RequestAttribute

: Request에 설정되어 있는 속성 값을 가져올 수 있다.

 

@RequestHeader

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

//ko-KR,ko;q=0.8,en-US;q=0.6
@RequestHeader(value="Accept-Language")String acceptLanguage 

 

@RequestPart

: Request로 온 MultipartFile을 바인딩

 

@ResponseBody

: view가 아닌 JSON 형식의 값을 응답할 때 사용하는 Annotation으로 문자열을 리턴하면 그 값을 http response header가 아닌 response body에 들어간다.

 

@ResponseStatus

: 사용자에게 원하는 response code와 reason을 return 해주는 Annotation

💡 웹 스코프
 : 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다.

웹 스코프 종류
1. request: HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다.
2. session: HTTP Session과 동일한 생명주기를 가지는 스코프
3. application: 서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프
4. websocket: 웹 소켓과 동일한 생명주기를 가지는 스코프

빈 스코프
1. 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
2. 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
3. 웹 관련 스코프

@Bean, @Component, @Scope, @Lookup, proxyMode

 

Exception


@ExceptionHandler

: 해당 클래스의 예외를 캐치하여 처리한다.

 

@ControllerAdvice

: Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지는 각 메서드 상단에 @ExceptionHandler(예외 클래스명. class)를 붙여서 기술

 

@RestControllerAdvice

: @ControllerAdvice + @ResponseBody

 

Data


@Valid

: 유효성 검증이 필요한 객체임을 지정하는 Annotation

 

@InitBinder

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

 

Method


@Transactional

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

@Transaction(readOnly=true, rollbackFor=Exception.class)
@Transaction(noRollbackFor=Exception.class)
@Transaction(timeout = 10)

 

@Cacheable

: 해당 method를 최초에 호출하면 캐시에 적재하고 다음부터는 동일한 method 호출이 있을 때 캐시에서 결과를 가져와서 return하므로 method 호출 횟수를 줄여주는 Annotation

⇒ 입력이 같으면 항상 출력이 같은 method(=순수 함수)에 적용해야한다.

 

@CachePut

: 캐시를 업데이트하기 위해서 method를 항상 실행하게 강제하는 Annotation

 

@CacheEvict

: 캐시에서 데이터를 제거하는 트리거로 동작하는 method에 붙이는 Annotation

 

@CacheConfig

: 클래스 레벨에서 공통의 캐시 설정을 공유하는 기능

 

@Scheduled

: Linux의 crontab처럼 정해진 시간에 실행해야 하는 경우에 사용

@Scheduled(cron = "0 0 07 * * ?")

 

JPA


@Entity

: 실제 DB의 테이블과 매칭 될 Class임을 명시

 

@Table

: Entity Class에 매핑할 테이블 정보를 알려준다. Annotation을 생략하면 Class 이름을 테이블 이름 정보로 매

 

@Id

: 해당 테이블의 PK 필드를 나타낸다.

 

@GeneratedValue

: PK의 생성 규칙을 나타낸다.

 

@Column

: 테이블의 칼럼을 나타내며, 굳이 선언하지 않더라도 해당 Class의 필드는 모두 칼럼이 된다.

@Column을 생략하면 필드명을 사용해서 칼럼명과 매핑

반응형
Comments