[TIL] 32일차 _ 일정관리 앱 Dev #7

Seoyeon Lee·2025년 11월 18일

Today I Learned ...

오늘은 코드카타 SQL과 알고리즘 46-47번 문제를 풀고, 일정관리 앱 Dev 과제의 Lv. 7, 8을 진행했다!


🗒️ 코드카타 #25

오늘은 2개의 SQL 문제를 풀었는데, 한 문제는 2가지 조건을 가지고 데이터를 출력하는 것이고, 한 문제는 *를 사용해 전체 데이터를 출력하는 것이었다.
오늘의 SQL 문제들은 정말 정말 쉽게 해결할 수 있었다.

오늘은 총 2개의 알고리즘 문제를 풀었다.
첫 번째 문제는 영어와 숫자가 섞인 문자열에서 영어를 숫자로 바꾸어 반환하는 것이었다.
문제 접근 자체는 이전에 String.replace()를 다뤄본 적이 있었기 때문에 어렵지 않게 할 수 있었다.
그런데!! replace 함수가 원래 있던 값을 변경하지는 않기 때문에, String changed = original.replace()처럼 반환할 변수를 지정해줘야 한다는 사실을 처음 알았다..
처음에는 위 예시처럼 반환할 변수와 기존의 변수를 다르게 설정했는데,
이렇게 하니 매번 새롭게 replace를 실행하게 되고, 그러니 아무리 반복해도 결국 마지막 숫자인 'nine'을 9로 바꾸는 것밖에 진행이 안 되고 있었다.
생각을 바꾸어 original = original.replace()로 실행을 해주니, 변경된 결과가 원본 문자열에 적용되고, 또 다음 내용을 변경하며 정답을 도출해낼 수 있었다.
앞으로 메서드를 찾아볼 때는.. 매개변수에 뭘 넣어야될지만 보지 말고.. 반환이 어떻게 되는지도 보아야겠다..

그리고 오늘 푼 두 번째 문제는 문자열 배열을 입력받으면, 2번째 문자의 알파벳 순서대로 정렬하고, 만약 2번째 문자가 같다면 전체 문자의 알파벳 순서로 정렬하는 것이었다.
어제 과제를 하면서 2가지 기준을 가지고 정렬하는 것은 이미 해봤기 때문에, 접근 자체는 어렵지 않게 할 수 있었다.
그런데... 어제 내가 한 것은 stream을 사용하는 방법이었고, Arrays.sort()를 활용해서 2가지 이상의 기준을 사용하려면 훠어얼씬 더 복잡했다...
stream을 사용하지 않고 문제를 해결해보려고 했지만,, 실패하여 결국 stream을 통해 문제를 해결했다.
다른 사람의 풀이를 보니, 아예 2번째 문자를 문자열의 맨 앞에 두고, 통째로 사전순으로 정렬하면 되는 것이었다...
이런 방법은 생각보 못해봤는데,, 창의력을 좀 더 길러봐야겠다..

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


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

오늘은 어제 마무리하지 못했던 Lv. 7의 내용들을 마무리하고, Lv. 8의 페이징을 진행했다!!

페이징은 이미 JPA에서 편리하게 사용할 수 있도록 관련 인터페이스들을 만들어두었기 때문에,
나는 방법만 배워서 사용하기만 하면 됐다!

관련 인터페이스와 클래스에는 크게 3가지가 있는데,
먼저 페이징 기능을 구현하게 하는 인터페이스인 Pageable이다.
Pageable는 페이지의 번호(page), 크기(size), 정렬(sort) 정보를 담고 있어서 내가 크기와 정렬 기준만 지정해주면 그대로 구현해준다.

만약 위 3가지 내용 외에도 더 구체적인 내용을 사용하고 싶다면 Pageable의 구현체인 PageRequest 클래스를 사용하면 된다.
이 클래스에는 페이지의 번호, 크기, 정렬 기준으로 객체를 생성하게 하는 메서드 외에도 현재 페이지 번호나 시작 위치, 정렬 정보, 다음 페이지의 내용 등을 반환해주는 메서드들이 있다.
그래서 간단하게만 사용한다면 Pageable 인터페이스 그대로, 구체적인 로직을 구현한다면 PageRequest 객체를 통해 사용하면 된다.

이제 어떻게 페이징할 것인지를 지정했으면, 이 내용을 사용자에게 반환해주어야 하는데, 이때 사용하는 것이 Page 객체이다.
Page 객체는 데이터 리스트 뿐만 아니라 페이징 메타데이터, 즉 전체 페이지 수나 데이터 수, 현재 페이지 번호 등등을 담아서 반환해준다.
만약 이 중 데이터 리스트만 보고 싶거나 페이지 수만 보고 싶거나 한다면 관련된 메서드를 사용하면 된다.

페이징을 사용하기 위해서는
1. Repository 계층 : findAll() 메서드의 반환값에 Page를 감싸기, Pageable 파라미터로 설정
2. Service 계층 : PageRequest 객체 생성해 리포지토리에 전달
3. Controller 계층 : 쿼리 파라미터로 페이지 번호와 크기, 정렬 등 입력받아 서비스에 전달
위와 같은 순서로 로직을 구성해주면 된다.

자세한 내용과 예시는 노션을 통해 정리해두었다.

사실 페이징은 이미 구현이 되어있는 내용이고, 나는 가져다가 쓰기만 하면 되는 것이었기에 Lv. 8의 내용을 완성하기까지 큰 어려움이 있지는 않았다.

이제 과제 끝났다! 생각하고 코드 리팩토링을 시작했는데...!
정말 수정하거나 추가해야할 내용들이 너무 너무 너무 많았다...
그리고... 테스트를 해보다 보니 처리하지 못한 예외들도 있더라...흑

오늘 마무리짓고 싶었지만,, 아직 어떻게 해결해야할지 감을 못잡았기 때문에.. 내일 해야겠다,,
내일은 진짜 남은 트러블슈팅 끝내고, 리팩토링 다시 하고, API 명세서 수정하고... 과제를 마무리 해야겠다.

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


🙃 오늘의 느낀점

드디어 과제를 끝냈다고 생각했는데!!!!!
수정할게 너무 너무 너무 너무 너무 많다...
아직 과제 제출 마감일까지 조금 남아있으니까,, 꼼꼼하게 확인하고 제출해야겠다...

profile
백엔드 개발자 지망생

0개의 댓글