본문 바로가기
Spring

SpringBoot 각종 Annotation

by 에드박 2020. 7. 22.

@SpringBootApplication ( @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan을 합친 것과 같다)

스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정해줍니다.

특히 @SpringBootApplication 이 있는 위치부터 설정을 읽어가기 때문에 이 클래스는 항상 프로젝트의 최상단에 위치해야만 합니다.

 

 

SpringApplication(프로젝트의 메인 클래스)의 main 메소드에서 실행하는
SpringApplication.run으로 인해 내장 WAS (Web Application server, 보통 톰캣)가 실행됩니다.

 

@SpringBootConfiguration : 스프링 부트의 설정을 나타내는 어노테이션입니다.

스프링의 @Configuration 을 대체하며 스프링 부트 전용으로 사용합니다. 예를 들어 스프링 부트의 테스트 어노테이션(@SpringBootTest)을 사용할 때 찾기 알고리즘을 사용하여 계속 @SpringBootConfiguration 어노테이션을 찾기 때문에 스프링 부트에서는 필수 어노테이션 중 하나입니다.

 

@EnableAutoConfiguration : 자동 설정의 핵심 어노테이션입니다.

클래스 경로에 지정된 내용을 기반으로 영리하게 설정 자동화를 수행합니다. 특별한 설정값을 지정하지 않으면 기본값으로 작동합니다.

 

@ComponentScan

특정 패키지 경로를 기반으로 @Configuration 에서 사용할 @Component 설정 클래스를 찾습니다. @ComponentScan의 basePackages 프로퍼티 값에 별도의 경로를 설정하지 않으면 @ComponentScan 이 위치한 패키지가 루트 경로(BackPackage)로 설정됩니다.

 

@AutoWired

스프링이 관리하는 빈(Bean)을 주입받습니다. 다음과 같은 형식으로 사용할 수 있습니다. (빈을 주입받는 방법은 여러가지가 있음)

@Autowired
private SomeController someController;

@Getter (라이브러리 Lombok 으로 사용하는 어노테이션입니다.)

선언된 모든 필드의 get 메서드를 생성해 줍니다.

 

@RequiredArgsConstructor

선언된 모든 final 필드가 포함된 생성자를 생성해 줍니다.

final이 없는 필드는 생성자에 포함되지 않습니다.

 

@NoArgsConstructor

기본 생성자 자동 추가

public Posts() {} 와 같은 효과

 

@RequestParam

외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다.

예를 들면 게시글을 클릭했을 때 해당 글에 대한 정보를 API 로 가져오는 역할입니다.

@RequestParam("name") String name
/* 
	외부에서 name(= @RequestParam("name)) 이란 이름으로 넘긴 파라미터를
	메소드 파라미터 name(= String name)에 저장하게 됩니다.
*/

@Entity

JPA의 어노테이션이며, 테이블과 링크될 클래스 임을 나타냅니다.

기본값으로 클래스의 카멜케이스(낙타표기법) 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭합니다.

ex) SalesManager.java -> sales_manager (table)

 

@Id

JPA의 어노테이션이며, 해당 테이블의 PK 필드를 나타냅니다.

 

@GeneratedValue

JPA의 어노테이션이며, PK의 생성 규칙을 나타냅니다.

스프링 부트 2.0 에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment가 됩니다.

 

@Column

테이블의 컬럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 됩니다.

그럼에도 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용합니다.

문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶거나, 타입을 TEXT로 변경하고 싶거나 등의 경우에 사용합니다.

 

@MappedSuperclass

JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate) 도 칼럼으로 인식하도록 합니다.

 

@EntityListeners(AuditingEntityListener.class)

BaseTimeEntity 클래스에 Auditing 기능을 포함시킵니다.

 

@CreatedDate

Entity가 생성되어 저장될 때 시간이 자동 저장됩니다.

 

@LastModifiedDate 

조회한 Entity 의 값을 변경할 때 시간이 자동 저장됩니다.

 

@Enumerated(EnumType.STRING)

JPA로 데이터베이스로 저장할 때 ENUM 값을 어떤 형태로 저장할지를 결정합니다.

기본적으로 int 로 된 숫자가 저장됩니다.

숫자로 저장되면 데이터베이스로 확인할 때 그 값이 무슨 코드를 의미하는지 알 수가 없습니다. 

그래서 문자열(EnumType.STRING)로 저장될 수 있도록 선언합니다.

 

@Target

어노테이션이 생성될 수 있는 위치를 지정합니다.

@Target(ElementType.PARAMETER) 처럼 사용할 수 있습니다. 사용할 수 있는 ElementType은 다음과 같습니다.

TYPE class, interface ,enumeration
FIELD field
METHOD method
CONSTRUCTOR constructor
LOCAL_VARIABLE local variable
ANNOTATION_TYPE annotation type
PARAMETER parameter
TYPE_USE 모든 type
TYPE_PARAMETER type variable

@Retention

어느 시점까지 어노테이션이 영향을 미칠지 결정합니다.

@Retention(RetentionPolicy.RUNTIME) 처럼 사용할 수 있습니다. 사용할 수 있는 RetentionPolicy는 다음과 같습니다.

SOURCE

Source code에서 참조하고, compile 이후에는 버려집니다.

@Override, @SuppressWarnings이 있습니다. Compiler난 Source 생성기 같은 곳에서 유용하게 사용할 수 있습니다.
CLASS Compile이후에도 class에서 존재하나, JVM이 인식하지는 않습니다. 특별히 유용한 곳은 없으나, byte parser정도에서 유용하게 사용할 수 있습니다.
RUNTIME

JVM에서 사용이 되면, 대부분이 여기에 해당이 되면, 앞에 언급한 2개의 Built-in을 제외하고는 모든 built-in annotation은 여기에 속합니다. 그리고, 앞으로 만들 모든 custom annotation도 여기에 속합니다.
중요한 사실은 Java reflection에서 getAnnotations를 이용하여, 실행시에 사용이 가능하다는 것입니다.

 


여기서부터는 테스트 관련 어노테이션입니다.

@RunWith(SpringRunner.class)

테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킵니다.

위의 표현은 SpringRunner라는 스프링 실행자를 사용합니다.

즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 합니다.

 

@WebMvcTest

여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션입니다.

선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있습니다.

단, @Service, @Component, @Repository 등은 사용할 수 없습니다.

 

@Test

단위 테스트임을 선언하는 메서드

@Test 어노테이션을 선언한 메서드는 JUnit 이 알아서 실행해준다.

 

@After

JUnit에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정

보통은 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기 위해 사용합니다.

여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그래도 남아 있어 다음 테스트 실행 시 테스트가 실패할 수 있습니다.

 

참고 문서 - 이동욱 개발자님의 [스프링 부트와 AWS로 혼자 구현하는 웹 서비스]
스프링을 시작하시는 분들에게 꼭꼭 추천해드리고 싶습니다.
https://jojoldu.tistory.com/463

 

 

[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 출간 후기

(출판사: 프리렉, 쪽수: 416, 정가: 22,000원) 서적 링크 오프라인 서점에는 2019.12.04 (수) 부터 올라갈 예정입니다. 강남 교보문고나 광화문 교보문고는 주말에도 올라올 순 있겠지만, 혹시 모르니 ��

jojoldu.tistory.com

 

추가해야 할 내용이나 오타나 틀린 내용 언제든지 말씀해주시길 바랍니다!

댓글