처음에는 단순히 목록을 보여주는 기능이었지만,
점점 아래처럼 확장됐다.
keyword로 검색
page로 페이지 이동
검색 + 페이징 동시에 적용
처음엔 기능을 하나씩 따로 구현했는데, 막상 같이 쓰는 순간 복잡도가 확 올라갔다.
기능은 따로 만드는 것보다, 같이 쓸 때를 고려해서 설계해야 한다.
이 문제를 해결하기 위해 Pageable을 도입했다.
class Pageable {
int pageNo;
int pageSize;
}
이건 단순한 객체 추가가 아니라, 생각의 전환이라고 할 수 있다.
기존:
page 따로
size 따로
변경:
Pageable 하나로 관리
기존에는 메모리(List)에 저장했지만 파일로 저장하는 구조로 바꿨다.
파일 생성 / 삭제
JSON ↔ Map 변환
실제 데이터 유지
db 폴더 git에서 제외
테스트 끝나면 temp 폴더 자동 삭제
단순 기능보다 환경 관리가 더 중요하다는 걸 체감했다.
@BeforeEach를 활용해서 테스트마다 데이터를 초기화하도록 만들었다.
이 방법을 사용하지 않으면 테스트가 서로 영향을 줘서 결과가 계속 바뀐다.
테스트는 돌아가는 것보다, 항상 같은 결과가 나오는 게 중요하다는 것을 알 수 있었다.
findById에 Optional을 적용했다.
기존:
if (result != null)
변경:
optional.ifPresent(...)
“값이 없을 수도 있다”는 걸 코드로 강제할 수 있다.
또한 null 체크를 ‘개발자 책임 → 구조 책임’으로 바꾼다.
때문에 Optional은 null을 없애는 게 아니라, null을 안전하게 다루도록 강제하는 도구이다.
단순 문법이 아니라 실수를 줄이기 위한 설계 방식이라는 걸 느낄수 있었다.
이번 구간에서 가장 크게 느낀 건 하나였다.
기능 구현보다 구조와 설계가 더 중요하다.
검색 + 페이징 결합 → 복잡도 증가 경험
Pageable → 설계의 힘 체감
파일 저장소 → 실제 서비스 구조 느낌
테스트 초기화 → 안정성 확보
Optional → 안전한 코드 작성