프리코스의 다른 글
최종 코테 레포
들어가며..
마지막 4주차에서 쓸데없이 Service라는 클래스를 만들어서 구현하는 바람에,, 더 복잡해진 코드를 보면서 떨어질 것 같은 느낌이 많이 들었고 싸피를 준비하고 있는 터라 신경을 쓰지 않고 있었는데 메일이 왔다.
1차 심사에 긴 시간이 걸려 많이 잊어버리고 있던 터라 다시 부랴부랴 준비했다.
최종 코딩 테스트 준비!
준비는 이전 기출들을 풀어보면서 내 기준을 더 확고하게 다지는 것이었다.
일주일동안 하던 테스트들을 5시간안에 모두 구현해내면서 테스트도 작성해야 했기 때문에 시간이 많이 부족하다고 생각했고 반복적으로 문제를 해결해나가면서 문제를 해결해나가는 순서나 고민을 최소화하기위해 노력했다.
온콜, 메뉴, 페어매칭, 크리스마스, 브릿지, 야구 총 6개를 풀었고 풀면서 다음의 기준을 세웠다.
- 제시된 요구사항을 읽고, 만들어야할 기능 목록을 다음과 같이 정의한다.
- 입력 기능, 출력 기능, 예외 상황, 비즈니스 로직
- 입력과 출력 먼저
- 입력과 출력은 확실하게 분리하여 구현할 수 있었기 때문에 이를 먼저 분리해두고 빠르게 구현하기로 했다.
- 이후 비즈니스 로직을 작성
- 비즈니스 로직을 차례차례 작성하고 이를 뷰와 연결해나가면서 문제를 해결했다.
- 마지막 남은 시간동안 도메인에 대한 테스트를 작성
- 이 후 시간이 남으면 README에 프로젝트의 상세한 설명 작성과 회고 작성
내가 세운 기준 프로젝트 구조는 다음과 같다.
- component
- 도메인 이외의 상태 없이 로직을 수행하는 클래스들의 모음이다.
- config
- 여러 클래스들의 의존성을 주입해주는 클래스들의 모음이다.
- controller
- MVC의 controller의 역할을 수행하는 클래스들의 모음이다.
- domain
- MVC의 model의 역할을 수행하는 클래스들의 모음이다.
- enums
- 상수 enum들의 모음이다.
- handler
- 중간에서 핸들링하는 클래스들의 모음이다.
- view
- MVC에서 view의 역할인 입력, 출력을 처리하는 클래스들의 모음이다.
- dto
- 도메인의 데이터를 dto에 담아서, 컨트롤러는 뷰로 전달하는데 데이터를 담은 클래스들의 모음이다.
위의 구조를 베이스로 가져가면서 유연하게 추가하려고 했는데, 딱히 추가된 것은 없었고 dto를 사용하지 않았다.
README 작성 및 기능 목록은 다음의 템플릿을 사용했다.
## 프로젝트 소개
> 소개말
>
### 기능 소개
1. 저희 서비스는 ~~를 할 수 있습니다.
---
### 기능 예제
**1. 기능-1**
- 기능 설명
```java
출력물
2. 기능-2
3. 기능-3
4. 기능-4
입력 가이드
1. 입력-1
- 입력 설명
입력 예시
2. 입력-2
프로젝트 패키지 구조
Class Diagram
mermaid 사용
트리 구조
트리 구조
기능 목록
입력
출력
실행 결과 예시
기능
실행 흐름
예외 상황
그리고 나만의 규칙? 같은것도 아래처럼 만들고 갔다.
```markdown
### 구현 흐름
1. 전체 요구사항을 상세히 읽는다.
2. 입력 요구사항과 출력 요구사항을 먼저 작성한다.
3. 실행 흐름을 작성하고 이를 기반으로 기능 요구사항을 작성한다.
4. 실행 흐름을 따라 구현한다.
5. 구현하면서, 테스트도 작성한다.
6. README에 프로젝트 설명을 작성하고 체크리스트를 확인한다.
7. 기본 체크리스트를 확인한다.
### Readme 체크리스트
1. 프로젝트 소개를 작성한지 체크한다.
2. 기능 소개를 작성한지 체크한다.
3. 기능 예제들을 작성한지 체크한다.
4. mermaid diagram을 작성한지 체크한다.
5. 기능 목록을 작성한지 체크한다.
[README Template](https://www.notion.so/README-Template-157188fb52a48004a4e8f9a440493219?pvs=21)
### 기본 체크리스트
1. 도메인은 정적 팩토리 메서드를 사용할 것이므로, 생성자를 private로 선언한다.
2. 모든 매개변수들은 수정될 일이 없으므로 final 키워드를 붙여서 수정이 불가능하도록 만들어준다.
3. .gitignore를 작성하여 필요없는 파일들이 올라가지는 않은지 체크한다.
4. 이름을 통해 의도를 잘 드러냈는지 체크한다. (불용어 사용 금지 (Info, Data, a, an, the))
5. 하드코딩(값을 코드에 표현)한 곳이 없는지 체크한다.
6. 도메인에 반드시 검증 로직이 있어야 한다.
### 기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항
### 나만의 구현 규칙
1. InputView는 Parser와 Validator를 이용해 값을 반환
2. OutputView는 OutputMessage를 출력하도록 분리
3. config.XXXConfig를 사용해서 클래스들의 의존관계를 주입
4. Component 패키지에는 Converter, Generator처럼 상태 없이 반복 사용 가능한 클래스들을 담아둘 것
5. dto는 Record를 활용하여 간략하고 빠르게 구현
6. exception은 CustomExcception만 활용해서 구현
7. handler에 RetryHandler를 사용하여 예외 핸들링 및 재시도 로직 구현
8. 컨트롤러는 도메인과 뷰, 컴포넌트들을 제어해서 로직 수행
9. 도메인은 반드시 검증 로직을 포함시켜 구현할 것
마지막으로 다음의 코드들을 미리 준비해갔다.
OutputView
에서 이전의 미션을 하면서 공통적으로 묶어낸 메서드들- 출력에 사용할 상수 집합
enum
- 에러 메시지에 사용할 상수 집합
enum
- 재시도 로직을 위한
RetryHandler
클래스 .md
파일을 파싱에 대비하기 위한 클래스
이정도로 준비해가서 유용하게 사용했다.
최종 코딩 테스트 - 출석
나는 카페에서 마지막 준비? 마음가짐처럼 하고 갔는데, 그냥 바로 시험장으로 들어가도 괜찮았을 것 같다.
분위기가 생각보다 편안했고 간식과 물도 제공해주셨다.
딱 준비한 그대로 진행했다.
하지만, 이전에 기출보다 내가 느끼기에 좀 많이 어려웠다.
사용을 많이 해보지 않았던 LocalDate, LocalTime을 많이 사용했고 이전과 다른 재시도 로직, 많은 출력과 기능이 사실 잘 이해가 되지 않았다.
30분동안 기능 목록을 정의했다.
그래서 시작하고 완벽하게 코드를 짜내려가면서 2시간 동안 입력, 출력에 대한 구현만 진행했다.
- 그 타이밍에 포비님이 돌아가는 쓰레기를 만들어야한다고 말씀하셔서 정신차리고 빠르게 기능 구현에 들어갔다.
4주차에서 복잡해지면서 겪었던 내가 작성한 메서드를 내가 이해하지 못하는 경우를 최대한 없애기 위해 메서드의 이름이 길어지더라도 최대한 내가 이해할 수 있을 정도로 이름을 풀어서 사용했고 때문에 헷갈리는 일은 없었다.
그렇게 남은 시간이 30분이 남을때 까지 기능을 구현했지만, 테스트를 해보니 2개밖에 통과하지 못했다.
마지막의 시간을 모두 사용할때까지 다음의 버그를 찾아냈다.
- 우테코에서 제공하는 DateTimes.now()를 사용하지 않고 시간을 받아왔다, 때문에 우테코에서 제공한 테스트코드에서 사용한 Mock 시간이 올바르게 전달되지 못해 통과하지 못했다.
- 똑바로 읽지 않은 내가 문제였다.
- 어떤 경우에서는, 예외를 앞에서 발생시켜야 하는 경우도 있었다. 이걸 수정하는 테스트가 통과했다.
마지막 남은 버그는 결국 찾지 못했고 테스트코드도 작성못하고, 프로젝트 설명도 못적은채로 5/4로 마무리했다.
결국 찝찝하게 집에와서 다음날 확인해보니, 출력 부분에서, “경고”를 “주의”로 작성하고, 01, 02일로 출력해야 하는 것을 1일, 2일로 출력하고 있었다..
- 정말 아쉬웠고 더 열심히 할걸이라는 후회가 많이 남았었다.
카톡방에서 사람들 후기를 보면서 마음을 다독였다.
'우아한 테크코스 > 프리코스 지원과정' 카테고리의 다른 글
우아한테크코스 7기 최종 합격 후기 (0) | 2025.01.08 |
---|---|
우테코 프리코스 4회차 회고록 (0) | 2025.01.06 |
우테코 프리코스 3회차 회고록 (0) | 2025.01.06 |
우테코 프리코스 2회차 회고록 (0) | 2025.01.06 |
우테코 7기 프리코스 1주차 회고 (0) | 2024.12.30 |