Annotation이란?
프로그램에게 추가적인 정보를 제공해주는 메타 데이터라고 볼 수 있다.
- 컴파일러에게 코드 작성 문법에러를 체크하도록 정보를 제공한다.
- 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 실행 시 특정기능을 실행하도록 정보를 제공한다.
Reflection이란?
Reflection이란 프로그램이 실행 중에 자신의 구조와 동작을 검사하고, 조사하고, 수정하는 것이다.
Spring에서 BeanFactory라는 container에서 객체가 호출되면 객체의 인스턴스를 생성하게 되는데 이 때 필요하다. 즉, 프레임 워크상에서 유연성 있는 동작을 위해 쓰인다.
Annotation 종류(실제로 써본 것만 일단 정리해본다)
@ComponentScan
@Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean을 찾아 context에 bean등록을 해준다. Spring에서 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는, @Repository는 DAO메소드에서 발생할 수 있는 unchecked Exception을 dataAccessEception으로 처리할 수 있기 때문이다. 또한 해당 클래스의 역할에 대한 가독성도 좋다.
@Component
개발자가 직접 작성한 class를 bean으로 등록하기 위한 annotation이다. value로 이름 지정 가능하고, 지정하지 않으면 classname을 camelcase로 변경한게 bean id로 사용된다.
@Bean
개발자가 직접 제어가 불가능한 외부 라이브러리등을 bean으로 만들려할 때 사용되는 annotation이다. ex)ArrayList
@Autowire
type에 따라 알아서 bean을 주입해준다. controller 클래스에서 dao나 service에 관한 객체들을 주입시킬 때 많이 사용한다. 그러나 순환 참조가 발생할 수 있기 때문에 권장하지 않는 방식이다.
Bean을 주입받는 방식 3가지
- annotation(@Autowire)
- setter
- 생성자(@AllArgsConstructor 사용)->권장방식
@Controller
Spring에서 Controller를 의미
api와 view를 동시에 사용하는 경우에 사용
api 서비스로 사용하는 경우에 @ResponseBody를 통해 객체 반환, 화면(view) return이 주 목적이다.
@RestController
Controller중 view로 응답하지 않는 controller를 의미한다. method의 반환결과를 json형태로 반환
@ResponseBody역할을 자동적으로 해준다.
@Controller+@ResponseBody를 사용하면 @ResponseBody를 모든 메소드에서 적용
@RestController=@Controller+@ResponseBody
data(json,xml 등) return이 주 목적이다.
@Service
서비스 클래스에 사용되고, 비즈니즈 로직을 수행하는 class라는 걸 나타낸다.
@Repository
DAO class에서 사용된다. database에 접근하는 method를 가지고있는 class에서 쓰인다.
@Configuration
@Configuration을 클래스에 적용하고, @Bean을 해당 클래스의 method에 적용하면 @Autowire로 bean을 부를 수 있다.
@Required
setter method에 적용하면 bean생성시 필수 property임을 알린다.
@Qualifier("id123")
@Autowired와 같이 쓰이며 같은 타입의 bean객체가 있을 때 해당 아이디를 적어 원하는 bean이 주입될 수 있도록 하는 annotation이다.
ex)
@Autowired
@Qualifier(value="tony")
@Value
properties에서 값을 가져와 적용할 떄 사용한다.
@RequestMapping
요청url을 어떤 메소드가 처리할 지 mapping해주는 annotation이다. @GetMapping,@PostMapping,@PutMapping,@DeleteMapping등 도 있다.
@RequestBody
요청이 온 데이터(json이나 xml형식)을 바로 class나 모델로 매핑하기 위한 annotation이다.
@PathVariable
url/{id}형식으로 되어있는 url에서 매핑되는 {id}가 requeste parameter값으로 자동으로 binding된다. uri에서 각 구분자에 들어오는 값을 처리해야할 때 사용된다.
@Transactional
데이터 트랜잭션을 설정하고 싶은 method에 annotation을 적용하면 method내부에서 일어나는 데이터베이스 로직이 전부 성공하게 되거나 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 annotaion이다.
Lombok Annotation
@NoArgsConstructor
기본생성자를 자동으로 추가
@AllArgsConstructor
모든 필드값을 파라미터로 받는 생성자를 추가한다.
@RequiredArgsConstructor
final이나 @NonNull인 필드값만 파라미터로 받는 생성자를 추가한다.
@Getter
class내 모든 필드의 getter method를 자동 생성한다.
@Setter
class내 모든 필드의 setter method를 자동 생성한다.
@Builder
어떤 필드에 어떤 값을 채워야할 지 명확하게 정하여 생성시점에 값을 채워준다.
@Data
Lombok에서 제공하는 필드와 관련된 모든 코드를 생성한다.
전체적인 모든 기능 허용하므로 위험하다. 따라서 사용을 지양한다.
JPA Annotation
@Entity
DB테이블과 매칭될 class임을 명시
@Table
entity class에서 매핑할 테이블 정보를 알려준다. annotation을 생략하면 class이름을 테이블 이름 정보로 매핑
@Id
PK필드를 의미한다.
@Column
테이블의 컬럼을 나타낸다. @Column을 생략하면 필드명을 사용해서 컬럼과 매핑. 기본값 외에 추가로 변경이 필요한 옵션이 있을 경우 사용한다.
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
'스프링' 카테고리의 다른 글
Transaction(트랜잭션)에 대한 이해 (0) | 2022.07.03 |
---|---|
스프링, 스프링 부트 접미사 (0) | 2022.04.24 |
스프링 배치 프로세스 (0) | 2022.04.16 |
ORM과 JPA에 대하여 (0) | 2022.03.29 |
[카프카]카프카에 대하여 (0) | 2021.12.12 |