본문 바로가기

프로그래밍/Spring

Annotation 정리

잘 정리된 블로그! 





출처:

https://effectivesquid.tistory.com/entry/Bean-%EA%B3%BC-Component%EC%9D%98-%EC%B0%A8%EC%9D%B4



1.

@Bean vs @Component




@Bean

외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용

public class RedisConfig {

private @Value("${spring.redis.host}") String redisHost;
private @Value("${spring.redis.port}") int redisPort;
private @Value("${spring.redis.password}") String password;

@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(30);
jedisPoolConfig.setTestOnBorrow(true);
jedisPoolConfig.setTestOnReturn(true);
return jedisPoolConfig;
}

@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig());
jedisConnectionFactory.setHostName(redisHost);
jedisConnectionFactory.setPort(redisPort);
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.setUsePool(true);
return jedisConnectionFactory;
}

@Bean
public RedisTemplate<String , Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
template.setStringSerializer(new StringRedisSerializer());
template.setEnableDefaultSerializer(false);
template.setEnableTransactionSupport(true);
return template;
}

}





 @Component

개발자가 직접 컨트롤이 가능한 Class들의 경우에 사용

@Component
@Aspect
public class CheckSessionValid {

@Autowired
private SessionTokenRedisRepository sessionTokenRedisRepository;

@Pointcut("execution(public * com.finder.genie_ai.controller.ShopController(..)) && args(token)")
public void controllerClassMethods(String token) {}

//Todo search @AspectJ
@Before("controllerClassMethods(token)")
public void checkSessionValid(String token) {
if (!sessionTokenRedisRepository.isSessionValid(token)) {
throw new UnauthorizedException();
}
}

}






출처:

https://medium.com/@aaaalpooo/%EB%A7%8E%EC%9D%B4-%EC%93%B0%EB%8A%94-spring-framework-annotation-%EC%A0%95%EB%A6%AC-summary-of-annotations-frequently-used-in-spring-framework-935e1c1a4877

https://marine1188.tistory.com/69

https://jeong-pro.tistory.com/151






@Required 

필수 프로퍼티를 명시 할때 사용

필수 프로퍼티를 설정하지 않을 경우 빈 생성시 예외를 발생시킨다.





@Autowired

의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. 

해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.





@Qualifier

@Autowired의 목적에서 동일 타입의 빈객체가 존재시 특정빈을 삽입할 수 있게 설정한다. 


    @Autowired

    @Qualifier("user2")

    private User user;





@Resource

@Autowired와 흡사하지만 @Autowired는 타입으로(by type), @Resource는 이름으로(by name)으로 연결한다.
자바 6 및 JEE5에 추가되었다. 




@Scope
스프링은 기본적으로 빈의 범위를 "singleton" 으로 설정한다. 
"singleton" 이 아닌 다른범위를 지정하고 싶다면 @Scope 어노테이션을 이용하여 범위를 지정한다.

@Component
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Worker {}




@PostConstruct/@PreConstruct
의존하는 객체를 생성한 이후 초기화 작업을 위해 객체 생성 전/후에(pre/post) 실행해야 할 메소드 앞에 붙인다.




@PreDestroy
컨테이너에서 객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용한다.




@Inject
SR-330 표준 Annotation으로 Spring 3 부터 지원하는 Annotation이다. 
특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다. 
클래스 패스 내에 JSR-330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 한다.




@Service
@Service를 적용한 Class는 비지니스 로직이 들어가는 Service로 등록이 된다. 
Controller에 있는 @Autowired는 @Service("xxxService")에 등록된 xxxService와 변수명이 같아야 하며 
Service에 있는 @Autowired는 @Repository("xxxDao")에 등록된 xxDao와 변수명이 같아야 한다.




@Repository
@Repository는 일반적으로 DAO에 사용되며 DB Exception을 DataAccessException으로 변환한다.




@SessionAttributes
세션상에서 model의 정보를 유지하고 싶을 경우 사용한다.
model로 할당된 객체 중 지정된 이름과 일치하는 객체를 세션 속성에도 추가해야 한다.




@RequestBody
적용된 파라미터는 HTTP Request body의 내용이 전달된다.

@RequestMapping(value = "/book", method = RequestMethod.POST)
public ResponseEntity<?> someMethod(@RequestBody Book book) {
....



@ResponseBody
메서드에 @ResponseBody를 적용한 후 문자열을 리턴하면 그 값은 HTTP response header가 아니라 HTTP response body에 쓰여진다. 




@PathVariable
URL의 일부를 파라미터 혹은 변수로 사용한다.

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




@RequestParam
?moviename=thepurge 와 같은 쿼리 파라미터를 파싱해준다.

@RequestMapping(value = "/search/movie", method = RequestMethod.GET)
public ResponseEntity<?> someMethod(@RequestParam String moviename) {
...




@Controller
Spring MVC에서 Controller클래스에 쓰인다.




@RestController
Spring에서 Controller 중 View로 응답하지 않는, 컨트롤러를 의미한다.
적용된 메서드는 HttpResponse로 바로 응답이 가능하다. @ResponseBody 역할을 자동적으로 해주는 어노테션이다.




@RequestMapping
Spring의 컨트롤러 혹은 그 메서드의 URI를 정의하는데 쓰인다.
요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다.
요청 받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정된다.




@ComponentScan
@Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해준다.
ApplicationContext.xml에 <bean id="myid" class="myclass" />  bean을 직접등록하는 방법도 있다. 




@EnableAutoConfiguration
스프링 애플리케이션 컨텍스트를 만들 때 자동으로 설정하는 기능을 켠다.
classpath의 내용에 기반해서 자동 생성해준다. 만약 tomcat-embed-core.jar가 존재하면 톰캣 서버가 setting된다.



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




@PropertySource
해당 프로퍼티 파일을 Environment로 로딩하게 해준다.




@ConfigurationProperties
yaml파일 읽는다. default로 classpath:application.properties 파일이 조회된다.




@Lazy
지연로딩을 지원한다.
@Component나 @Bean 애노티에션과 같이 쓰는데 클래스가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법이다.




@Value
properties에서 값을 가져와 적용할 때 사용한다.




@SpringBootApplication
@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.




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




@ModelAttribute
view에서 전달해주는 파라미터를 클래스(VO/DTO)의 멤버 변수로 binding 해준다.



@GetMapping
@RequestMapping(Method=RequestMethod.GET)과 같음
@PostMapping, @PutMapping, @PatchMapping, @DeleteMapping




@Valid
유효성 검증이 필요한 객체임을 지정한다.




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




@RestControllerAdvice
@ControllerAdvice + @ResponseBody




@ResponseStatus
사용자에게 원하는 response code와 reason을 리턴해준다.
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "my page URL changed..")




@EnableEurekaServer
Eureka 서버로 만들어준다.




@EnableDiscoveryClient
Eureka 서버에서 관리될 수 있는 클라이언트 임을 알려준다.




@Transactional
트랜잭션을 설정




@Cacheable     // 캐시에 적재하고 다음부터는 동일한 메서드 호출이 있을 때 캐시에서 결과를 가져와서 리턴
@CachePut      // 캐시를 업데이트하기 위해서 메서드를 항상 실행하게 강제
@CacheEvict    // 캐시에서 데이터를 제거하는 트리거
@CacheConfig // 클래스 레벨에서 공통의 캐시설정을 공유




@Scheduled(cron = "0 0 07 * * ?") "초 분 시 일 월 요일 년(선택)에 해당 메서드 호출






'프로그래밍 > Spring' 카테고리의 다른 글

AWS + Spring boot + Java + Oauth + Mustache + JPA (sample project)  (0) 2020.04.28
REST API sample With Kotiln  (0) 2020.04.28
String(date foramt) in Json to LocalDateTime  (0) 2019.09.27
Spring AOP  (0) 2019.04.22
Filter & Interceptor  (0) 2019.03.04