
부트캠프에 들어온 지 벌써 2개월이 지났다. 9주차 회고를 작성해본다.
Spring Framework에 대해 본격적으로 학습하기 전, 기반기술에 해당하는 서블릿에 대해 학습하였다.
Spring Core와 Spring Boot에 대해 학습하였다. lombok 라이브러리와 Spring 프레임워크를 이용하여, 그동안 Java에서 작성해야 했던 getter, setter, 생성자 등의 반복적인 패턴의 코드를 어노테이션으로 간소화할 수 있었다.
Java를 공부했던 것은 이런 편의 기능을 제공하는 라이브러리, 프레임워크 등의 도구가 작동하는 기본적인 원리를 이해하기 위함이고, 결국 실제 개발에서는 이런 도구들을 잘 활용하면 되겠구나 하는 생각이 들었다.
강의 코드를 돌렸을 때 페이지 내용에 한글을 포함한 경우 내용이 깨지는 경우가 있었다. 이 부분은 아래와 같이 Help > EDIT Custom VM Options 메뉴에서 다음 내용을 작성 후 IntelliJ를 재실행하는 것으로 해결되었다.
-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8

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

동기 한 분께서 코딩 테스트 합격자 되기: 자바 편 책을 함께 학습하는 코테 스터디를 모집하셔서 참가하게 되었다. 앞으로 남은 일정들은 대부분 수업과 프로젝트 준비가 함께 진행되므로 시간을 많이 투자하기는 어렵겠지만, 문제 풀이 감각 유지를 위해 1주일에 5문제 정도라도 꾸준히 풀어보는 것을 목표로 생각 중이다. 스터디 문제를 풀다가 막혔던 부분을 정리해본다.
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()을 이용하면 더 간단하게 코드를 작성할 수 있었다. 저자의 풀이를 변형해보기도 하며 다양한 방법으로 풀어보았는데, 자세한 내용은 여기에서 확인할 수 있다.
스터디 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];와 같이 작성할 수도 있었다.
이번주에 겪은 문제 상황을 정리해본다.
*설명: 코드를 수정하고 IntelliJ의 Run에서 Redeploy나 Restart Server를 선택하여 다시 실행을 눌러도 페이지에 변경사항이 반영되지 않았다.

Redeploy 버튼 클릭
설명: 강의 내용에 따르면 아래의 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로 시작하는 주소를 입력해야 했다. 코드 작성 과정에서 발생한 문제를 해결해보려다가 수업 일부를 놓쳐, IntelliJ가 추천해주는 명령어를 자동 완성했다가 발생하였다.이 외에 Gradle build fail 문제를 겪기도 했는데, 이는 root directory가 잘못 설정된 경우였다.

위의 사진에서 02_spring-web이 아닌 chap01-, chap02- 등의 폴더가 root directory인 상태로 프로젝트를 열면 정상적으로 작동한다.

갈등을 무작정 피하려고 하기보다는 잘 대처하는 것이 가장 좋다.
프로젝트의 진행에 있어 소통은 정말 중요한 부분인데, 이번 프로젝트의 준비 초반에 소통의 부재로 인해 갈등이 발생하였다. 이로 인해 위기가 올 뻔했는데, 지금은 다행히도 잘 수습된 것으로 보인다.
돌이켜봤을 때 오히려 우리 팀이 더 단단해지고, 프로젝트가 잘 진행되기 위한 한 번의 해프닝이었다고 생각한다.
갈등을 피하려고 불편한 점이 발생해도 누군가가 참다보면 그게 쌓여서 결국 더 크게 터질 가능성이 높다. 물론 갈등을 잘 수습하는 것이 쉽지 않지만, 회피하기보다는 그때그때 잘 봉합하는 것이 중요하다는 것을 느꼈다.
Spring Framework 부분에 들어오니 진도가 빨라진 느낌이 든다. 백엔드 개발지를 지망한다면 Spring을 잘 알아두는 것이 중요한 만큼, 수업을 최대한 놓치지 않도록 정신 차리고 들어야겠다.
지난 번에 선정된 우수회고 상품으로는 배민 기프티콘을 받았는데, 이번주 중에 저녁 식사로 잘 사용하였다. 일용할 양식을 선물해준 플레이데이터 측에 감사하다.

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