[회고] 코드숨 스프링 14기 1주차

gwk·2023년 1월 15일
0

코드숨 스프링

목록 보기
1/3

1주 차 회고

사실 요즘 고민이 많다. 지난 2년 남짓 블록체인 회사에서 백엔드 개발을 했는데 사실 사수도 없고 블록체인에 대해서도 잘 모르겠고 무사히 프로젝트 수행한 것만 해도 기적이라 생각된다 (아니면 정부 과제가 다 이런가?😓). 백엔드 개발을 하면서 좋은 아키텍처나 설계 예제를 찾게 되는데 국내 자료는 절대적으로 자바, 그리고 더 나아가서는 JVM 기반으로 되어 있어서 Node.js로 되어 있는 예제를 찾기 힘들었다. 그래서 이 기회에 스프링 사용법을 배워보기로 했다. 또한 사수가 없고 개발자마다 하나의 프로젝트에 투입되어 있는 상황이라 코드 리뷰를 받아보지 못해 누군가와 같이 코드 품질을 향상하기 위해 고민하고 싶어 강의를 수강하게 되었다.

과제 - Todo REST API 만들기

1강 웹 개발 시작하기에서 기본적으로 JDK에서 제공하는 com.sun.net.httpserver.HttpServer class를 사용하여 todo 리스트 CRUD API를 구현하는 과제를 수행했다. 소스 코드는 1주 차 과제에 있다. 잘은 모르겠지만 단일 쓰레드 HttpServer를 main 함수에서 띄우고 handler를 등록하는 메인 로직을 구현했다. 여기서 쓰레드에 대한 부분을 잘 모르겠다. Node.js는 이벤트 루프를 사용하는 Reactor pattern의 구현체를 엔진으로 사용하기에 별로 고민해 볼 기회가 없었다. 메인 드라이버 코드는 다음과 같고

    try {
      HttpServer httpServer = HttpServer.create(new InetSocketAddress(PORT), 0);
      httpServer.createContext(BASE_PATH, TaskFactory.taskHandler());
      httpServer.start();
    } catch (Exception e) {
      e.printStackTrace();
    }

핸들러의 라우팅 로직은 TaskHandler 객체 안에서

  @Override
  public void handle(HttpExchange httpExchange) throws IOException {
    Parser parser = new Parser(httpExchange);
    String method = parser.getMethod();
    String path = parser.getPath();
    String body = parser.getBody();

    switch (RequestType.of(method, path)) {
      case GET_TASKS -> handleGetAllTasks(httpExchange);
      case GET_TASK_BY_ID -> handleGetTaskById(httpExchange, parser.getId(TASKS_PATH));
      case POST_TASK -> handleCreateTask(httpExchange, body);
      case PUT_PATCH_TASK -> handleUpdateTask(httpExchange, parser.getId(TASKS_PATH), body);
      case DELETE_TASK -> handleDeleteTask(httpExchange, parser.getId(TASKS_PATH));
      default -> handleNotFound(httpExchange);
    }
  }

와 같이 구현했다.

코드 리뷰

  • String.format 사용
  • Static method 사용 지양
  • 라우팅과 핸들링 관심사 분리
  • 등, 등...

코드 리뷰를 반영하면서 이펙티브 자바를 잘 알고 있으면서 고민되는 부분들을 best practice에 맞게 깨끗하고 깔끔하게 처리했을 것이라는 생각을 했다. 그 책 스터디도 병행할 시간이 됐으면 한다. 현재 PR이 머지되는 것을 대기 중이다.

배운 점

  • I/O: InputStream, OutputStream, {Buffered,InputStream}Reader
  • HttpServer, HttpExchange
  • Jackson: ObjectMapper 너무 좋다. Node.js에서는 힘들게 TypeScript, reflect-metadata 등을 써서 json 오브젝트 리터럴을 클래스로 변환할 수 있었던 것 같은데 com.fasterxml.jackson을 사용하면 자동으로 해결된다. 예를 들어 json request body를 자동으로 DTO로 변환, DTO는 타입이 아닌데도 타입처럼 Nest.js에서 인자 타입으로 선언...

개인적으로 넥스트스텝의 TDD 강의에서 외에는 지난 2년 조금 남짓 개발자로 일하면서 자바 개발을 할 기회가 없었다. 전에 잠깐 "자바 웹 프로그래밍 Next Step"을 공부하려고 했는데 다시 도전할 밑천이 생기고 있는 것 같다.

아쉬운 점

오랜만에 코드 리뷰를 받을 기회가 생겼는데 미리미리 과제를 시작했으면 하는 아쉬움이 있다. 더 여러 번 핑퐁 리뷰-반영 루프를 거쳐야만 남은 수강 기간에 실력 향상을 최대화할 수 있을 것 같다.

그 외

이직을 위해 준비해야 할 것이 너무 많고 땅기는 기술적 주재들도 너무 많다. 특히 아직 주니어이기에 많이 끌리는 시스템 디자인이나 팀 리더쉽과 같은 영역을 공부하고 고민해도 지금 당장 결과를 보기 힘들 것 같다. 하지만 2~3년 후에 좋은 매실을 걷었으면 한다.

profile
백엔드 개발자

0개의 댓글