[TIL] 24일차 _ 일정관리 앱 #3

Seoyeon Lee·2025년 11월 6일

Today I Learned ...

오늘은 코드카타 SQL과 알고리즘 28, 29, 30번 문제를 풀고, 일정관리 앱 프로젝트를 마무리지었다!


🗒️ 코드카타 #17

오늘 진행한 SQL 문제들은 coalesce를 사용해 Null을 처리하고, 카테고리별 개수를 구하고, 특정 값을 가지고 있는 데이터를 구하는 내용이었다.
다 이전에 진행해본 적이 있는 내용들이라 어렵지 않게 해결할 수 있었다.

오늘은 총 3개의 알고리즘 문제를 풀었는데,
첫 번째 문제는 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열을 입력받으면, 배열에 없는 수의 합을 구하는 것이었다.
이건 사실.. 0부터 9까지의 합에서 배열의 합을 빼면서 쉽게 해결할 수 있었다.

두 번째 문제는 입력받은 배열에서 가장 작은 수를 제거하고, 다시 배열을 반환하는 것이었다.
배열을 복제하고, 오름차순으로 정렬하여 가장 작은 수를 찾고, 기존의 배열에서 stream을 사용하여 가장 작은 수를 제외하며 해결했다.
처음으로 내가 원하는대로 스트림을 구현할 수 있게 되었다.

마지막으로 세 번째 문제는 문자열을 입력받으면 가운데 글자만 출력하는 것이었다.
나는 문자열을 char의 배열로 바꾸고, 배열의 가운데 인덱스를 가져와 String으로 바꾸어주었다.
그런데!! 알고보니 String에도 substring() 메서드가 있었고.. 이걸 사용하면 쉽게 해결할 수 있었다.
substring(int beginIndex, int endIndex) 형식으로 사용할 수 있는데, 이때 beginIndex는 포함하고, endIndex는 포함하지 않는다는 점을 주의해야 한다.
이렇게 또 새로운 메서드의 존재를 알았으니.. 다음에 사용해봐야겠다.

각각의 문제와 풀이는 깃허브를 통해 업로드해두었다.
GitHub 보러가기


🖥️ 일정관리 앱 프로젝트 #3

오늘 드디어 일정관리 앱 프로젝트를 완성했다!

여태까지 해결하지 못했던 문제들을 다 해결하고 제출할 수 있었다.
먼저, Request 파라미터로 Long 자료형의 비밀번호를 입력받았을 때 제대로 해결되지 않았던 이유는 동등성과 동일성.. 세션에서 배웠던 ==equals의 차이였다.
나는 Long이라는 참조 타입 변수를 활용했는데, 여기에 원시 타입 변수들을 다루는 ==을 사용하니 제대로 처리되지 않았던 것이다.
equals로 값을 비교하니 아주 쉽게 해결되었다.

Request 파라미터에 존재하지 않는 값을 넣었을 경우에도 if문을 활용하여 적절한 예외를 터뜨려주었다.
join을 활용한 두 테이블의 연관성을 구현해보려고 했지만... 실패했다.
하지만, 이번 주차에서 요구되는 바는 지금처럼 구현하는 것이 맞았고, 테이블 매핑은 다음주 새로운 강의에서 배운다고 한다ㅎㅎㅎ

이외에도 댓글을 조회하고, 수정하고, 삭제하는 API를 구현하여 과제 제출을 마감하였다.
ERD를 수정하는 것을 깜빡해서 뒤늦게 수정하긴 했지만... 그래도 어찌저찌 잘 제출하였다.

그리고 오후에 과제 해설 세션이 진행되었는데, 역시나 request 파라미터를 받았을 때와 받지 않았을 때 더 간결하게 처리하는 방법이 있었다.
SQL의 where과 order by를 사용하는 쿼리 메서드를 생성해서 진행할 수도 있고,
스트림을 활용하여 하는 방법도 있었다.
그놈의 스트림... 사실 스트림을 사용해 구현하고 싶었지만 계속 실패해서 포기했었는데...
스트림 사용 방법에 대해서는 계속 계속 연습해봐야겠다.

또 해설 세션에서 여러가지 깨닫게 된 점들이 있다.
먼저는 예외의 메시지에 대한 것이다.
예외를 터뜨릴 때마다 예외 메시지를 입력하는 것이 굉장히 불편하다고 생각했는데, 이걸 상수로 만들어서 하나의 클래스에 두고, 그때그때 거기에서 가져와서 사용하면 되는 거였다..

또, 예외를 처리할 때 나는 if문에는 예외가 발생하지 않는 경우를, else에는 예외가 발생하는 경우를 넣어줬는데,
이렇게 되면 예외가 발생하는 경우에도 if문의 참일 경우의 코드를 모두 다 읽고 마지막에 예외가 발생하게 된다.
예외가 발생하는 경우를 if문에 넣으면 이후에 동작할 내용들을 읽지 않고 예외를 터뜨리며 메서드를 끝내버릴 수 있다..

그리고, 일정과 댓글의 내용을 수정하고 나서 수정일이 제대로 반환되지 않는 문제가 있었는데, 나는 이걸 수정일을 수동으로 설정하면서 해결해주었었다.
그런데 saveAndFlush() 메서드를 사용하면 트랜젝션 수행 중간에 DB에 접근해 데이터를 수정하고, 수정된 내용을 받아올 수 있었다.
이런 메서드가 있다는 사실을 처음 알았다... 나중에 사용해봐야겠다.

어제 도전과제가 너무 쉽게 해결되어서 찜찜했었는데.. 진짜 내가 문제를 잘못 이해한게 맞았다.
Lv. 7에서 일부 항목들을 필수값으로 처리하라는 요구가 있었는데, 나는 이걸 엔티티에서 nullable = false로만 정해주며 끝냈다.
그런데 사실 사용자의 입력값에 대해 처리하는 내용이기에 Controller 계층에서 관리를 해줘야 했고...
이걸 모르고 그냥 끝내버렸다...
생각 좀 하고.. 헷갈리면 여쭤봐야겠다..

내가 작성한 코드는 깃허브에 업로드해두었다.
GitHub 보러가기


🙃 오늘의 느낀점

매번 과제를 할 때마다 나는 나름 잘했다고 생각하고 제출하는데,,
해설 세션을 들을 때마다 매번 충격을 받고 있다...
정말 그놈의 스트림... 어떻게든 공부해서 마스터할 것이다...

저번에도, 이번에도 계속 문제를 제대로 이해하지 못하고 있는데... 제발 생각을 먼저 하고 행동해야겠다.

profile
백엔드 개발자 지망생

0개의 댓글