[우아한테크코스 8기] 프리코스 1주차 회고

2025. 10. 21. 00:16·우아한테크코스 8기

[1주차 미션에 들어가기 전]

프리코스 1주차 과제라는 새로운 도전이 찾아왔습니다. 이때까지 저의 삶을 지탱해온 마음 가짐을 되뇌이며 문제를 해결하는 과정에서 Why와 How를 끊임없이 고민하자고 다짐했습니다.

 

저는 평소 다양한 서비스 기업의 테크 블로그를 읽고, 최신 기술을 실제 서비스 기업에서 어떻게 도입할 수 있는지 공부하는 것을 좋아합니다. 읽은 글 중 인상 깊었던 내용이 있어 이를 이번 주차 과제의 모토(moto)로 삼았습니다. 우아한기술블로그의 「[배민스토어] 신입 개발자 배민스토어 6개월 생존기」를 읽으며 “새로운 기술을 빠르게 습득하고 적용하는 것도 중요하지만 주어진 기간 안에 정상적으로 동작하는 기능을 개발하는 것도 일을 하는 데 꼭 필요합니다”라는 구절이 깊이 와닿았습니다.

 

https://techblog.woowahan.com/12987/

 

[배민스토어] 신입 개발자 배민스토어 6개월 생존기 | 우아한형제들 기술블로그

어떤글인가요? 안녕하세요. 작년 겨울, 우아한테크코스를 수료하고 올해 1월에 배민스토어서비스개발팀으로 입사한 유현호입니다. 이제 막 6개월간의 수습 기간을 마치고 배민스토어에서 느꼈

techblog.woowahan.com

+ 읽어보고 싶으신 분들을 위해 링크 첨부합니다

 

프리코스는 일주일이라는 기간 안에 요구 사항을 완성해야 하는 과정이므로 기능을 정상적으로 동작시키고 그 후 리팩터링을 통해 개선하는 접근이 적합하다고 생각했습니다. 그래서 1주차 과제를 진행하며 학습 목표와 요구 사항을 명확하게 이해하고 이에 맞는 개발을 하기 위해 노력했습니다.

 

[나만의 언어로 요구사항을 정리하기]

1주차 과제의 학습목표와 요구 사항을 저만의 언어로 정의하는 것 부터 시작했습니다.

학습 목표 : 알맞은 개발 환경을 설정하고, 과제를 기간 내에 해결하기

제시된 3가지 과제 진행 요구 사항, 기능 요구 사항, 프로그래밍 요구 사항을 읽고 다음과 같이 개발 프로세스를 정리해봤습니다.

  1. 과제 저장소를 포크하고, 내 브랜치를 만들어서 해당 브랜치에서 개발 및 커밋을 합니다. (개발 환경 설정)
  2. README에 구현 기능 목록을 정리합니다.
  3. 프로그래밍 요구 사항을 염두하며 기능 목록 단위로 개발 및 커밋을 진행합니다.
  4. 중간에 리팩터링할 사항이 생긴다면 기록해두고 기능 구현 이후 이 항목을 점검하며 리팩터링 합니다.

개발 환경 설정

우테코에서 제공한 안내 문서를 꼼꼼히 읽으며 과제 레포지토리를 포크하고, 제 닉네임으로 된 브랜치를 생성했습니다.

이때 “내 레포지토리로 가져왔는데, 왜 브랜치를 따로 만들어야 할까?”라는 의문이 들었습니다. 궁금증을 해소하기 위해 깃 브랜치 전략을 찾아보면서, 우테코에서는 메인 브랜치에 직접 쓰기 기능을 허용하지 않고, PR(Pull Request)을 통한 코드 리뷰 문화를 지향하기 때문이라는 점을 알게 되었습니다. 이 과정을 통해 브랜치 분리의 필요성과 협업 중심 개발 방식의 중요성을 이해할 수 있었습니다.

 

커밋을 진행할 때는 IntelliJ의 기본 터미널이 Windows PowerShell로 설정되어 있어 불편함을 느꼈습니다. 이를 해결하기 위해 터미널을 git bash로 변경했고, 저에게 더 익숙한 환경에서 작업할 수 있었습니다. 이에 더불어 우테코 자바 코드 컨벤션 검사기를 적용하고, 한글 깨짐 오류를 해결하면서 점점 개발 환경 설정에 익숙해졌습니다. 이 과정에서 새로운 환경 문제를 만날 때마다 스스로 해결하는 속도가 빨라지는 것을 체감하며, 개발자로서의 소소한 성장을 느낄 수 있었습니다.

 

기능 목록 작성 및 구현

기능 구현 목록은

문자열 입력 - 사용자 입력값 분리 - 덧셈 연산 및 결과 반환 - 예외 처리

4가지 기능으로 나눈 후, 세부 사항을 작성했습니다. 이렇게 나눈 이유는 프로그램의 작동 과정을 입력 - 실제 서비스 로직 - 출력 으로 생각했기 때문입니다. 이에 더해 예외 처리를 통한 오동작을 막는다는 측면에서 4번째 단계인 예외처리를 생각했습니다. 작성한 목록 순서대로 기능 구현을 진행했습니다. 특히 GitHub를 활용한 협업 경험이 거의 없었기 때문에, 기능 단위 커밋과 의미 있는 커밋 메시지 작성에 집중했습니다.

 

[가장 오래 고민했던 부분 - 사용자 입력값 분리]

기능 구현 과정에서 저는 입력값을 분리하는 로직에 가장 많은 시간과 노력을 투자했습니다.

문자열을 어떻게 나누고, 그 결과를 계산 가능한 형태로 변환할지에 대한 설계가 프로그램의 핵심이라 생각했기 때문입니다.

구현에 앞서 다음과 같은 두 가지 질문을 던지며 방향을 정했습니다.

 

1.문자열 입력값을 어떻게 분리할까?

→ 정규표현식이나 특정 구분자를 기준으로 문자열을 나누기 위해 split() 메서드를 활용하자.

 

2.분리된 문자를 언제, 어떻게 정수로 바꿀까?

→ split() 결과는 여전히 문자열 배열이므로, 계산 전에 parseInt()를 사용해야 한다. 문자열을 정수형으로 변환하는 기능을 별도의 메서드로 분리해 코드의 가독성과 재사용성을 높이자.

 

과제를 진행하기 위한 기능을 구현하면서 처음으로 split()과 parseInt() 메서드를 학습하게 되었습니다. 두 메서드 모두 Java API에서 제공하는 기본 기능임을 알 수 있었습니다. Java에서 다양한 기능을 클래스로 제공하기 때문에, 이미 구현되어 있는 클래스를 적절히 활용하면 개발을 훨씬 효율적으로 할 수 있다는 점도 배웠습니다.

 

초기에는 입력값 분리를 기본 구분자와 커스텀 구분자 두 가지 경우로 나누어 생각했습니다. 이에 따라 defaultDelimiter, customDelimiter 변수를 각각 선언하고, 두 구분자를 더하기 위해 새로운 객체를 생성하려고 했습니다.

 

그 과정에서 문자열을 결합하는 방법을 고민하면서 Java API에서 기본 제공하는 메서드인 concat()과 append()를 비교하며 학습했습니다. 이때 불필요한 객체 생성이 메모리 낭비를 유발한다는 점, 그리고 이를 개선하기 위해 StringBuilder의 append()가 등장했다는 사실을 알게 되었습니다.

 

이 내용을 이해하면서 제가 작성하려던 코드에서 불필요한 객체를 생성하고 있다는 점을 깨달았습니다. 이 부분을 해결하기 위해 defaultDelimiter를 delimiter로 변수명을 변경하고 커스텀 구분자가 있을 경우에 customDelimiter로 받아서 delimiter에 concat()로 결합시켜주도록 수정했습니다. 또한, 커스텀 구분자 확인 기능만 남기고 중복된 코드는 제거해서 아래와 같이 효율적이고 메모리 친화적인 코드 구조를 완성했습니다.

    public void checkCustomDelimiter() {
        String customDelimiter = "";
        int endOfCustomDelimiter;
        if (inputStr.startsWith("//") && inputStr.contains("\\n")) {
            //커스텀 구분자가 끝나는 문자열의 index 위치 반환
            endOfCustomDelimiter = inputStr.indexOf("\\");
            //사용자가 지정한 커스텀 구분자를 저장
            customDelimiter = inputStr.substring(2, endOfCustomDelimiter);
            // 구분자 안에 커스텀 구분자를 추가
            delimiter = delimiter.concat("\\").concat(customDelimiter);
            // 커스텀 구분자가 끝나는 지점부터 inputStr을 변환
            inputStr = inputStr.substring(endOfCustomDelimiter + 2);
        }
    }

 

 

불필요한 객체 생성을 줄이는 것, 이미 구현된 클래스를 적극 활용하는 것, 기능을 단위별로 분리하는 것, 코드의 효율성을 고민하는 과정이 개발자로서의 사고를 확장시키는 경험이었습니다. 많은 시간을 쏟은만큼 얻은 것이 많았습니다.

 

[리팩터링을 하며 배운 점 - MVC 패턴 적용하기]

기본적인 기능 구현을 마친 후에, 모든 로직이 한 메서드 안에 들어있다보니 코드 가독성과 유지 보수성이 떨어진다는 점을 크게 느꼈습니다. 이를 개선하기 위해 MVC패턴을 적용했습니다.

기능 구현을 모두 마치고 MVC 패턴으로 리팩터링한 커밋 메시지 내역

 

Model = 데이터 저장 및 서비스 로직

View = 사용자에게 보여주는 페이지

Controller = Model과 View를 이어주는 역할

 

MVC 패턴이 주로 웹 개발에서 사용되는 구조이다보니 순수 Java 코드에 어떻게 녹여낼 수 있을지에 대해 많은 고민이 필요했습니다.

View에서는 사용자와 직접 상호작용하는 입출력 코드를 담당하도록 하여 기능을 명확히 분리했습니다.

Controller를 통해 데이터를 전달하는 과정에서 Model의 메서드를 전부 직접 호출하게 되어 코드 가독성이 떨어지는 문제가 발생했습니다. 이를 해결하기 위해 Model에 생성자를 활용하여 Controller 코드를 간결하게 줄였습니다.

 

[1주차를 마무리하며 느낀 점]

이번 1주차 과제에서 TDD를 모든 기능 단위로 적용하는 데 어려움이 있었습니다.

저는 TDD에 익숙하지 않아 처음부터 전체 기능에 적용하기보다는 제가 할 수 있는 작은 범위인 예외 처리 기능에만 도입했습니다. 제가 생각한 예외가 발생할 수 있는 부분을 정리하고, 예외 단위로 쪼개서 테스트 코드를 작성했습니다. 덕분에 기능 구현 후 테스트를 진행하는 것보다 안정성을 조금 더 확보할 수 있었고, TDD의 기본 개념을 실제로 체험할 수 있었습니다.

 

디스코드에서 TDD와 관련된 토론에 달린 댓글들을 읽어보면서, feature와 function을 구분해야할 필요성을 느꼈습니다. 다음 미션에서는 기능 단위가 무엇인지 좀 더 고민하고 TDD를 적용해보고 싶다는 생각을 하게 되었습니다.

 

토론과 정보 공유 활동에서 제가 주로 다른 분들의 글을 읽고 의견을 참고하는 것은 굉장히 도움이 되었습니다. 다음 주차부터는 기능 구현 과정에서 느낀 고민이나 학습한 내용을 토론 주제로 정리해 글을 작성하고, 다른 분들과 의견을 주고받으며 학습을 확장하고자 합니다.

 

프리코스 1주차에 도전하며 저는 매일 새로운 성장을 이룩하고 있습니다. 꾸준히 함께 고민하며 성장하겠습니다.

'우아한테크코스 8기' 카테고리의 다른 글

[우아한테크코스 8기] 최종 코딩테스트 후기  (3) 2026.02.03
[우아한테크코스 8기] 1차 합격 했어요!  (1) 2025.12.30
[우아한테크코스 8기] 프리코스 오픈미션 회고  (0) 2025.12.02
[우아한테크코스 8기] 프리코스 3주차 회고  (0) 2025.11.10
[우아한테크코스 8기] 프리코스 2주차 회고  (0) 2025.10.29
'우아한테크코스 8기' 카테고리의 다른 글
  • [우아한테크코스 8기] 1차 합격 했어요!
  • [우아한테크코스 8기] 프리코스 오픈미션 회고
  • [우아한테크코스 8기] 프리코스 3주차 회고
  • [우아한테크코스 8기] 프리코스 2주차 회고
kcnsmoothie
kcnsmoothie
얼레벌레
  • kcnsmoothie
    청산가리스무디
    kcnsmoothie
  • 전체
    오늘
    어제
    • 분류 전체보기 (17)
      • 우아한테크코스 8기 (6)
      • 아인슈타인클래스 17기 (3)
  • 블로그 메뉴

    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ttrpc
    K8S
    CI/CD
    Java
    JVM
    docker
    우아한테크코스
    아인슈타인클래스
    Grafana
    observability
    Prometheus
    kata-container
    grpc
    kvm
    우아한테크코스8기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
kcnsmoothie
[우아한테크코스 8기] 프리코스 1주차 회고
상단으로

티스토리툴바