{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2021-08-24--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"fbc4c6a9-a589-501f-9e43-c9af4fc0b3d6","html":"<p>이번에 RestTemplate 세팅을 하면서 req/res 로깅을 하도록 구성을 했다.<br>\nreq/res 의 경우 당연히 Object(Null 포함)라 생각했기 때문에\nObjectMapper 클래스의 <span class=\"text-mark__red\">readValue 메소드</span>를 이용하여<br>\nmap 객체로 변환하였다.</p>\n<p>테스트에서는 별 문제 없이 잘 작동하는 듯 하였으나…<br>\n<span class=\"text-mark__red\">응답값이 Json 포맷의 문자열이 아닐 경우</span> 즉, 일반 문자열 일 경우, 오브젝트로 변환 시 아래와 같은 오류가 발생하였다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">com.fasterxml.jackson.core.JsonParseException: Unrecognized token &#39;hello&#39;: was expecting (JSON String, Number, Array, Object or token &#39;null&#39;, &#39;true&#39; or &#39;false&#39;)\n at [Source: (byte[])&quot;hello world&quot;; line: 1, column: 7]</code></pre></div>\n<p>그래서 아래와 같이 테스트를 진행해봤다.\n<br/><br/></p>\n<p><span class=\"title__sub2\">case1) readValue 메소드를 이용하여 string to object</span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">val stringData <span class=\"token operator\">=</span> <span class=\"token string\">\"hello world\"</span>\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    objectMapper<span class=\"token punctuation\">.</span><span class=\"token function\">readValue</span><span class=\"token punctuation\">(</span>stringData<span class=\"token punctuation\">.</span><span class=\"token function\">toByteArray</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span><span class=\"token operator\">::</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">.</span>java<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"success 1\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token operator\">:</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"error1 [stringData] : \"</span> <span class=\"token operator\">+</span> e<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span> <span class=\"token comment\">//에러 발생!!!</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>1번 케이스의 경우 에러가 발생했다.<br>\nreadValue 메소드 내의 코드를 보니 JsonParser를 생성하는걸로 봐선 Json 포맷만 가능한걸로 보인다.</p>\n<br/>\n<p><span class=\"title__sub2\">case2) writeValueAsString 메소드를 이용하여 object to string</span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">val stringData <span class=\"token operator\">=</span> <span class=\"token string\">\"hello world\"</span>\n\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    objectMapper<span class=\"token punctuation\">.</span><span class=\"token function\">writeValueAsString</span><span class=\"token punctuation\">(</span>stringData<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"success 2\"</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">//성공!!!</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token operator\">:</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"error2 [stringData] : \"</span> <span class=\"token operator\">+</span> e<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>2번 케이스의 경우는 에러가 발생하지 않았다.<br>\nwriteValueAsString 메소드에서는 param으로 받은 object를 serialize 하여 이를 문자열로 반환하기 때문에 정상적으로 작동한 것으로 보인다.</p>\n<br/>\n<p><span class=\"title__sub2\"><span class=\"text-mark__blue\">결론적으로,</span></span><br>\nreq의 경우에는 모두 DTO 클래스로 정의를 했기 때문에 readValue 메소드를 이용하여 map 객체로 변환하였고,<br>\nres의 경우에는 DTO 클래스 또는 string 객체로 정의 했기 때문에 </p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre class=\"language-kotlin\"><code class=\"language-kotlin\"><span class=\"token function\">String</span><span class=\"token punctuation\">(</span>it<span class=\"token punctuation\">,</span> StandardCharsets<span class=\"token punctuation\">.</span>UTF_8<span class=\"token punctuation\">)</span></code></pre></div>\n<p>을 이용하여 String 객체로 로깅하였다.</p>\n<p>그런데 생각해보니.. ES를 이용하여 로깅수집을 하고 있기 때문에 type 검사 후에 string 또는 map 으로 변환하는게 가장 좋을 듯 싶다.<br>\n추후에 다시 수정해야겠다.</p>","fields":{"tagSlugs":["/tags/jackson/","/tags/object-mapper/"],"slug":"/works/posts/2021-08-24--001"},"frontmatter":{"title":"[작업로그] ObjectMapper로 String to Object 는 불가하다","tags":["Jackson","ObjectMapper"],"date":"2021-08-24","description":""}}},"pageContext":{"slug":"/works/posts/2021-08-24--001"}},"staticQueryHashes":[]}