차근차근/Spring

Annotation

예쁜꽃이피었으면 2021. 12. 9. 17:38
더보기

스프링 코드를 작성하면서 당연하게 써야한다고 생각했던 어노테이션인데..

자바 어노테이션이 있다는 말을 읽고..어디서부터 공부를 해야 하나..심각해졌다..

Annotation 이란

- Java5부터 새롭게 추가된 문법요소

- 사전적 의미는 주석이지만 '//, /**/' 이런 주석과는 차이가 있다 

- 전체 코드에서 비즈니스 로직에 영향을 주지는 않지만,

  해당 타겟의 연결 방법이나 소스코드의 구조를 변경할 수 있다.

- 자바 소스코드에 추가하여 사용할 수 있는 메타데이터의 일종

 

JAVA Annotation 기본 문법

annotation 이름

ex) @Entity에서 @ <- 이게 어노테이션 / @ 다음에 있는 엔티티는 어노테이션의 이름

 

JAVA Annotation 타입(3)

1)  마커 어노테이션(Maker Annotation)

: 메서드 없이 선언 / 추가정보없이 클래스나 메서드 위에 추가

@NewAnnotation

2) 싱글값 어노테이션(Single Value Annotation)

: 하나의 값만 입력받을 수 있음

@NewAnnotation(id=10)

3) 멀티값 어노테이션(Multi Value Annotation)

: default키워드로 기본값 선언할 수 있음

@NewAnnotation(id=10,name="hello",roles={"admin","user"})

 

JAVA Annotation 요소(Element)

- 자바 annotation은 값을 세팅할 수 있는 요소를 가질 수 있다. (속성 / 파라미터라고 생각하자 , 한 개~여러 개도 됨.)

@Entitiy(tableName="TestTable",primaryKey="Testpk")

- 요소가 하나인 경우

@InsertNew("yes") 가능

 

JAVA Annotation 선언 위치(Placement)

- 클래스, 인터페이스, 메소드, 메소드 파라미터, 필드, 지역변수 위에 위치 할 수 있다.

 

JAVA에서 기본으로 제공되는 Annotation

1) 자바 코드에 적용되는 어노테이션

- @Deprecated : 해당 클래스/메소드 등은 더 이상 사용하지 않으니 사용하지 말라

- @Override : 슈퍼클래스에 대해 오버라이드 되었다는 선언 , 메서드가 슈퍼클래스와 매칭되지 않는다면 에러 생김

- @SuppressWarnings : 컴파일 경고 억제


 

Spring Annotation의 종류

Bean등록 Annotation

- Component계열의 Annotation : 기본 스테레오 타입 어노테이션.

- 이 어노테이션들을 붙인 클래스는 빈 객체가 된다.

클래스에 붙여서 해당 클래스가 컴포넌트 스캐닝의 대상이고, 스프링에 의해 관리될 것임을 표시한다.

<bean> XML설정파일에서 <Bean>으로 선언한 것과 같은 효과를 낸다.

1) @Controller : 프레젠테이션 계층에서 사용

2) @Repository : 영속성 계층에서 사용

3) @Servie : 비즈니스 계층에서 사용

 

Bean 의존성 관계 주입 Annotation

1) @AutoWired : 의존대상 객체를 타입으로 검색해서 주입. 만약에 동일한 타입의 객체가 여러개일 경우 Exception발생

2) @Resource : 의존대상 객체를 타입으로 검색해서 주입

3) @Resource(name="beanID") : 의존대상 객체를 이름으로 주입. Autowired의 단점 보완

4) @Inject : 의존대상 객체를 타입으로 검색해 주입

    @Named("beanID") : @Inject와 @Named를 함께 명시하면 이름으로 주입


Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록한다.
Spring Framework에서 Bean객체를 주입받기 위한 방법(3)
1) @Autowired
2) 생성자(@AllArgsConstructor사용) -> 권장방식
3) seter

 

@ComponentScan bean으로 등록 될 준비를 마친 클래스들을 스캔하여 bean으로 등록해주는 것
(@Controller, @Service, @Component, @Repository, @Configuration)
@Component 개발자가 생성산 Class를 Spring의 Bean으로 등록
@Bean 개발자가 제어가 불가능한 외부라이브러리와 같은 것들을Bean으로 만들 때 사용
@Controller Spring에게 해당 class가 Controller의 역할을 한다고 명시
@RestController
Spring에서 Controller중 View로 응답하지 않는 Controller를 의미
method의 반환 결과를 JSON형태로 반환
@RestController이 있는 Controller의 method는 HttpResponse로 바로 응답이 가능하다.
@ResponseBody역할을 자동적으로 해주는 어노테이션
@RequestMapping @RequestMapping(value="")와 같은 형태로 작성, 요청들어온 URI의 요청과 Annotation value값이 일치하면 해당 클래스나 메소드가 실행된다.
- class단위에 사용하면 하위 메소드에 모두 적용된다.
- 메소드에 적용되면 해당 메소드에서 지정한 방식으로 URI를 처리한다.
ex) @RequestMapping("/user") // 이 class는 /user로 들어오는 요청을 모두 처리
@RequestHeader Request의 header값을 가져올 수 있으며, @RequestHeader를 쓴 메소드 파라미터 사용
@RequestParam URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 어노테이션.
JSON형식의 BODY를 MessageConverter를 통해 JAVA로 변환.
@RequestBody Body에 전달되는 데이터를 메소드의 인자와 매칭시켜, 데이터를 받아서 처리할 수 있는 어노테이션.
클라이언트가 보내는 HTTP요청 본문(JSON,XML..)을 JAVA오브젝트로 변환
@ResponseBody 메소드에서 리턴되는 값이 View로 출력되지 않고 HTTP REsponse Body에 직접 쓰여진다.
return 시 json, xml과 같은 데이터를 return한다.
@ModelAttribute 클라이언트가 전송하는 HTTP parameter, Body내용을 Setter함수를 통해 1:1로 객체에 데이터를 연결(바인딩)한다.
RequestBody와 다르게 HTTP Body내용은 multipart/form-data형태를 요구한다.
@RequestBody가 json을 받는 것과는 달리 @ModenAtribute의 경우에는 json을 받아 처리할 수 없다.
@Autowired Bean을 주입받기 위해서 사용
Spring Framework가 Class를 보고 Type에 맞게 (Type을 먼저 확인 후, 없으면 Name확인) Bean 주입
@service Service Class에서 사용
비즈니스 로직을 수행하는 Class라는 것을 명시
@Repository DAO class에서 사용
DataBase에 접근하는 method를 가지고 있는 class에서 쓴다.
@Resource @Autowired와 마찬가지로 Bean객체를 주입
@GetMapping @RequestMapping(Method=RequestMethod.GET)과 똑같은 역할
@PostMapping @RequestMapping(Method=RequestMethod.POST)과 똑같은 역할
@SpringBootTest Spring Boot Test에 필요한 의존성 제공
@Test JUnit에서 테스트할 대상표시
@Inject @Autowired와 비슷한 역할
@RequestMapping, @PostMapping, @GetMapping 차이
Spring 4.3부터 Spring MVC 컨트롤러 메소드를 위해 새로운 어노테이션 5개 추가됨.
1) @PostMapping
2) @GetMapping
3) @PutMapping
4) @DeleteMapping
5) @PatchMapping

- 차이
@RequestMapping(value="/getList", method = { RequestMethod.POST}​

 

을 이렇게 바꿀 수 있다. 짧게
@PostMapping("/getList")​


https://0penster.tistory.com/24

@Controller와 @RestController의 차이
1) @Controller
- API와 view를 동시에 사용하는 경우에 사용한다.
- API서비스로 사용하는 경우 @ResponseBody를 사용해 객체를 반환한다.
- View return이 주 목적이다.

2) @RestController
- view가 필요없는 API만 지원하는 서비스에서 사용
- Spring 4.0.1부터 제공
@requestMapping메서드가 기본적으로 @ResponseBody의미를 가정한다.
- date(json, xml 등) return 이 주 목적이다.

@RestController = @Controller + @ResponseBody
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
  @Autowired @Resource @Inject
의존 Spring JAVA Javax
사용가능 위치 필드
생성자
setter
필드
파라미터가 1개인 setter
필드
생성자
setter
Bean검색
우선순위
타입->이름 이름->타입 타입->이름
Bean 강제지정 @Autowired
@Qualifier("ID")
@Resource(name="ID") @Inject
@Named("ID")
Bean없을 겨우 @Autowired(requied=false)처리하면 예외발생 방지 예외발생 예외발생
기타   Spring Framework2.5.*부터 지원
jsr250-api.jar 추가 필요.
 
* Annotation사용으로 인해 특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서는 @Resource를 사용할 것을 권장함.

https://codevang.tistory.com/256

 

 

 

 

 

 


[참조]

http://melonicedlatte.com/2021/07/11/232800.html

 

https://dejavuhyo.github.io/posts/spring-annotation/

 

https://www.nextree.co.kr/p5864/

 

https://hamait.tistory.com/314

 

https://advenoh.tistory.com/21

 

https://bangu4.tistory.com/199

 

https://blog.naver.com/PostView.nhn?blogId=wwwkang8&logNo=220994093310

 

https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC

https://codevang.tistory.com/256

 

 

 

 

 

반응형

'차근차근 > Spring' 카테고리의 다른 글

스프링 파일 경로  (0) 2021.12.15
mybatis Oracle Procedure 호출하기  (0) 2021.12.13
2.용어정리(6)-SPA  (0) 2021.12.09
2.용어정리(5)-싱글톤패턴  (0) 2021.12.09
2.용어정리(4)-ViewResolver,prefix,suffix  (0) 2021.12.09