본문 바로가기
프로젝트/자리 있어요?

[Refactoring] 22.08.08. 검색 메인 페이지

by 규글 2022. 8. 8.

검색 메인 페이지

구성

로고

  1. 누르면 기본 main page로 돌아올 수 있다.

검색

  1. home page에서와 마찬가지로 검색을 할 수 있다.
  2. 검색한 내용은 검색창에 남는다.

검색 결과

  1. 검색 결과를 띄워준다. 한 페이지 당 최대 8개의 항목을 볼 수 있다.
  2. Card에는 매장의 대표 이미지와 상호명, 주소, 평균 별점을 확인할 수 있다.
  3. 검색 결과의 card를 클릭하면 해당 매장의 상세 페이지로 이동한다.

네비게이션 바

  1. 클릭하면 네비게이션 바가 우측에서 나온다.
  2. 마이 페이지로 이동할 수 있다.
  3. 매장 관리 페이지로 이동할 수 있다.
  4. 새 매장 정보를 생성할 수 있다.
  5. 로그아웃을 할 수 있다.

페이징

  1. 한 페이지에 최대 8개의 매장 정보를 볼 수 있다.

footer

  1. 그냥 footer이다. Front를 맡아주었던 팀원들이 만들어두었다.

 

코드 뜯어보기

StoreController.java

  • getList(main 요청)

 메인 페이지 이동에 대한 controller의 method이다. 가장 처음 main page로 올 수 있는 방법은 home page에서 검색을 했을 경우이다. 그리고 또 다른 main page로 올 수 있는 방법은 상단의 logo를 누르는 경우나, 또다른 검색을 했을 경우이다. 그래서 검색한 내용을 요청 경로에 query로 달고 가는데, 해당 내용을 가져오기 위해서 dto에 넣어준 후 response를 하는 logic을 생각했다.

 해당 내용은 필자가 작성한 부분인데, 처음에는 request scope에 data를 담아서 return 했을텐데 왜 session scope에 담았는지 의문이다. 추정하기로는 이런 저런 기능들이 합쳐지면서 관련 오류가 발생했고, 해당 내용을 급하게 수정하기 위한 방책이었던 것 같다. 예를 들면 로그아웃 시, 기존의 검색 내용을 잃어버리도록 redirect를 걸어두었기때문에 발생하는 검색 내용 초기화 같은 이유였을 것이다. 하단의 UserController.java의 logout 부분을 보면 request 객체의 getHeader( ) method를 사용, 안에 "referer" 를 전달해주면 어떤 곳에서 request를 요청했는지 알 수 있다. 때문에 session scope 대신 request scope로 searchData를 넘겨주어도 될 것 같다.

 

 Service 단의 getList method에서는 마땅히 수정하고 싶은 것이 없었으나, 바로 이어서 나오는 getMyStores method에서는 또다시 session scope를 사용하고 있다. 이유는 navigation bar에서 계속해서 해당 email(아이디)로 관리하고 있는 매장의 목록에 대한 정보를 가지고 있어야하기 때문이다. 만약 사용자가 많아지면 session scope 를 사용하는 양이 많아질 것이고, 그러면 server에 부하가 올 것 같다. 매 요청에 대해 Request 객체에 같은 data를 넘겨주는 것이 번거롭다고 생각했었는데, session에 부하를 주는 것 보다는 낫다는 생각이 든다. 하지만 보다 좋은 방법이 있을 것 같다. 당장 생각나는 것은 AOP를 이용하는 방법이다. 일단은 session scope를 이용하는 항목에 대해 일단 request scope를 사용하도록 바꾸었다.

 

  • addStore

 매장을 새로 추가하는 요청에 대한 controller의 method이다. 바로 직전에 수정한 HttpSession 객체의 사용이 변동되어서 전달되는 객체를 지워주었다. 그리고 Map 객체에 정보를 담는 내용이 있어서 그것을 service 단으로 넘겨주려고 한다.

 

 새로운 매장 정보를 추가함과 동시에, 해당 매장 정보를 바로 front 단에 반영하기 위해 새로 만든 매장 data를 front에 전달해야 한다. 그 과정에서 data list의 size에서 1을 빼는 방식으로 새로 들어간 마지막 index의 data를 가져왔는데, 이는 따로 마지막 element에 대한 index를 얻는 method가 존재하지 않기 때문이다. 전체 list size에서 1을 뺀 것이 마지막 index가 된다. 그리고 해당 매장 번호를 자리를 관리하는 DB의 num column에 넣어 새로 만들어준다.

 이곳에서는 이미 service 단에서 작성한 getMyStores method 에서의 logic이 그대로 있기 때문에 void로 return 되는 method를 Map 으로 return 하도록 하여 data를 넣어주었다. 그리고 해당 response도 나뉘도록 해두었다.

 

UsersController.java

  • logout

 

 사실 로그아웃의 경우, 어디에서 로그아웃을 하더라도 보고 있던 검색 내용은 그대로 확인할 수 있어야하는 것이 당연하다. 그냥 일반적인 요청보다 직전 경로를 요청하도록 하는 것이 맞다. HttpServletRequest 객체의 getHeader( ) method를 통해 다양한 정보를 알 수 있을텐데, "referer" 의 정보를 얻어보면 기존 요청을 한 위치의 url 정보를 알 수 있다. 그리고 역시나 ModelAndView 객체를 전달받을 필요도 없고, 해당 type으로 return 할 필요도 없어서 지우고 String으로 바꿔주었다.

 신경써야할 점은 계정 소유주만이 이용할 수 있는 곳에서 활동하다가 로그아웃을 했을 때, 지금처럼 분기하지 않았을 때 오류가 발생한다. 왜냐하면 해당 접근 권한이 없는 것이 아니라 session 정보가 없어서 data를 가져오지 못하기 때문이다. 아마 해당 요청 사항에 대한 Filter가 없는 것 같아 일단은 분기를 해두었다. 이 부분에 대해서 service 단에서 작성해야하는지에 대한 궁금증이 생기긴 한다.

 

댓글