평소 원티드에서 진행하는 커리어 과정을 눈여겨보는 편인데, 7월 말쯤 '백엔드 인턴십'을 진행 예정임을 알게 되었다. 서울시 여성가족재단과 원티드가 함께하는 기업 실무 교육과정의 일환으로, 현재 나의 상황과 걸맞다는 생각이 들었다.
현업 개발자분과 함께 교육하며 궁금한 점이나 커리어쪽으로 도움을 받을 수 있을 것 같았고, 교육 과정 또한 내가 실제로 다뤄보지 못했던 부분들이 있어 빠르게 배울 수 있다는 생각이 들어 지원 방법을 살펴보았다.
사전 미션을 수행하고 1. 제출시기, 2. 사전 미션 실현도에 따라 5점 만점으로 채점하여 선발하는 방식이었다. 언어와 개발환경은 JavaScript&Node.js, Python&Django, Java&Spring 중 택일이었는데, 사전 설명회를 들어 보니 다양하게 모집 후 언어별로 팀을 모아 주시는 듯했다. 그리고 반드시 ORM을 사용하라는 조건도 있었다.
굉장히 긴장이 되었던 부분은, 오랜만에 작게나마 프로젝트를 만들고 제시하는 요구사항을 수행해야 하는 부분과, ORM을 사용해야 하는 부분이었다. MyBatis를 주로 사용했었지만, JPA도 공부해 본 적이 있기에 일단 도전!!
시작하려니 생각보다 긴장이 되었는데, 꼭 참여하고 싶어서 과제 수행을 시작했다. 그때가 일주일 좀 더 남은 시점이었다.
당시 가점을 주는 기한이 있었는데, 늦게 시작한 터라 가점 기한은 못 맞추겠다 싶었다. 대신 가점을 주는 기능 구현을 모두 수행해서 제출하고, 퀄리티를 높이는 데 중점을 뒀다.
미션 내용
구현 서비스는 기업의 채용을 위한 웹 서비스로, 회사는 채용 공고를 등록하고, 사용자는 지원할 수 있다.
기본적인 요구사항은 채용 공고 CRUD였고, 가점 사항으로는 채용 공고 검색, 채용공고 상세 조회 시 회사가 등록한 다른 채용공고 목록 포함시키기, 사용자의 채용 공고 지원하기 기능이었다.
채점 기준은 기능 구현 여부 40%, 코드 품질 30%, 테스트 및 검증 20% 등으로 이뤄져 있었는데, 기능 구현은 가장 첫 번째로 수행하되, 추가적인 점수를 얻기 위해 신경 쓰려고 했던 부분은 git commit 컨벤션과 테스트였다.
이전에 ATDD와 TDD 관련 강의를 수강하면서 git commit 컨벤션과 테스트 주도 개발에 대해 혼자 구현해 볼 기회가 있으면 좋겠다는 생각을 했는데, 이번이 그 기회였다.
위의 일정을 보면 알 수 있듯, 프로젝트를 생성하고 먼저 커밋 단위와 ATDD에 따른 개발 순서, API 네이밍을 먼저 문서화하고 시작했다. 개발에 집중하다 보면 나도 헷갈리는 부분이 생기기 마련인데, 문서를 참고하며 어떤 단위로 커밋을 진행하고, 커밋 종류는 무엇으로 할지, API 네이밍은 무엇으로 할지 정하고 찾아볼 수 있었다.
ATDD.. 잘 지켰나요?
'인수 테스트 작성 > (필요시) 단위 테스트 작성 > 기능 개발 > 리팩토링'의 순서를 지켜 개발하고자 했다. 이때, 인수테스트 작성과 단위 테스트 작성 혹은 기능 개발 사이에 간극이 발생하는데, 실패하는 인수테스트 작성 다음으로 무엇을 할 것인가? 였다. ServiceTest로 넘어가는 게 Out -> In 방식이고, 도메인 설계로 넘어간 뒤 TDD를 진행하는 게 In -> Out 방식인데, 인수 테스트와 엔티티 중심의 테스트에 집중하고자 In -> Out 방식으로 개발하였다.
package com.hiredhub.api.acceptance;
import io.restassured.RestAssured;
import io.restassured.response.ExtractableResponse;
import io.restassured.response.Response;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpStatus;
import org.springframework.test.context.ActiveProfiles;
@DisplayName("채용 공고 테스트")
@ActiveProfiles("test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class JobPostingAcceptanceTest {
/**
* when 채용 공고를 등록하면
* then 채용 공고 목록에서 조회할 수 있다.
*/
@DisplayName("채용 공고 등록")
@Test
void createJob() {
ExtractableResponse<Response> response = RestAssured.given()
.body("")
.when()
.post("/jobPostings")
.then()
.statusCode(HttpStatus.CREATED.value())
.extract();
long id = response.jsonPath().getLong("id");
RestAssured.given()
.when()
.get("/jobPostings/" + id)
.then()
.statusCode(HttpStatus.OK.value());
}
}
위 인수 테스트는 가장 처음에 작성한 것인데, 시나리오에서 등록과 동시에 상세 조회를 인수 테스트 시나리오에 넣는 바람에 이 테스트가 통과하기까지 텀이 매우 길어졌다. 심지어 다음 기능 구현은 목록 조회였다. (이럴 줄 알았다면 목록 조회를 할걸..)
또, 계획했던 것보다 미리 구현해 버리고 그 뒤에 테스트를 작성하는 일도 있었다. 작은 프로젝트인데도 진짜 TDD는 진행하기가 참 어렵구나 하는 생각도 들고, 그래도 해보면서 흥미롭고 이전에 배웠던 내용들을 돌이켜보며 진행할 수 있었다.
그 외에 중점을 둔 부분
서비스 로직에서 연산하지 않고, 해당 역할과 책임이 있는 객체에게 메서드 구현으로서 역할을 수행하게 하기, 엔티티 유효성 검사에 대한 Exception은 어디에서 발생시킬지, 패키지 구조는 어떻게 구성할지 등 나름의 고민들이 있었는데, 나름의 답을 찾으면서도 빠르게 수행했고 무사히 제출할 수 있었다.
결과
다행히 50명(많이 뽑아주셔서 총 60명) 안에 들어서 인턴십에 참여할 수 있었다. 오래간만에 들어 본 합격 소식이라 더 반가웠고, 완주를 향해 가며 사람들과의 경험, 프로젝트 경험, 기술 경험 등을 통해 성장하고 싶다.
'Education' 카테고리의 다른 글
ATDD, 클린코드 with Spring 8기를 시작하며 (0) | 2024.01.26 |
---|
댓글