Annotation은 Java5부터 새롭게 추가된 문법요소이다.
사전적으로는 "주석"이라는 의미를 가지고, 자바 코드에 @를 이용해 주석처럼 달아 특수한 의미를 부여해준다. 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공하고, 코드에 정보를 추가하는 정형화된 방법이다.즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다
💡meta data: 데이터를 위한 데이터
📖Java Reflection: 프로그램 실행중에 자신의 구조와 동작을 검사하고, 조사하고 수정하는 것이다. 자바와 같은 객체 지향 프로그래밍 언어에서 Reflection을 사용하면 컴파일 타임에 인터페이스, 필드, 메소드의 이름을 알지 못해도 실행중에 클래스, 인터페이스, 필드 및 메소드에 접근할 수 있다. 또한 새로운 객체의 인스턴스화 및 메소드 호출을 허용한다.
스프링 IoC 컨테이너에 의해서 관리되고 애플리케이션의 핵심을 이루는 객체들을 스프링에서는 빈즈(Beans)라고 한다. 빈은 IoC컨테이너에 의해서 인스턴스화되어 조립되거나 관리되는 객체를 말합니다. 이같은 점을 제외하고 빈은 수많은 객체들중의 하나일 뿐입니다. 빈과 빈사이의 의존성은 컨테이너가 사용하는 메타데이터 환경설정에 반영됩니다.
단순히, 어노테이션은 표식 reflection은 표식을 보고 반응하는 형식이라고 생각하면 되겠다.
SpringBoot를 자동으로 실행시켜주는 어노테이션으로 Bean 등록은 두 단계로 진행된다.
1)@ComponentScan을 통해 Component들을 Bean으로 등록한다.
2)@EnableAutoCofiguration을 통해 미리 정희해둔 자바 설정 파일들을 Bean으로 등록한다.
스프링IoC컨테이너에게 해당 클래스가 Bean 구성 Class임을 알려주는 어노테이션이다.
@Bean을 해당 클래스의 메소드에 적용하면, @Autowired로 빈을 부를 수 있다.(설정에 관련된 어노테이션)@Configuration
public class ParserFactory {
@Bean
public ReadLineContext<Hospital> hospitalReadLineContext() {
return new ReadLineContext<Hospital>(new HospitalParser());
}
}
@Bean의 경우 개발자가 컨트롤이 불가능한 외부라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.
(예를들면, ParserFactory는 외부라이브러리를 호출해서 사용하기 때문에 객체를 만들기 때문에 개발자가 직접 제어하는 것이 아니여서@Bean을 사용한다. )반대론 개발자가 직접 컨트롤이 가능한 Class들의 경우 @Component를 사용한다.
그럼 개발자가 생성한 Class에Bean선언이 가능할까?
정답 NO이다.
@Bean과@Component는 각자 선언할 수 있는 타입이 정해져 있어 해당 용도외에는 컴파일 에러를 발생시킨다.
스프링 어플리케이션 컨텍스트를 만들 때 자동으로 설정하는 기능을 켠다.
classpath의 내용에 기반해서 자동생성해 준다. 만약 tomcat-embed-core.jar 가 존재하면 톰캣 서버가 setting된다.
Component와 Service,Repository,Controller,@Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록 해주는 Annotation 이다.
개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션
public class TemplateEngine{
}
@ComponentScan 선언에 의해 특정 패키지 안의 클래스들을 자동 스캔하여 @ComponentScan 어노테이션이 있는 클래스들에 대하여 빈 인스턴스를 생성한다.
@ComponentScan 어노테이션은 Controller,Service,DAO 세가지 이외의 클래스에만 사용권장!!
자동으로 등록되는 빈의 네임의 클래스의 첫문자가소문자로 바뀌어 자동으로 적용된다(HomeController -> homeController)
Tip@Component-> (구체화) ->@Controller, @Service,@Repository
SpringMVC의 Controller로 사용되는 클래스 선언을 단순화 시켜주는 어노테이션 Controller클래스의 리턴타입이 String이면 jsp파일명을 의미
비지니스 로직 이 들어가는 Service로 사용되는 클래스임을 명시하는 어노테이션
MVC 패턴의 Model이라는 것은 결국 비즈니스 로직이고, View는 프레젠테이션, Controller는 이 둘을 연결해주는 매개체이다.

비지니스로직은 MVC에서 Model 에 가까울수록 좋다.
DAO class에서 쓰인다
DataBase에 접근하는 method 를 가지고 있는 class에 쓰인다.
해당 클래스에서 발생하는 DB관련 예외를 spring의 DAOException으로 전환할 수 있기 때문에 DAO접근할 때 사용한다.
클라이언트에게 요청받는 주소를 클래스와 연결시켜주는 어노테이션(클래스 연결 중간점)/ 디폴트 GET 방식클래스와 메소드 단 두 곳에서 모두 사용 가능하다. 즉 요청 URL을 어떤 method 처리할지 mapping해주는 것이다.
요청받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정된다.
@RequestMapping("/A/")
/A/(모든 주소 가능) 기본 주소 매핑(접두사와 비슷한 의미)
@RequestMapping(value = "/A", method = RequestMethod.POST)
http method 방식으로 value url 주소 매핑
//1)메소드 리턴타입이 void일 때
//주소:/A
//리턴타입(이동 페이지): B.jsp(value 가 jsp 파일명)
@RequestMapping(value = "B", method = RequestMethod.GET)
public void write(){
}
//2)메소드 리턴타입이 String일 때
//주소:/A
//리턴타입(이동 페이지):B.jsp(리턴타입이 jsp 파일명)
@RequestMapping(value = "A" , method = RequestMethod.GET)
public String A(int idx) throws Exception{
return "/B";
}
//3)클래스에서 사용시
// 기본 주소에 /jpa를 무조건 포함
@RestController
@RequestMapping("/jpa")
public class UserJpaController{...}


@Controller + ResponseBody 결합 형태의 어노테이션으로, 주 용도는 해당 클래스가 ajax 요청을 받아 Json/Xml형태로 객체 데이터를 반환하는 것이다.
MVC@Controller와의 차이점은 HTTP Response Body가 생성되는 방식의 차이 이다
📌 @RestController:(주용도 데이터 리턴) 클래스의 리턴 타입이 String이면 문자열 데이터의미(jsp파일 사용 X)
@Controller:(주용도 view리턴) 클래스의 리턴타입이 String이면 리턴값이 jsp파일명을 의미
-> 물론 @Controller의 경우 메소드에 @RequestBody를 사용하여 리턴할 수 있음
- @Controller의 실행 흐름
Client -> Request -> DispatchServlet -> HandleMapping -> Controller -> View -> DispatcherServlet -> Response -> Client- @ResponseBody의 실행 흐름
Client -> Request -> DispatcherServlet -> HandleMapping -> Controller(ResponseBody) -> Response -> Client- RestController의 실행 흐름
Client -> HTTP Request -> Dispatcher Servlet -> Handle Mapping -> RestController(자동 ResponseBody 추가) -> HTTP Response -> Client
@Controller + @ResponseBody를 사용하면
@ResponseBody를 모든 메소드에서 적용 한다.
json문법 구조 포맷으로 전송되어 온 데이터를 내보낼 때에는 ResponseBody/ 가져올 때에는 @RequestBody -> jackson 라이브러리 필요
자바의 객체를 HTTP요청의 body내용으로 변환/매핑하는 어노테이션
HTTP요청의 body내용을 전달받아 자바 객체로 변환/매핑하는 어노테이션
@Controller
public class ControllerMain {
//home.jsp
@RequestMapping(value = "/",method = RequestMethod.GET)
public String home(){
return "home";
}
@ResponseBody
@RequestMapping(value = "/test" , method = RequestMethod.POST)
public void init(@RequestBody UserVO userVO){
userVO.getName(); //"byeon"
userVO.getAge(); // 30
}
}
HttpEntity클래스:Http프로토콜을 이용하는 통신의 header와 body관련 정보를 저장
요청하거나 요청 받은 정보에 대한 HTTP 상태 코드를 리턴하거나 리턴받아서 정상 처리가 되었는지 에러가 났는지 알 수 있다.
즉, 📌통신 메시지 관련 header 와 body의 값들으 하나의 객체로 저장하는 것이 HttpEntity클래스 객체이다. 이를 상속받은 클래스로 RequestEntity 와 ResponseEntity가 존재한다.
header값을 변경시켜야 할 경우에는 @ResponseBody의 경우 파라미터로 Response 객체를 받아 해당 객체의 header를 변경시켜야 하고, ResponseEntity에서는 해당 클래스의 객체를 생성한 뒤 객체에서 header값을 변경시켜야 한다.
RequestEntity VS ResponseEntity
public class MainController {
public ResponseEntity<String> replyUpdate(@PathVariable("rno") int rno, @RequestBodY ReplyVO vo){
//HTTP상태 코드 + 데이터 를 클라이언트에게 리턴
ResponseEntity<String> entity = null;
try{ //rno 세팅 하기
vo.setRno(rno);
service.replyUpdate(vo);
entity = new ResponseEntity<String>("SUCCESS", HttpStatus.OK);
}catch (Exception e){
e.printStackTrace();
entity = new ResponseEntity<String>📌(e.getMessage(),HttpStatus.BAD_REQUEST);
}
return entity
}
}
ResponseBody 와 ResponseEntity의 차이
두 가지는 똑같은 결과 값을 가지고 오지만 ResponseEntity를 사용하는 용도는 HTTP response header의 유통성 있는 추가가 가능ㅇ하다.
따라서, 📌굳이 HTTP설정이 필요하지 않다면,ResponseBody의 사용이 더 간결하다.
@PathVariable
URL 경로 주소에 사용하는 값을 매개 변수로 사용가능하게 해주는 어노테이션(RESTful)
@RequestMapping의 URL 정의 부분과 Method 내의 Parameter 부분에 정의를 하여 사용이 가능하다.
@RequestMapping 어노테이션 값으로 {템플릿 변수}를 사용한다.
@PathVariable 어노테이션을 이용해서 {템플릿 변수}와 동일한 이름을 갖는 파라미터를 추가한다.
RequestMapping 어노테이션에 변수를 포함하고 있으면서, 이들 변수는 @PathVariable어노테이션이 적용된 동일한 이름을 갖는 파라미터에 매핑됩니다.
💡 동적 라우팅 구성시,(예:/path/to/{placeholderName} 동적 라우팅에 대한 바인딩 값을 가져오는 인자 어노테이션이다. 길게 설명할 거 없이 동작 라우팅에서 동적 값을 가져올 때 없어서 안될 라우팅이다
해당 URL에서 {특정값}을 변수로 받아 올 수 있다. 괄호 안에 입력 값을 따로 넣지 않으면, HTTP요청 path 변수 중에서 method의 파라미터명과 일치하는 값을 가져온다.
public class MainController {
@RequestMapping(value = "some./path/{id}", method = RequestMethod.GET)
public ResponseEntity<?> someMethod(@PathVariable int id){
}
}
RequestParam을 사용했을 때 주소
localhost:8080/?aaa=bbb&ccc=ddd
PathVariable을 사용했을 때 주소
localhost:8080/bbb/ddd
1) @ExceptionHandler
기존 Controller 에 @ExceptionHandler 어노테이션을 사용하는 메소드를 추가하여 예외처리를 하는 방식 @RequestMapping 대신 @ExceptionHandler어노테이션을 사용하기만 하면 된다.
각 컨트롤러에 예외처리를 위한 메소드를 추가해주는 방식은 컨트롤러의 수가 많아지면 그만큼 작업해야 할 양이 많아진다. 사이트 전체에 공통으로 적용해야할 컨토롤러에는 @ControllerAdvice를 사용한 예외 처리 방법이 효율적이다.
2)@ResponseStatus
HTTPStatusCode 제어를 위한 Excepton handling특정한 예외 지정
문제에 대한 정확한 원인을 파악하기 힘들다는 단점을 보완하는 코드가 바로 이 @ResponseStatus이다.
참고바람
3)@ControllerAdvice
SpringAOP를 이용한 Exception handling으로 예외처리 전용 컨트롤러 생성하여 예외 처리를 하는 어노테이션이다. 모든 컨트롤러가 실행될 때 @ControllerAdvice 어노테이션을 가지고 있는 빈이 자동 실행된다.
RestController를 이용하여 @RequestBody 객체를 사용자로부터 가져올 때, 들어오는 값들을 유효성 검사 @Valid를 이용하면, service단이 아닌 객체에서, 들어오느 값에 대한 검증을 할 수 있다.
1)문자열 유무 검증(@NotBlank,@NotEmpty,@NotNull)
@NotBlank
@NotEmpty
@NotNull
@Null

2)최대,최소에 대한 검증
@DecimalMax: 지정된 최대 값보다 작거나 같아야 한다.
Require:String value => max 값을 지정한다.
@DecimalMin: 지정된 최대 값보다 크거나 같아야 한다.
Require:String value => min 값을 지정한다.
@Min: 지정된 최대 값보다 작거나 같아야 한다.
Require:int vlaue => max 값을 지정한다
@Max: 지정된 최대 값보다 크거나 같아야 한다.
Require:int value => min 값을 지정한다.
->String을 사용하느냐 Integer를 사용하느냐에 따라 범위 값이 현저히 달라진다.
3)최대, 최소에 대한 검증
@Positive : 양수인 값이다.
@PositiveOrZero : 0이거나 양수인 값이다.
@Negative : 음수인 값이다.
@NegativeOrZero : 0이거나 음수인 값이다.
4) 시간 값에 대한 검증
@Future : Now 보다 미래의 날짜, 시간이어야 한다.
@FutureOrPresent : Now 거나 미래의 날짜, 시간이어야 한다.
@Past : Now 보다 과거 의의 날짜, 시간이어야 한다.
@PastOrPresent : Now 거나 과거의 날짜, 시간이어야 한다.
5) 이메일 검증
@Email : 올바른 형식의 이메일 주소여야 한다. (@가 들어가야한다.)
6) 자릿수 범위 검증
@Digits : 허용된 범위 내의 숫자이다.
Require : int integer => 이 숫자에 허용되는 최대 정수 자릿수
Require : int fraction => 이 숫자에 허용되는 최대 소수 자릿수
public class MainController {
@Digits(integer =5, fraction = 5)
private Integer digits
}
7) boolean 값에 대한 검증
@AssertTrue : 값이 항상 True 여야 한다.
@AssertFalse : 값이 항상 False 여야 한다.
8) 크기(길이) 검증
@Size : 이 크기가 지정된 경계(포함) 사이에 있어야 한다.
Require : int max => element의 크기가 작거나 같다.
Require : int min => element의 크기가 크거나 같다.
@Min과@Max는 String(숫자를 나타냄), int, short, byte등의
숫자 필드와 해당 기본 래퍼 일 수 있는 유효성 검사에 사용됩니다.
@Size는 필드의 길이 제한 조건을 확인하는데 사용됩니다.
@Min과@Max는 프리머티브와 래퍼를 지원하는 반면@Size는 String,Collection,Map및 배열을 지원합니다.
9)정규식 검증
@Pattern:지정한 정규식과 대응되는 문자열 이어야 한다. Java의 Pattern패키지의 컨벤션을 따른다.
Require:String regxp => 정규식을 지정한다.
필드 하나 하나에 개별적으로 필터 어노테이션 적용
클래스 블록에 필터 어노테이션 적용
어드민 페이지에서 지정된 필드만 조회할 때 사용하는 필터(Controller, Service클래스에서 사용)
###EnablSwagger2
개발자 도움말 페이지를 생성해주는 어노테이션
간단하게 Spring 어노테이션을 정리해보았다
<span style = color:red

계속 추가 하고 보완할 예정