티스토리 뷰
* 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
- JavaScript
- 자바의 정석
- jQuery
- @Modifying
- OWIN
- 스프링
- JpaRepository
- spring boot
- C# 문법
- 영속성
- DataAnnotation
- SpringBoot
- default interface
- 토비의 스프링
- 스프링 부트 테스트
- Effective Java
- MSSQL
- orphanRemoval
- ASP.NET
- Java
- 다이내믹 프록시
- 준영속
- 고아 객체
- c#
- uploadfive
- JPA
- Spring
- Nullable
- 빌더 패턴
- 스프링MVC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |