dev_note/TIL

(최근 본 상품1) 쿠키에 데이터 넣기

jjoylee 2019. 2. 23. 17:47


이번에 최근 본 상품을 최대 5개 보여주는 기능을 개발하는 이슈를 맡게 되었습니다.


* 최근 본 상품 데이터를 저장하는 방법


1. DB에 테이블을 만들어서 데이터를 저장한다.

2. Session에 데이터를 저장한다.

3. Cookie에 데이터를 저장한다.


저는 이 셋 중 쿠키에 최근 본 상품 데이터를 넣어서 화면에 보여주는 방법을 선택했습니다.


* 쿠키에 데이터를 넣는 프로세스


1. Client가 상품 페이지를 요청한다.

2-1. 최근 본 상품 정보를 저장한 쿠키가 존재하지 않으면 정보를 담을 모델 형식의 빈 리스트를 만든다. 

2-2. 최근 본 상품 정보를 저장한 쿠키가 존재한다면(JSON) 해당 정보를 꺼내서 모델 리스트로 변환한다.    

3. 해당 페이지의 상품과 url 정보를 모델로 만들어 리스트에 넣는다. 

4. 리스트를 JSON형식으로 변환한다.

5. 쿠키에 JSON 데이터를 넣는다.

6. 쿠키를 Client에 전달한다.


* ASP.NET에서 쿠키 작업하기


HttpRequestBase.Cookies, HttpResonseBase.Cookies 프로퍼티로 쿠키를 다뤘습니다. 

HttpRequestBase.Cookies에는 클라이언트 브라우저에 저장되어있는 쿠키 정보가 담겨있습니다. 

주로 서버에서 데이터를 읽기 위한 용도로 사용됩니다.

HttpResponseBase.Cookies는 사용자의 브라우저에 새로운 쿠키를 저장하거나, 

이미 있는 쿠키의 정보를 변경하기 위해 사용합니다. 


클라이언트가 상품 페이지를 요청하면

Controller에서 상품 페이지 View를 반환하기 전에 제가 만든 서비스 객체의 함수를 호출하고

서비스 객체에서 쿠키에 데이터를 저장하도록 하였습니다.


* Model (RecentlyViewedItem)


최근 본 상품을 정보를 저장하기 위한 모델로 상품명, 상품ID, request의 url 정보를 넣기 위한 속성을 가지고 있습니다.

 

* Service(RecentlyViewedService) 메소드 설명


1. GetRecentlyViewedItemFromCookie

request 쿠키에 들어있는 최근 본 상품 정보를 List<RecentlyViewedItem>로 만들어 반환하는 함수

쿠키에 데이터를 넣는 프로세스에서 2번 과정을 처리


// RecentlyViewed라는 이름의 쿠키에 최근 본 상품 정보를 저장

- request.Cookies["RecentlyViewed]와 request.Cookies{"RecentlyViewed"].Value가 null 또는 빈 값인지 isCookieExist 메소드에서 체크


- false일 경우 return new List<RecentlyViewedItem>() // 빈 리스트 반환


- true일 경우 

request.Cookies{"RecentlyViewed"].Value에 담겨있는 json 데이터를 

json.net 라이브러리를 사용하여 List<RecentlyViewedItem>으로 Deserialize

Deserialize한 List 반환


그런데 한가지 문제가 발생할 수 있습니다. 의도치 않게 RecentlyViewed Cookie에 json형식이 아닌 데이터가 들어가면 deserialize 할 때 Exception이 발생합니다. 하여 try - catch 문을 사용해 Exception이 발생하면 빈 리스트를 반환하도록 했습니다.


2. SetRecentlyViewedItemsInCookie

GetRecentlyViewedItemFromCookie 메소드에서 반환받은 리스트에 최근 본 상품 정보를 새로 추가하는 함수로 3번 과정을 처리합니다. 새로운 RecentlyViewedItem 객체를 만들어 데이터를 넣은 후 list에 Add합니다.