본문 바로가기

Development/Spring

spring framework에서 사용하는 주요 annotation 정리

annotation외부 소프트웨어처리 내용전달하는 방법이다.

 

기본적인 annotation으로는 다음과 같은 것들이 있다(대부분 Lombok 필요).

 

 

@SpringBootApplication

 

spring boot 프로젝트를 사용할 때 spring boot 애플리케이션의 실행 클래스임을 지정하는 annotation이다. 실행 클래스이므로 main method가 필요하다.

 

 

@Data

 

class에 부여해, 모든 field에 대해 Getter와 Setter 메소드를 자동 생성해 준다.

 

Getter와 Setter 외에도 여러 가지를 자동으로 생성하기 때문에, 도메인 등 핵심이 되는 객체에는 사용하기 적합하지 않다.

 

 

@Getter

 

class에 부여해, 모든 field에 대해 Getter 메소드를 자동 생성해 준다.

 

 

@Setter

 

class에 부여해, 모든 field에 대해 Setter 메소드를 자동 생성해 준다.

 

 

@NoArgsConstructor

 

class에 부여해, 기본 생성자를 자동 생성해 준다.

 

 

@AllArgsConstructor

 

class에 부여해, 모든 field를 매개변수로 가지는 생성자를 자동 생성해 준다.

 

 

@RequiredArgsConstructor

 

class에 부여해, 초기화되지 않은 모든 final field를 매개변수로 가지는 생성자를 자동 생성해 준다.

 

이를 통해 초기화가 필수적인 final field만 초기화할 수 있다.

 

 

@NonNull

 

Null을 허용하지 않는다. 따라서 final field가 아니더라도 위의 @RequiredArgsConstructor를 통해 생성자가 자동 생성된다.

 

 

@Nullable

 

Null을 허용한다.

 

 

@Table

 

class에 부여해, class명과 다른 이름의 데이터베이스 table과 mapping해 준다.

 

 

@Id

 

field에 Primary Key를 부여한다.

 

 

@GeneratedValue

 

index 또는 규칙에 의한 생성값의 자동 생성 방식을 설정한다.

 

 

@Column

 

해당 column field에 별도 설정을 추가한다.

 

 

@Transient

 

DB column에서 제외한다.

 

 

@Test

 

JUnit의 단위 테스트를 실행할 method를 지정한다.

 

 

@Query

 

query language를 사용할 수 있는 query 메소드를 선언한다.

 

 

 

의존성 주입

 

 

 

의존성 주입은 spring framework의 핵심 기능이다. DI Container는 객체 생성을 대신 해 준다. 이는 의존 객체를 변경할 때 class 직접 의존에 비해 훨씬, interface 의존에 비해 좀 더 편리하게 해 준다. interface 의존은 구현 객체를 변경할 때 구현 객체명만 변경해 사용할 수 있어 class 의존에 비해 간편하지만, DI Container를 이용하면 이마저도 생략할 수 있게 해 준다.

 

의존성을 주입하기 위해서는 먼저 interface를 통해 의존성을 형성하고, 구현 객체과 주입받을 대상(사용 객체)에 각각 annotation을 명시해야 한다. spring framework는 시작 시 프로젝트의 모든 패키지를 component scan하여 DI Container에 등록하고, 대신 객체를 생성한다. 따라서 해당 annotation을 사용하기 위해서는 직접 객체를 생성해서는 안 된다.

 

이를 이용하면 구현 객체가 변경될 경우 직접 객체명을 변경할 필요 없이 구현 객체의 annotation 위치만 변경하면 된다.

 

 

구현 객체

 

 

@Controller

 

Controller 클래스의 객체를 생성한다.

 

 

@Service

 

Service 클래스의 객체를 생성한다.

 

 

@Repository

 

Repository 클래스의 객체를 생성한다.

 

 

@Component

 

위 컴포넌트들의 하위 로직을 처리하는 컴포넌트와 다른 컴포넌트(각 계층의 구성요소)에 부여한다.

 

 

@Bean

 

외부 라이브러리 등 개발자가 직접 제어할 수 없는 컴포넌트의 객체를 생성한다.

 

 

주입받을 대상

 

 

field, constructor, method에 @Autowired를 명시하면 위의 annotation이 있는 객체들 중 parameter의 타입에 해당하는 interface 구현 객체의 의존성을 주입한다. 개인적으로 @Autowired가 'new @Component 객체'를 대신한다고 생각하면 기억하기 쉬웠다. 실제로는 자동 생성된 객체를 사용하는 것이다.

 

이후 직접 구현 객체를 생성했을 때처럼 주입된 구성요소를 이용하여 해당 인터페이스의 method를 호출하면 된다. 그러면 DI Container에서 객체가 생성된(위의 annotation이 붙은) 구현 객체를 사용할 수 있다.

 

 

 

객체 지향 프로그래밍(AOP)

 

 

 

객체 지향 프로그래밍에서는 중심적 관심사와 횡단적 관심사를 분리해 횡단적 관심사는 외부 소프트웨어에 위임하고, 개발자가 중심적 관심사에 집중할 수 있도록 한다. spring framework에서는 이를 위해 AOP(Aspect Oriented Programming, 객체 지향 프로그래밍) 기능을 제공한다.

 

 

@Aspect

 

횡단적 관심사를 구현한 Advice method를 기술하는 class를 명시한다.

 

 

@Before

 

중심적 관심사의 실행 이전에 실행되는 Before Advice 메소드를 명시한다.

 

 

@After

 

중심적 관심사의 실행 이후에 실행되는 After Advice 메소드를 명시한다.

 

 

@Around

 

중심적 관심사의 호출 전후에 실행되는 Around Advice 메소드를 명시한다.

 

 

@AfterReturning

 

중심적 관심사의 종료 이후에 실행되는 AfterReturning Advice 메소드를 명시한다.

 

 

@AfterThrowing

 

중심적 관심사의 예외 투입 이후에 실행되는 AfterThrowing Advice 메소드를 명시한다.

 

 

@Transactional

 

class 또는 method에 부여하여 transaction을 관리하고 제어한다(시작, 커밋, 롤백).

 

 

 

유효성 검사

 

 

 

유효성 검사는 입력 내용이 요건에 만족하는지 타당성을 체크하는 검사다.

 

 

@NotNull

 

Null 여부를 검증한다.

 

 

@NotEmpty

 

문자열이 Null 혹은 빈 문자열이 아님을 검증한다.

 

 

@NotBlank

 

문자열이 null 혹은 빈 문자열, 공백(띄어쓰기)이 아님을 검증한다.

 

 

@Max

 

지정한 숫자 이하 여부를 검증한다.

 

 

@Min

 

지정한 숫자 이상 여부를 검증한다.

 

 

@Size

 

문자열 혹은 컬렉션의 지정한 크기 위반 여부를 검증한다.

 

 

@AssertTrue

 

값이 참인 것을 검증한다.

 

 

@AssertFalse

 

값이 거짓인 것을 검증한다.

 

 

@Pattern

 

지정한 정규 표현식과의 일치 여부를 검증한다.

 

 

@Range

 

지정한 숫자 범위 위반 여부를 검증한다.

 

 

@DecimalMax

 

지정한 숫자 이하 여부를 검증한다.

 

 

@DeciamalMin

 

지정한 숫자 이상 여부를 검증한다.

 

 

@Digits

 

정수와 소수점의 자릿수를 검증한다.

 

 

@Future

 

미래 날짜 여부를 검증한다.

 

 

@Past

 

과거 날짜 여부를 검증한다.

 

 

@Valid

 

중첩된 Form을 검증한다.

 

 

@Length

 

문자열 길이의 범위 위반 여부를 검증한다.

 

 

@Email

 

문자열의 이메일 주소 형식 여부를 검증한다.

 

 

@CreditCardNumber

 

문자열의 신용카드 번호 형식 여부를 검증한다.

 

 

@URL

 

문자열의 URL 형식 여부를 검증한다.

 

 

 

meta annotation

 

 

 

meta annotation은 custom annotation에 정의를 추가할 수 있는 annotation이다.

 

 

@Target

 

custom annotation의 대상을 선언한다. 대부분의 요소에 부여할 수 있다.

 

 

@Retention

 

custom annotation의 정보 보관 및 유지 유효 범위를 설정한다. 유효 범위 이후에는 annotation 정보가 삭제된다.

 

 

@Inherited

 

해당 클래스의 자식 클래스에도 custom annotation을 부여해 준다.