BEYOND SW 캠프 15기 7주차 회고

mijuckboon·2025년 3월 8일
post-thumbnail

부트캠프에 들어온 지 약 한 달 반 정도 되는 날이다. 벌써 14\frac{1}{4} 정도가 지났다. (현재까지 교육일수: 29일, 전체 교육일수: 120일)
이번 7주차를 돌아보며 회고를 작성한다.

학습 내용

  1. Java
    스레드, SOLID 원칙, JUnit 테스트 코드, 객체 디자인 패턴에 대해 학습하였다.
  2. 자료 구조, 알고리즘
    복잡도, 컬렉션 계열 자료 구조(List, Stack, Queue, Deque)와 그래프 계열 자료 구조(Tree, Heap, Graph) 중 트리와 힙의 작동 원리 및 사용법에 대해 학습하였다.

배운 점

개발 공부를 할 때는 역시 코드를 봐야 한다는 것

필자는 이전에 정보처리기사 자격증 공부를 했는데, 총 23개의 디자인 패턴이 각각 생성, 구조, 행위 패턴 중 어디에 속하는지와 그 특징을 외워야 했다. 자격증에서 다루는 범위가 워낙 방대하다보니, 개념서에서 자세한 코드는 다루지 않고 줄글로 설명만 작성되어 있었다. 잘 와닿지도 않는 수많은 내용을 다 외워야 한다는 게 스트레스여서, 설명을 보고 패턴을 맞히는 문제는 틀릴 각오로 어느 패턴에 속하는 지 분류하는 법만 학습했다.

강의를 통해 실제로 디자인 패턴을 구현한 코드를 읽어보니 생성, 구조, 행위 패턴이 어떤 의미였는지, 어떤 점에서 유지보수성 좋게 잘 작성된 코드인지 잘 이해할 수 있었다. 단순히 자격증 취득이 목적이라면 개념서를 읽고 문제를 풀어보는 것으로 충분하지만, 개발 공부의 의미로 개념서에서 다루지 않는 내용도 찾아보며 공부했으면 더 좋았겠다 싶었다.

Java 종합 실습

Java 수업이 끝난 후에는 보통 주어진 문제 상황을 해결하는 실습 문제가 주어졌는데, 이번 주에는 객체지향 설계 원칙을 고려하여 하나의 서비스를 만들어보는 일종의 개인 프로젝트 느낌의 종합 실습 과제가 주어졌다. 혼자 처음부터 작성하기 어려운 사람을 위한 샘플 코드도 주어졌다. 과제는 화요일 수업시간 중에 안내되었고 제출 기한은 금요일 점심시간이었다.

그동안의 실습 문제나 알고리즘 문제를 풀 때는 절차적인 코드를 작성한 경우가 대부분이다보니, 객체 지향적인 코드를 작성해본 경험이 많지 않은 필자에게 많은 공부가 되는 실습 과제였다.

실제 프로젝트에서는 DB 상에서 FK로 연결된 데이터를 다루어야 하는 경우가 많을테니 테이블 2개를 이용해볼 수 있게 회원 관리, 성적 처리 기능을 구현해보고 싶었으나, 경험치 부족으로 거기까지 수행하기에는 어려움이 있어 강사님 코드를 바탕으로 회원 관리 기능 부분만 완성하는 것으로 계획을 수정하였다.

회원의 속성을 인조식별자, 이름, 역할, 상태로 정하고 역할은 "학생", "조교", "강사"로, 상태는 "활성화", "비활성화", "탈퇴"로 나누었다. 실습 내용은 대부분 주어진 샘플 코드에서 유지보수성을 개선하는 리팩토링이었다. 자세한 내용은 깃허브 저장소에서 확인할 수 있다.
실습 첫 날에는 어떻게 진행해야 할 지 막막해서 뇌정지가 오기도 했는데, 2일차, 3일차를 지나면서 진행 방식이 좀 정리되기 시작하여 무사히 작업을 수행할 수 있었다. 혼자 많은 책임을 갖고 있던 Application 클래스의 기능을 다른 클래스로 보냈더니 기존에 작성한 import 문이 불필요해지는 것을 보며, 분리가 잘 되었음을 느낄 수 있었다.
이전 실습 문제들도 메서드를 분리하며 리팩토링 하고 싶지만 다른 작업을 하느라 못해봤는데, 이번 과제를 수행하며 리팩토링 요령을 배울 수 있었다. 기한이 하루만 더 있었다면 더 잘 할 수 있었겠다 싶어 좀 아쉽지만, 나름대로 잘 마무리한 듯하다.

실습 종료 이후에는 발표가 진행되었다. 예전 회고의 배운 점에서 본인이 맞게 풀었는지 검사받고 싶어서 발표를 지원하신 분의 일화를 언급했는데, 이번 실습에서 정확히 같은 생각이 들어 발표를 지원하게 되었다. 덕분에 강사님께서 커피 쿠폰을 보내주셨다. 받은 쿠폰은 다음주 수업 시작 전에 카페에 들러 사용할 생각이다.

발표 안내 페이지

사실 실습 내용에 대해 꼼꼼하게 피드백을 받아보고 싶어서 강사님께 커피 쿠폰 대신 자세한 피드백을 받는 것을 요청드리려 했다. 아래와 같이 피드백 요청사항이 많다보니 이 정도의 꼼꼼한 피드백을 받을 수 있다면 커피 쿠폰을 대신할 수 있을 것 같았다. 이 말씀을 드리기 전에 먼저 쿠폰을 보내주셔서 쿠폰을 받은 채로 피드백을 요청드리게 되었는데, 다음에 비슷한 상황이 오면 먼저 말씀 드려야겠다.

피드백 요청사항

다른 분들의 발표를 들으며 같은 과제이지만 각자 중요하게 생각하고 고민한 부분도 다르고 다양한 것을 시도해본 점이 인상적이었다.

문제 상황

다음으로 이번주에 겪은 여러 문제 상황을 공유한다.

1. 백준에서 틀렸습니다.가 반복됨

  • 설명: 코테 스터디 문제인 백준 1654번 문제에 답을 제출하였는데, chatGPT와 함께 디버깅하며 수정한 이후에도 틀렸습니다.가 반복되었다.

틀렸습니다의 향연

이전에 작성한 파이썬 코드를 참고해봤는데, 오답으로 판정된 자바 코드와 로직이 정확하게 일치했다.

  • 해결 방법: 백준 질문 게시판을 통해 자료형을 int로 설정하여 오버플로우가 발생한 것이 원인임을 파악할 수 있었다. long으로 수정하니 해결되었다. chatGPT가 이걸 찾아내지 못하고 계속 헛소리를 반복하는 바람에 2시간 정도를 날렸다.
  1. 테스트 코드 수업 중 Gradle 빌드 실패
  • 설명: 테스트 코드 수업 중 작성한 테스트 코드를 실행시켰더니 다음과 같이 빌드 실패 메시지가 뜨며 실행되지 않았다.
    빌드 실패
  • 해결 방법: 파일이 저장된 폴더의 위치를 변경
  • 원인: 기존에 수업 코드를 저장하던 폴더의 이름은 한글, 특수문자 대괄호, 공백 등을 포함하고 있었다. 폴더 정렬 순서 등을 편하게 관리하기 위함인데, 프로그램에서 공백이나 특수문자 등을 구분자로 처리하는 경우가 많다보니 이와 같이 파일이나 폴더 이름을 설정하면 예상치 못한 동작을 일으키는 경우가 종종 있다. 따라서 파일이나 폴더의 이름은 되도록 영문자, 특수문자 언더바(_)만 사용하는 것이 좋다.

기존에 코드를 돌릴 때는 별 문제가 없었는데 테스트 코드를 돌리려니 발생한 문제여서, 코드 관리 폴더를 옮기고 기존 폴더에는 코드 관리 폴더에 접근하는 바로가기를 추가하였다. 아래 사진은 폴더 위치를 옮긴 후에 빌드에 성공한 모습이다.

빌드 성공

  1. 테스트 코드를 실행 결과 입력값 null로 테스트 실패
  • 설명: 자료구조 실습 문제의 풀이를 위해 테스트 코드를 작성했는데 다음과 같이 실제 결과가 null이어서 실패하였다.

테스트 실패

작성된 코드를 봤을 때 아무리 봐도 null이 나올 수는 없었기에 좀 이상하다고 생각했다.

public String solution(int n, int k) {
        Queue<Integer> queue = new LinkedList<>();
        StringBuilder sb = new StringBuilder("<");

        for (int i = 1; i <= n; i++) {
            queue.offer(i);
        }

        while (!queue.isEmpty()) {
            for (int i = 1; i < k; i++) {
                queue.offer(queue.poll());
            }
            int out = queue.poll();
            sb.append(out)
                    .append(" ");
        }
        
        return sb.toString()
                       .trim()
                       .replace(" ", ", ") + ">";
    }
  • 해결 방법: 테스트 코드의 import 문을 수정하여 해결
  • 원인: 이전에 회고에서 언급했듯 강사님의 저장소를 pull 받아오는 방식으로 디렉터리를 관리하고 있다. 그래서 텍스트를 복사, 붙여넣기하지 않고 코드 파일을 직접 복사, 붙여넣기하는 방식으로 테스트 코드를 받아왔더니 IntelliJ가 너무나 똑똑한 나머지 기존 디렉터리의 패키지를 인식하여 import 문을 추가하였다. 즉, 테스트 코드는 작성한 코드와 다른 곳을 바라보고 있었다. 아래 사진의 오른쪽과 같이 불필요한 부분을 삭제하여 해결했다.
    문제 해결

느낀 점

  1. AI의 시대에도 기본적인 작동 원리를 잘 이해하는 것은 여전히 중요하다.
    앞의 문제 상황 1번에서는 chatGPT가 문제 해결에 아무런 도움을 주지 못했고, 3번 상황에서는 IntelliJ가 제공해주는 편의 기능으로 인해 예상치 못한 동작을 하게 되었다. AI, IDE 등 생산성을 높여주는 도구가 정말 많이 개발되어 있지만, 효율적으로 잘 활용하고 예상치 못한 동작을 할 때 수습하기 위해서는 기본적인 작동 원리를 잘 파악해야 한다.
  2. GitHub 저장소를 많이 만들어보자.
    앞서 언급한 종합 실습에 대한 코드 리뷰를 주고 받아보고 싶어서 GitHub 저장소를 만들어보았다. 아래 사진은 작성한 REAME 내용이다.
    코드리뷰 저장소 README

혼자 저장소 목적으로 쓸 때는 크게 신경쓰지 않아도 되지만, 함께 사용하기 위한 저장소를 만들다보니 브랜치 보호 규칙, 코드 리뷰 진행 방식 등에 대해서도 고민해야 했다. 이를 위해 GitHub에서 ruleset 설정하는 방법도 찾아보고, 코드 리뷰를 위한 PR을 올리는 과정에서 로컬 저장소의 브랜치 관리에도 신경써야 했기에 공부가 많이 되었다. 앞으로 스터디 또는 프로젝트를 진행할 때 GitHub 저장소를 직접 만들거나, 혹은 관리 규칙 등을 개설자와 함께 고민해볼 생각이다.

  1. 실습 경험을 많이 쌓아야겠다.
    첫 번째 기반기술 프로젝트를 할 때도 느꼈던 점인데, 하나의 프로젝트를 진행하려다보니 앞으로 무엇을 해야하는 지가 정리되지 않아서 코드 창을 바라보며 아무것도 하지 못하는 순간이 종종 온다. 일명 뇌정지가 온 것인데, 규모가 있는 하나의 시스템을 만들어본 적이 거의 없다보니 주어진 일을 어떤 순서로 수행해야 하는 지 결정하는 데 어려움이 있다. 경험치의 부족이 원인일테니 앞으로 경험을 많이 쌓으며 극복해 나가야겠다.

여담

회고 작성을 토요일에 시작하다보니 작성하려던 내용을 까먹어서 나중에 수정하는 일이 잦았다. 이번주에 임시저장 기능을 활용하여 회고에 작성할만한 내용이 생길때마다 키워드를 기록해두니 작성에 많이 도움이 되었다. 매일 회고를 작성하는 수준까지는 아니더라도, 이렇게 키워드를 임시저장해두는 습관을 계속 가져야겠다.

profile
곽진웅, 백엔드 개발자 준비 중

1개의 댓글

comment-user-thumbnail
2025년 3월 10일

AI 를 내 팔처럼 다루시는 경지?!

답글 달기