애플리케이션 기능 설명
간단하게 필요한 기능만 구현했다. REST 구조를 기반으로 한다.
POST /students
- 학생을 생성한다.
- 학생 정보는 학번밖에 없다.
POST /lectures
- 강의를 생성한다.
- 다양한 제약조건을 위해 여러 강의 정보가 존재한다(e.g. 개설 학기, 난이도, 교양 영역, 학점, 정원).
POST /students/{studentId}/register
- 학생이 강의에 수강신청한다.
- 이때, 미리 정의된 여러 제약 조건을 검사하여 수강 조건을 확인한다:
- 학기당 최대 학점 제한 (19학점 이하 수강 가능)
- 동일 난이도 교양 과목은 한 학기에 중복 수강 불가
- 동일 과목은 한 학기에 중복 수강 불가 (같은 과목(subject)이 다른 시간대의 강의(lecture)들로 나눠진 경우)
- 과거에 동일 과목을 C+ 이하 평점으로 이수한 경우 재수강 최대 1회 가능
- 잘못된 시간표 구성 불가 (시간대가 겹치도록 수강할 수 없음)
- 그 외에 시뮬레이션에 필요한 API들..
애플리케이션 구현 방식
Spring Boot + JPA + MySQL로 구성했다.
- 전편에서 서술했듯, 실제 운영 환경처럼 유지보수를 어느 정도 고려해야 하는 상황을 만들고 싶었다.
- 가장 기본적이고 범용적인 기술 스택 중 하나라고 생각했다.
최소한의 테스트만 작성했다.
- 아무리 유지보수를 신경쓴다고 해도 테스트 코드까지 열심히 짤 필요는 없는 것 같다. (유지보수를 고려하는 것은 어디까지나 런타임 성능에 제한을 주고 싶기 때문이다)
- 내가 내 코드를 의심할 수 있는 부분(제약 조건 검사)에서만 단위 테스트를 작성했다.
- 전반적인 기능 검사를 위한 통합 테스트도 간단히 작성했다.
Kotlin으로 작성했다.
- 생산성에 중점을 두고자 선택한 방향인데, 실제로 테스트 코드를 작성할 때 엄청 편했다.
- 생각보다 Spring이 Kotlin 지원을 잘 해주고 있어서 큰 어려움은 없었다. 프록시 관련 문제도 플러그인만 넣으면 크게 걱정할 거 없었다.
기본적인 소스 코드 구조(계층)는 이전 프로젝트와 동일하게 했다.
- 의사결정을 내리는 데에 시간을 뺏기고 싶지 않았다. (이미 다 했던 것들이다)