티스토리 뷰

dev_note/TIL

(최근본상품2)Problem Solving

jjoylee 2019. 2. 23. 19:17

* View에서 RenderAction 사용 시 발생한 문제


뷰에서 최근 본 상품 정보를 보여주기 위해 Html.RenderAction 메소드를 사용했습니다.

뷰에서 컨트롤러의 Action을 호출하면 Service의 메소드로 최근 본 상품 리스트를 가져온 뒤 

이 정보를 PartialView에 담아 return하는 것입니다.


저는 Action에 GoodsId정보를 전달해야 했습니다. 하여 다음과 같이 코딩을 했습니다.

Html.RenderAction("ActionName","ControllerName", new { GoodsItem = goodsItem});

GoodsItem의 모든 데이터를 보낸 것이죠. 그랬더니 Url Too long exception이 발생했습니다.

검색해서 왜 그런지 이유를 찾아봤더니

 https://stackoverflow.com/questions/17112230/asp-net-mvc-2-renderaction-with-model-throws-uri-too-long-exception 링크에서 이유를 찾을 수 있었습니다.


정확하게 확인 된 바는 없지만, 액션에 모델을 전달할 때, 해당 모델을 serialize해 이를 url에 querystring으로 붙인다고 합니다. 그래서 ChildAction에는 전체 모델을 넘기는 것이 아니라 필요한 최소한의 정보 만을 전달하는 것이 좋다고 합니다. 저 같은 경우도 GoodsItem을 serialize하니 url이 너무 길어져 문제가 발생한 것입니다. 

Html.RenderAction("ActionName","ControllerName", new { Id = goodsItem.Id })로 

코드를 수정해 id 정보만 넣었더니 문제가 해결되었습니다.


* Cookie에 Url 정보 넣을 때 발생한 문제


이전에 말씀드린 바와 같이. 최근 본 상품에 해당 페이지 정보가 필요합니다. 때문에 RecentlyViewedItem을 만들고 Url property에 request.Url.ToString()로 url의 string 정보를 넣었습니다. 그리고 이를 json으로 serialize해 cookie에 넣었습니다. 그런데 cookie에 데이터를 넣을 때는 괜찮은데, deserialize할 때 json형식이 아니라고 예외가 발생했습니다. 

확인해보니 request.Cookies["RecentlyViewed"].Values의 값이 중간부터 잘린 상태였습니다. 분명 response로 브라우저에 전달할 때는 잘 들어갔는데 말이죠. 

항상 url의 "&" 부분부터 데이터가 잘린 것을 바탕으로 구글에 검색해본 뒤 url을 인코딩하지 않아서 발생한 문제로 결론을 내렸습니다. 그래서 url데이터를 encoding하여 객체에 넣은 뒤 나중에 뷰에서 보여줄 때 디코딩하는 방식으로 코드를 변경했습니다. 

recentlyViewedItem.Url = HttpUtility.UrlEncode(request.Url.ToString()) // URL 인코딩하기(해결)


* request.Cookies, response.Cookies 불일치


c#은 클라이언트 브라우저 쿠키를 update하기 위해 response.Cookies의 데이터를 사용합니다. 

그런데 새로운 쿠키를 넣을 때와, request의 쿠키에 있는 데이터를 변경할 때 동작이 약간 다릅니다.


- 기존에 없던 새로운 쿠키를 넣을 경우(이름으로 구분)

response.Cookies에 쿠키가 들어가는 동시에 request.Cookies에도 쿠키가 add됩니다.


- 기존에 있던 쿠키 값을 변경할 경우 (ex - RecentlyViewed)

response.Cookie의 상태는 위와 같습니다. (RecentlyViewed라는 쿠키 추가)

그런데 request.Cookies에는 이미 RecentlyViewed 라는 쿠키가 있고, 또 response에 add할 때 또 하나 쿠키가 add됩니다. (즉, 같은 이름의 쿠키가 2개가 됩니다.) 

-> 브라우저에서 response를 받는 시점에 값이 update 됩니다.

그리고 이 때 request의 쿠키 값을 읽으면 이미 있던 쿠키의 값을 가져옵니다.


정리하면 쿠키 값을 변경할 때 브라우저에서 쿠키 값이 update되기 전에는

request.Cookies["RecentlyViewed"].Value 와 response.Cookies["RecentlyViewed"].Value가 다르다는 의미입니다. 그래서 저 같은 경우는 최근 본 상품에 새로운 정보가 추가되는 시점이 늦어지는 문제가 발생했습니다.


- request.Cookies["RecentlyViewed"].Value, response.Cookies["RecentlyViewed"].Value 일치시키기

request.Cookies.Remove("RecentlyViewed")로 이미 request에 존재하는 RecentlyViewed 쿠키를 제거

response.Cookies에 쿠키를 Add (request의 cookie에도 add됨)

response의 RecentlyViewed 쿠키 값과 request의 RecentlyViewed 쿠키 값이 동일해짐.

* 참고 : Remove 메소드는 없는 쿠키를 제거하려고 할 경우 Exception을 발생 시키지 않습니다.

'dev_note > TIL' 카테고리의 다른 글

SQL 레벨업  (0) 2021.07.11
웹 개발자를 위한 웹을 지탱하는 기술  (0) 2021.07.11
프록시  (0) 2021.07.10
데코레이터 패턴  (0) 2021.07.10
(최근 본 상품1) 쿠키에 데이터 넣기  (0) 2019.02.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함