사전적 의미: 주석
Java에서는 주석 이상으로 특정 기능을 하는 기술
Annotation
을 사용하면 코드가 짧아지고 유지보수가 용이함
개발자가 직접 제어 불가능한 외부 라이브러리 등을 Bean으로 등록하려 할 때 사용
@Component
가 선언된 Class를 Spring의 Bean으로 등록할 때 사용
@Component
, @Service
, @Repository
, @Controller
, @Configuration
어노테이션 중 1개라도 선언되어 있는 클래스가 있다면 해당 클래스를 Context에 Bean으로 등록
Spring MVC 패턴에서 Controller클래스에 사용
비즈니스 로직을 수행하는 클래스를 나타낼 때 사용
DAO 클래스에서 사용
DB 연동 작업을 하는 클래스에서 사용하면 Spring의 DAOException 예외를 적용할 수 있음
@Configuration
어노테이션이 붙은 클래스는 @Bean
을 등록하기 위한 클래스
@Configuration
이 붙은 클래스에 @Bean
을 메서드에 적용시키면 다른 클래스에서 @Autowired
로 Bean을 사용할 수 있음
@Configuration
이 없어도 Bean을 등록할 수 있지만 싱글톤이 유지되지 않음
타입에 따라서 자동으로 Bean을 주입받기 위해 사용
Bean을 주입 받는 3가지 방법
- @AutoWired
- Setter
- 생성자
@Autowired
와 비슷한 역할, 차이점은 이름으로 연결해 줌
@AutoWired
와 비슷한 역할
Spring의 Application-context를 만들 때 자동으로 설정하는 기능을 On
@RestController
= @Controller
+ @ResponseBody
@Controller
의 주 목적은 View를 리턴해주는 어노테이션
@RestController
의 주 목적은 데이터(XML, JSON 등)를 리턴해주는 어노테이션
JSON형태로 전송받은 데이터를 가져올 때는 @RequestBody
데이터를 전송할 때는 @ResponseBody
@ResponseBody
메서드가 선언된 컨트롤러는 리턴값이 View로 출력되는것이 아닌 HTTP Body에 직접 리턴됨
XML, JSON등 데이터를 리턴
HTTP Body로부터 전달받은 데이터를 클래스나 Model에 매핑하기 위한 어노테이션
XML, JSON등 데이터를 받으면 Java Object로 변환
Body가 없는 GET 방식에서는 @RequestBody
사용 시 오류 발생
클라이언트로 부터 전달받은 요청 URL을 어떤 메서드가 처리할지 매핑해주는 어노테이션
@RequestMapping
(value="") 형식으로 작성
value 뒤에 형식으로 (method=RequestMethod.GET)와 같이 요청 형식 지정가능
요청 형식 종류
- GET
- POST
- PATCH
- PUT
- DELETE
요청 형식을 지정하지 않으면 기본값으로 GET 사용
URL 요청으로 받은 파라미터 값과 @RequestParam
어노테이션이 붙은 메서드에서 일치하는 파라미터 값을 파싱하여 사용하기 위한 어노테이션
기본으로 파라미터 전송이 true이기 때문에 파라미터를 전송받지 못하면 HTTP 400 오류 발생
필수적으로 필요한 변수가 아니면 (required = false)
로 설정
View로부터 전달받은 파라미터를 바로 처리 가능
Request의 header값을 가져올 수 있음
Setter 메서드에서 선언하면 Bean 생성 시 필수 프로퍼티임을 알림
Spring 5.1부터 더이상 권장되지 않는 방식으로 변경되어 deprecated warnings 발생
public class Product { private String id; public String getId() { return id; } @Required // 이 부분 권장하지 않음 public void setId(String id) { this.id = id; } }
위의 코드를
public class Product { private String id; public Product(String id) { this.id = id; } public String getId() { return id; }
생성자를 통해 set 하는 방식으로 권장
@AutoWired
와 같이 쓰이며 같은 타입의 Bean 객체가 있으면 value값을 설정해서 원하는 Bean만 주입될 수 있도록 하는 어노테이션
지연 로딩 지원
@Component
나 @Bean
과 같이 쓰는데 클래스가 로드될 때 Spring에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법
property에서 값을 가져와 적용할 때 사용
@Configuration
, @EnableAutoConfiguration
, @ComponentScan
모두를 합친 어노테이션
쿠키 값을 파라미터로 전달 받을 수 있음
쿠키가 존재하지 않으면 500에러 발생
CORS 보안상의 문제로 브라우저에서 리소스를 현재 origin에서 다른 곳으로 AJAX 요청을 방지하기 위해 사용
@ModelAttribute
가 붙은 객체를 자동으로 생성 후 HTTP 요청으로 넘어온 파라미터 값들을 자동으로 객체의 멤버 변수에 바인딩 시켜주는 어노테이션
@RequestParam
은 1:1 매핑
@ModelAttribute
는 객체 매핑, Setter 또는 생성자가 있어야함
@RequestMapping(Method=RequestMethod.GET)
과 동일
@PostMapping
, @PutMapping
, @PatchMapping
, @DeleteMapping
도 있음
메서드의 파라미터 앞에 사용하면 해당 URL에서 특정값을 변수로 받아올 수 있음
@RequestMapping
어노테이션에 value값을 포함하고 있으면서 @PathVariable
어노테이션이 적용된 동일한 이름을 갖는 파라미터에 매핑됨
@RequestParam
을 사용했을 때 주소
http://localhost:8080/?aaa=bbb&ccc=ddd
@PathVariable
을 사용했을 때 주소
http://localhost:8080/bbb/ddd
해당 클래스의 예외 발생시 처리
클래스 위에 @ControllerAdvice
어노테이션을 설정하고 어떤 예외를 잡을 것인지는 각각의 메서드 위에 @ExceptionHandler
를 붙여서 사용
@ControllerAdvice
+ @ResponseBody
합친 것
HTTP 상태 코드에 따른 Exception을 Handling 하기위한 예외 지정 어노테이션
500 에러 발생 시 500 에러 페이지를 띄우는 것이 아닌 @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="이유")
와 같이 메시지를 표시하기 위해 사용
유효성 검증이 필요한 객체 지정
문자열 유무 검증
@NotBlank
null이 아닌 값, 공백을 제외한 문자를 하나 이상 포함해야 함
@NotEmpty
null이 아닌 값, 빈 문자열이 아니어야 함(empty)
@NotNull
null이 아닌 값이어야 함
@Null
null값임
최대, 최소값에 대한 검증
@DecimalMax
지정된 최대 값보다 작거나 같아야 함, String값으로 value지정
@DecimalMin
지정된 최대 값보다 크거나 같아야 함, String값으로 value지정
@Min
지정된 최대 값보다 작거나 같아야 함, int값으로 value지정
@Max
지정된 최대 값보다 크거나 같아야 함, int값으로 value지정
양수, 음수에 대한 검증
@Positive
양수임
@PositiveOrZero
0 또는 양수
@Negative
음수임
@NegativeOrZero
0또는 음수
시간값에 대한 검증
@Future
현재(Now)보다 미래의 날짜, 시간이어야 함
@FutureOrPresent
현재(Now)이거나 미래의 날짜, 시간이어야 함
@Past
현재(Now)보다 과거의 날짜, 시간이어야 함
@PastOrPresent
현재(Now)이거나 과거의 날짜, 시간이어야 함
이메일 검증
@Email
올바른 형식의 이메일 주소인지 검증(@ 문자가 포함되어야 함)
자릿수 검증
@Digits
허용된 범위 내의 숫자여야 함, integer=최대 정수 자릿수, fraction = 최대 소수 자릿수
@Digits(integer = 5, fraction = 5)
boolean값 검증
@AssertTrue
값이 항상 True여야 함
@AssertFalse
값이 항상 False여야 함
크기(length)검증
@Size
크기가 지정된 경계 사이에 있어야 함
(@Min
, @Max
는 숫자만 검증 가능하지만 @Size
는 Collection, Map, 배열 등을 지원함)
정규식 검증
@Pattern
지정한 정규식과 Java의 Pattern패키지의 컨벤션을 따르는 문자열과 비교
(@Pattern(regexp = "비교할 대상의 문자열 패턴"))
DB 트랜잭션을 설정하고 싶은 메서드에 적용하면 메서드 내부에서 일어나는 모든 DB관련 로직 중 하나라도 실패하면 롤백해주는 어노테이션
@Transactional(readOnly=true, rollbackFor=Exception.class)
위의 어노테이션은 읽기 전용 속성을 가지고 Exception이 발생하면 롤백하는 어노테이션
이미 DB에 입력된 데이터를 롤백 시키는 것이 아닌 DB관련 로직이 모두 성공 했을 때 커밋하고 실패하면 해당 모든 로직을 실행시키기 이전으로 되돌리는 것
보통 @Service
가 선언된 클래스의 경우 DB 관련 로직을 수행하기 때문에 @Transactional
을 선언함
DB 설정 Class에 선언하여 트랜잭션을 허용시킴
DB 설정 Class에서 transactionManager() 생성 후 @Bean
으로 등록해야 트랜잭션을 쓰려는 다른 클래스에서 @Transactional
을 사용하여 트랜잭션 적용 가능
@PropertySource("classpath:/application.properties")
와 같은 프로퍼티 설정 파일의 경로를 지정하여 @Configuration
이 선언 된 클래스에 선언
*.properties
에 선언 된 설정 파일 내용들을 @ConfigurationProperties(prefix="~~~")
를 사용하여 자바 클래스에서 값을 바인딩 해주는 어노테이션
final 속성을 갖는 변수가 속한 클래스에 properties값 바인딩 해주는 어노테이션
메서드 앞에 선언하면 해당 메서드를 최초로 호출 시 캐시에 적재 후 동일한 메서드를 재 호출 시 캐시에서 결과를 가져와서 값을 리턴하게됨
항상 같은 결과를 리턴하는 메서드 앞에 선언해야 한다는 단점이 있음
정해진 시간에 실행해야할 경우에 사용
@Scheduled(cron = "0 0 07 * * ?")
(cron = "초 분 시 일 월 요일 연도)
?: 설정값 없을 때(생략 가능한 부분에서만 가능, 요일과 연도)
*: 모든 조건
Spring의 AOP형식에서 모듈화를 위해 @Aspect
를 선언하여 해당 클래스가 Aspect를 나타내는 클래스임을 명시
스프링 bean에만 AOP를 적용할 수 있기 때문에 @Component
이랑 같이 사용하여 클래스를 bean에 등록
@Aspect
로 선언한 클래스 내에서 @Around
는 Target 메서드 안에서 특정 Advice를 실행하겠다고 선언하는 어노테이션
@Around
안에서 execution으로 시작하는 구문은 PointCut을 지정하는 문법(제일 많이 사용하는 문법, 다른 문법으로는 within, bean)
@Around("execution(* com.my.board..controller.*Controller.*(..)) or execution(* com.my.board..service.*Impl.*(..)) or execution(* com.my.board..mapper.*Mapper.*(..))")
Target 메서드의 Aspect 실행 시점을 지정하는 어노테이션 종류
@Before
@After
@AfterReturning
@AfterThrowing
@Around
파라미터가 없는 생성자를 자동으로 생성해 주는 어노테이션
필드가 final로 생성되어 있으면 생성자를 만들 수 없음
@NoArgsConstructor(force=true)
옵션을 사용해 0,false,null 등 강제 초기화하여 생성자 생성 가능
클래스에 있는 모든 필드들에 대해 생성자를 자동으로 생성해 주는 어노테이션
@NonNull
이 선언되어 있는 필드가 있으면 해당 필드는 생성자 내에서 null-check 로직을 자동으로 생성
final이나 @NonNull
로 생성되어 있는 모든 필드들에 대해 생성자를 자동으로 생성해 주는 어노테이션
@NonNull
로 마크되어 있는 필드들은 null-check가 추가로 생성되고 파라미터로 null값이 들어오면 NullPointerException이 발생됨
단순 필드 리턴해주는 어노테이션
클래스에 선언하면 해당 클래스 내 모든 필드에 대한 리턴 메서드를 자동 생성
필드에 값을 저장해주는 어노테이션
@Getter
와 @Setter
에는 Access Level을 지정할 수 있음
Access Level의 종류
레벨을 설정하지 않으면 기본값은 Public
@Getter(AccessLevel.PRIVATE)
와 같이 사용
null값을 허용하지 않는 필드 선언
null을 허용할 경우 선언
클래스의 모든 필드에 대해 toString 메서드를 자동 생성
@ToString(exclude="name")
과 같이 exclude(제외) 시키고 싶은 필드를 선언하면 결과에서 제외됨
equals와 hashCode 메서드를 자동으로 생성해 주는 어노테이션
@EqualsAndHashCode(callSuper=true)
로 설정 시 부모 클래스의 필드 값들도 동일한지 체크, false 설정 시 자신 클래스의 필드 값만 체크
빌드 패턴을 사용하여 객체를 생성할 수 있고 생성 후 Setter를 통한 접근을 제한할 수 있음(불변형 객체 생성 가능)
User user = User.builder() .id(1L) .username("name") .password("1234") .build();
컬렉션으로 선언한 필드에는 @Singular
어노테이션을 선언하면 리스트 안에 계속 값을 추가할 수 있음
@Singular private List<Integer> scores; User user = User.builder() .scores(100) .scores(90) .build();
자동으로 log필드 생성 및 로거 객체 생성, 할당해 주는 어노테이션
@Slf4j
, @Log4j2
와 같은 로그 관련 프레임워크가 있음
@Getter
, @Setter
, @RequiredArgsConstructor
, @ToString
, @EqualsAndHashCode
를 모두 자동 설정해 주는 어노테이션
@Data
대신에 불변 객체를 생성하기 위해 선언하는 어노테이션
IO 입출력 및 JDBC 코딩 시 try-catch-finally
문에서 finally
를 통해 close()
를 호출하는 대신 @Cleanup
을 사용하면 자동으로 닫히는 것을 지원해 줌
Checked Exception 처리를 위해 Throws
또는 try-catch
구문을 통해 예외처리를 해주는 대신 @SneakyThrows
를 사용하여 명시적으로 예외 처리를 생략할 수 있음
@SneakyThrows(IOException.class)
java의 synchronized 키워드를 사용하면 객체 레벨에서 락이 걸려 동기화 문제가 발생할 수 있음
@Synchronized
를 사용하면 안전하게 락을 걸 수 있음
(java thread관련 참고)