ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11/24 TIL | 매일 쓰는 어노테이션 @SpringBootTest, @ActiveProfiles, @Autowired
    📝 기록/매일의 기록 2022. 11. 24. 11:25

    그동안 Spring Boot로 개발하면서 매일 썼던 @SpringBootTest, @ActiveProfiles, @Autowired 어노테이션. 막상 정확하게 어떠한 기능들을 하는지에 대해서 떠올리니 명쾌하게 정리되지 않았다. 오늘 한번 쌈박하게 정리하고 가자!


    @SpringBootTest

    @SpringBootTest 어노테이션

    통합 테스트를 위해서 붙이는 어노테이션이다(단위 테스트는 @WebMvcTest 등을 사용). 통합 테스트란, 실제 운영 환경에서 사용될 클래스들을 통합하여 테스트하는 것을 말한다. 단위 테스트와 같이 기능 검증을 위한 것이 아니라 스프링 프레임워크의 전체적인 플로우가 제대로 동작하는지 검증하기 위해 사용한다.

    장점이자 단점은 애플리케이션의 설정, 모든 Bean을 모두 로드하기 때문에 운영환경과 가장 유사한 테스트가 가능하다는 것. 다만 그렇기 때문에 시간이 오래 걸리고 굉장히 무겁다.

    BackdoorControllerTest의 @SpringBootTest 어노테이션

    @SpringBootTest 어노테이션은 스프링 애플리케이션 테스트에 기본으로 붙는 어노테이션인데, 이번 주 강의에서 Backdoor API를 만들면서 또 @SpringBootTest를 붙여줬다.

    Backdoor는 일반적인 인증을 통과, 원격 접속을 보장하고 plaintext에의 접근을 취득하는 등의 행동을 들키지 않고 행하는 방법을 일컫는다. 이번 강의에서의 Backdoor API는 DB를 딱 내가 원하는 상태로 초기화(setUp)하고, 잔액을 수정(changeAmount)하는 용도로 만들었는데, 결국 이 또한 실제 DB를 사용하기 때문에 기존에 모킹을 하는 방식 @WebMvcTest가 아닌 @SpringBootTest를 붙여줘야 했던 것! 근데 상황마다 어떤 어노테이션을 붙여줘야 하는지에 대해서는 아직도 잘 모르겠다..... 열심히 정리하고 최대한 많은 코드를 작성하면서 경험치로 해결해보자!

    @ActiveProfiles("test")

    @ActiveProfiles 어노테이션

    그리고 위에 사진에도 계속 있었던 @ActiveProfiles("test")! 이 어노테이션은 실행 환경을 설정하는 어노테이션이다. 개발을 하다 보면 실행 환경을 분리해줘야 하는 상황이 생긴다. 예를 들면 테스트는 메모리에서 돌아가고, 실제 기능은 데이터베이스에서 돌아가게 하는 등.. 그럴 때 이 Profile이 어떤 Profile인지를 적어줌으로써 분리할 수 있다.

    그래서 application.properties 파일에 위와 같이 작성하여 test라는 Profile을 설정해주고, 그 Profile은 메모리에서 돌아가게 한 뒤, 해당 값을 사용하는 클래스에서 @ActiveProfiles("test")을 달아주면 된다!

    @Autowired

    @Autowired 어노테이션을 얘기하기 전에 먼저 DI(Dependency Injection, 의존성 주입)에 대해서 알고 있어야 하는데, DI란, 클래스간의 의존 관계를 스프링 컨테이너가 자동으로 연결해주는 것을 말한다. 이때, Dependency란, 객체가 다른 객체와 상호 작용하는 것을 말한다. 즉, 클래스 A가 클래스 B, C와 상호 작용한다면 객체 A는 객체 B, C와 의존 관계라고 할 수 있다.

    @Autowired는 스프링 DI를 위해 사용되는 어노테이션으로, 스프링에서 빈 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입된다. 즉, 해당 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해주는 개념이다!


    마치 이름을 불러주지 않을 때 하나의 몸짓에 지나지 않는 것(feat. 김춘수 - 꽃)처럼... 기능 또한 이 기능이 정확하게 무엇을 수행하며, 어떠한 효과를 기대할 수 있고, 이러한 목적으로 사용한다를 명확하게 하지 않는다면 그것은 우연히 사용하는 것에 불과하다! 앞으로는 어떤 기능을 사용하든 간에 이것이 왜 사용되어야 하는지? 나는 왜 이것을 사용해야 하는지에 대해서 명확하게 할 수 있도록 하자.