{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2020-10-12--001--02","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":"516ba608-40f7-572c-b25e-a8338a9c52e2","html":"<h2>아이템70) 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라</h2>\n<p>복구할 수 있는 상황이면 Checked Exception, 프로그래밍 오류거나 확실하지 않다면 Runtime Exception 을 예외로 던지자.  </p>\n<h3>Exception vs Error</h3>\n<p>오류(Error)는 시스템에 비정상적인 상황이 생겼을 때 발생한다(JVM 자원 부족 등).<br>\n이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다.<br>\n따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.</p>\n<p>오류가 시스템 레벨에서 발생한다면, 예외(Exception)는 개발자가 구현한 로직에서 발생한다.<br>\n즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있다.<br>\n즉, 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.</p>\n<h3>Exception</h3>\n<p>예외 클래스 구조</p>\n<ul>\n<li>모든 예외클래스는 Throwable 클래스를 상속받고 있다</li>\n<li>Error는 시스템 레벨의 심각한 수준의 에러이기 때문에 시스템에 변화를 주어 문제를 처리해야 하는 경우가 일반적이다.</li>\n<li>Exception은 개발자가 로직을 추가하여 처리한다.</li>\n<li>RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/ad2fe7b123b9f182826ba5b510b5d459/c1328/001--02-1.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 866px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 74.58333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABJ0AAASdAHeZh94AAACJElEQVQ4y41UaY/aQAzN//877YfS7bGwq0UsLWcIhCMBkpA7tOQ+4NUzLdpAoaolK5bGY7/n54mAmp1OJ/4tigK2tcFmLcPQVwg8E2VZXuTcM+FWwTzPsDNW6PfaGA07cB2NN/mvgiyh7swYGtvSoWsKoVzA9ywcj0dc557z602EW12KIoc87WPQf0H3tQlVkVBV1U1E14g5QoYojiM4jgPP8xAEAY9VVYWiKHBdF/v9np+5roMkiXmDOsJzLMRxCNNYQJp0CckY5k7h9K5RsPTtZg5x3MF41IGyHFHh6KIgc4EJEPg2FRySoir2gfvW8YqO6+wwlUYYDrok2hpZlv5dsKpKUjWHKIowDIPQvdGoCGlJYNWNhv5wDN3YQdd1mJaNKE4QhiECGsWFKNpWwXzWw4ooLOcDaFuZqCT8UDEztOUMvWWCVzmCuC2RsHUMD7Caj7Cfn2C1WrCenmA3m0jmcwiea9NsZPjuFo69oXmuENEFZlaQozVJ0Z4f8SKXaEkl/JioHX7A+vQA68tnqO/fQW80YDY+IJImv9emJMXSNKOZ5Jz+mUKappyS5Xhw/D1cz+c5dVvQFvwk6hdrc2+32PosFgtomob1es3j6M/ldDZF3ush7Pdx+P4N5WqJI4ERrlW6fgX3LJVlpA8fUbaaKB6/cq+omfCv7b/XiHlKwoW08KFpIrRtHMiLLLtd8J7V/0bsBc0IpUKjWFIsShJ/Ub8AjRh9FbzPXdYAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001  02 1\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/ad2fe7b123b9f182826ba5b510b5d459/c1328/001--02-1.png\"\n        srcset=\"/devHistoryBlog/static/ad2fe7b123b9f182826ba5b510b5d459/8ff5a/001--02-1.png 240w,\n/devHistoryBlog/static/ad2fe7b123b9f182826ba5b510b5d459/e85cb/001--02-1.png 480w,\n/devHistoryBlog/static/ad2fe7b123b9f182826ba5b510b5d459/c1328/001--02-1.png 866w\"\n        sizes=\"(max-width: 866px) 100vw, 866px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<h4>Checked Exception VS Unchecked(Runtime) Exception</h4>\n<ul>\n<li>가장 명확한 구분 기준은 ‘꼭 처리를 해야 하느냐’이다.</li>\n<li>Checked Exception이 발생할 가능성이 있는 메소드라면 반드시 로직을 try/catch로 감싸거나 throw로 던져서 처리해야 한다.</li>\n<li>Unchecked Exception은 명시적인 예외처리를 하지 않아도 된다.\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/1062f18c82456b7ce83ce1c5c14a8902/2e367/001--02-2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 47.08333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABJ0AAASdAHeZh94AAABoElEQVQoz1VRaW+jMBDl//+pVT9V2pW6TTYpKTcECNjG5j4bvfWYtkqRnmY88+bNgTXyEJsIsHDfYLg5xlbRCTw4QkT/IMIjZHzCzDwMhQOVnMGCw57TYP4BXWZjkiksL4nxHgUI8xQxKxBmVwyqhLgliD0beexpe8Et8fEx1mhFDp5FSEMH1+AdWeQicm2wNMTUSVgvQYpn94pDJnDmLU7aMi4gVQ1VNxinGcM4Gbt93MErafL9MH6Dcl0/YNC+9efi4dfrGb/dCOdC4i0twcoSnHMopdB1HaZpwrosWDQYYyiKAnVdm/e67vFtW7XgoCf0IjwdL3i++HhNCtg5N+S2bdE0jRHu+14XrqawqioTl1IaAYpRw3med0FfNAjaBb4a4MgeTinNZEIII0qCBHo/+sQhUHMCiZK49ZaV+BvfYJcKrtSibCdSIa1HK1NnEqcpKJbnOUp9lsf17/f7LkgrHjIOm9V6wl2QiFRA6xHx8aMY5WnK8vPW5FNjOosVcIVA9fCrFp5e32fqB5nut22bIZMlwa/pCF8/h6antf8DrnWkTeT0lP4AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001  02 2\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/1062f18c82456b7ce83ce1c5c14a8902/d9199/001--02-2.png\"\n        srcset=\"/devHistoryBlog/static/1062f18c82456b7ce83ce1c5c14a8902/8ff5a/001--02-2.png 240w,\n/devHistoryBlog/static/1062f18c82456b7ce83ce1c5c14a8902/e85cb/001--02-2.png 480w,\n/devHistoryBlog/static/1062f18c82456b7ce83ce1c5c14a8902/d9199/001--02-2.png 960w,\n/devHistoryBlog/static/1062f18c82456b7ce83ce1c5c14a8902/2e367/001--02-2.png 1066w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">//Before</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">method</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token class-name\">RuntimeException</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//After</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">method</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token class-name\">RuntimeException</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4>예외 처리 방법</h4>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/08a762dd4c8ce9cc733908168ecca131/99f37/001--02-3.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 77.08333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABJ0AAASdAHeZh94AAACaklEQVQ4y41U207cMBDd/28/oH3pG0+t+sAPVKgg9YZUSiVYFgi7bMLuxrnYiW+J7dOJw9JtEYiJRnGSmeOZM8eZgMwHB2EZuMnR2JLWBUq9hnUaowWE8DKfUCxMp9HoCj6mAs4HmJ7emRaF9PH5paAT5zxYzrBaMbRVBldfo6f8UvWxtpvSg+sw1rmT+P/zA6Cn3YN3MaBJDnD56TU+Zxb7Z2msKm89gT8N8LjC+3Y6ayFEg6t0g2WW4WI6RW8NaqJxaHvkelvdM4DSetjeI9sUWK5yZHcrMJaDcx5BVBewbtxDm9tKnwKdrBqP6cZjxjwu8hDv88pjyQOu1gbfzmsc/Cpx+LvEzyuOVrtn25/g777/uDQO+0cZ3r7/incfv0d/8+EYX874TtxjmzDi56YC5jWQVONU0wZYCuDHTOBkxnGSSJwmLY6nHKcLjVUbsKg9rovBHZLSxbUwHpNaOczvCiRZjiRlyIUl+aTo9MihJn4LiuEUbLSkwQmwWlEHHdqOlDG4BQ1vkJcfddgZBWt0vAeeQpzuoauSCFhKF6dcKw9FAxRsCXZ5iGEugXJlfQ5Hp2uwzvmtbEbrraaANXijsLhN4V0HJkMUdiV7mCGmOEd+9ArDaBirsZjtoeUXY75zg7Cp1JqjqmrkeY7bZYrFYo4kSWCUJG4DWmqXSSArFaqygiDwqipRFAWqWqJtNCzpeCgtnmVlJBrF6WUHrS2M7elsS3AlSIM+CnrQIyPCGGdoZAtNHGploZQClyVsZ8cpxxNAF7c5RFdC9oKIrlGaNfTO32YrE9VL+rZB2/MYy+kvJbriXujAH1ZPhkWxsG6mAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001  02 3\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/08a762dd4c8ce9cc733908168ecca131/d9199/001--02-3.png\"\n        srcset=\"/devHistoryBlog/static/08a762dd4c8ce9cc733908168ecca131/8ff5a/001--02-3.png 240w,\n/devHistoryBlog/static/08a762dd4c8ce9cc733908168ecca131/e85cb/001--02-3.png 480w,\n/devHistoryBlog/static/08a762dd4c8ce9cc733908168ecca131/d9199/001--02-3.png 960w,\n/devHistoryBlog/static/08a762dd4c8ce9cc733908168ecca131/99f37/001--02-3.png 1100w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<ul>\n<li>1.예외 복구<br>\n예외복구의 핵심은 예외가 발생하여도 애플리케이션은 정상적인 흐름으로 진행된다는 것이다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">int</span> maxretry <span class=\"token operator\">=</span> MAX_RETRY<span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span>maxretry <span class=\"token operator\">--</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 예외가 발생할 가능성이 있는 시도</span>\n        <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 작업성공시 리턴</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">SomeException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 로그 출력. 정해진 시간만큼 대기</span>\n    <span class=\"token punctuation\">}</span> \n    <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 리소스 반납 및 정리 작업</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RetryFailedException</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 최대 재시도 횟수를 넘기면 직접 예외 발생  </span></code></pre></div>\n<ul>\n<li>2.예외처리 회피<br>\n호출한 쪽에서 다시 예외를 받아 처리하도록 하거나, 해당 메소드에서 이 예외를 던지는 것이 최선의 방법이라는 확신이 있을 때만 사용해야 한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">SQLException</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span> <span class=\"token comment\">// 구현 로직</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>3.예외 전환<br>\n호출한 쪽에서 예외를 받아서 처리할 때 좀 더 명확하게 인지할 수 있도록 돕기 위한 방법이다.<br>\n어떤 예외인지 분명해야 처리가 수월해지기 때문이다.<br>\n예를 들어 Checked Exception 중 복구가 불가능한 예외가 잡혔다면 이를 Unchecked Exception으로 전환하여서 다른 계층에서 일일이 예외를 선언할 필요가 없도록 할 수도 있다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">catch</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SQLException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n   <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n   <span class=\"token keyword\">throw</span> <span class=\"token class-name\">DuplicateUserIdException</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>","fields":{"tagSlugs":["/tags/책리뷰/","/tags/이펙티브자바/"],"slug":"/history/posts/2020-10-12--001--02"},"frontmatter":{"title":"[책리뷰/Effective Java] 예외","tags":["책리뷰","이펙티브자바"],"date":"2020-10-12","description":"아이템70) 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라"}}},"pageContext":{"slug":"/history/posts/2020-10-12--001--02"}},"staticQueryHashes":[]}