ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SpringBoot] 테스트 코드 작성에 대하여 / 멀티 모듈의 장점 / API 설계 및 배포 / 코드 작성 관련(다형성, lombok, import문)
    Back-end/TIL 2022. 3. 24. 09:16

    스타트업 백엔드 인턴으로 근무하며 배운 내용을 까먹지 않기 위해 정리하는 글입니다.

     

    📌 테스트 코드 작성에 대하여

    테스트 코드 작성에 대해서 나는 절대적인 기준이 있다고 생각했다. 

    하지만 회사에서 테스트 코드를 작성하고 팀장님께 피드백을 받으며 테스트 코드 작성에는 절대적인 규칙은 없고, 상황에 따라 적절한 방식을 선택하면 되는 것임을 깨달았다.

     

    ▶️ 테스트를 위한 데이터(객체, 변수) 준비를 위한 방법: @BeforeAll vs. @BeforeEach vs. 테스트 메서드 내 //given

    • 테스트를 수행하는데 오래 걸리지 않는 상황리아면 3가지 방식 중 어떤 것을 사용할지는 각 회사의 표준이나 개인의 취향에 따라 많이 갈리는 편이다.
    • 성능 이슈가 발생하는 상황이나 이로인해 테스트가 깨지는 상황이 아니라면 정답은 없다.
    • 즉, 절대적인 원칙은 없고, 상황에 따라 혹은 개인의 선호도에 따라 선택하면 된다.

     

    ▶️ 테스트 코드 작성에 대한 무조건 따라야 하는 규칙은 없다.

    • 생성한 서비스, 테스트 코드 작성 상황에 따라 유연하게 작성해주면 된다.
    • 예를 들어, 데이터베이스에 값이 있다는 것을 안다는 가정하에 작성해도 되는지에 대해 현재 상황에서 그렇게 해야한다면 그것도 맞다.

     

    ▶️ 서버에서 작성한 로직에 대한 검증은 서버에서 모두 하는 것으로 한다!

    • [상황] 회사에서 테스트 코드를 작성하며 500 Server Error도 테스트 코드에 넣는게 맞는지(특히 Pagination에 대한 값일 때) 의문이 들었다.
      • [해결] Pagination이더라도 요청에 어떤 값이 올지는 모르기 때문에 테스트 코드를 작성해주는게 맞다. 
      • [해결] 500 Server Error는 예외처리가 안된 것이므로 코드 작성 시 잘못된 것이 맞고, 예외처리는 반드시 해줘야 한다.

     

    ▶️ TDD의 필요성

    • 우선 테스트 코드를 먼저 작성한 뒤 하나씩 단계적으로 오류나는 부분에 대한 코드를 작성하면 된다.
    • 필요하지 않은 비즈니스 로직 작성을 줄여준다.

     

    참고) 

    https://meetup.toast.com/posts/124 (Spring Boot Test : NHN Meetup)

     

     

    📌 멀티 모듈의 장점

    현재 회사 코드는 멀티 모듈로 구성되어 있고, 각 모듈마다 필요한 설정이나 라이브러리들을 각각 구성해두었다.

     

    ▶️ 코드를 작성하며 느낀 멀티 모듈의 장점

    • 각각의 어플리케이션들에 필요한 공통된 자원들은 공통 파일에 한번만 작성하여 공유해서 사용 가능하다.
    • 의존성을 명확히 분리해 Layered Architecture 구성이 용이하다.
      • ex. Controller 관련 모듈은 Service 모듈과 의존성을 가지고, Repository & Domain 모듈과는 가지지 않는다. 그러므로 코드 짤 때 Service 모듈에 정의된 함수만 사용이 가능해진다.
    • 각 모듈들에 필요한 라이브러리만 따로 추가할 수 있다.
      • ex. Domain 모듈에서만 사용하는 Querydsl은 Domain 모듈 .yml에만 추가되어 있다.

     

    참고)

    Gradle과 함께하는 Backend Layered Architecture

    Spring 멀티 모듈 with Gradle

     

    📌 API 설계 및 배포

    ▶️ 필요 기능에 대한 각각의 API를 구성하는 것을 고려하자

    • 로그인을 할 때도 전화번호 인증, 이메일 인증이 필요한데, 프론트 화면에서는 하나의 화면에서 처리가 된다. 하지만 이를 API를 사용해 테스트하고자 한다면 각각의 기능에 대한 API를 만들어주는 것이 편할 것이다. 또한 프론트에게도 편하다.

     

    ▶️ 실무에서의 배포

    • 개발페이지, 운영페이지(실제 사용화된 서비스, 사용자가 사용하는 서비스) 둘로 나누어서 진행한다.
    • 동일한 도메인에 dev만 붙여 개발페이지를 운영한다.

     

    📌 코드 작성 관련

    ▶️ 인터페이스, 다형성의 중요성

    상황

    • 부모 클래스: MailService, 자식 클래스: HtmlMailService(개발, 운영에 사용), ConsoleMailService(로컬에 사용)
    public class BatchMailService {
    
        private final HtmlMailService htmlMailService;	//자식 클래스 타입으로 선언됨
    		...
    }
    
    // 개선
    private final MailService mailService;	//부모 클래스 타입으로 선언해줌

     

    → BatchMailService 클래스에서 멤버 변수에 자식 클래스 타입인 HtmlMailService로 선언되어 있어 테스트 코드 실행 시 오류가 발생했다. 테스트 환경에서는 ConsoleMailService를 사용하기 때문이다.

     

    개선

    • 위처럼 자식 클래스인 HtmlMailService 타입이 아니라 부모 클래스인 MailSerivce 타입으로 변경해줘야 한다.

     

    ▶️ Lombok

    • Lombok의 어노테이션은 필요한 내용만 가져다 쓰도록 하자.
    • 불필요한 기능에 대한 오남용이 발생할 수 있다.

     

    ▶️ import문 제거

    • 사용하지 않는 import문은 모두 제거해줘야 한다.
    • 서비스 운영시에는 해당 라이브러리가 없어 오류가 발생할 수 있기 때문이다.

    댓글

Designed by Tistory.