코딩 과제 하나가 도착했다.
개발 요건은 언어만 Java or Kotlin으로 제약을 두고 프레임워크, DBMS는 자유롭게 선택 할 수 있었다.
개인 프로젝트를 진행하면서 Spring WebFlux 프로젝트 사용을 계획하고 있었는데 마침 이 과제를 내준 회사의 우대사항에 Spring WebFlux 개발 경험이 있었다. 이웬떡
코딩 과제를 진행하며 느낀 점과 고민했던 부분을 작성하려 한다.
코딩 과제 요구사항 파악부터
당연한 말이긴 한데 요구사항부터 차근차근 뜯어봐야한다.
요구사항에 따라 기술 선택이 달라져야 할 수 있고, 어떤 부분을 보고 싶은지 파악이 되니깐 말이다.
이번에 진행한 과제에서는 친절하게 이런 요구사항도 있었다.
- 동시성 이슈 고려
- 데이터 일관성 고려
동시성 제어를 위해 Lock을 사용해야 할 것이고, 데이터 일관성을 위해 트랜잭션 처리가 필요하니 제한이 있거나 지원하지 않는 DB를 선택하면 안될 것이다.
기술 선택과 이유를 준비하자
과제, 현업에서 기술을 선택 할 때 그럴싸한 이유는 참 중요하다.
이전에는 기술과 개발한 것에 대한 이유를 설명하는게 뭐가 그리 중요한가? 되면 됐지 뭘 자꾸 딴지거나? 싶었는데 재밌게도 결국 내가 원하는걸 얻어내기 위해선 누군가를 설득해야하고 설득 당하는 사람의 입장에도 서보니 그들은 왜 이런 것들을 원했는지 조금은 알 것 같다.
난 이번 프로젝트에 아래와 같은 기술을 사용했고 선택한 이유를 각각 설명했다.
- Java17
가장 많은 사용자를 보유한 JDK 버전 중 하나인 17을 사용 - Spring WebFlux 6.1.13
비동기, 논블로킹 방식의 API를 구현하기 위해 WebFlux를 사용 - MySQL 8.0.39
R2DBC를 사용하여 리액티브 방식으로 MySQL과 연동. MySQL 5.7 버전에서 바로 업그레이드 가능한 버전( < 8.4) 중 지원기간이 가장 많이 남아있는 버전 - Redis 7.2.4
BSD 라이선스를 따르는 Redis의 마지막 버전, 캐시, 분산락 구현을 위해 사용
제발 요구사항부터
나도 진행하다보면 너무 지켜지지 않는 부분인데, 요구사항에 나온 것부터 먼저 구현을 하고, 그 뒤에 내 실력을 뽐내야 한다.
처음 과제를 받으면 시간이 널널 한 것 같지만 진행하다보면 생각보다 시간이 부족한 경우가 많다. 당연히 이걸 감안해서 출제를 할테니깐.
요구사항을 보면 뭔가 나사 하나 빠진 것 같은 것들이 있는데, 빠진 나사를 찾아서 끼우지 말고 우선 조립부터 완성을 하는게 정말 정말 중요하다.
예를들어 요구사항에 상품 등록 API 만 있고 상품 수정 API 가 기재되어있지 않다면
어멋! 상품 수정 API 가 빠져있다니, 내가 이런 것도 구현 할 줄 아는 것을 뽐내야지! -> (X)
상품 수정 API 는 이 세상에 존재 할 필요가 없는 것 같아. -> (O)
요구사항 그대로 구현하면 시간이 남는다. 그때 보완을 하자. 요구사항에도 없는 기능과 뽐내기 스킬을 시전 했다가 요구사항에 기재된 기능이 제대로 동작하지 않거나, 미구현 상태로 제출하는 것은 최악의 수다.
코딩 과제의 꽃 README.md
사람에게 첫 인상이 중요하듯, 프로젝트의 첫 인상 또한 중요하다. 이걸 README.md 가 책임진다.
프로젝트를 열자마자 눈에 들어오는 README.md 에 프로젝트 이름만 덜렁 쓰여있다면, 소개팅에 팬티만 입고 가는 수준이다. 차라리 파일을 지우는게 낫다.
요즘 과제에는 고민한 부분, 실행 방법을 포함해서 작성해달라고 요구하는 것 같은데 과제 요구사항에 없다고 쌩까라는 말이 아니다.
md 는 Markdown 확장자로 일종의 마크업 언어인데, 이전엔 일일이 찾아가며 귀찮게 작성해야 했지만, 이젠 만인의 비서 chat GPT 가 있지 않은가? Markdown 문법에 맞지 않는 작성된 내용을 GPT 형님에게 보내면 순식간에 변환해서 보내준다.
- 개발 환경 (기술)
- 실행 방법
- 프로젝트 구조 (패키지 구조)
- 데이터 설계
- 주요 기능
- 특이, 개선사항
이 정도 내용을 포함해서 작성하면 그래도 최소한 욕은 먹지 않을 것.
나는 docker-compose 로 로컬에 MySQL, Redis 를 컨테이너로 실행되도록 구성하고 프로젝트 루트에 docker-compose.yml 파일을 위치시켰다. 프로젝트 루트에서 docker-compose up --build
을 실행하면 된다는 내용과 혹시라도 docker, docker-compose 가 설치되지 않았을 수 있기에 설치 가이드 md 파일도 만들고 링크를 걸었다.
GPT보다 쎈 클로드
최근 과제 진행과 개인 프로젝트를 진행하며 여러 인공지능 형님들을 모셔봤는데 GPT, 퍼플렉시티, 클로드 중 코딩 능력은 클로드 형님이 단연 으뜸이다.
사실 그렇다고 클로드만 사용한건 아니고, 세 형님 모두 모시면서 상호 검증을 하고 작성했지만 단연 개발 쪽으론 클로드가 압도적인 결과물이 나온다.
결국 GPT, 클로드는 구독하고 퍼플렉시티는 무료로 사용하고 있는데 2개의 구독비가 아깝지 않을 정도의 퍼포먼스 향상을 보여주기 때문에 정말 만족스럽다.
클로드는 내가 보낸 코드를 기억하고 답변하는 능력이 GPT보다 뛰어나지만 기억된 내용이 누적 될수록 사용 제한이 빨리 걸리게 되기 때문에 주요 내용을 요약하고 여러개의 질문을 한번에 던지면서 사용하는 편이 좋다. (유료여도 사용 제한이 있음)
마치 사수 GPT 대리님한테 짜치는거 여러개 물어보고 퍼플렉시티 대리님한테 검증 받아보고 그래도 해결이 안되면 클로드 과장님한테 가서 물어보는 느낌이랄까. GPT, 클로드 둘다 구독 박는걸 강력 추천한다. (퍼플렉시티는 구독하지 않아도 꽤 쓸만한 것 같아 구독하지 않았다)