일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 이클립스
- jsp
- hashcode
- git
- spring-framework
- Linux
- oracle
- tomcat
- java
- gitlab
- Web
- Jenkins
- Pipeline
- 개발
- 웹프로젝트
- Gradle
- REST
- 스프링부트
- Spring Framework
- 스프링프레임워크
- maven
- springboot
- JAR
- mybatis
- War
- SpringFramework
- soap
- Spring
- Spring Boot
- annotaion
- Today
- Total
Verity's Daily Logs_
[Spring-Framework]Spring Annotation 본문
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을 생략하면 필드명을 사용해서 칼럼명과 매핑
'Spring Framework' 카테고리의 다른 글
[Spring Boot]개발-운영환경 설정 나누기(Gradle) (0) | 2021.01.06 |
---|---|
[Spring Boot]war로 배포하기 (Gradle + 내/외장 톰캣) (3) | 2020.12.23 |
[Spring Boot]JSP 제약사항 (3) | 2020.12.18 |
[Spring Boot]배포 방법 비교 (JAR vs WAR) (0) | 2020.12.17 |
[Spring Boot]JDBC+MyBatis 연결하기(2) (0) | 2020.10.14 |