스프링부트+jsp로 배달사이트 만들기-24 찜하기(비회원)
2021. 12. 10. 23:12ㆍ스프링부트
비회원의 찜 목록 쿠키를 관리할 클래스를 util패키지에 생성합니다
CookieManager
public class CookieManager {
public String findCookie(String cookieName) throws Exception {
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
Cookie[] cookies = attr.getRequest().getCookies();
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals(cookieName)) {
return URLDecoder.decode(cookies[i].getValue(), "UTF-8");
}
}
return null;
}
public void likes(long storeId) throws Exception {
final String LIKES_LIST = "LIKES_LIST";
String cookie = findCookie(LIKES_LIST);
List<Long> list = new ArrayList<>();
if(cookie == null) {
list.add(storeId);
addCookie(LIKES_LIST, list.toString());
System.out.println("찜 목록 = " + list);
return;
}
StringTokenizer st = new StringTokenizer(cookie, ", ");
while(st.hasMoreTokens()) {
list.add(Long.parseLong(st.nextToken()));
}
if(list.contains(storeId)) {
list.remove(storeId);
} else {
list.add(storeId);
}
if(list.size() == 0) {
addCookie(LIKES_LIST, "");
} else {
addCookie(LIKES_LIST, list.toString());
}
System.out.println("찜 목록 = " + list);
}
public void addCookie(String name, String value) throws Exception {
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
cookie.setMaxAge(60 * 60 * 24 * 30);
attr.getResponse().addCookie(cookie);
}
}
likes 메서드를 호출하면 findCookie메서드를 호출해 이름이 LIKES_LIST인 쿠키를 찾습니다
","를 구분자로 배열을 만들고 배열에 가게번호가 있다면 remove 없다면 add합니다
리스트를 다시 문자열로 변환후 addCookie를 호출합니다
addCookie는 리스트 [1, 2, 3]에서 replaceall로 괄호를 제거 후 쿠키에 저장합니다 => 1, 2, 3
컨트롤러에서 비회원시 호출할 메서드를 추가합니다
public class CookieManager {
public String findCookie(String cookieName) throws Exception {
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
Cookie[] cookies = attr.getRequest().getCookies();
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals(cookieName)) {
return URLDecoder.decode(cookies[i].getValue(), "UTF-8");
}
}
return null;
}
public void likes(long storeId) throws Exception {
final String likesList = "LIKES_LIST";
String cookie = findCookie(likesList);
List<Long> list = new ArrayList<>();
if(cookie == null) {
list.add(storeId);
addCookie(likesList, list.toString());
System.out.println("찜 목록 = " + list);
return;
}
StringTokenizer st = new StringTokenizer(cookie, ", ");
while(st.hasMoreTokens()) {
list.add(Long.parseLong(st.nextToken()));
}
if(list.contains(storeId)) {
list.remove(storeId);
} else {
list.add(storeId);
}
if(list.size() == 0) {
addCookie(likesList, "");
} else {
addCookie(likesList, list.toString());
}
System.out.println("찜 목록 = " + list);
}
public void addCookie(String name, String value) throws Exception {
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
value = value.replaceAll("[\\[\\]]", "");
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
cookie.setMaxAge(60 * 60 * 24 * 30);
cookie.setPath("/");
attr.getResponse().addCookie(cookie);
}
}
하트표시를 위해 storeDetail메서드의 비회원 부분을 추가합니다
@GetMapping("/store/detail/{id}")
public String storeDetail(@PathVariable long id, Model model, @AuthenticationPrincipal LoginService user) throws Exception {
long userId = 0;
if(user != null) {
userId = user.getUser().getId();
} else {
CookieManager cm = new CookieManager();
String likesList = cm.findCookie("LIKES_LIST");
if(likesList == null ) {
model.addAttribute("isLikes", false);
} else {
String[] arr = likesList.split(", ");
boolean isLikes = Arrays.asList(arr).contains(id+"");
model.addAttribute("isLikes", isLikes);
}
}
StoreDetail storeDetail = storeService.storeDetail(id, userId);
model.addAttribute("store", storeDetail);
return "store/detail";
}
배열에 가게번호가 있다면 true 없다면 false를 화면에 전달합니다
StoreDetail.jsp에서 하트표시 if문에 isLikes를 추가합니다
찜한 가게 목록을 불러올 컨트롤러에 비회원용 코드를 추가합니다
// 찜한 가게 목록
@GetMapping("/likes/store")
public String likes(Model model, @AuthenticationPrincipal LoginService user) throws Exception {
long userId = 0;
List<Store> likesList = new ArrayList<>();
if (user == null) {
CookieManager cm = new CookieManager();
String likes = cm.findCookie("LIKES_LIST");
if(likes != null && !"".equals(likes)) {
likesList = storeService.likesListNonUser(likes);
}
} else {
userId = user.getUser().getId();
likesList = storeService.likesList(userId);
}
model.addAttribute("likesList", likesList);
return "/store/likes";
}
StoreService
List<Store> likesListNonUser(String likes);
StoreServiceImp
@Override
public List<Store> likesListNonUser(String likes) {
return storeDAO.likesListNonUser(likes);
}
StoreDAO
List<Store> likesListNonUser(String likes);
StoreDAOImp
@Override
public List<Store> likesListNonUser(String likes) {
return sql.selectList("store.likesListNonUser", likes);
}
StoreMapper
<select id="likesListNonUser" resultType="Store">
WITH R_COUNT AS (
SELECT R.STORE_ID
,ROUND(R.SCORE, 1) SCORE
,R.REVIEW_COUNT
,R.BOSS_COMMENT_COUNT
FROM
(SELECT STORE_ID
,AVG(SCORE) SCORE
,COUNT(REVIEW_CONTENT) REVIEW_COUNT
,COUNT(BOSS_COMMENT) BOSS_COMMENT_COUNT
FROM BM_REVIEW GROUP BY STORE_ID ) R
),
STORE AS (
SELECT S.*
,T.*
,CASE WHEN MOD(24 - S.OPENING_TIME + S.CLOSING_TIME, 24) != 0 THEN MOD(24 - S.OPENING_TIME + S.CLOSING_TIME, 24) ELSE 24 END BS_TIME
FROM BM_STORE S
LEFT JOIN R_COUNT T
ON S.ID = T.STORE_ID
WHERE ID IN(${likes })
)
SELECT * FROM
(SELECT C.*
,'true' IS_OPEN
FROM STORE C
WHERE (TO_CHAR(SYSTIMESTAMP, 'HH24')
BETWEEN OPENING_TIME
AND OPENING_TIME + BS_TIME)
UNION ALL
SELECT C.*
,'false' IS_OPEN
FROM STORE C
WHERE (TO_CHAR(SYSTIMESTAMP, 'HH24')
NOT BETWEEN OPENING_TIME
AND OPENING_TIME + BS_TIME )
)
</select>
likesList쿼리에서 BM_LIKES테이블과 조인 하는 부분을 WHERE ID IN(${likes })으로 변경했습니다
'스프링부트' 카테고리의 다른 글
스프링부트+jsp로 배달사이트 만들기-27 관리자 가게상세/AOP (1) | 2021.12.17 |
---|---|
스프링부트+jsp로 배달사이트 만들기-25 매장검색 (2) | 2021.12.11 |
스프링부트+jsp로 배달사이트 만들기-23 찜한 가게 목록 (0) | 2021.12.10 |
스프링부트+jsp로 배달사이트 만들기-22 찜하기(회원) (0) | 2021.12.10 |
스프링부트+jsp로 배달사이트 만들기-21 인터셉터로 주소 불러오기 (0) | 2021.12.10 |