BEYOND SW 캠프 15기 9주차 회고

mijuckboon·2025년 3월 23일
post-thumbnail

부트캠프에 들어온 지 벌써 2개월이 지났다. 9주차 회고를 작성해본다.

학습 내용

1. Servlet

Spring Framework에 대해 본격적으로 학습하기 전, 기반기술에 해당하는 서블릿에 대해 학습하였다.

2. Spring

Spring Core와 Spring Boot에 대해 학습하였다. lombok 라이브러리와 Spring 프레임워크를 이용하여, 그동안 Java에서 작성해야 했던 getter, setter, 생성자 등의 반복적인 패턴의 코드를 어노테이션으로 간소화할 수 있었다.
Java를 공부했던 것은 이런 편의 기능을 제공하는 라이브러리, 프레임워크 등의 도구가 작동하는 기본적인 원리를 이해하기 위함이고, 결국 실제 개발에서는 이런 도구들을 잘 활용하면 되겠구나 하는 생각이 들었다.

IntelliJ 콘솔 깨짐 문제

강의 코드를 돌렸을 때 페이지 내용에 한글을 포함한 경우 내용이 깨지는 경우가 있었다. 이 부분은 아래와 같이 Help > EDIT Custom VM Options 메뉴에서 다음 내용을 작성 후 IntelliJ를 재실행하는 것으로 해결되었다.

-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8

메뉴 위치

이전에 여러 방법을 적용해보고도 한글 깨짐 문제가 해결되지 않아 Build Tool을 Gradle이 아닌 IntelliJ로 변경하는 방식을 사용했는데, 그 방식에서는 실행 후에 확인되는 UI가 조금 달라졌다. 수업시간에 배운 방법을 이용하니 Gradle 기능 활용에도 문제가 없어서 좋았다.
Build Tool 변경 방법

코테 스터디

동기 한 분께서 코딩 테스트 합격자 되기: 자바 편 책을 함께 학습하는 코테 스터디를 모집하셔서 참가하게 되었다. 앞으로 남은 일정들은 대부분 수업과 프로젝트 준비가 함께 진행되므로 시간을 많이 투자하기는 어렵겠지만, 문제 풀이 감각 유지를 위해 1주일에 5문제 정도라도 꾸준히 풀어보는 것을 목표로 생각 중이다. 스터디 문제를 풀다가 막혔던 부분을 정리해본다.

1. toArray() 메서드

스터디 2번 문제는 int[] 배열에서 중복값을 제거하고 데이터를 내림차순으로 정렬해서 반환하는 문제였는데, 그 과정에서 형변환이 문제가 되었다.
1. 기본 자료형인 int에 대해 Comparator를 사용할 수 없다.
2. set.toArray()를 거치면 Object[] 배열이 반환된다.

위와 같은 문제를 극복하는 과정에서 아래와 같은 코드가 완성되었다.

private static int[] solution(int[] arr) {
    Set<Integer> set = new HashSet<>();
    for (int num : arr) {
        set.add(num);
    }

    return Arrays.stream(set.toArray())
            .map(x -> (Integer) x)
            .sorted(Comparator.reverseOrder())
            .mapToInt(x -> x)
            .toArray();
}

나중에 확인해보니 Arrays.stream을 이용하지 않고 set.stream()을 이용하면 더 간단하게 코드를 작성할 수 있었다. 저자의 풀이를 변형해보기도 하며 다양한 방법으로 풀어보았는데, 자세한 내용은 여기에서 확인할 수 있다.

2. generic array creation

스터디 13번 문제를 풀이하는 과정에서 스택의 배열을 만드는 일이 필요했는데, Stack<Integer>[] lines = new Stack<Integer>[board[0].length];와 같이 작성하니 generic array creation이라는 문구가 뜨며 코드가 실행되지 않았다.
generic 배열의 생성을 허용하지 않는 점을 극복하기 위해 List<Stack<Integer>> lines = new ArrayList<>();와 같이 바꾸어서 코드를 작성했는데, 나중에 저자의 풀이를 확인해보니 배열 앞에 generic을 주지 않고 Stack<Integer>[] lines = new Stack[board[0].length];와 같이 작성할 수도 있었다.

문제 상황

이번주에 겪은 문제 상황을 정리해본다.

1. 페이지 변경 사항이 반영되지 않음

*설명: 코드를 수정하고 IntelliJ의 Run에서 RedeployRestart Server를 선택하여 다시 실행을 눌러도 페이지에 변경사항이 반영되지 않았다.
해당 메뉴

  • 해결 방법: Service 쪽의 Redeploy 버튼 클릭
    해결
    Servlet에 대응되는 주소를 변경한 경우에는 Run 단계에서 재배포를 해도 변경 사항이 적용되지 않는 것으로 보인다. Service 메뉴의 redeploy 기능을 통해 해결할 수 있었다.

2. 오류 페이지가 수정되지 않음

  • 설명: 강의 내용에 따르면 아래의 expected와 같이 수정된 오류 페이지가 나타나야 하는데, actual과 같이 기본 오류 페이지의 메시지만 변경된 형태의 페이지가 나타났다.
    오류 페이지 커스텀 실패

  • 해결 방법: 아래의 코드에서 javax를 모두 jakarta로 수정

int statusCode = (int)req.getAttribute("javax.servlet.error.status_code");
        String message = (String)req.getAttribute("javax.servlet.error.message");
        String servletName = (String)req.getAttribute("javax.servlet.error.servlet_name");
  • 원인: 수업 상황에서는 Jakarta EE 프로젝트를 사용하므로 jakarta로 시작하는 주소를 입력해야 했다. 코드 작성 과정에서 발생한 문제를 해결해보려다가 수업 일부를 놓쳐, IntelliJ가 추천해주는 명령어를 자동 완성했다가 발생하였다.
    디버깅하기 어려운 유형의 실수여서 옆 자리 조원 및 강사님께서도 원인을 찾기 어려워하셨다. 같은 실수를 반복하지 않도록 주의해야겠다.

이 외에 Gradle build fail 문제를 겪기도 했는데, 이는 root directory가 잘못 설정된 경우였다.
build fail
위의 사진에서 02_spring-web이 아닌 chap01-, chap02- 등의 폴더가 root directory인 상태로 프로젝트를 열면 정상적으로 작동한다.

3. 강설로 인한 지하철 지연

  • 설명: 화요일에는 눈이 오는 바람에 지하철 운행이 지연되었다. 평소보다 10-20분 정도 더 소요된 듯하다.
  • 해결 방법: 필자의 경우 개인적 사정으로 평소 강의 시작 시간보다 20-30분 정도의 여유를 두고 입실하고 있다.
    출석 기록
    필자는 시간 약속을 중시하는 사람이어서 직장인이던 시절에도 출근 시간을 칼 같이 지키려고 노력했다. 변수에 대응할 수 있도록 여유 시간을 두었기에 지각을 거의 안했지만, 강설 등의 변수가 발생하면 지각하는 경우가 간혹 있었다. (당시에는 여유 시간을 요즘만큼 길게 잡진 않았었다.)
    이번에는 지하철 지연 외에도 한 가지 변수가 더 있었는데, 여유 시간을 충분히 확보한 덕에 2가지 변수가 동시에 발생하고도 지각을 피할 수 있었다. 회사 생활을 하게되면 근태를 포함한 기본적인 태도가 중요하게 여겨지므로, 취업을 하게 되면 요즘처럼 출근에 충분한 여유 시간을 확보할까 한다.
    물론 평소에 근태를 잘 챙긴다면 강설 등의 사유로 인한 지각은 이해받을 수 있지만, 이런 경우조차 지각을 피하여 그 횟수를 최소화한다면 더 좋은 평가를 받을 수 있을 것이다.

느낀 점

  1. 갈등을 무작정 피하려고 하기보다는 잘 대처하는 것이 가장 좋다.
    프로젝트의 진행에 있어 소통은 정말 중요한 부분인데, 이번 프로젝트의 준비 초반에 소통의 부재로 인해 갈등이 발생하였다. 이로 인해 위기가 올 뻔했는데, 지금은 다행히도 잘 수습된 것으로 보인다.
    돌이켜봤을 때 오히려 우리 팀이 더 단단해지고, 프로젝트가 잘 진행되기 위한 한 번의 해프닝이었다고 생각한다.
    갈등을 피하려고 불편한 점이 발생해도 누군가가 참다보면 그게 쌓여서 결국 더 크게 터질 가능성이 높다. 물론 갈등을 잘 수습하는 것이 쉽지 않지만, 회피하기보다는 그때그때 잘 봉합하는 것이 중요하다는 것을 느꼈다.

  2. Spring Framework 부분에 들어오니 진도가 빨라진 느낌이 든다. 백엔드 개발지를 지망한다면 Spring을 잘 알아두는 것이 중요한 만큼, 수업을 최대한 놓치지 않도록 정신 차리고 들어야겠다.

여담

  1. 지난 번에 선정된 우수회고 상품으로는 배민 기프티콘을 받았는데, 이번주 중에 저녁 식사로 잘 사용하였다. 일용할 양식을 선물해준 플레이데이터 측에 감사하다.
    당신의 기프티콘 치킨으로 대체되었다.

  2. 부트캠프에 들어온 이후로 가장 잘 쉰 주인 듯하다.
    그동안 블로그 회고 작성, 복습 등을 진행하느라 주말도 대부분을 공부로 보냈는데, 이번 주말에는 2개월 만에 처음으로 친구들을 만나 보냈다. 또, 평일 중 하루는 평소보다 일찍 잠들기도 했다. 복습, 프로젝트 준비, 코테 스터디 문제 풀이 등을 하느라 아주 푹 쉬진 못했지만, 그동안 지내온 것과 비교해보면 이번주는 휴식주였다고 생각한다.
    물론 열심히 하는 것도 좋지만 번아웃이 오지 않으려면 충분히 잘 쉬어주는 것 또한 매우 중요하다. 열심히 하는 것과 휴식 사이의 적정 선을 잘 유지해봐야겠다.

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

0개의 댓글