개발 공부/코딩테스트

무신사 2차 코딩테스트 -1

엽승 2026. 2. 17. 17:10
728x90
2월 8일 일요일 오후 3시, 대망의 2차 코딩테스트가 시작되었습니다. 그리고 2월 13일 오후 5시 31분, 다행히 합격 메일을 받을 수 있었습니다.
이번 무신사 2차 테스트는 'AI 네이티브' 전형이라는 꽤 파격적이었습니다. 보통은 금지되는 AI 도구를 마음껏 사용할 수 있었고, 심지어 무신사 측에서 코덱스 사용 권한을 주기도 했습니다. 시험은 깃허브를 통해 문제를 확인하고, 개인 비공개 저장소에 코드를 올리는 방식으로 진행되었습니다. 

 

 https://github.com/musinsatech/2026-musinsa-rookie

 

GitHub - musinsatech/2026-musinsa-rookie: 2026 무신사 AI Native 개발자 채용 2차 시험 안내

2026 무신사 AI Native 개발자 채용 2차 시험 안내. Contribute to musinsatech/2026-musinsa-rookie development by creating an account on GitHub.

github.com

 

코딩테스트 내용 
  • AI Agent 사용 가능 (무신사 제공 Codex 혹은 개인이 구독한 AI)
  • Github를 통한 문제 풀이 (개인 Private Repository에서 작업)
  • 개발 환경 자유
  • 시험 시작시, PROBLEM.md 공개
  • 시험 응시 가능 언어 - 자바, 코틀린, 자바스크립트, 파이썬
시험 방식이 '3시간 제한'과 'AI 활용'이라는 점을 미루어 볼 때, 단순 알고리즘 풀이보다는 실무에 가까운 API 구현 문제가 나올 것이라 예상했습니다.

그래서 저는 '상품 좋아요' 기능의 동시성 제어나, '장바구니 조회' 시 발생할 수 있는 N+1 문제 같은 병목 현상 해결을 중점적으로 준비했습니다. 3시간 안에 API를 완성해서 제출해야 할 것 같아, API 명세서를 빠르게 만들 수 있도록 스웨거 설정도 미리 연습해두었습니다.

또한 AI 도구를 사용하는 과정 자체도 평가 대상이 될 수 있겠다고 생각했습니다. 대화 로그를 제출하거나 마크다운으로 정리해야 할 수도 있어서, 이 부분을 어떻게 깔끔하게 보여줄지도 고민했습니다.

평소 프리랜서로 활동하면서 AI를 활용한 개발에는 꽤 자신이 있었습니다. 하지만 시험 시간은 한정되어 있으니  각 AI 모델마다 확실한 역할을 부여해두고 환경 설정을 마쳤습니다.

평소 프리랜서로 활동하면서 AI를 활용한 개발에는 꽤 자신이 있었습니다. 

1. 그록 (기획 및 프롬프트 설계)
    문제가 공개되면 가장 먼저 그록에게 던져주기로 했습니다. 환경설정을 통해 
    문제를 해석하고, 제가 어떻게 접근할지 방향을 잡으면 커서 에디터에 입력할 최적의 프롬프트를 짜주는 역할을 맡겼습니다.

2. 제미나이 (문서화 담당)
   제 경험상 문서를 정리하고 다듬는 건 제미나이가 가장 뛰어났습니다.
   구현된 내용을 바탕으로 리드미 작성이나 문서화 작업을 전담하도록 설정했습니다.

3. GPT
   마지막으로 GPT는 시니어 개발자 역할 
  리팩토링 포인트를 집어내는 리뷰 용도로 활용할 계획


4. Cursor
   순수 개발 목적 

 

 

코딩테스트시작 

문제를 보마자마 일단 장바구니 좋아요 등은 아니지만, 무신사에서 요구하는 것이 있다는 것은 깨달았고, 천천히 시작했습니다. 

어차피 도메인만 '수강신청'으로 바뀌었을 뿐, 결국 무신사가 보고자 하는 핵심은 트래픽이 몰리는 상황에서의 데이터 정합성과 동시성 제어라는 본질은 같았기 때문입니다. 

 

💡 위 항목이 평가의 전부는 아닙니다.
좋은 개발자는 명시적으로 요구받지 않아도, 스스로 필요한 것을 찾아서 합니다. 이 과제에도 명시되지 않은 평가 요소가 있으며, 그런 부분을 스스로 고민하고 실천한 후보자에게 추가 점수가 부여됩니다. 

 

이부분이 가장 중요하다 생각이 들었습니다.  

단순히 기능 구현에 그칠 게 아니라, '서비스라면 당연히 갖춰야 할 품질'을 보여줘야겠다고 다짐했습니다. 그래서 요구사항에는 없었지만, 스스로 5가지 목표를 세우고 구현에 들어갔습니다.  

 

여러가지를 한번에 구현하면 질이 떨어지기 떄문에 
Global Exception -> Student (JWT Cookie Login Logout) ->  Course -> Professor  순서로 구현을 시작했습니다. 

 

① 아키텍처 설계
AI 도구를 사용하지만, 코드의 전체적인 구조까지 AI에게 맡길 수는 없었습니다. 프롬프트를 입력하기 전, 패키지 구조와 도메인 설계는 제가 직접 먼저 수행했습니다. 제가 짠 탄탄한 뼈대 위에서 AI가 살을 붙이도록 유도해야 유지보수 가능한 코드가 나온다고 판단했기 때문입니다. + 어떤 락을 사용할지? 

② 보안과 사용자 경험을 고려한 인증
요구사항엔 없었지만, 실제 수강신청 시스템에 '로그인'이 없다면 말이 안 된다고 생각했습니다. 그래서
JWT 기반의 인증 시스템을 구현하고, 보안을 위해 토큰을 쿠키 에 담아 관리하도록 하여 '내 시간표 조회'나 '수강신청' 시 학생 식별이 자연스럽게 이루어지도록 계획.

③ 객체지향적인 도메인 설계
비즈니스 로직이 서비스 계층에만 비대하게 뭉치는 것을 방지하기 위해, 도메인 엔티티가 스스로 비즈니스 규칙을 처리하도록 객체지향적으로 설계했습니다. 예를 들어, '정원 초과 여부'나 '시간표 중복 확인' 같은 로직은 도메인 객체 내부에서 판단하도록 했습니다. 

④ 성능을 고려한 쿼리 튜닝
수강신청은 읽기와 쓰기가 빈번한 시스템입니다. 단순히 JPA 메서드에만 의존하면 N+1 문제나 불필요한 조회가 발생할 수 있습니다. 그래서 병목이 예상되는 복잡한 조회나 대량의 데이터 처리가 필요한 부분은 직접 쿼리를 작성하여 성능을 최적화했습니다.

⑤ 확장성을 고려한 예외 처리 
수많은 예외 상황(정원 초과, 이미 신청한 강의, 학점 초과 등)을 일관성 있게 처리하기 위해 전역 예외 처리기를 도입했습니다.

그리고  그록에게 던지기 전에 문제를 요약했습니다. 

🎓 대학교 수강신청 시스템 백엔드 과제 요약
1. 프로젝트 목표
대학교 수강신청 시스템의 백엔드 서버 구축 불명확한 요구사항을 스스로 분석하여 합리적인 결정을 내리고 구현

2. 핵심 기능 
조회: 학생, 강좌(전체/학과별/정원정보), 교수 목록 조회수강신청/취소: 핵심 트랜잭션 처리내 시간표 조회: 신청 완료된 내역 확인비즈니스 규칙:학생당 최대 18학점 제한강의 시간 중복 불가정원 초과 불가

기술적 핵심 과제
동시성 제어  정원이 1명 남았을 때 100명이 동시에 신청해도 단 1명만 성공해야 함 (락, 트랜잭션 격리 수준 등 전략 수립 및 문서화 필수).REST API: REST 원칙을 준수한 API 설계 및 구현.헬스체크: GET /health (200 OK) 구현 필수.

데이터 구축 
동적 생성: 서버 시작 시 프로그래밍 로직으로 데이터 생성 (SQL/CSV 파일 로드 금지).제약 시간: 서버 시작 후 1분 이내 생성 완료.규모: 학과 10+, 강좌 500+, 학생 10,000+, 교수 100+ .

제출물 및 문서화
소스 코드: src/ (Java, Kotlin, Python, JS 중 택1)README.md: 빌드 및 실행 방법.docs/REQUIREMENTS.md: 요구사항 분석, 설계 의사결정(가정), 동시성 제어 전략 기술.docs/API 문서: API 명세서.prompts/: AI와 대화한 프롬프트 기록 (필수 평가 요소).

평가 포인트
동작 여부: 빌드/실행 및 헬스체크 성공.핵심 로직: 비즈니스 규칙 및 동시성 제어의 견고함.사고의 깊이: AI 활용 능력, 문서화 수준(설계 근거), 코드 품질. 

 

여러가지 프롬프트들 중 예시를 들면 

수강신청 시스템 구축을 위한 첫 단계로, 'Global Exception Handling' 구조를 잡고 싶다.

1. Exception Structure (예외 구조)
- 모든 커스텀 예외는 `ErrorCode` 라는 인터페이스를 통해 관리하고 싶어.
- 도메인별로 에러 코드를 분리해줘.
- `AuthErrorCode` : 토큰, 로그인, 회원가입 관련
-`EnrollmentErrorCode` : 수강신청, 장바구니 관련 (정원 초과, 중복 신청 등)
- `ProfessorErrorCode` : 교수 정보 관리 관련
- `CustomException` 하나로 모든 비즈니스 예외를 처리할 수 있도록 래핑해줘.

2. Global Handler (전역 핸들러)
-`@RestControllerAdvice`를 사용하여 `CustomException`이 발생하면 `ApiResponse` 포맷으로 자동 변환해줘.
 !! ApiResponse는 제가 프론트랑 작업을 할 때 주로 쓰는 컨퍼런스입니다. !! 
- 복잡한 로직 없이 딱 `CustomException` 만 처리하는 깔끔한 핸들러면 충분해.

3. Standard Response (공통 응답)
- 성공/실패 여부와 상관없이 항상 일관된 JSON 구조(`ApiResponse` )를 리턴해야 해.
-필드:`success`,`code`,`message`,`data`

4.  Output
위 요구사항을 만족하는 Java 클래스 코드를 작성해줘.

 

그록에게 받은 프롬프트를 또 저만의 방식으로 가공을 했습니다. 

 


1. Exception Structure (예외 구조)
- 모든 커스텀 예외는 `ErrorCode` 라는 인터페이스를 통해 관리하고 싶습니다.
- 도메인별로 에러 코드를 분리하고 싶고.
- `AuthErrorCode` : 토큰, 로그인, 회원가입 관련
-`EnrollmentErrorCode` : 수강신청, 장바구니 관련 (정원 초과, 중복 신청 등)
- `ProfessorErrorCode` : 교수 정보 관리 관련
- `CustomException` 하나로 모든 비즈니스 예외를 처리할 수 있도록 래핑해줘.

2. Global Handler (전역 핸들러)
-`@RestControllerAdvice`를 사용하여 `CustomException`이 발생하면 `ApiResponse` 포맷으로 자동 변환해줘.
 !! ApiResponse는 제가 프론트랑 작업을 할 때 주로 쓰는 컨퍼런스입니다. !! 
- 복잡한 로직 없이 딱 `CustomException` 만 처리하는 깔끔한 핸들러면 충분해.

3. Standard Response (공통 응답)
- 성공/실패 여부와 상관없이 항상 일관된 JSON 구조(`ApiResponse` )를 리턴해야 해.
-필드:`success`,`code`,`message`,`data`

4. 객체지향을 위해 패키지 구조에 맞게 구현해

5.  Output
위 요구사항을 만족하는 Java 클래스 코드를 작성해줘. 

분량이 많아 2편을 바로 쓰겠습니다. 

https://yeopseung.tistory.com/282

728x90

'개발 공부 > 코딩테스트' 카테고리의 다른 글

코딩테스트 -4  (0) 2026.02.26
무신사 코딩테스트 2차 -3  (0) 2026.02.20
무신사 ROOKIE AI Native Engineer 1차 코딩테스트  (0) 2026.02.17
같은숫자는 싫어  (0) 2024.07.06
폰켓몬[JAVA]  (0) 2024.06.21