카카오페이 iOS 개발자의 채용 과제 서버 개발기 with Vapor

카카오페이 iOS 개발자의 채용 과제 서버 개발기 with Vapor

시작하며

안녕하세요. 카카오페이 iOS개발팀 입니다. 카카오페이 기술직군 채용 과정에는 과제 전형이 있습니다. 채용 과제 유출 등의 이슈로 내부에서 매년 과제를 리뉴얼하여 지원자 분들에게 안내드리고 있는데요.

그중에서도 카카오페이 iOS 개발자들이 채용 과제를 어떻게 준비하는지 얘기해보려고 합니다.

iOS 개발자가 과제를 만드는 의식의 흐름

카카오페이에 맞는 iOS 개발자를 뽑으려면 어떤 과제를 제출해야 할까? → 서버와 통신이 있어야 할 텐데.. → Open API를 찾아볼까? Json 파일을 제공할까?? → 어떤 게 싸고 좋은 물건이지?

💬 해설:

iOS 개발자는 주로 클라이언트 사이드를 개발하기 때문에 서버 사이드 개발 경험이 많지 않습니다. 과제를 만들려면 결국 OpenAPI나 Json mock에 의지 해야 하고 과제 아이디어와 평가 요소에 제한이 생길 수밖에 없는 게 현실입니다.

새로운 도전 with Vapor

새로운 과제에서는 직접 서버를 개발하면 어떨까라는 의견이 나왔고, 이왕이면 iOS 개발자가 자신 있는 Swift로 서버를 개발하면 카카오페이 iOS 개발자와 지원자 모두에게 의미 있는 결과가 나올 것 같다는 생각을 했습니다. 그래서 전부터 관심있던 오픈소스 Web Framework Vapor로 채용 과제 개발을 시작했습니다.

👀 TMI:

Vapor is an HTTP web framework for Swift. It provides a beautifully expressive and easy-to-use foundation for your next > website, API or cloud project.

쉽게 얘기드리면 Vapor는 Swift로 개발된 오픈소스 Web Framework입니다.

개발기

프로젝트 구성

Vapor로 서버 개발은 처음이고 새로이 환경을 구성할 시간이 부족한 상황이라 몇 가지 조건을 전제로 프로젝트를 구성했습니다.

  • XCode 기반으로 빌드해야 한다.
  • 테스트용 샘플 앱이 있어야 한다.
  • 서버와 샘플 앱을 같이 빌드해야 한다.

그래서 XCode에 샘플 앱 프로젝트를 만들고 Swift Package Manager로 서버 코드를 구성했고, 샘플 앱과 서버 Scheme를 추가하여 XCode에서 2가지 다 빌드할 수 있도록 했습니다.

샘플 앱 개발

서버 개발은 처음이다 보니 테스트를 하기가 너무 힘들었는데 어떻게 할까 고민하다 직업이 iOS 개발자다 보니 직접 테스트용 샘플 앱을 개발하게 되었습니다. 그리고 빠르게 개발하기 위해서 SwiftUI와 Combine을 사용하여 MVVM 아키텍처로 구현했습니다!

위 MVVM 아키텍처는 보편적으로 많이 사용하고 있는 형태인데요. 카카오페이 앱 개발에서는 많이 사용하고 있지만 SwiftUI + Combine 조합의 MVVM을 사용해본 건 처음이었습니다. 카카오페이 iOS 개발자들은 새로운 기술 스택을 주제로 다양하게 스터디를 진행하고 있습니다. 그리고 꾸준히 진행한 스터디를 바탕으로 SwiftUI, Combine, Async/Await는 충분한 검증을 통해 여러 프로젝트에 적용되어 있습니다. 비록 사내 사이드 앱이지만 평소에 스터디한 내용을 모두 활용하여 결과물까지 만들어낸 과정은 큰 의미가 있고 중요한 결과라고 생각합니다.

토큰 발급, 리스트, 상세, 카테고리, 프로필 API까지 요청할 수 있도록 아래처럼 앱을 구성해서 서버 개발할 때 지속적으로 테스트할 수 있도록 했습니다.

카카오페이에서 SwiftUI와 Combine을 열심히 스터디한 보람이 있었습니다.
카카오페이에서 SwiftUI와 Combine을 열심히 스터디한 보람이 있었습니다.

Vapor

아주 간단하게 설명드리면 Vapor는 아래와 같이 동작합니다.

  • Client에서 Request를 요청
  • Middleware에서 전처리를 진행
  • Router에서 요청에 맞는 Response를 전달

Middleware

Middleware에서 주로 하는 역할은 다음과 같습니다.

  • 로그 출력
  • 토큰 유효성 검사
  • Request 유효성 검사
  • 에러 처리

이번 채용 과제에서도 2가지 Middleware를 사용했습니다.

첫 번째는 TokenGuardMiddleware입니다. TokenGuardMiddleware에서는 request로 들어온 header에 authorization 값의 3가지 상태를 확인합니다.

  1. header의 authorization에 토큰이 들어있는지? 만약 없다면? → “NEED_TOKEN”
  2. 토큰의 형태가 유효한지? 만약 유효하지 않다면? → “INVALID_TOKEN”
  3. 토큰 만료시간이 유효한지? 만약 만료된 토큰이라면? → “EXPIRED_TOKEN”

이렇게 3가지 상태를 확인해서 에러를 내려주고 만약 문제가 없다면 다음 Middleware로 넘어갑니다.

두 번째는 IncidentMiddleware입니다.
IncidentMiddleware는 장애 상황을 재현하기 위한 장치입니다. 금융 기반 서비스인 카카오페이는 에러에 대한 처리가 매우 중요합니다. 그래서 10%의 확률로 여러 가지 상황의 에러를 발생시킵니다.

  • 3가지의 StatusCode
  • 4가지의 Reason

위 case를 조합해서 장애 상황과 에러를 재현하고 있습니다.
(그만큼 에러 처리가 중요한 채점 포인트겠죠??)

Router

Router는 클라이언트 개발자에게는 익숙하지 않은 개념입니다. 쉽게 설명하면 request에 대한 적합한 응답을 찾아서 전달해주는 역할입니다. 이 과정에서 Data를 Json으로 전달해야 하는데, 다행히도 iOS 개발자라면 익숙한 Decodable을 채택해서 쉽게 response를 전달할 수 있습니다.

아래는 유저의 잔액을 가져오는 예시입니다. 예전에는 EventLoopFuture로 Asynchronous task를 처리했는데 지금은 Swift의 Async/Await를 사용할 수 있어요. iOS 개발자들이라면 누구나 익숙한 Swift 문법들이 많이 사용돼서 쉽게 도전해볼 수 있을 것 같습니다.

 app.get("balance") { req async throws -> Balance in
    guard let user = try await User.query(on: req.db).first else {
        throw Abort(.notFound)
    }

    return user.balance
 }

현재 iOS 채용 과제에는 총 2개의 Router와 4개의 API가 있습니다. 더 자세히 알려드리고 싶은데 채용 과제다 보니… 🤐 궁금하시다면 카카오페이 iOS 개발자로 지원 해주세요!

마치며

이번 채용 과제 리뉴얼은 카카오페이 iOS 개발자들과 지원자분들 모두에게 의미있는 과제라고 생각합니다.

카카오페이 iOS 개발자로서
그동안 막막하게만 느껴졌던 서버 사이드 개발을 Swift로 도전해보니 조금이지만 쉽게 경험해볼 수 있었고 서버 개발자분들의 고충도 느낄 수 있었습니다.

카카오페이 iOS 개발자 지원자분들도
단순한 OpenAPI를 활용한 과제가 아닌 미래에 같이 일할 동료들이 Swift로 직접 개발한 서버로 과제 전형을 진행해서 의미가 있을 것 같아요!

앞으로 질 높은 과제를 지원자분들에게 제공하고 좋은 경험을 드릴 수 있는 첫걸음이라고 생각합니다.

짧은 글 읽어주셔서 너무 감사드립니다.
카카오페이에서 만나요! 👋 👋 👋

dean.cool
dean.cool

iOS 앱을 개발하고, 카카오페이에서 최대한 많은 경험을 하고 싶은 딘입니다.

태그