토이 프로젝트 기록-여러 기능 구현
현재까지의 진척
이전의 프로젝트를 했을 때와 같이 기능을 하나씩 구현하다 보니 어느새 어느정도 구현이 완료되었다. 현재까지의 구현은 HttpSession을 활용한 로그인 구현, 아이템과 회원의 CRUD 구현, 상품과 회원 등록 페이지 구현, 메인과 로그인 회원의 메인페이지 분리 등등이 되었다.
중간에 테스트 코드도 짜고 CI/CD도 구현하느라 옆길로 빠져서 시간을 좀 많이 썼지만 싸피 준비가 끝나고 다시 시작하기로 했다. 예외 처리는 어떻게 할지 고민이 많다.
가장 최근에 구현한 것은 메인 화면에서 상품 목록 페이지를 구현한 것이다. 원래는 Repository에서 findAll 메서드로 받아오려 했었다.
@Override
public List<Item> findAll() {
String sql="select * from item";
return jdbcTemplate.query(sql,ItemRowMapper());
} //원래 사용하려 했던 메서드
그런데 생각해보니 물론 지금은 실습이라 일어나지 않을 일이지만 상품의 경우 수십, 수백만 개가 등록될 수도 있는 도메인이다. 그러므로 이것을 list로 받는 것은 메모리 상 크게 문제가 생길 수도 있는 부분이라 느꼈다. 따라서 새로운 방법을 생각해내야 했는데 DB에서 페이지 단위로 받아오는 방법을 생각했다.
@Override
public List<Item> findPage(int curPage) {
String sql="select * from item order by upload_date DESC LIMIT " + String.valueOf(8*(curPage-1)) + ",8";
return jdbcTemplate.query(sql,ItemRowMapper());
}
SQL의 LIMIT, ORDER BY 문을 사용하여 페이지 당 8개만, 최신 순으로 긁어오도록 하는 메서드를 새로 만들었다.
또한 기존의 폼에서 사용하던 itemDTO와 달리 위의 메서드로 긁어온 8개의 받아 View로 전달할 객체가 새로 필요했다.
@Getter
@Setter
public class ItemPage {
int curPage=1;
List<Integer> pages=new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9));
List<Item> items;
public ItemPage(List<Item> items) {
this.items = items;
}
}
메인 페이지 또한 url 뒤에 PathVariable로 페이지 번호를 받도록 맵핑을 수정했고, model에 위 ItemPage 객체를 페이지 번호에 맞는 아이템들을 받아와 생성하고 넣어주었다.
다행히 테스트 결과 잘 작동하는 것 같았다. 이제 상품 이미지가 보이도록 프론트를 처리해주고 예외 처리에 대해 고민해봐야겠다.
프론트도 처음에 걱정했던 것과 달리 템플릿을 가져다가 html과 css를 알음알음 배우면서 하나씩 타임리프로 고쳐나가니 어떻게든 생각한 대로 나오는 것 같다. 자바 공부와 인프런 강의도 들을 걸 생각하면 할게 많지만 틈틈히 꾸준히 하자.