Spring

[SpringBoot] 어노테이션 정리 (1)

무모한 폴라베어 2021. 2. 24. 01:26

 

 

 

최근에 알고리즘 공부를 책으로 독학하고 있다. 오로지 책과 인터넷 검색에 의존해야하기 때문에 완벽히 알고리즘을 이해하려면 누군가가 가르쳐주거나 정해진 커리큘럼대로 따라하는 거보다 더 많은 노력을 해야한다. 지금 정렬파트를 보고있는데 코드보고 이해하고 돌아서서 구현하려면 까먹기를 반복해서 머리를 식히고자 쉬는시간에 스프링부트를 공부하고있다. 

 

프로젝트를 이미 두번정도 만들었지만, 둘다 Spring Legacy Project 로 만들었기에 지금 보는 스프링부트는 익숙한듯 새로운것 같다. 이전에 해보지 않은 TDD 도 간접적으로 경험하고 있는데 대량의 트래픽이 발생하는 프로젝트나 규모가 큰 프로젝트의 경험이 없어서 그런지 아직까지 테스트코드의 필요성이 와닿지는 않고있다. 하지만 공고에 심심찮게 발견하는 테스트코드에 대한 우대사항이 기억나서 앞으로 적극 활용할 예정이다.

 

 

서론이 좀 길었는데.... 테스트 코드를 따라하면서 처음보는 어노테이션이 굉장히 많다고 느꼈다. 거기에 추가로 스프링부트를 사용하면서 추가한 Lombok 덕분에 두배로 늘은 셈이다. 그래서 공부 초기에 뿌리뽑고자 정리하기로 했다. 어노테이션에 대한 정리를 할것이지만 깊게 다루기 보다는 사용법과 용도에 대해서만 간략하게 볼것이다.

 

 

개발환경 : macOS Big Sur 

사용 툴 : IntelliJ IDEA 2020.3.

사용언어 : Java 11

Gradle : 6.8.2

SpringBoot : 2.4.1

 

1.  @SpringBootApplication

스프링부트의 가장 기본적인 어노테이션이다. 크게 3가지 역할을 수행한다. 이 어노테이션을 사용한 클래스를 실행해서 애플리케이션이 동작한다.


@ComponentScan 

이 어노테이션을 사용한 패키지부터 시작해서 @Service, @Repository, @Controller 등의 어노테이션을 사용한 클래스를 찾아서 Bean 으로 등록해준다.

 

@EnableAutoconfiguration

말그대로 스프링의 자동설정을 하게 해주는데 사전에 정의한 라이브러리들이 일정 조건을 만족할시 Bean 으로 등록해준다. 

 

@SpringBootConfiguration 

스프링부트의 홈페이지에 들어가면 스프링이 개발을 더 쉽게 해준다고 쓰여있는데 이 어노테이션이 그것을 도와주지 않나 싶다.

기존 스프링의 @Configuration 을 대체한다.

 

 

2. @RestController

기존에 자주 쓰던 @Controller 는 주로 MVC 패턴에서 클라이언트의 요청에 맞는 view 를 보여주기위해 사용했었다. 하지만 항상 view 페이지의 이름이 아닌 JSON을 리턴해줘야할때도 있는데 그럴때를 위해서 사용한다. 기존의 각 메소드마다 선언했던 @ResponseBody 가 추가된것이라고 한다.

 

 

3. @GetMapping

@RequestMapping(method = RequestMethod.GET) 의 축약형이다. 매핑한 값을 요청했을때 그 요청을 처리하기위한 메소드에 사용한다.

 

 

4. @ExtendWith

테스트 클래스 가장위에 사용했었는데 사실 원래는 @RunWith(SpringRunner.class) 를 사용했었다. 하지만 이내 이 코드를 봤던 책에서 썼던 버전들이 지금과달라서 더이상 똑같이 작성하면 작동하지 않았다. 그래서 @ExtendWith(SpringExtension.class) 로 바꿔주게 되었다. 테스트 코드를 작성할때 무조건 이 어노테이션을 써야하는줄 알았는데 찾다보니 다음에서 다룰 @SpringBootTest 어노테이션이 이미 가지고 있어서 사용하지 않아도 된다는 것을 알았다. 

 

자세한 내용은 백기선님 블로그에서 해당 자료를 찾을 수 있었다.

 

스프링 부트, @RunWith가 더이상 보이지 않는 이유

왜 최근 버전의 스프링 부트를 사용한 프로젝트의 테스트 코드에서 @RunWith를 더이상 볼 수 없는지 살펴보겠습니다.

www.whiteship.me

 

 

5. @SpringBootTest

통합 테스트를 제공하는 스프링 부트 어노테이션이다. @SpringBootApplication을 사용한 클래스를 찾아서 테스트를 위한 빈을 등록해주고  properties, classes, webEnvironment 를 추가적으로 설정해줄수 있다. 만약 

@Transactional 을 사용하면 바뀐 데이터가 롤백되지만, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT 으로 설정해주면 트랜잭션이 롤백되지 않는다고 한다.

 

 

6. @Getter

Lombok 에서 제공하는 어노테이션이다. 처음 말로만 존재를 들었을때는 자동으로 Getter 를 만들어준다길래 신기하다고 생각했다. 

지금봐도 신기하고 편한 기능이라고 생각한다. 이렇게 기존 스프링하고 차이가 벌어진다면 곧 Deprecate 될수도 있지 않을까? 하는 생각이 든다. 사용한 클래스내의 모든 필드의 getter를 생성해준다. @Setter 도 마찬가지.

 

 

 

7. @RequiredArgsConstructor

사용한 클래스의 모든 final 필드가 포함된 생성자를 생성해준다. 생성자 만드는 일이 이렇게 어노테이션을 따로 만들어서 더 빠르게 할만큼의 일인가? 라는 생각이 좀 들긴하지만 필드가 많고 가독성이 좋아지기 때문에 사용하겠지 라는 생각이 든다.

 

 

8. @NoArgsConstructor

파라미터가 없는 기본 생성자를 자동으로 추가해준다.

 

 

9. @RequestParam

외부로 넘긴 파라미터를 가져오는 어노테이션이다. 어노테이션 사용시 파라미터의 이름을 넘기면 그 이름을 가진 파라미터의 앖을 가져온다. 

 

 

10. @Builder

해당 클래스의 빌터 패턴 글래스를 생성해준다. 그렇다면 빌더란? 

빌더 패턴은 디자인 패턴중에 하나이다. 기존에 프로젝트때 Dto는 필드를 쭉 선언하고 생성자와 Getter, Setter를 선언하는 식으로 만들었었다. 이런 형식은 만들기는 쉬웠으나 직관성이 떨어질 수도 있다. Builder 패턴은 이러한 점을 보완하는 방식이다.

 

 

11. @After

JUnit 에서 단위테스트가 끝날때마다 수행되는 메소드를 지정하는 어노테이션이다. 여러 테스트가 동시에 수행되면 시스템 내의 DB인 H2에 데이터가 그대로 남아있어서 테스트가 실패할 수 있는데 이를 방지하고자 테스트가 끝날때마다 데이터를 지우는 코드를 작성할때 사용했다.

 

 

12. @Autowired

어찌보면 가장 많이 사용하게될 어노테이션이 아닐까 하는 생각이 든다. 스프링이 관리하는 빈을 상황에 맞게 자동으로 주입해주는 역할이다. 이 어노테이션을 사용해서 빈의 의존성을 주입하는게 익숙했는데 이것보다 생성자를 통해서 주입하는 방식이 더 낫다길래 방식을 조금씩 바꿔보려고 한다.

 

 

 

작성하면서 다른 블로그들을 많이 찾아봤지만 다들 정말 자세하게 잘 설명해놓은 신것 같다 ㅠㅠ 지금은 어노테이션에 대한 초안정도라고 생각하고 스프링에 대한 역량이 더 커진다면 수정 및 보완을 해서 다시 올려보리라는 계획을 세웠다. 언제일지는 모르지만 금방 와야겠지?