CS Activity/Projects

[아카이브 개인 프로젝트] Spring Boot + Maven + Cucumber 테스트 자동화 적용기

Jenn28 2024. 1. 31. 14:22

0. 참고 자료

[Cucumber 가이드라인]

 

나중에 협업할 때 유용하게 사용할 것 같아 첨부한다.

 

🥒 Cucumber 이해하고 잘 쓰는 방법 (tistory.com)

 

🥒 Cucumber 이해하고 잘 쓰는 방법

🥒 Cucumber Cucumber (큐컴버) 는 Behaviour-Driven Development (BDD) 지원용 툴이다. BDD는 소프트웨어 개발에서 비지니스와 테크니컬한 부분 사이의 문제를 줄이기 위해 시작되었다. 협옵을 통해 문제는 해

hsoochun.tistory.com

 

[연결할 때 참고하기]

 

맛집 지도 만들기(1) - Spring Boot + Vue.js 설치 및 연동하기 (tistory.com)

 

맛집 지도 만들기(1) - Spring Boot + Vue.js 설치 및 연동하기

📢 들어가며 이번 포스팅에선 맛집 지도를 개발해볼 것이다! 🤤 작성한 코드는 github에 업로드 해 두었다. 스펙은 다음과 같다. IDE Intellij IDEA Ultimate FrontEnd Framework Vue.js BackEnd Framework Spring Boot DB

doozi0316.tistory.com

 

1. 개발 환경

[OS]

Windows 10

 

[IDE]

IntelliJ IDEA

 

[Versions]

Java 8

Spring Boot 2.7.17

Vue.js 2.5.2

Maven 4.0.0

Cucumber 4.3.0

MySQL (JPA)

 

 

2. Spring Boot + Maven + Cucumber 사용 이유

1. 인턴 회사 사수분께서 Cucumber를 사용한 테스트 자동화 개발을 과제로 부여

2. 내가 속한 팀이 Spring Boot + Maven 빌드 툴 사용

 

따라서, 팀에 조금이라도 기여할 수 있을만한 서비스 + 테스트 자동화를 구현해보고 싶었기에 이와 같이 결정했다.

 

+) 팀에 사용하는 버전을 최대한 맞추고 싶어 Java 8 을 사용했다.

Spring Boot 3.0 부터는 Java 17 이상이 요구되기 때문에 Spring Boot 버전도 2.7.x 로 맞췄다.

 

3. Cucumber 이란?

행동 주도 개발 (BDD) 을 지원하는 툴이다. BDD는 소프트웨어 개발에서 비즈니스와 테크니컬한 부분 사이의 문제를 줄이기 위해 시작되었다.

보통은 Gherkin (절킨) 이라는 문법을 사용하고, Step Definition 시스템으로 '사람이 읽을 수 있는' 방식으로 적는다.

참고로 Step Definition은 Given/When/Then, 혹은 이전 스텝을 따라가는 And로 시작되어야 하며 한글로도 작성이 가능하다.

 

feature

나는 영어가 좀 더 직관적이라고 생각해서 영어 시나리오로 작성했다.

 

step

Step의 경우 시나리오 별로 파일을 구분하고 싶었는데,

그렇게 해버리면 "Could not Autowire. No Bean of" 에러가 뜬다.

 

시간이 없어서 해결 못하고 그냥 한 파일에 때려박아 끝냈는데..

 

이거에 대해서는 다시 테스트해보면서 해결해봐야겠다.

https://thalals.tistory.com/450

 

[Spring Junit] @SpringBootTest + @Autowired 에러 "Could not autowire. No beans of "

때는 바야흐로.. ATDD 과정 수강 중 각각의 E2E 인수테스트의 데이터베이스를 서로 영향받지않게 격리 시켜주기 위해 test 패키지에 만든 별도의 클래스를 빈으로 올려 @Autowired 로 주입받고자 했습

thalals.tistory.com

 

4. 데이터베이스 구조

테스트 코드 구현이 우선이기 때문에 DB는 간단하게 Employee 테이블과 Survey 테이블만 구현했다.

 

5. 주요 프로젝트 구조


최상위 폴더
    frontend
        build
        config
        dist
        src
          ㄴcomponent
          ㄴrouter
          ㄴstore
    ㄴsrc
       ㄴmain
          ㄴjava
             ㄴcom.example.project
                ㄴcontroller
                ㄴmodel
                ㄴrepository
                ㄴservice
          ㄴresources
       ㄴtest
          ㄴjava
             ㄴcom.example.project
                ㄴsteps
                ㄴutils
          ㄴresources
                ㄴfeatures

 

일단 vue frontend 폴더는 최상위 폴더 안에 두고 개발을 진행했다.

backend 폴더를 따로 만들어서 아예 분리를 할까 했지만,

백-프 왔다갔다 폴더 여닫기가 번거로워서 그냥 백은 그대로 뒀다.

 

추가로 controller, model, repository, service를 분리해서

나 스스로도 빠르게 파일을 찾을 수 있도록 했고,

 

Service에 Interface 사용은 하지 않았다.

 

https://velog.io/@hsw0194/Spring-Boot%EC%97%90%EC%84%9C-interface%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

 

Spring Boot에서 interface를 사용해야 할까? (Do I need an interface with Spring boot?)

Service vs ServiceImpl 중에서 어느 것을 사용해야 할까요?

velog.io

 

개인적인 견해이므로 나도 따라야할까 고민을 해봤지만..

직접 개발해보니 인터페이스를 굳이..? 라는 생각이 많이 들었다.

특히, 작은 단위의 프로젝트였기 때문에 더더욱 그 필요성을 느끼지 못했다.

 


6. 배운 점

일단 처음으로 풀스택 개발을 해봤다는 점,

프-백의 연동 방법을 깨달았다는 점에서 이미 크게 배웠다.

 

추가로, 이전 어흥올림픽에서 느꼈던 프론트 지식의 부재가 어느정도 해소가 되었다.

 

이걸 계기로 공모전에 풀스택으로 참가해서 flutter를 도전해 볼 기회도 생기고,

협업에 있어서 좀 더 넓은 시야를 갖게 되었다.

 

그리고, 기술적으로는 다음과 같은 지식을 얻었다.

- axios 통신

- vuex store (이거 특히 각 페이지에서 입력된 결과를 마지막 페이지에서 한번에 보낼 때 굉장히 유용했다!!)

- spring bean & 의존성 주입 (잘 모르고 하나의 컨테이너에 2개 이상의 bean을 등록했다가 matching bean을 찾지 못하는 오류 발생.. 이거에 대해서는 나중에 자세히 다뤄보겠다.)

- cucumber 테스트 적용법 등..

 

간단한 프로젝트임에도 처음인 부분이 많아서 많이 배웠고,

각각에 대해서는 하나하나 자세하게 다뤄 볼 예정이다.

 

이제는 인턴을 끝내고 프로젝트에 집중하게 될 시기가 왔는데,

Spring Boot를 또 사용하게 될 예정이니 같이 병행하면서 정리해봐도 좋을 것 같다!