From c24cc18e3daa18d06487a60f026254baa3310b06 Mon Sep 17 00:00:00 2001 From: greeng00se Date: Sat, 6 Jan 2024 02:53:08 +0000 Subject: [PATCH] deploy: ee338927820981705d9bd1293ce69a095e183057 --- 2022-retrospective.html | 2 +- 2023-retrospective.html | 8 ++++---- 404.html | 2 +- accidental-duplication.html | 2 +- assets/js/4e394c08.14a3ca53.js | 1 + assets/js/{4e394c08.ace82320.js => 6f03d3d2.6aad02cc.js} | 2 +- assets/js/6f03d3d2.cde41e4b.js | 1 - assets/js/b2b675dd.16539ccd.js | 1 - assets/js/b2b675dd.2f9a4877.js | 1 + assets/js/{f8409a7e.45d26143.js => f8409a7e.c9918afa.js} | 2 +- ...{runtime~main.1465a156.js => runtime~main.e806e01d.js} | 2 +- atom.xml | 4 ++-- blackjack-retrospective.html | 2 +- blog.html | 2 +- book-leadership-and-self-deception.html | 2 +- book-writer.html | 2 +- chess-retrospective.html | 2 +- cloudwatch.html | 2 +- composite.html | 2 +- custom-jdbc-template.html | 2 +- db-replication.html | 2 +- docs.html | 4 ++-- docs/architecture/virtical-slice-architecture.html | 2 +- docs/book/getting-out-of-the-box.html | 2 +- docs/culture/postmortem.html | 2 +- docs/database/maximumPoolSize.html | 2 +- docs/database/query-execution.html | 2 +- docs/deploy/zero-downtime.html | 2 +- docs/design/package.html | 2 +- docs/etc/communication.html | 2 +- docs/etc/develop-with-spring.html | 2 +- docs/etc/event-storming.html | 2 +- docs/etc/experience-and-self-question.html | 2 +- docs/etc/healthful-growth.html | 2 +- docs/java/sequenced-collection.html | 2 +- docs/jpa/key.html | 2 +- docs/linux/shell.html | 2 +- docs/linux/swap.html | 2 +- docs/mac/java.html | 2 +- docs/monitoring/intro.html | 2 +- docs/network/load-balancing-algorithm.html | 2 +- docs/network/load-balancing.html | 2 +- docs/nginx/command.html | 2 +- docs/nginx/static-file.html | 2 +- docs/performance/throughput-latency.html | 2 +- docs/performance/throughput.html | 2 +- docs/performance/types.html | 2 +- docs/spring/essence.html | 2 +- docs/tags.html | 2 +- docs/tags/architecture.html | 2 +- docs/tags/book.html | 2 +- docs/tags/collection.html | 2 +- docs/tags/deploy.html | 2 +- docs/tags/etc.html | 2 +- docs/tags/java.html | 2 +- docs/tags/jpa.html | 2 +- docs/tags/latency.html | 2 +- docs/tags/load-balancing.html | 2 +- docs/tags/monitoring.html | 2 +- docs/tags/network.html | 2 +- docs/tags/nginx.html | 2 +- docs/tags/package.html | 2 +- docs/tags/performance.html | 2 +- docs/tags/postmortem.html | 2 +- docs/tags/sequenced.html | 2 +- docs/tags/spring.html | 2 +- docs/tags/test.html | 2 +- docs/tags/throughput.html | 2 +- docs/tags/zero-downtime.html | 2 +- docs/test/benefit.html | 2 +- docs/test/first.html | 2 +- docs/test/heuristics.html | 2 +- docs/test/stairstep.html | 2 +- docusaurus.html | 2 +- grasp.html | 2 +- healthful-growth.html | 2 +- index.html | 2 +- innodb-lock.html | 2 +- intellij-settings.html | 2 +- java-class-file.html | 2 +- java-spring-springboot.html | 2 +- jdbc-retrospective.html | 2 +- jenkins.html | 2 +- jsr-310.html | 2 +- kotlin-null.html | 2 +- ladder-retrospective.html | 2 +- level2-interview-retrospective.html | 2 +- log-async-exception.html | 2 +- mock-static-method.html | 2 +- mvc-retrospective.html | 2 +- mysql-lock.html | 2 +- order-retrospective.html | 2 +- page/10.html | 2 +- page/11.html | 2 +- page/12.html | 2 +- page/13.html | 2 +- page/14.html | 2 +- page/15.html | 2 +- page/16.html | 2 +- page/17.html | 2 +- page/18.html | 2 +- page/19.html | 2 +- page/2.html | 2 +- page/20.html | 2 +- page/21.html | 2 +- page/22.html | 2 +- page/23.html | 2 +- page/24.html | 2 +- page/25.html | 2 +- page/26.html | 2 +- page/27.html | 2 +- page/28.html | 2 +- page/29.html | 2 +- page/3.html | 2 +- page/30.html | 2 +- page/31.html | 2 +- page/32.html | 2 +- page/33.html | 2 +- page/34.html | 2 +- page/35.html | 2 +- page/36.html | 2 +- page/37.html | 2 +- page/38.html | 2 +- page/39.html | 2 +- page/4.html | 2 +- page/40.html | 2 +- page/41.html | 2 +- page/42.html | 2 +- page/43.html | 2 +- page/44.html | 2 +- page/45.html | 2 +- page/46.html | 2 +- page/47.html | 2 +- page/48.html | 2 +- page/49.html | 2 +- page/5.html | 2 +- page/50.html | 2 +- page/51.html | 2 +- page/52.html | 2 +- page/53.html | 2 +- page/54.html | 2 +- page/6.html | 2 +- page/7.html | 2 +- page/8.html | 2 +- page/9.html | 2 +- parameterized-tests.html | 2 +- performance-test-type.html | 2 +- racing-car-retrospective.html | 2 +- refactoring-retrospective.html | 2 +- route-image-async-with-event.html | 2 +- route-image-implementation.html | 2 +- route-image-intro.html | 2 +- route-image-python.html | 2 +- rss.xml | 4 ++-- search.html | 2 +- shopping-cart-retrospective.html | 2 +- spring-test-isolation.html | 2 +- subway-retrospective.html | 2 +- tags.html | 2 +- tags/async.html | 2 +- tags/async/page/2.html | 2 +- tags/awt.html | 2 +- tags/awt/page/2.html | 2 +- tags/book.html | 2 +- tags/book/page/2.html | 2 +- tags/book/page/3.html | 2 +- tags/class.html | 2 +- tags/cloudwatch.html | 2 +- tags/composite.html | 2 +- tags/data-base.html | 2 +- tags/data-base/page/2.html | 2 +- tags/data-base/page/3.html | 2 +- tags/documentation.html | 2 +- tags/dto.html | 2 +- tags/elastic-beanstalk.html | 2 +- tags/etc.html | 2 +- tags/event.html | 2 +- tags/exception.html | 2 +- tags/grasp.html | 2 +- tags/image.html | 2 +- tags/image/page/2.html | 2 +- tags/image/page/3.html | 2 +- tags/inno-db.html | 2 +- tags/intelli-j.html | 2 +- tags/isolation.html | 2 +- tags/java.html | 2 +- tags/java/page/2.html | 2 +- tags/java/page/3.html | 2 +- tags/java/page/4.html | 2 +- tags/java/page/5.html | 2 +- tags/jdbc.html | 2 +- tags/jenkins.html | 2 +- tags/kotlin.html | 2 +- tags/lock.html | 2 +- tags/lock/page/2.html | 2 +- tags/log.html | 2 +- tags/mock.html | 2 +- tags/mockito.html | 2 +- tags/monitoring.html | 2 +- tags/my-sql.html | 2 +- tags/mysql.html | 2 +- tags/oop.html | 2 +- tags/pattern.html | 2 +- tags/performance-test.html | 2 +- tags/python.html | 2 +- tags/replication.html | 2 +- tags/retrospective.html | 6 +++--- tags/retrospective/page/10.html | 2 +- tags/retrospective/page/11.html | 2 +- tags/retrospective/page/12.html | 2 +- tags/retrospective/page/13.html | 2 +- tags/retrospective/page/14.html | 2 +- tags/retrospective/page/15.html | 2 +- tags/retrospective/page/16.html | 2 +- tags/retrospective/page/17.html | 2 +- tags/retrospective/page/18.html | 2 +- tags/retrospective/page/19.html | 2 +- tags/retrospective/page/2.html | 2 +- tags/retrospective/page/20.html | 2 +- tags/retrospective/page/21.html | 2 +- tags/retrospective/page/3.html | 2 +- tags/retrospective/page/4.html | 2 +- tags/retrospective/page/5.html | 2 +- tags/retrospective/page/6.html | 2 +- tags/retrospective/page/7.html | 2 +- tags/retrospective/page/8.html | 2 +- tags/retrospective/page/9.html | 2 +- tags/spring-boot.html | 2 +- tags/spring.html | 2 +- tags/static.html | 2 +- tags/teco-chat.html | 2 +- tags/teco-chat/page/2.html | 2 +- tags/teco-chat/page/3.html | 2 +- tags/test.html | 2 +- tags/test/page/2.html | 2 +- tags/time.html | 2 +- tags/transaction.html | 2 +- tags/web-application.html | 2 +- tags/web-socket.html | 2 +- tags/woowacon.html | 2 +- tags/woowahan-techcourse.html | 2 +- tags/woowahan-techcourse/page/10.html | 2 +- tags/woowahan-techcourse/page/11.html | 2 +- tags/woowahan-techcourse/page/12.html | 2 +- tags/woowahan-techcourse/page/13.html | 2 +- tags/woowahan-techcourse/page/14.html | 2 +- tags/woowahan-techcourse/page/15.html | 2 +- tags/woowahan-techcourse/page/16.html | 2 +- tags/woowahan-techcourse/page/2.html | 2 +- tags/woowahan-techcourse/page/3.html | 2 +- tags/woowahan-techcourse/page/4.html | 2 +- tags/woowahan-techcourse/page/5.html | 2 +- tags/woowahan-techcourse/page/6.html | 2 +- tags/woowahan-techcourse/page/7.html | 2 +- tags/woowahan-techcourse/page/8.html | 2 +- tags/woowahan-techcourse/page/9.html | 2 +- tecochat-retrospective-1.html | 2 +- tecochat-retrospective-2.html | 2 +- tecochat-retrospective-3.html | 2 +- test-double.html | 2 +- the-essence-of-object-orientation.html | 2 +- tomcat-retrospective.html | 2 +- transaction-and-isolation.html | 2 +- web-application-evolution.html | 2 +- web-racing-car-retrospective.html | 2 +- websocket.html | 2 +- woowacon-2023.html | 2 +- woowacourse-level1-retrospective.html | 2 +- woowacourse-level2-retrospective.html | 2 +- woowacourse-level3-retrospective.html | 2 +- 270 files changed, 276 insertions(+), 276 deletions(-) create mode 100644 assets/js/4e394c08.14a3ca53.js rename assets/js/{4e394c08.ace82320.js => 6f03d3d2.6aad02cc.js} (67%) delete mode 100644 assets/js/6f03d3d2.cde41e4b.js delete mode 100644 assets/js/b2b675dd.16539ccd.js create mode 100644 assets/js/b2b675dd.2f9a4877.js rename assets/js/{f8409a7e.45d26143.js => f8409a7e.c9918afa.js} (92%) rename assets/js/{runtime~main.1465a156.js => runtime~main.e806e01d.js} (98%) diff --git a/2022-retrospective.html b/2022-retrospective.html index 60ece1dec..f23cf6738 100644 --- a/2022-retrospective.html +++ b/2022-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/2023-retrospective.html b/2023-retrospective.html index 3bf859a7b..ba7d1f2fe 100644 --- a/2023-retrospective.html +++ b/2023-retrospective.html @@ -13,7 +13,7 @@ - + @@ -43,14 +43,14 @@

프로젝트

부족함을 많이 느껴서 개인적으로 힘들었던 기간이었다. 단순 개발뿐만이 아니라 일정 산출, 소통, 문서화와 같은 다양한 능력이 필요했었고, 자존감이 많이 떨어진 상태였다. -그래도 안드로이드 크루들과 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 -문제가 발생할 때 같이 해결하고, 팀원들과 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

+그래도 팀원들과 함께 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 +문제가 발생할 때 같이 해결하고, 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

레벨 5

이 기간 동안 가장 잘한 일은 주위 사람들에게 도움을 요청한 일이었다. 조금 억지스러운 도움 요청도 주변 크루들이 많이 들어주었고, 너무 감사하다. 취업에 대한 막연한 두려움이 있었지만 정신적으로 지지해주는 사람들 덕분에 두려움을 잘 이겨낼 수 있었던 것 같다.

앞으로

-

우아한테크코스에 들어와서 많은 것을 배웠고, 부족한 점을 알아갈 수 있었다. +

우아한테크코스에 들어와서 많은 것을 배웠고, 부족한 점을 알아갈 수 있었다. 그리고 부족했던 부분을 행동으로 옮기고 개선하는 과정에서 사람으로서 많은 성장을 할 수 있었다. 추가로 현재 나의 개인적인 목표가 뚜렷하지 않은 것 같다. 다른 사람과 대화도 많이 하면서 나에 대해 관심을 가지고 알아가는 과정이 필요해 보인다.

diff --git a/404.html b/404.html index ccb0ac91c..d37edc2e5 100644 --- a/404.html +++ b/404.html @@ -13,7 +13,7 @@ - + diff --git a/accidental-duplication.html b/accidental-duplication.html index 35d7f0c81..b44f7bf3e 100644 --- a/accidental-duplication.html +++ b/accidental-duplication.html @@ -13,7 +13,7 @@ - + diff --git a/assets/js/4e394c08.14a3ca53.js b/assets/js/4e394c08.14a3ca53.js new file mode 100644 index 000000000..90243e2fe --- /dev/null +++ b/assets/js/4e394c08.14a3ca53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7805],{98331:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var r=t(85893),i=t(11151);const s={title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},l=void 0,c={permalink:"/2023-retrospective",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",source:"@site/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",title:"2023\ub144 \ud68c\uace0",description:"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",date:"2024-01-04T00:00:00.000Z",formattedDate:"2024\ub144 1\uc6d4 4\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.885,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},unlisted:!1,nextItem:{title:"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30",permalink:"/woowacon-2023"}},o={authorsImageUrls:[]},a=[{value:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9",id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",level:3},{value:"\ud68c\uace0",id:"\ud68c\uace0",level:3},{value:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514",id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",level:3},{value:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8",id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ud504\ub85c\uc81d\ud2b8",id:"\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ub808\ubca8 5",id:"\ub808\ubca8-5",level:3},{value:"\uc55e\uc73c\ub85c",id:"\uc55e\uc73c\ub85c",level:3}];function d(e){const n={br:"br",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",(0,r.jsx)(n.br,{}),"\n","\ud55c \ud574 \ub3d9\uc548 \uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub4e4\uc5c8\ub358 \uc0dd\uac01\ub4e4\uc744 \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."]}),"\n",(0,r.jsx)(n.h3,{id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",children:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9"}),"\n",(0,r.jsx)(n.p,{children:"\uc5b4\ub5a0\ud55c \ud658\uacbd\uc5d0 \uc18c\uc18d\ud574 \uc788\ub2e4\ub294 \ubd80\ubd84\uc774 \ub9c8\uc74c\uc5d0 \uc548\uc815\uc744 \uac00\uc838\ub2e4\uc8fc\uc5c8\uace0 \ud559\uc2b5\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc558\uace0, \uae30\uc220\uc801\uc778 \uc774\uc57c\uae30\ub098 \uc7a1\ub2f4\uc744 \ub098\ub20c \uc218 \uc788\ub294 \ud658\uacbd\uc774 \uc88b\uc558\ub2e4.\n\ub0af\uc744 \ub9ce\uc774 \uac00\ub9ac\ub294 \ud3b8\uc774\ub77c \ucd08\ubc18\uc5d0\ub294 \uc774\uc57c\uae30\ub97c \uc120\ub73b \uba3c\uc800 \uaebc\ub0b4\uc9c0 \ubabb\ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4\uc5b4 \uc7a1\ub2f4\uc744 \ub9ce\uc774 \ud558\ub824\uace0 \ubd80\ub2e8\ud788 \ub178\ub825\ud588\ub2e4.\n\ud2b9\ud788\ub098 \uae30\uc220\uc801\uc778 \uace0\ubbfc\uc744 \ub098\ub204\ub294 \uac83\uc774 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub294\ub370, \ub3c5\ud559\ud560 \ub550 \ud63c\uc790 \uace0\ubbfc\ud588\ub358 \ubd80\ubd84\uc744 \uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ud06c\ub8e8\ub4e4\uc774 \uc788\uc5b4\uc11c \uad49\uc7a5\ud788 \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."}),"\n",(0,r.jsx)(n.p,{children:"\uc8fc\uc704\uc5d0 \uc88b\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc788\uc5b4 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc744 \uc218 \uc788\uc5c8\ub2e4.\n\ud06c\ub8e8\ub4e4\uc758 \uc7a5\uc810\uc744 \ubc14\ub77c\ubcf4\uba74\uc11c \uc870\uae08\uc774\ub77c\ub3c4 \ud761\uc218\ud574\ubcf4\ub824\uace0 \ud558\uace0, \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \uc788\ub2e4\uba74 \ub3c4\uc6c0\uc744 \ubc1b\uc544\uc11c \uc55e\uc73c\ub85c \ub098\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\ub808\ubca8 1, 2\uc5d0\uc11c \ub9ac\ubdf0\ub97c \ub2f4\ub2f9\ud574\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4\ub2d8\ub4e4 \uadf8\ub9ac\uace0 \ucf54\uce58\ub2d8\ub4e4\uc5d0\uac8c \ubc1b\uc740 \uc870\uc5b8\ub4e4\uc774 \uc0b4\uc544\uac10\uc5d0 \uc788\uc5b4\uc11c \ub9ce\uc774 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4.\n\uc5b4\ub5a4 \ubc29\ud5a5\uc73c\ub85c\ub4e0 \ub098\uc5d0\uac8c \uc601\ud5a5\uc744 \uc900 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud68c\uace0",children:"\ud68c\uace0"}),"\n",(0,r.jsx)(n.p,{children:"\uae30\uc5b5\ub825\uc774 \uc88b\uc740 \ud3b8\uc774 \uc544\ub2c8\ub77c \uc77c\uc5b4\ub0ac\ub358 \uc77c\ub4e4\uc744 \uc790\uc8fc \uae4c\uba39\ub294\ub2e4.\n\ubbf8\uc158\uc774 \ub05d\ub0a0 \ub54c\ub9c8\ub2e4 \uafb8\uc900\ud788 \ud68c\uace0\ub97c \uc791\uc131\ud588\ub294\ub370 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4.\n\ud559\uc2b5\ud588\ub358 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud560 \uc218 \uc788\uc744 \ubfd0 \uc544\ub2c8\ub77c, \uc8fc\uae30\uc801\uc73c\ub85c \ub3cc\uc544\ubcf4\uba70 \uc2e4\ud589 \uac00\ub2a5\ud55c \uacc4\ud68d\uc744 \uc218\ub9bd\ud560 \uc218 \uc788\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",children:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \ud558\uba74\uc11c \uc2a4\ud130\ub514\ub97c \ub531 \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ub808\ubca8 1, 2 \ub54c \uc9c4\ud589\ud55c \uc2a4\ud130\ub514\ub85c \ub9e4\uc8fc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uace0 \ub09c \ub4a4 \ucf54\ub4dc\ub97c \uc11c\ub85c \ub9ac\ubdf0\ud574\uc8fc\uace0 \uc9c0\uc2dd\uc744 \uacf5\uc720\ud558\ub294 \uc2a4\ud130\ub514\uc600\ub2e4.\n\uc774 \uc2dc\uc810\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud558\uba74 \ub354 \uc88b\uc740 \ubc29\ubc95\uc73c\ub85c \ucf54\ub4dc\ub97c \ub9ac\ubdf0\ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\uc5c8\uace0, \ub355\ubd84\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \ub2e4\ub978 \uc0ac\ub78c \ucf54\ub4dc\ub97c \uc77d\uace0, \ub9ac\ubdf0\ud558\ub294 \ud589\uc704 \uc790\uccb4\ub97c \ud559\uc2b5\ud560 \uc218 \uc788\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",children:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ub54c\ub294 \ub808\ubca8 2, \ube0c\ub77c\uc6b4\uacfc\uc758 \ucee4\ud53c\ucc57 \uc774\ud6c4\ub85c \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ucd08\uae30 \uae30\ud68d\uc740 \ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc744 \uc8fc\uace0, \uac01 \ub808\ubca8\ubcc4\ub85c \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ud558\ub294\uc9c0 \uc54c\uc544\ubcf4\ub294 \uac83\uc774 \uc6d0\ub798 \ubaa9\ud45c\uc600\ub2e4.\n\uafb8\uc900\ud788 \uc0ac\uc6a9\ud574\uc8fc\uc5c8\ub358 \ud06c\ub8e8\ub3c4 \uc788\uc5c8\uace0 \uac00\ub054 \uc2ec\uc2ec\ud574\uc11c \ub4e4\uc5b4\uc628 \ud06c\ub8e8\ub4e4\ub3c4 \uc788\uc5c8\ub294\ub370 \uc7a0\uc2dc\ub098\ub9c8 \uc7ac\ubc0c\uac8c \uc0ac\uc6a9\ud574\ubd24\ub358 \uae30\uc5b5\uc73c\ub85c \ub0a8\uae38 \ubc14\ub780\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud504\ub85c\uc81d\ud2b8",children:"\ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaef4\uc11c \uac1c\uc778\uc801\uc73c\ub85c \ud798\ub4e4\uc5c8\ub358 \uae30\uac04\uc774\uc5c8\ub2e4.\n\ub2e8\uc21c \uac1c\ubc1c\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \uc77c\uc815 \uc0b0\ucd9c, \uc18c\ud1b5, \ubb38\uc11c\ud654\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ub2a5\ub825\uc774 \ud544\uc694\ud588\uc5c8\uace0, \uc790\uc874\uac10\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4 \uc0c1\ud0dc\uc600\ub2e4.\n\uadf8\ub798\ub3c4 \ud300\uc6d0\ub4e4\uacfc \ud568\uaed8 \ub9cc\ub4e4\uc5c8\ub358 \uc571\uc774 \ub3d9\uc791\ud558\uace0 \ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \ubc30\ud3ec\ub41c \uac83\uc744 \ubcfc \ub54c \uc2e0\uae30\ud588\uace0\n\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \ub54c \uac19\uc774 \ud574\uacb0\ud558\uace0, \ud300 \ubb38\ud654\ub97c \ub9cc\ub4dc\ub294 \uac83 \uadf8\ub9ac\uace0 \ub370\ubaa8\ub370\uc774\uac00 \uae30\uc5b5\uc774 \ub0a8\ub294\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ub808\ubca8-5",children:"\ub808\ubca8 5"}),"\n",(0,r.jsx)(n.p,{children:"\uc774 \uae30\uac04 \ub3d9\uc548 \uac00\uc7a5 \uc798\ud55c \uc77c\uc740 \uc8fc\uc704 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub3c4\uc6c0\uc744 \uc694\uccad\ud55c \uc77c\uc774\uc5c8\ub2e4.\n\uc870\uae08 \uc5b5\uc9c0\uc2a4\ub7ec\uc6b4 \ub3c4\uc6c0 \uc694\uccad\ub3c4 \uc8fc\ubcc0 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc8fc\uc5c8\uace0, \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4.\n\ucde8\uc5c5\uc5d0 \ub300\ud55c \ub9c9\uc5f0\ud55c \ub450\ub824\uc6c0\uc774 \uc788\uc5c8\uc9c0\ub9cc \uc815\uc2e0\uc801\uc73c\ub85c \uc9c0\uc9c0\ud574\uc8fc\ub294 \uc0ac\ub78c\ub4e4 \ub355\ubd84\uc5d0 \ub450\ub824\uc6c0\uc744 \uc798 \uc774\uaca8\ub0bc \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc55e\uc73c\ub85c",children:"\uc55e\uc73c\ub85c"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0 \ub4e4\uc5b4\uc640\uc11c \ub9ce\uc740 \uac83\uc744 \ubc30\uc6e0\uace0, \ubd80\uc871\ud55c \uc810\uc744 \uc54c\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\uadf8\ub9ac\uace0 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud589\ub3d9\uc73c\ub85c \uc62e\uae30\uace0 \uac1c\uc120\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc0ac\ub78c\uc73c\ub85c\uc11c \ub9ce\uc740 \uc131\uc7a5\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\n\ucd94\uac00\ub85c \ud604\uc7ac \ub098\uc758 \uac1c\uc778\uc801\uc778 \ubaa9\ud45c\uac00 \ub69c\ub837\ud558\uc9c0 \uc54a\uc740 \uac83 \uac19\ub2e4. \ub2e4\ub978 \uc0ac\ub78c\uacfc \ub300\ud654\ub3c4 \ub9ce\uc774 \ud558\uba74\uc11c \ub098\uc5d0 \ub300\ud574 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \uc54c\uc544\uac00\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4."})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>l});var r=t(67294);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e394c08.ace82320.js b/assets/js/6f03d3d2.6aad02cc.js similarity index 67% rename from assets/js/4e394c08.ace82320.js rename to assets/js/6f03d3d2.6aad02cc.js index a8393e8c7..84c60a94b 100644 --- a/assets/js/4e394c08.ace82320.js +++ b/assets/js/6f03d3d2.6aad02cc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7805],{98331:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var r=t(85893),i=t(11151);const s={title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},l=void 0,c={permalink:"/2023-retrospective",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",source:"@site/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",title:"2023\ub144 \ud68c\uace0",description:"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",date:"2024-01-04T00:00:00.000Z",formattedDate:"2024\ub144 1\uc6d4 4\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.92,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},unlisted:!1,nextItem:{title:"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30",permalink:"/woowacon-2023"}},o={authorsImageUrls:[]},a=[{value:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9",id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",level:3},{value:"\ud68c\uace0",id:"\ud68c\uace0",level:3},{value:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514",id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",level:3},{value:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8",id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ud504\ub85c\uc81d\ud2b8",id:"\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ub808\ubca8 5",id:"\ub808\ubca8-5",level:3},{value:"\uc55e\uc73c\ub85c",id:"\uc55e\uc73c\ub85c",level:3}];function d(e){const n={br:"br",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",(0,r.jsx)(n.br,{}),"\n","\ud55c \ud574 \ub3d9\uc548 \uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub4e4\uc5c8\ub358 \uc0dd\uac01\ub4e4\uc744 \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."]}),"\n",(0,r.jsx)(n.h3,{id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",children:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9"}),"\n",(0,r.jsx)(n.p,{children:"\uc5b4\ub5a0\ud55c \ud658\uacbd\uc5d0 \uc18c\uc18d\ud574 \uc788\ub2e4\ub294 \ubd80\ubd84\uc774 \ub9c8\uc74c\uc5d0 \uc548\uc815\uc744 \uac00\uc838\ub2e4\uc8fc\uc5c8\uace0 \ud559\uc2b5\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc558\uace0, \uae30\uc220\uc801\uc778 \uc774\uc57c\uae30\ub098 \uc7a1\ub2f4\uc744 \ub098\ub20c \uc218 \uc788\ub294 \ud658\uacbd\uc774 \uc88b\uc558\ub2e4.\n\ub0af\uc744 \ub9ce\uc774 \uac00\ub9ac\ub294 \ud3b8\uc774\ub77c \ucd08\ubc18\uc5d0\ub294 \uc774\uc57c\uae30\ub97c \uc120\ub73b \uba3c\uc800 \uaebc\ub0b4\uc9c0 \ubabb\ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4\uc5b4 \uc7a1\ub2f4\uc744 \ub9ce\uc774 \ud558\ub824\uace0 \ubd80\ub2e8\ud788 \ub178\ub825\ud588\ub2e4.\n\ud2b9\ud788\ub098 \uae30\uc220\uc801\uc778 \uace0\ubbfc\uc744 \ub098\ub204\ub294 \uac83\uc774 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub294\ub370, \ub3c5\ud559\ud560 \ub550 \ud63c\uc790 \uace0\ubbfc\ud588\ub358 \ubd80\ubd84\uc744 \uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ud06c\ub8e8\ub4e4\uc774 \uc788\uc5b4\uc11c \uad49\uc7a5\ud788 \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."}),"\n",(0,r.jsx)(n.p,{children:"\uc8fc\uc704\uc5d0 \uc88b\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc788\uc5b4 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc744 \uc218 \uc788\uc5c8\ub2e4.\n\ud06c\ub8e8\ub4e4\uc758 \uc7a5\uc810\uc744 \ubc14\ub77c\ubcf4\uba74\uc11c \uc870\uae08\uc774\ub77c\ub3c4 \ud761\uc218\ud574\ubcf4\ub824\uace0 \ud558\uace0, \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \uc788\ub2e4\uba74 \ub3c4\uc6c0\uc744 \ubc1b\uc544\uc11c \uc55e\uc73c\ub85c \ub098\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\ub808\ubca8 1, 2\uc5d0\uc11c \ub9ac\ubdf0\ub97c \ub2f4\ub2f9\ud574\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4\ub2d8\ub4e4 \uadf8\ub9ac\uace0 \ucf54\uce58\ub2d8\ub4e4\uc5d0\uac8c \ubc1b\uc740 \uc870\uc5b8\ub4e4\uc774 \uc0b4\uc544\uac10\uc5d0 \uc788\uc5b4\uc11c \ub9ce\uc774 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4.\n\uc5b4\ub5a4 \ubc29\ud5a5\uc73c\ub85c\ub4e0 \ub098\uc5d0\uac8c \uc601\ud5a5\uc744 \uc900 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud68c\uace0",children:"\ud68c\uace0"}),"\n",(0,r.jsx)(n.p,{children:"\uae30\uc5b5\ub825\uc774 \uc88b\uc740 \ud3b8\uc774 \uc544\ub2c8\ub77c \uc77c\uc5b4\ub0ac\ub358 \uc77c\ub4e4\uc744 \uc790\uc8fc \uae4c\uba39\ub294\ub2e4.\n\ubbf8\uc158\uc774 \ub05d\ub0a0 \ub54c\ub9c8\ub2e4 \uafb8\uc900\ud788 \ud68c\uace0\ub97c \uc791\uc131\ud588\ub294\ub370 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4.\n\ud559\uc2b5\ud588\ub358 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud560 \uc218 \uc788\uc744 \ubfd0 \uc544\ub2c8\ub77c, \uc8fc\uae30\uc801\uc73c\ub85c \ub3cc\uc544\ubcf4\uba70 \uc2e4\ud589 \uac00\ub2a5\ud55c \uacc4\ud68d\uc744 \uc218\ub9bd\ud560 \uc218 \uc788\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",children:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \ud558\uba74\uc11c \uc2a4\ud130\ub514\ub97c \ub531 \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ub808\ubca8 1, 2 \ub54c \uc9c4\ud589\ud55c \uc2a4\ud130\ub514\ub85c \ub9e4\uc8fc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uace0 \ub09c \ub4a4 \ucf54\ub4dc\ub97c \uc11c\ub85c \ub9ac\ubdf0\ud574\uc8fc\uace0 \uc9c0\uc2dd\uc744 \uacf5\uc720\ud558\ub294 \uc2a4\ud130\ub514\uc600\ub2e4.\n\uc774 \uc2dc\uc810\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud558\uba74 \ub354 \uc88b\uc740 \ubc29\ubc95\uc73c\ub85c \ucf54\ub4dc\ub97c \ub9ac\ubdf0\ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\uc5c8\uace0, \ub355\ubd84\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \ub2e4\ub978 \uc0ac\ub78c \ucf54\ub4dc\ub97c \uc77d\uace0, \ub9ac\ubdf0\ud558\ub294 \ud589\uc704 \uc790\uccb4\ub97c \ud559\uc2b5\ud560 \uc218 \uc788\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",children:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ub54c\ub294 \ub808\ubca8 2, \ube0c\ub77c\uc6b4\uacfc\uc758 \ucee4\ud53c\ucc57 \uc774\ud6c4\ub85c \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ucd08\uae30 \uae30\ud68d\uc740 \ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc744 \uc8fc\uace0, \uac01 \ub808\ubca8\ubcc4\ub85c \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ud558\ub294\uc9c0 \uc54c\uc544\ubcf4\ub294 \uac83\uc774 \uc6d0\ub798 \ubaa9\ud45c\uc600\ub2e4.\n\uafb8\uc900\ud788 \uc0ac\uc6a9\ud574\uc8fc\uc5c8\ub358 \ud06c\ub8e8\ub3c4 \uc788\uc5c8\uace0 \uac00\ub054 \uc2ec\uc2ec\ud574\uc11c \ub4e4\uc5b4\uc628 \ud06c\ub8e8\ub4e4\ub3c4 \uc788\uc5c8\ub294\ub370 \uc7a0\uc2dc\ub098\ub9c8 \uc7ac\ubc0c\uac8c \uc0ac\uc6a9\ud574\ubd24\ub358 \uae30\uc5b5\uc73c\ub85c \ub0a8\uae38 \ubc14\ub780\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud504\ub85c\uc81d\ud2b8",children:"\ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaef4\uc11c \uac1c\uc778\uc801\uc73c\ub85c \ud798\ub4e4\uc5c8\ub358 \uae30\uac04\uc774\uc5c8\ub2e4.\n\ub2e8\uc21c \uac1c\ubc1c\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \uc77c\uc815 \uc0b0\ucd9c, \uc18c\ud1b5, \ubb38\uc11c\ud654\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ub2a5\ub825\uc774 \ud544\uc694\ud588\uc5c8\uace0, \uc790\uc874\uac10\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4 \uc0c1\ud0dc\uc600\ub2e4.\n\uadf8\ub798\ub3c4 \uc548\ub4dc\ub85c\uc774\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ub9cc\ub4e4\uc5c8\ub358 \uc571\uc774 \ub3d9\uc791\ud558\uace0 \ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \ubc30\ud3ec\ub41c \uac83\uc744 \ubcfc \ub54c \uc2e0\uae30\ud588\uace0\n\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \ub54c \uac19\uc774 \ud574\uacb0\ud558\uace0, \ud300\uc6d0\ub4e4\uacfc \ud300 \ubb38\ud654\ub97c \ub9cc\ub4dc\ub294 \uac83 \uadf8\ub9ac\uace0 \ub370\ubaa8\ub370\uc774\uac00 \uae30\uc5b5\uc774 \ub0a8\ub294\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ub808\ubca8-5",children:"\ub808\ubca8 5"}),"\n",(0,r.jsx)(n.p,{children:"\uc774 \uae30\uac04 \ub3d9\uc548 \uac00\uc7a5 \uc798\ud55c \uc77c\uc740 \uc8fc\uc704 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub3c4\uc6c0\uc744 \uc694\uccad\ud55c \uc77c\uc774\uc5c8\ub2e4.\n\uc870\uae08 \uc5b5\uc9c0\uc2a4\ub7ec\uc6b4 \ub3c4\uc6c0 \uc694\uccad\ub3c4 \uc8fc\ubcc0 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc8fc\uc5c8\uace0, \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4.\n\ucde8\uc5c5\uc5d0 \ub300\ud55c \ub9c9\uc5f0\ud55c \ub450\ub824\uc6c0\uc774 \uc788\uc5c8\uc9c0\ub9cc \uc815\uc2e0\uc801\uc73c\ub85c \uc9c0\uc9c0\ud574\uc8fc\ub294 \uc0ac\ub78c\ub4e4 \ub355\ubd84\uc5d0 \ub450\ub824\uc6c0\uc744 \uc798 \uc774\uaca8\ub0bc \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc55e\uc73c\ub85c",children:"\uc55e\uc73c\ub85c"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0 \ub4e4\uc5b4\uc640\uc11c \ub9ce\uc740 \uac83\uc744 \ubc30\uc6e0\uace0, \ubd80\uc871\ud55c \uc810\uc744 \uc54c\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\uadf8\ub9ac\uace0 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud589\ub3d9\uc73c\ub85c \uc62e\uae30\uace0 \uac1c\uc120\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc0ac\ub78c\uc73c\ub85c\uc11c \ub9ce\uc740 \uc131\uc7a5\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\n\ucd94\uac00\ub85c \ud604\uc7ac \ub098\uc758 \uac1c\uc778\uc801\uc778 \ubaa9\ud45c\uac00 \ub69c\ub837\ud558\uc9c0 \uc54a\uc740 \uac83 \uac19\ub2e4. \ub2e4\ub978 \uc0ac\ub78c\uacfc \ub300\ud654\ub3c4 \ub9ce\uc774 \ud558\uba74\uc11c \ub098\uc5d0 \ub300\ud574 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \uc54c\uc544\uac00\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4."})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>l});var r=t(67294);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[326],{73503:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var r=t(85893),i=t(11151);const s={title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},l=void 0,c={permalink:"/2023-retrospective",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",source:"@site/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",title:"2023\ub144 \ud68c\uace0",description:"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",date:"2024-01-04T00:00:00.000Z",formattedDate:"2024\ub144 1\uc6d4 4\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.885,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},unlisted:!1,nextItem:{title:"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30",permalink:"/woowacon-2023"}},o={authorsImageUrls:[]},a=[{value:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9",id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",level:3},{value:"\ud68c\uace0",id:"\ud68c\uace0",level:3},{value:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514",id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",level:3},{value:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8",id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ud504\ub85c\uc81d\ud2b8",id:"\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ub808\ubca8 5",id:"\ub808\ubca8-5",level:3},{value:"\uc55e\uc73c\ub85c",id:"\uc55e\uc73c\ub85c",level:3}];function d(e){const n={br:"br",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",(0,r.jsx)(n.br,{}),"\n","\ud55c \ud574 \ub3d9\uc548 \uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub4e4\uc5c8\ub358 \uc0dd\uac01\ub4e4\uc744 \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."]}),"\n",(0,r.jsx)(n.h3,{id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",children:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9"}),"\n",(0,r.jsx)(n.p,{children:"\uc5b4\ub5a0\ud55c \ud658\uacbd\uc5d0 \uc18c\uc18d\ud574 \uc788\ub2e4\ub294 \ubd80\ubd84\uc774 \ub9c8\uc74c\uc5d0 \uc548\uc815\uc744 \uac00\uc838\ub2e4\uc8fc\uc5c8\uace0 \ud559\uc2b5\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc558\uace0, \uae30\uc220\uc801\uc778 \uc774\uc57c\uae30\ub098 \uc7a1\ub2f4\uc744 \ub098\ub20c \uc218 \uc788\ub294 \ud658\uacbd\uc774 \uc88b\uc558\ub2e4.\n\ub0af\uc744 \ub9ce\uc774 \uac00\ub9ac\ub294 \ud3b8\uc774\ub77c \ucd08\ubc18\uc5d0\ub294 \uc774\uc57c\uae30\ub97c \uc120\ub73b \uba3c\uc800 \uaebc\ub0b4\uc9c0 \ubabb\ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4\uc5b4 \uc7a1\ub2f4\uc744 \ub9ce\uc774 \ud558\ub824\uace0 \ubd80\ub2e8\ud788 \ub178\ub825\ud588\ub2e4.\n\ud2b9\ud788\ub098 \uae30\uc220\uc801\uc778 \uace0\ubbfc\uc744 \ub098\ub204\ub294 \uac83\uc774 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub294\ub370, \ub3c5\ud559\ud560 \ub550 \ud63c\uc790 \uace0\ubbfc\ud588\ub358 \ubd80\ubd84\uc744 \uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ud06c\ub8e8\ub4e4\uc774 \uc788\uc5b4\uc11c \uad49\uc7a5\ud788 \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."}),"\n",(0,r.jsx)(n.p,{children:"\uc8fc\uc704\uc5d0 \uc88b\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc788\uc5b4 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc744 \uc218 \uc788\uc5c8\ub2e4.\n\ud06c\ub8e8\ub4e4\uc758 \uc7a5\uc810\uc744 \ubc14\ub77c\ubcf4\uba74\uc11c \uc870\uae08\uc774\ub77c\ub3c4 \ud761\uc218\ud574\ubcf4\ub824\uace0 \ud558\uace0, \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \uc788\ub2e4\uba74 \ub3c4\uc6c0\uc744 \ubc1b\uc544\uc11c \uc55e\uc73c\ub85c \ub098\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\ub808\ubca8 1, 2\uc5d0\uc11c \ub9ac\ubdf0\ub97c \ub2f4\ub2f9\ud574\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4\ub2d8\ub4e4 \uadf8\ub9ac\uace0 \ucf54\uce58\ub2d8\ub4e4\uc5d0\uac8c \ubc1b\uc740 \uc870\uc5b8\ub4e4\uc774 \uc0b4\uc544\uac10\uc5d0 \uc788\uc5b4\uc11c \ub9ce\uc774 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4.\n\uc5b4\ub5a4 \ubc29\ud5a5\uc73c\ub85c\ub4e0 \ub098\uc5d0\uac8c \uc601\ud5a5\uc744 \uc900 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud68c\uace0",children:"\ud68c\uace0"}),"\n",(0,r.jsx)(n.p,{children:"\uae30\uc5b5\ub825\uc774 \uc88b\uc740 \ud3b8\uc774 \uc544\ub2c8\ub77c \uc77c\uc5b4\ub0ac\ub358 \uc77c\ub4e4\uc744 \uc790\uc8fc \uae4c\uba39\ub294\ub2e4.\n\ubbf8\uc158\uc774 \ub05d\ub0a0 \ub54c\ub9c8\ub2e4 \uafb8\uc900\ud788 \ud68c\uace0\ub97c \uc791\uc131\ud588\ub294\ub370 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4.\n\ud559\uc2b5\ud588\ub358 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud560 \uc218 \uc788\uc744 \ubfd0 \uc544\ub2c8\ub77c, \uc8fc\uae30\uc801\uc73c\ub85c \ub3cc\uc544\ubcf4\uba70 \uc2e4\ud589 \uac00\ub2a5\ud55c \uacc4\ud68d\uc744 \uc218\ub9bd\ud560 \uc218 \uc788\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",children:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \ud558\uba74\uc11c \uc2a4\ud130\ub514\ub97c \ub531 \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ub808\ubca8 1, 2 \ub54c \uc9c4\ud589\ud55c \uc2a4\ud130\ub514\ub85c \ub9e4\uc8fc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uace0 \ub09c \ub4a4 \ucf54\ub4dc\ub97c \uc11c\ub85c \ub9ac\ubdf0\ud574\uc8fc\uace0 \uc9c0\uc2dd\uc744 \uacf5\uc720\ud558\ub294 \uc2a4\ud130\ub514\uc600\ub2e4.\n\uc774 \uc2dc\uc810\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud558\uba74 \ub354 \uc88b\uc740 \ubc29\ubc95\uc73c\ub85c \ucf54\ub4dc\ub97c \ub9ac\ubdf0\ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\uc5c8\uace0, \ub355\ubd84\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \ub2e4\ub978 \uc0ac\ub78c \ucf54\ub4dc\ub97c \uc77d\uace0, \ub9ac\ubdf0\ud558\ub294 \ud589\uc704 \uc790\uccb4\ub97c \ud559\uc2b5\ud560 \uc218 \uc788\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",children:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ub54c\ub294 \ub808\ubca8 2, \ube0c\ub77c\uc6b4\uacfc\uc758 \ucee4\ud53c\ucc57 \uc774\ud6c4\ub85c \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ucd08\uae30 \uae30\ud68d\uc740 \ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc744 \uc8fc\uace0, \uac01 \ub808\ubca8\ubcc4\ub85c \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ud558\ub294\uc9c0 \uc54c\uc544\ubcf4\ub294 \uac83\uc774 \uc6d0\ub798 \ubaa9\ud45c\uc600\ub2e4.\n\uafb8\uc900\ud788 \uc0ac\uc6a9\ud574\uc8fc\uc5c8\ub358 \ud06c\ub8e8\ub3c4 \uc788\uc5c8\uace0 \uac00\ub054 \uc2ec\uc2ec\ud574\uc11c \ub4e4\uc5b4\uc628 \ud06c\ub8e8\ub4e4\ub3c4 \uc788\uc5c8\ub294\ub370 \uc7a0\uc2dc\ub098\ub9c8 \uc7ac\ubc0c\uac8c \uc0ac\uc6a9\ud574\ubd24\ub358 \uae30\uc5b5\uc73c\ub85c \ub0a8\uae38 \ubc14\ub780\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud504\ub85c\uc81d\ud2b8",children:"\ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaef4\uc11c \uac1c\uc778\uc801\uc73c\ub85c \ud798\ub4e4\uc5c8\ub358 \uae30\uac04\uc774\uc5c8\ub2e4.\n\ub2e8\uc21c \uac1c\ubc1c\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \uc77c\uc815 \uc0b0\ucd9c, \uc18c\ud1b5, \ubb38\uc11c\ud654\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ub2a5\ub825\uc774 \ud544\uc694\ud588\uc5c8\uace0, \uc790\uc874\uac10\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4 \uc0c1\ud0dc\uc600\ub2e4.\n\uadf8\ub798\ub3c4 \ud300\uc6d0\ub4e4\uacfc \ud568\uaed8 \ub9cc\ub4e4\uc5c8\ub358 \uc571\uc774 \ub3d9\uc791\ud558\uace0 \ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \ubc30\ud3ec\ub41c \uac83\uc744 \ubcfc \ub54c \uc2e0\uae30\ud588\uace0\n\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \ub54c \uac19\uc774 \ud574\uacb0\ud558\uace0, \ud300 \ubb38\ud654\ub97c \ub9cc\ub4dc\ub294 \uac83 \uadf8\ub9ac\uace0 \ub370\ubaa8\ub370\uc774\uac00 \uae30\uc5b5\uc774 \ub0a8\ub294\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ub808\ubca8-5",children:"\ub808\ubca8 5"}),"\n",(0,r.jsx)(n.p,{children:"\uc774 \uae30\uac04 \ub3d9\uc548 \uac00\uc7a5 \uc798\ud55c \uc77c\uc740 \uc8fc\uc704 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub3c4\uc6c0\uc744 \uc694\uccad\ud55c \uc77c\uc774\uc5c8\ub2e4.\n\uc870\uae08 \uc5b5\uc9c0\uc2a4\ub7ec\uc6b4 \ub3c4\uc6c0 \uc694\uccad\ub3c4 \uc8fc\ubcc0 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc8fc\uc5c8\uace0, \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4.\n\ucde8\uc5c5\uc5d0 \ub300\ud55c \ub9c9\uc5f0\ud55c \ub450\ub824\uc6c0\uc774 \uc788\uc5c8\uc9c0\ub9cc \uc815\uc2e0\uc801\uc73c\ub85c \uc9c0\uc9c0\ud574\uc8fc\ub294 \uc0ac\ub78c\ub4e4 \ub355\ubd84\uc5d0 \ub450\ub824\uc6c0\uc744 \uc798 \uc774\uaca8\ub0bc \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc55e\uc73c\ub85c",children:"\uc55e\uc73c\ub85c"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0 \ub4e4\uc5b4\uc640\uc11c \ub9ce\uc740 \uac83\uc744 \ubc30\uc6e0\uace0, \ubd80\uc871\ud55c \uc810\uc744 \uc54c\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\uadf8\ub9ac\uace0 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud589\ub3d9\uc73c\ub85c \uc62e\uae30\uace0 \uac1c\uc120\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc0ac\ub78c\uc73c\ub85c\uc11c \ub9ce\uc740 \uc131\uc7a5\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\n\ucd94\uac00\ub85c \ud604\uc7ac \ub098\uc758 \uac1c\uc778\uc801\uc778 \ubaa9\ud45c\uac00 \ub69c\ub837\ud558\uc9c0 \uc54a\uc740 \uac83 \uac19\ub2e4. \ub2e4\ub978 \uc0ac\ub78c\uacfc \ub300\ud654\ub3c4 \ub9ce\uc774 \ud558\uba74\uc11c \ub098\uc5d0 \ub300\ud574 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \uc54c\uc544\uac00\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4."})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>l});var r=t(67294);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6f03d3d2.cde41e4b.js b/assets/js/6f03d3d2.cde41e4b.js deleted file mode 100644 index f8acb268c..000000000 --- a/assets/js/6f03d3d2.cde41e4b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[326],{73503:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var r=t(85893),i=t(11151);const s={title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},l=void 0,c={permalink:"/2023-retrospective",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",source:"@site/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx",title:"2023\ub144 \ud68c\uace0",description:"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",date:"2024-01-04T00:00:00.000Z",formattedDate:"2024\ub144 1\uc6d4 4\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.92,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2023\ub144 \ud68c\uace0",slug:"2023-retrospective",tags:["Retrospective"]},unlisted:!1,nextItem:{title:"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30",permalink:"/woowacon-2023"}},o={authorsImageUrls:[]},a=[{value:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9",id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",level:3},{value:"\ud68c\uace0",id:"\ud68c\uace0",level:3},{value:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514",id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",level:3},{value:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8",id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ud504\ub85c\uc81d\ud2b8",id:"\ud504\ub85c\uc81d\ud2b8",level:3},{value:"\ub808\ubca8 5",id:"\ub808\ubca8-5",level:3},{value:"\uc55e\uc73c\ub85c",id:"\uc55e\uc73c\ub85c",level:3}];function d(e){const n={br:"br",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.",(0,r.jsx)(n.br,{}),"\n","\ud55c \ud574 \ub3d9\uc548 \uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub4e4\uc5c8\ub358 \uc0dd\uac01\ub4e4\uc744 \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."]}),"\n",(0,r.jsx)(n.h3,{id:"\uad00\uacc4-\ud615\uc131\uacfc-\uc0c1\ud638-\uc791\uc6a9",children:"\uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9"}),"\n",(0,r.jsx)(n.p,{children:"\uc5b4\ub5a0\ud55c \ud658\uacbd\uc5d0 \uc18c\uc18d\ud574 \uc788\ub2e4\ub294 \ubd80\ubd84\uc774 \ub9c8\uc74c\uc5d0 \uc548\uc815\uc744 \uac00\uc838\ub2e4\uc8fc\uc5c8\uace0 \ud559\uc2b5\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc558\uace0, \uae30\uc220\uc801\uc778 \uc774\uc57c\uae30\ub098 \uc7a1\ub2f4\uc744 \ub098\ub20c \uc218 \uc788\ub294 \ud658\uacbd\uc774 \uc88b\uc558\ub2e4.\n\ub0af\uc744 \ub9ce\uc774 \uac00\ub9ac\ub294 \ud3b8\uc774\ub77c \ucd08\ubc18\uc5d0\ub294 \uc774\uc57c\uae30\ub97c \uc120\ub73b \uba3c\uc800 \uaebc\ub0b4\uc9c0 \ubabb\ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4\uc5b4 \uc7a1\ub2f4\uc744 \ub9ce\uc774 \ud558\ub824\uace0 \ubd80\ub2e8\ud788 \ub178\ub825\ud588\ub2e4.\n\ud2b9\ud788\ub098 \uae30\uc220\uc801\uc778 \uace0\ubbfc\uc744 \ub098\ub204\ub294 \uac83\uc774 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub294\ub370, \ub3c5\ud559\ud560 \ub550 \ud63c\uc790 \uace0\ubbfc\ud588\ub358 \ubd80\ubd84\uc744 \uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ud06c\ub8e8\ub4e4\uc774 \uc788\uc5b4\uc11c \uad49\uc7a5\ud788 \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."}),"\n",(0,r.jsx)(n.p,{children:"\uc8fc\uc704\uc5d0 \uc88b\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc788\uc5b4 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc744 \uc218 \uc788\uc5c8\ub2e4.\n\ud06c\ub8e8\ub4e4\uc758 \uc7a5\uc810\uc744 \ubc14\ub77c\ubcf4\uba74\uc11c \uc870\uae08\uc774\ub77c\ub3c4 \ud761\uc218\ud574\ubcf4\ub824\uace0 \ud558\uace0, \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \uc788\ub2e4\uba74 \ub3c4\uc6c0\uc744 \ubc1b\uc544\uc11c \uc55e\uc73c\ub85c \ub098\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\ub808\ubca8 1, 2\uc5d0\uc11c \ub9ac\ubdf0\ub97c \ub2f4\ub2f9\ud574\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4\ub2d8\ub4e4 \uadf8\ub9ac\uace0 \ucf54\uce58\ub2d8\ub4e4\uc5d0\uac8c \ubc1b\uc740 \uc870\uc5b8\ub4e4\uc774 \uc0b4\uc544\uac10\uc5d0 \uc788\uc5b4\uc11c \ub9ce\uc774 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4.\n\uc5b4\ub5a4 \ubc29\ud5a5\uc73c\ub85c\ub4e0 \ub098\uc5d0\uac8c \uc601\ud5a5\uc744 \uc900 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud68c\uace0",children:"\ud68c\uace0"}),"\n",(0,r.jsx)(n.p,{children:"\uae30\uc5b5\ub825\uc774 \uc88b\uc740 \ud3b8\uc774 \uc544\ub2c8\ub77c \uc77c\uc5b4\ub0ac\ub358 \uc77c\ub4e4\uc744 \uc790\uc8fc \uae4c\uba39\ub294\ub2e4.\n\ubbf8\uc158\uc774 \ub05d\ub0a0 \ub54c\ub9c8\ub2e4 \uafb8\uc900\ud788 \ud68c\uace0\ub97c \uc791\uc131\ud588\ub294\ub370 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4.\n\ud559\uc2b5\ud588\ub358 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud560 \uc218 \uc788\uc744 \ubfd0 \uc544\ub2c8\ub77c, \uc8fc\uae30\uc801\uc73c\ub85c \ub3cc\uc544\ubcf4\uba70 \uc2e4\ud589 \uac00\ub2a5\ud55c \uacc4\ud68d\uc744 \uc218\ub9bd\ud560 \uc218 \uc788\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ucf54\ub4dc\ub9ac\ubdf0-\uc2a4\ud130\ub514",children:"\ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \ud558\uba74\uc11c \uc2a4\ud130\ub514\ub97c \ub531 \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ub808\ubca8 1, 2 \ub54c \uc9c4\ud589\ud55c \uc2a4\ud130\ub514\ub85c \ub9e4\uc8fc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uace0 \ub09c \ub4a4 \ucf54\ub4dc\ub97c \uc11c\ub85c \ub9ac\ubdf0\ud574\uc8fc\uace0 \uc9c0\uc2dd\uc744 \uacf5\uc720\ud558\ub294 \uc2a4\ud130\ub514\uc600\ub2e4.\n\uc774 \uc2dc\uc810\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud558\uba74 \ub354 \uc88b\uc740 \ubc29\ubc95\uc73c\ub85c \ucf54\ub4dc\ub97c \ub9ac\ubdf0\ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\uc5c8\uace0, \ub355\ubd84\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \ub2e4\ub978 \uc0ac\ub78c \ucf54\ub4dc\ub97c \uc77d\uace0, \ub9ac\ubdf0\ud558\ub294 \ud589\uc704 \uc790\uccb4\ub97c \ud559\uc2b5\ud560 \uc218 \uc788\uc5c8\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc0ac\uc774\ub4dc-\ud504\ub85c\uc81d\ud2b8",children:"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ub54c\ub294 \ub808\ubca8 2, \ube0c\ub77c\uc6b4\uacfc\uc758 \ucee4\ud53c\ucc57 \uc774\ud6c4\ub85c \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\ub098 \uc9c4\ud589\ud588\ub2e4.\n\ucd08\uae30 \uae30\ud68d\uc740 \ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc744 \uc8fc\uace0, \uac01 \ub808\ubca8\ubcc4\ub85c \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ud558\ub294\uc9c0 \uc54c\uc544\ubcf4\ub294 \uac83\uc774 \uc6d0\ub798 \ubaa9\ud45c\uc600\ub2e4.\n\uafb8\uc900\ud788 \uc0ac\uc6a9\ud574\uc8fc\uc5c8\ub358 \ud06c\ub8e8\ub3c4 \uc788\uc5c8\uace0 \uac00\ub054 \uc2ec\uc2ec\ud574\uc11c \ub4e4\uc5b4\uc628 \ud06c\ub8e8\ub4e4\ub3c4 \uc788\uc5c8\ub294\ub370 \uc7a0\uc2dc\ub098\ub9c8 \uc7ac\ubc0c\uac8c \uc0ac\uc6a9\ud574\ubd24\ub358 \uae30\uc5b5\uc73c\ub85c \ub0a8\uae38 \ubc14\ub780\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ud504\ub85c\uc81d\ud2b8",children:"\ud504\ub85c\uc81d\ud2b8"}),"\n",(0,r.jsx)(n.p,{children:"\ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaef4\uc11c \uac1c\uc778\uc801\uc73c\ub85c \ud798\ub4e4\uc5c8\ub358 \uae30\uac04\uc774\uc5c8\ub2e4.\n\ub2e8\uc21c \uac1c\ubc1c\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \uc77c\uc815 \uc0b0\ucd9c, \uc18c\ud1b5, \ubb38\uc11c\ud654\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ub2a5\ub825\uc774 \ud544\uc694\ud588\uc5c8\uace0, \uc790\uc874\uac10\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4 \uc0c1\ud0dc\uc600\ub2e4.\n\uadf8\ub798\ub3c4 \uc548\ub4dc\ub85c\uc774\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ub9cc\ub4e4\uc5c8\ub358 \uc571\uc774 \ub3d9\uc791\ud558\uace0 \ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \ubc30\ud3ec\ub41c \uac83\uc744 \ubcfc \ub54c \uc2e0\uae30\ud588\uace0\n\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \ub54c \uac19\uc774 \ud574\uacb0\ud558\uace0, \ud300\uc6d0\ub4e4\uacfc \ud300 \ubb38\ud654\ub97c \ub9cc\ub4dc\ub294 \uac83 \uadf8\ub9ac\uace0 \ub370\ubaa8\ub370\uc774\uac00 \uae30\uc5b5\uc774 \ub0a8\ub294\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\ub808\ubca8-5",children:"\ub808\ubca8 5"}),"\n",(0,r.jsx)(n.p,{children:"\uc774 \uae30\uac04 \ub3d9\uc548 \uac00\uc7a5 \uc798\ud55c \uc77c\uc740 \uc8fc\uc704 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub3c4\uc6c0\uc744 \uc694\uccad\ud55c \uc77c\uc774\uc5c8\ub2e4.\n\uc870\uae08 \uc5b5\uc9c0\uc2a4\ub7ec\uc6b4 \ub3c4\uc6c0 \uc694\uccad\ub3c4 \uc8fc\ubcc0 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc8fc\uc5c8\uace0, \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4.\n\ucde8\uc5c5\uc5d0 \ub300\ud55c \ub9c9\uc5f0\ud55c \ub450\ub824\uc6c0\uc774 \uc788\uc5c8\uc9c0\ub9cc \uc815\uc2e0\uc801\uc73c\ub85c \uc9c0\uc9c0\ud574\uc8fc\ub294 \uc0ac\ub78c\ub4e4 \ub355\ubd84\uc5d0 \ub450\ub824\uc6c0\uc744 \uc798 \uc774\uaca8\ub0bc \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4."}),"\n",(0,r.jsx)(n.h3,{id:"\uc55e\uc73c\ub85c",children:"\uc55e\uc73c\ub85c"}),"\n",(0,r.jsx)(n.p,{children:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0 \ub4e4\uc5b4\uc640\uc11c \ub9ce\uc740 \uac83\uc744 \ubc30\uc6e0\uace0, \ubd80\uc871\ud55c \uc810\uc744 \uc54c\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4.\n\uadf8\ub9ac\uace0 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud589\ub3d9\uc73c\ub85c \uc62e\uae30\uace0 \uac1c\uc120\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc0ac\ub78c\uc73c\ub85c\uc11c \ub9ce\uc740 \uc131\uc7a5\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\n\ucd94\uac00\ub85c \ud604\uc7ac \ub098\uc758 \uac1c\uc778\uc801\uc778 \ubaa9\ud45c\uac00 \ub69c\ub837\ud558\uc9c0 \uc54a\uc740 \uac83 \uac19\ub2e4. \ub2e4\ub978 \uc0ac\ub78c\uacfc \ub300\ud654\ub3c4 \ub9ce\uc774 \ud558\uba74\uc11c \ub098\uc5d0 \ub300\ud574 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \uc54c\uc544\uac00\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4."})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>l});var r=t(67294);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.16539ccd.js b/assets/js/b2b675dd.16539ccd.js deleted file mode 100644 index 1f5508002..000000000 --- a/assets/js/b2b675dd.16539ccd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[533],{28017:n=>{n.exports=JSON.parse('{"blogPosts":[{"id":"2023-retrospective","metadata":{"permalink":"/2023-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx","source":"@site/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx","title":"2023\ub144 \ud68c\uace0","description":"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.","date":"2024-01-04T00:00:00.000Z","formattedDate":"2024\ub144 1\uc6d4 4\uc77c","tags":[{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.92,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"2023\ub144 \ud68c\uace0","slug":"2023-retrospective","tags":["Retrospective"]},"unlisted":false,"nextItem":{"title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","permalink":"/woowacon-2023"}},"content":"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4. \\n\ud55c \ud574 \ub3d9\uc548 \uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub4e4\uc5c8\ub358 \uc0dd\uac01\ub4e4\uc744 \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### \uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9\\n\\n\uc5b4\ub5a0\ud55c \ud658\uacbd\uc5d0 \uc18c\uc18d\ud574 \uc788\ub2e4\ub294 \ubd80\ubd84\uc774 \ub9c8\uc74c\uc5d0 \uc548\uc815\uc744 \uac00\uc838\ub2e4\uc8fc\uc5c8\uace0 \ud559\uc2b5\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc558\uace0, \uae30\uc220\uc801\uc778 \uc774\uc57c\uae30\ub098 \uc7a1\ub2f4\uc744 \ub098\ub20c \uc218 \uc788\ub294 \ud658\uacbd\uc774 \uc88b\uc558\ub2e4. \\n\ub0af\uc744 \ub9ce\uc774 \uac00\ub9ac\ub294 \ud3b8\uc774\ub77c \ucd08\ubc18\uc5d0\ub294 \uc774\uc57c\uae30\ub97c \uc120\ub73b \uba3c\uc800 \uaebc\ub0b4\uc9c0 \ubabb\ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4\uc5b4 \uc7a1\ub2f4\uc744 \ub9ce\uc774 \ud558\ub824\uace0 \ubd80\ub2e8\ud788 \ub178\ub825\ud588\ub2e4. \\n\ud2b9\ud788\ub098 \uae30\uc220\uc801\uc778 \uace0\ubbfc\uc744 \ub098\ub204\ub294 \uac83\uc774 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub294\ub370, \ub3c5\ud559\ud560 \ub550 \ud63c\uc790 \uace0\ubbfc\ud588\ub358 \ubd80\ubd84\uc744 \uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ud06c\ub8e8\ub4e4\uc774 \uc788\uc5b4\uc11c \uad49\uc7a5\ud788 \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4. \\n\\n\uc8fc\uc704\uc5d0 \uc88b\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc788\uc5b4 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc744 \uc218 \uc788\uc5c8\ub2e4. \\n\ud06c\ub8e8\ub4e4\uc758 \uc7a5\uc810\uc744 \ubc14\ub77c\ubcf4\uba74\uc11c \uc870\uae08\uc774\ub77c\ub3c4 \ud761\uc218\ud574\ubcf4\ub824\uace0 \ud558\uace0, \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \uc788\ub2e4\uba74 \ub3c4\uc6c0\uc744 \ubc1b\uc544\uc11c \uc55e\uc73c\ub85c \ub098\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4. \\n\ub808\ubca8 1, 2\uc5d0\uc11c \ub9ac\ubdf0\ub97c \ub2f4\ub2f9\ud574\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4\ub2d8\ub4e4 \uadf8\ub9ac\uace0 \ucf54\uce58\ub2d8\ub4e4\uc5d0\uac8c \ubc1b\uc740 \uc870\uc5b8\ub4e4\uc774 \uc0b4\uc544\uac10\uc5d0 \uc788\uc5b4\uc11c \ub9ce\uc774 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. \\n\uc5b4\ub5a4 \ubc29\ud5a5\uc73c\ub85c\ub4e0 \ub098\uc5d0\uac8c \uc601\ud5a5\uc744 \uc900 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n### \ud68c\uace0\\n\\n\uae30\uc5b5\ub825\uc774 \uc88b\uc740 \ud3b8\uc774 \uc544\ub2c8\ub77c \uc77c\uc5b4\ub0ac\ub358 \uc77c\ub4e4\uc744 \uc790\uc8fc \uae4c\uba39\ub294\ub2e4. \\n\ubbf8\uc158\uc774 \ub05d\ub0a0 \ub54c\ub9c8\ub2e4 \uafb8\uc900\ud788 \ud68c\uace0\ub97c \uc791\uc131\ud588\ub294\ub370 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4. \\n\ud559\uc2b5\ud588\ub358 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud560 \uc218 \uc788\uc744 \ubfd0 \uc544\ub2c8\ub77c, \uc8fc\uae30\uc801\uc73c\ub85c \ub3cc\uc544\ubcf4\uba70 \uc2e4\ud589 \uac00\ub2a5\ud55c \uacc4\ud68d\uc744 \uc218\ub9bd\ud560 \uc218 \uc788\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4.\\n\\n### \ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \ud558\uba74\uc11c \uc2a4\ud130\ub514\ub97c \ub531 \ud558\ub098 \uc9c4\ud589\ud588\ub2e4. \\n\ub808\ubca8 1, 2 \ub54c \uc9c4\ud589\ud55c \uc2a4\ud130\ub514\ub85c \ub9e4\uc8fc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uace0 \ub09c \ub4a4 \ucf54\ub4dc\ub97c \uc11c\ub85c \ub9ac\ubdf0\ud574\uc8fc\uace0 \uc9c0\uc2dd\uc744 \uacf5\uc720\ud558\ub294 \uc2a4\ud130\ub514\uc600\ub2e4. \\n\uc774 \uc2dc\uc810\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud558\uba74 \ub354 \uc88b\uc740 \ubc29\ubc95\uc73c\ub85c \ucf54\ub4dc\ub97c \ub9ac\ubdf0\ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\uc5c8\uace0, \ub355\ubd84\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \ub2e4\ub978 \uc0ac\ub78c \ucf54\ub4dc\ub97c \uc77d\uace0, \ub9ac\ubdf0\ud558\ub294 \ud589\uc704 \uc790\uccb4\ub97c \ud559\uc2b5\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n### \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\\n\\n\ub54c\ub294 \ub808\ubca8 2, \ube0c\ub77c\uc6b4\uacfc\uc758 \ucee4\ud53c\ucc57 \uc774\ud6c4\ub85c \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\ub098 \uc9c4\ud589\ud588\ub2e4. \\n\ucd08\uae30 \uae30\ud68d\uc740 \ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc744 \uc8fc\uace0, \uac01 \ub808\ubca8\ubcc4\ub85c \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ud558\ub294\uc9c0 \uc54c\uc544\ubcf4\ub294 \uac83\uc774 \uc6d0\ub798 \ubaa9\ud45c\uc600\ub2e4. \\n\uafb8\uc900\ud788 \uc0ac\uc6a9\ud574\uc8fc\uc5c8\ub358 \ud06c\ub8e8\ub3c4 \uc788\uc5c8\uace0 \uac00\ub054 \uc2ec\uc2ec\ud574\uc11c \ub4e4\uc5b4\uc628 \ud06c\ub8e8\ub4e4\ub3c4 \uc788\uc5c8\ub294\ub370 \uc7a0\uc2dc\ub098\ub9c8 \uc7ac\ubc0c\uac8c \uc0ac\uc6a9\ud574\ubd24\ub358 \uae30\uc5b5\uc73c\ub85c \ub0a8\uae38 \ubc14\ub780\ub2e4. \\n\\n### \ud504\ub85c\uc81d\ud2b8\\n\\n\ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaef4\uc11c \uac1c\uc778\uc801\uc73c\ub85c \ud798\ub4e4\uc5c8\ub358 \uae30\uac04\uc774\uc5c8\ub2e4. \\n\ub2e8\uc21c \uac1c\ubc1c\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \uc77c\uc815 \uc0b0\ucd9c, \uc18c\ud1b5, \ubb38\uc11c\ud654\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ub2a5\ub825\uc774 \ud544\uc694\ud588\uc5c8\uace0, \uc790\uc874\uac10\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4 \uc0c1\ud0dc\uc600\ub2e4. \\n\uadf8\ub798\ub3c4 \uc548\ub4dc\ub85c\uc774\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ub9cc\ub4e4\uc5c8\ub358 \uc571\uc774 \ub3d9\uc791\ud558\uace0 \ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \ubc30\ud3ec\ub41c \uac83\uc744 \ubcfc \ub54c \uc2e0\uae30\ud588\uace0 \\n\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \ub54c \uac19\uc774 \ud574\uacb0\ud558\uace0, \ud300\uc6d0\ub4e4\uacfc \ud300 \ubb38\ud654\ub97c \ub9cc\ub4dc\ub294 \uac83 \uadf8\ub9ac\uace0 \ub370\ubaa8\ub370\uc774\uac00 \uae30\uc5b5\uc774 \ub0a8\ub294\ub2e4.\\n\\n### \ub808\ubca8 5\\n\\n\uc774 \uae30\uac04 \ub3d9\uc548 \uac00\uc7a5 \uc798\ud55c \uc77c\uc740 \uc8fc\uc704 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub3c4\uc6c0\uc744 \uc694\uccad\ud55c \uc77c\uc774\uc5c8\ub2e4. \\n\uc870\uae08 \uc5b5\uc9c0\uc2a4\ub7ec\uc6b4 \ub3c4\uc6c0 \uc694\uccad\ub3c4 \uc8fc\ubcc0 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc8fc\uc5c8\uace0, \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\ucde8\uc5c5\uc5d0 \ub300\ud55c \ub9c9\uc5f0\ud55c \ub450\ub824\uc6c0\uc774 \uc788\uc5c8\uc9c0\ub9cc \uc815\uc2e0\uc801\uc73c\ub85c \uc9c0\uc9c0\ud574\uc8fc\ub294 \uc0ac\ub78c\ub4e4 \ub355\ubd84\uc5d0 \ub450\ub824\uc6c0\uc744 \uc798 \uc774\uaca8\ub0bc \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\\n### \uc55e\uc73c\ub85c \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0 \ub4e4\uc5b4\uc640\uc11c \ub9ce\uc740 \uac83\uc744 \ubc30\uc6e0\uace0, \ubd80\uc871\ud55c \uc810\uc744 \uc54c\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4. \\n\uadf8\ub9ac\uace0 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud589\ub3d9\uc73c\ub85c \uc62e\uae30\uace0 \uac1c\uc120\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc0ac\ub78c\uc73c\ub85c\uc11c \ub9ce\uc740 \uc131\uc7a5\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ucd94\uac00\ub85c \ud604\uc7ac \ub098\uc758 \uac1c\uc778\uc801\uc778 \ubaa9\ud45c\uac00 \ub69c\ub837\ud558\uc9c0 \uc54a\uc740 \uac83 \uac19\ub2e4. \ub2e4\ub978 \uc0ac\ub78c\uacfc \ub300\ud654\ub3c4 \ub9ce\uc774 \ud558\uba74\uc11c \ub098\uc5d0 \ub300\ud574 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \uc54c\uc544\uac00\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4."},{"id":"woowacon-2023","metadata":{"permalink":"/woowacon-2023","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-11-17-\uc6b0\uc544\ucf58 2023 \ud6c4\uae30.mdx","source":"@site/blog/2023-4/2023-11-17-\uc6b0\uc544\ucf58 2023 \ud6c4\uae30.mdx","title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","description":"\uc6b0\uc544\ucf58 2023\uc744 \ub2e4\ub140\uc654\ub2e4.","date":"2023-11-17T00:00:00.000Z","formattedDate":"2023\ub144 11\uc6d4 17\uc77c","tags":[{"label":"Woowacon","permalink":"/tags/woowacon"}],"readingTime":10.11,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","slug":"woowacon-2023","tags":["Woowacon"]},"unlisted":false,"prevItem":{"title":"2023\ub144 \ud68c\uace0","permalink":"/2023-retrospective"},"nextItem":{"title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","permalink":"/refactoring-retrospective"}},"content":"\uc6b0\uc544\ucf58 2023\uc744 \ub2e4\ub140\uc654\ub2e4. \\n\uc774\ud574\uac00 \uc798 \uc548\ub418\ub294 \ub0b4\uc6a9\uc774 \ub300\ub2e4\uc218\uc600\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \uc720\uc775\ud55c \ub0b4\uc6a9\ub4e4\uc774 \ub9ce\uc558\ub2e4. \\n\\n### \ub300\uaddc\ubaa8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ucc98\ub9ac\ud558\ub294 \ubc30\ubbfc \uc8fc\ubb38\uc2dc\uc2a4\ud15c \uaddc\ubaa8\uc5d0 \ub530\ub978 \uc9c4\ud654\\n\\n\ubc30\ub2ec\uc758\ubbfc\uc871 \uc8fc\ubb38\uc2dc\uc2a4\ud15c\uc758 \uacbd\uc6b0 \ud2b9\uc815 \uc2dc\uac04\ub300(\uc810\uc2ec, \uc800\ub141) \ud53c\ud06c\uac00 \ubc1c\uc0dd\ud558\ub294 \ud2b9\uc9d5\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. \\n\uc774\uc804\uc5d0\ub294 \uc77c \ud3c9\uade0 10\ub9cc \uac74 \uc815\ub3c4\uc758 \uc8fc\ubb38\uc774 \ubc1c\uc0dd\ud588\uace0, \ucd5c\uadfc\uc5d0\ub294 \uc77c \ud3c9\uade0 300\ub9cc \uac74\uc758 \uc8fc\ubb38\uc774 \ubc1c\uc0dd\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\uc774\ub807\uac8c \uc131\uc7a5\ud558\ub294 \uc8fc\ubb38 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\uc640 \uadf8 \ud574\uacb0 \ubc29\ubc95\uc5d0 \ub300\ud55c \ub0b4\uc6a9\ub4e4\uc774 \uc18c\uac1c\ub418\uc5c8\ub358 \uc138\uc158\uc774\uc5c8\ub2e4.\\n\\n\ub300\uaddc\ubaa8 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc6a9\uc774 \uc778\uc0c1 \uae4a\uc5c8\ub294\ub370 \ub298\uc5b4\ub098\ub294 \uc8fc\ubb38 \ucc98\ub9ac\ub7c9\uc5d0 \ub530\ub77c \uc4f0\uae30 \ucc98\ub9ac\ub7c9\uc5d0 \ud55c\uacc4\uc5d0 \ub3c4\ub2ec\ud588\uace0, \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uc0e4\ub529\uc744 \ud1b5\ud574 \uc4f0\uae30 \ubd80\ud558\ub97c \ubd84\uc0b0\ud588\ub2e4\uace0 \ud55c\ub2e4. \\nAurora DB\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 DB \ub808\ubca8\uc5d0\uc11c \uc0e4\ub529\uc774 \ubd88\uac00\ub2a5\ud588\uace0, AbstractRoutingDataSource\ub97c \uc774\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub808\ubca8\uc5d0\uc11c \uc0e4\ub529\uc744 \ub3c4\uc785\ud558\uae30\ub85c \ud588\uace0 \\n\uc5ec\ub7ec \uc0e4\ub529 \ubc29\uc2dd \uc911 \uc8fc\ubb38 \ub370\uc774\ud130\uc758 \ud2b9\uc131\uc0c1 Key Based \uc0e4\ub529 \ubc29\uc2dd\uc744 \uc120\ud0dd\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### \ubaa8\ub180\ub9ac\uc2dd\uc5d0\uc11c \uc810\uc9c4\uc801 \uc11c\ube44\uc2a4 \ubd84\ub9ac: \uc0ac\uc5c5\uacfc\uc81c\uc640 \ubcd1\ud589\ud558\uc5ec \uc2dc\uc2a4\ud15c \uac1c\uc120\ud558\uae30\\n\\n\uac70\ub300\ud55c \ubaa8\ub180\ub9ac\uc2dd \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uc810\uc9c4\uc801\uc73c\ub85c \uc0ac\uc5c5\uacfc\uc81c\uc640 \ubcd1\ud589\ud558\uba74\uc11c \uc11c\ube44\uc2a4\ub97c \ubd84\ub9ac\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc138\uc158\uc774\uc5c8\ub2e4. \\n\ubaa8\ub4c8, \ucef4\ud3ec\ub10c\ud2b8 \ubd84\ub9ac\ubd80\ud130 \uc11c\ube44\uc2a4 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub2e4\uc591\ud55c \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc5c8\uace0 \ubc30\ubbfc\uc0c1\ud68c\uc758 \uacbd\uc6b0 \uc7a5\uae30\uc801\uc778 \uad00\uc810\uc5d0\uc11c \uc11c\ube44\uc2a4 \uae30\uc900\uc73c\ub85c \uac1c\ubc1c \uc870\uc9c1\uc758 \ubd84\ub9ac\ub97c \uc704\ud574 \uc11c\ube44\uc2a4 \ubd84\ub9ac \uc9c4\ud589\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\uc11c\ube44\uc2a4 \ubd84\ub9ac\ub97c \ud560 \ub54c \uace0\ub824\ud574\uc57c\ud558\ub294 \uc0ac\uc774\ub4dc \uc774\ud399\ud2b8\uc5d0 \uad00\ud55c \ub0b4\uc6a9\ub3c4 \uc788\uc5c8\uace0, \uc7a5\uc560 \ubc1c\uc0dd \uc2dc \ube60\ub974\uac8c \ub864\ubc31\ud560 \uc218 \uc788\ub3c4\ub85d FeatureFlag\ub97c \ub3c4\uc785\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### \ubc30\ubbfc\uc2a4\ud1a0\uc5b4\uc5d0 \ucd5c\uc2e0 \uae30\uc220 \ud55c\ubc29\uc5d0 \ub54c\ub824\ub123\uae30: Kotlin, Spring WebFlux, EDA\\n\\n\ubc30\ubbfc\uc2a4\ud1a0\uc5b4\uc5d0 \ucd5c\uc2e0 \uae30\uc220\uc744 \ub3c4\uc785\ud558\uace0, \uae30\uc220 \ub3c4\uc785\uc744 \uc704\ud55c \ub17c\uc758 \uacfc\uc815\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc790\uc138\ud558\uac8c \uc124\uba85\ud574\uc8fc\ub294 \uc138\uc158\uc774\uc5c8\ub2e4. \\n\ub610\ud55c \uae30\uc220 \ub3c4\uc785 \ud6c4 \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc544\uc9d0\uc5d0 \ub530\ub77c \uae30\uc220\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\ub3c4 \ub192\uc544\uc9c0\ub294 \ubd80\ubd84\uc774(\ucee4\uba38\uc2a4 \ud2b9\uc131\uc0c1 Batch \ub85c\uc9c1\uc5d0\uc11c \ubc30\uc555\uc758 \ud2b9\uc131\uc774 \uc624\ud788\ub824 \ubc1c\ud718\ub418\uc5c8\ub2e4\uace0 \uc124\uba85\ud558\ub294 \ubd80\ubd84) \uc778\uc0c1\uae4a\uc5c8\ub2e4. \\n\\n:::note \uae30\uc220 \ub3c4\uc785 \ud558\uae30\uc88b\uc740 \ud658\uacbd\uc774\ub780?\\n\\n- \ud300 \ucc28\uc6d0\uc5d0\uc11c \ucc59\uaca8\uc57c \ud558\ub294 \ubd80\ubd84\\n- \uae30\ubcf8\uc801\uc778 \uac1c\ubc1c \ubb38\ud654 \u2192 \uc2a4\ud130\ub514, \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d, \ucf54\ub4dc \ub9ac\ubdf0, \ub178\ud558\uc6b0 \uacf5\uc720\\n- \ud300\uc5d0\uc11c \ucda9\ubd84\ud55c \ub17c\uc758\ub97c \uac70\uccd0 \ub0b4\ub9b0 \uacb0\uc815\uc740 \uc874\uc911\ud574\uc8fc\uace0, \ubbff\uace0 \uc9c0\ucf1c\ubd10\uc918\uc57c\ud55c\ub2e4.\\n- \uac1c\ubc1c\uc790\ub294 \ub3c4\uba54\uc778\uc5d0 \ub300\ud55c \uc804\ubb38\uc131\uc744 \ubc14\ud0d5\uc73c\ub85c \uae30\uc220 \ub3c4\uc785\uc5d0 \ub300\ud55c \uacb0\uc815\uc744 \ub0b4\ub9ac\uace0 \uc99d\uba85\ud55c\ub2e4.\\n- \uc8fc\ubcc0\uc5d0\uc11c\ub294 \uac1c\ubc1c\uc790\ub97c \uc804\ubb38\uac00\ub85c\uc368 \uc2e0\ub8b0\ud55c\ub2e4. \uc131\uacfc\ub97c \ube14\ub85c\uadf8\ub098 \ubc1c\ud45c\ub85c \ub098\ub220\uac00\uc9c4\ub2e4.\\n\\n:::\\n\\n### \ub300\uc6a9\ub7c9 \ud2b8\ub798\ud53d\uc744 \ubc1b\ub294 \ubaa8\ub180\ub9ac\uc2dd \uc11c\ube44\uc2a4\uc5d0 Woowa\ud558\uac8c RPC \uc801\uc6a9\ud558\uae30\\n\\nRPC\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 IDL \ud30c\uc77c\uc774 \ud544\uc694\ud55c\ub370 \uc774\uc5d0 \ub300\ud55c \uc720\uc9c0\ubcf4\uc218\uac00 \uc5b4\ub835\uae30 \ub54c\ubb38\uc5d0, Spring \ucf54\ub4dc \uae30\ubc18\uc73c\ub85c RPC\uc5d0 \ub300\ud55c \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uad00\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 Woowaboot\uc5d0 \ub300\ud55c \uc138\uc158\uc774\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc RPC\ub97c \uc798 \ubab0\ub77c\uc11c \uc774\ud574\ud558\uc9c0\ub294 \ubabb\ud588\ub2e4. \\n\uae30\uc5b5\ub098\ub294 \ubd80\ubd84\uc740 \uae30\uc874\uc758 RestController + RPC\ub97c \ub3d9\uc2dc\uc5d0 \uc791\uc131\ud560 \uc218 \uc788\ub3c4\ub85d \ud588\uace0, \ucf54\ub4dc \ub808\ubca8\uc5d0\uc11c Enum \uac12\uc5d0 \ub530\ub77c\uc11c RPC\uc758 \uad6c\ud604\uccb4\uc778 gRPC, Thrift \ub458 \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud55c\uac8c \uae30\uc5b5\ub09c\ub2e4. \\n\\n### \ub0af\uc120 \uc11c\ub4dc\ud30c\ud2f0\uc640\uc758 \ub3d9\ud589: \ubbff\uc744 \ub9cc\ud55c \ubc30\ubbfc\ucee4\ub125\ud2b8 \uc11c\ubc84 \uad6c\ucd95\ud558\uae30\\n\\n\ubb38\uc81c\uc5d0 \ub300\ud55c \uc778\uc2dd \uc5c6\uc774 \ubc30\ubbfc \ucee4\ub125\uc2a4 \uc571\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc5b4\ub5a0\ud55c \uace0\ubbfc\uc744 \ud558\ub294\uc9c0 \uc54c \uc218 \uc788\uc5c8\ub358 \uc138\uc158\uc774\ub2e4. \\n\uc11c\ub4dc\ud30c\ud2f0\ub97c \ud1b5\ud55c \uc6b4\uc804\uba74\ud5c8 \uac80\uc99d\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \uc124\uba85\ud588\ub294\ub370 \ub2e4\uc74c\uc758 \ud50c\ub85c\uc6b0\ub85c \uc9c4\ud589\ub41c\ub2e4\uace0 \ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n A[\ub77c\uc774\ub354 \uc6b4\ud589 \uc2dc\ub3c4] -- 1. \uba74\ud5c8 \uc0c1\ud0dc \ud655\uc778 --\x3e B[\uc6b4\uc804\uba74\ud5c8 \uc0c1\ud0dc]\\n\\tB -- 2. \ud604\uc7ac \uba74\ud5c8 \uc0c1\ud0dc \uc751\ub2f5 --\x3e A\\n\\tB -- 3. \uac80\uc99d\uc744 \uc704\ud55c \uba54\uc2dc\uc9c0 \ubc1c\ud589 --\x3e D[\uac80\uc99d \uc218\ud589 \ubc0f \uacb0\uacfc \ubc18\uc601]\\n\\t\\n```\\n\\n\ub610\ud55c \uac80\uc99d \ubc29\uc2dd\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc810\uc9c4\uc801\uc73c\ub85c \ubc1c\uc804\uc2dc\ucf1c\ub098\uac14\ub2e4\uace0 \ud55c\ub2e4. \\n\uc218\uae30 \uac80\uc99d \u2192 \uc11c\ub4dc\ud30c\ud2f0\uc5d0 \uc81c\uacf5\ud558\ub294 \ubb38\uc11c\ub97c \uc774\uc6a9\ud558\uc5ec \ucd5c\ub300 1000\uac74 \uc77c\uad04 \uac80\uc99d \u2192 Spring Batch \uc774\uc6a9\ud558\uc5ec \uc8fc\uae30\uc801 \uac80\uc99d\\n\\n\ub610\ud55c \uc11c\ub4dc\ud30c\ud2f0\uc5d0 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c \uacbd\uc6b0 \uc11c\ud0b7\ube0c\ub808\uc774\ucee4\ub97c \uc801\uc6a9\ud558\uc5ec \uc7a5\uc560 \uc804\ud30c\ub97c \ucc28\ub2e8\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\ubc1c\ud45c\ub97c \uc81c\ub300\ub85c \uc774\ud574\ub97c \ubabb\ud574\uc11c \uadf8\ub7f0\uac00 \uc6b4\ud589 \uc2dc\ub3c4\ud560 \ub54c \ud604\uc7ac \uba74\ud5c8 \uc0c1\ud0dc\ub97c \uc751\ub2f5\ud558\uc9c0\ub9cc, \ub9cc\uc57d \uc11c\ub4dc\ud30c\ud2f0\ub97c \ud1b5\ud574 \uac80\uc99d \uc218\ud589\ud55c \uacb0\uacfc\uac00 \uc6b4\ud589 \uc2dc\ub3c4\uc5d0 \ubd80\uc801\ud569\ud560 \ub54c\uc758 \uacbd\uc6b0\uac00 \uad81\uae08\ud588\ub2e4. \\n\\n### Kafka\ub97c \ud65c\uc6a9\ud55c \uc774\ubca4\ud2b8 \uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\\n\\n\uc694\uad6c\uc0ac\ud56d\uc774 \ub9ce\uc544\uc9d0\uc5d0 \ub530\ub77c \ubc30\ub2ec \uc2dc\uc2a4\ud15c\uc758 \ubcf5\uc7a1\ub3c4\uac00 \uc99d\uac00\ud588\ub2e4. \ud558\uc9c0\ub9cc \ub300\ubd80\ubd84\uc758 \uae30\ub2a5\uc740 \ubc30\ub2ec\uacfc \uac15\ud55c \uc77c\uad00\uc131(\uad00\ub828 \uae30\ub2a5\ub4e4\uc774 \ub3d9\uc2dc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud558\ub294\uac83)\uc744 \ud544\uc694\ub85c\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc774\ubca4\ud2b8 \uae30\ubc18\uc73c\ub85c \uad6c\ucd95\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n:::note SNS + SQS\uac00 \uc544\ub2cc Kafka\ub97c \uc120\ud0dd\ud55c \uc774\uc720\\n\\n- \uc21c\uc11c \ubcf4\uc7a5 \u2192 \ud1a0\ud53d\uc758 \ud30c\ud2f0\uc158\uc744 \ud1b5\ud574 key\ubcc4\ub85c \uc21c\uc11c\ub97c \ubcf4\uc7a5\\n- \uace0\uc131\ub2a5 \uace0\uac00\uc6a9\uc131 \u2192 \uc2e4\uc2dc\uac04 \uc774\ubca4\ud2b8\ub97c \ucc98\ub9ac\ud560 \uace0\uc131\ub2a5 \uace0\uac00\uc6a9\uc131 \uc81c\uacf5 + \ube0c\ub85c\ucee4\ub97c \ud074\ub7ec\uc2a4\ud130 \ud615\ud0dc\ub85c \uad00\ub9ac\\n- \ud1b5\ud569 \ub3c4\uad6c \u2192 Kafka Streams, Kafka Connect\ub4f1 \ub2e4\uc591\ud55c \ud1b5\ud569 \ub3c4\uad6c \uc81c\uacf5\\n- \uc804\ub2f4\ud300 \uc9c0\uc6d0 \u2192 \uce74\ud504\uce74 \ud074\ub7ec\uc2a4\ud130 \uad00\ub9ac, \ubaa8\ub2c8\ud130\ub9c1 \ubc0f \uc9c0\uc6d0\ub3c4\uad6c \uc81c\uacf5\\n\\n:::\\n\\n\ub3c4\uba54\uc778\uc758 \uc0c1\ud0dc\uc640 \uc774\ubca4\ud2b8 \ubc1c\ud589 \uacb0\uacfc\uac00 \uac19\ub2e4\ub294 \uac83\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ud2b8\ub79c\uc7ad\uc158 \uc544\uc6c3\ubc15\uc2a4 \ud328\ud134\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud558\ub294\ub370 \uc774\ud6c4\uc5d0\ub294 \ubcf5\uc7a1\ud55c \ub0b4\uc6a9\uc774 \ub098\uc640\uc11c \uc81c\ub300\ub85c \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158 \uc544\uc6c3\ubc15\uc2a4 \ud328\ud134\uc744 \uc801\uc6a9\ud560 \ub54c \uc800\ube44\uc6a9, \uc548\uc815\uc131, \ucc98\ub9ac\ub7c9\uc744 \uace0\ub824\ud558\uc5ec debezium\uc744 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\uc774\ub54c debezium\uc740 Binary Log\ub97c \ud1b5\ud55c \uc21c\uc11c\ub97c \ubcf4\uc7a5\ud558\ub294\ub370 \ucc98\ub9ac\ub7c9\uc744 \uc99d\ub300\uc2dc\ud0a4\uae30 \uc704\ud574 Outbox \ud14c\uc774\ube14\uc744 \ud30c\ud2f0\uc154\ub2dd\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n\uc544\ub798\uc640 \uac19\uc740 \ub290\ub08c\uc778 \uac83 \uac19\uc740\ub370 \uc544\uc9c1 \uc798 \ubaa8\ub974\uaca0\ub2e4. \\n\\n```mermaid\\ngraph LR\\n Database -- binary log --\x3e Debezium --\x3e Kafka\\n```\\n\\n### \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d \uc778 \uc561\uc158: \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d \uc18c\uac1c\uc640 \uc801\uc6a9 \ubc29\ubc95\\n\\n\uadfc\ub85c\ub97c \ud558\ub294 \ud06c\ub8e8\ub4e4\uc740 \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\uc744 \uacbd\ud5d8\ud574\ubcf4\uc558\ub2e4\uace0 \ud558\ub294\ub370, \uad81\uae08\ud574\uc11c \uc81c\uc774\uc2a8\uc758 \uc138\uc158\uc744 \ub4e4\uc73c\ub7ec \uac14\ub2e4. \\n\uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\uc774 \uc5b4\ub5bb\uac8c \uc9c4\ud589\ub418\uc5b4\uc57c \ud558\ub294\uc9c0, \ud37c\uc2e4\ub9ac\ud14c\uc774\ud130(\uc9c4\ud589\uc790)\ub294 \uc5b4\ub5bb\uac8c \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\uc774 \uc798 \uc9c4\ud589\ub420 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc57c\ud558\ub294\uc9c0, \uc548\ud2f0 \ud328\ud134\ub4f1\uc744 \uc18c\uac1c\ud574\uc918\uc11c \uc7ac\ubc0c\uc5c8\ub2e4. \\n\\n:::note \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\\n\uc54c\ubca0\ub974\ud1a0 \ube0c\ub780\ub3cc\ub9ac\ub2c8\uac00 \uc81c\uc548\ud55c \ubcf5\uc7a1\ud55c \ube44\uc988\ub2c8\uc2a4 \ub3c4\uba54\uc778\uc744 \ube60\ub974\uac8c \ud0d0\uc0c9\ud558\uace0 \ud559\uc2b5\ud560 \uc218 \uc788\ub294 \uc6cc\ud06c\uc20d \\n\ud504\ub85c\uc81d\ud2b8 \ucc38\uc5ec\ud558\ub294 \ubaa8\ub4e0 \uc774\ud574\uad00\uacc4\uc790\uac00 \ud55c\uc790\ub9ac\uc5d0 \ubaa8\uc5ec \ub3c4\uba54\uc778 \uc9c0\uc2dd\uc744 \uad50\ud658\ud558\uace0 \uc6a9\uc5b4\ub97c \ud1b5\uc77c\ud558\uace0 \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8 \ub0b4 \ud68c\uc0c9 \uc9c0\ub300\ub97c \ud30c\uc545\ud558\uc5ec \ud5a5\ud6c4 \uc758\uc0ac\uc18c\ud1b5 \ube44\uc6a9\uc744 \uc808\uc57d\ud558\ub294 \uc6cc\ud06c\uc20d\uc774\ub2e4. \\n:::\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[DB\ubd84\uc0b0\ucc98\ub9ac\ub97c \uc704\ud55c sharding, \uc6b0\uc544\ud55c\uae30\uc220\ube14\ub85c\uadf8](https://techblog.woowahan.com/2687/) \\n[Feature Toggles, martinfowler](https://martinfowler.com/articles/feature-toggles.html)"},{"id":"refactoring-retrospective","metadata":{"permalink":"/refactoring-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-31-\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-4/2023-10-31-\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-refactoring/pull/465","date":"2023-10-31T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 31\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":8.095,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","slug":"refactoring-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","permalink":"/woowacon-2023"},"nextItem":{"title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/jdbc-retrospective"}},"content":":::note PR \ub9c1\ud06c\\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/465 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/547 \\n3\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/610 \\n4\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/721 \\n:::\\n\\n### \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158\\n\\n\uc694\uad6c\uc0ac\ud56d \uc791\uc131 \u2192 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud55c \ucf54\ub4dc \ubcf4\ud638 \u2192 \ub9ac\ud329\ud130\ub9c1 \u2192 \uc758\uc874\uc131 \ub9ac\ud329\ud130\ub9c1 \u2192 \uba40\ud2f0\ubaa8\ub4c8 \uc21c\uc11c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\ubbf8\uc158\uc5d0 \uc628\uc804\ud788 \uc9d1\uc911\ud558\uace0 \uc2f6\uc5c8\uc9c0\ub9cc, \ud504\ub85c\uc81d\ud2b8\uc640 \ubcd1\ud589\ud558\uba74\uc11c \uc9c4\ud589\ud588\uae30\uc5d0 \uc5b4\ub290\uc815\ub3c4 \ud0c0\ud611\ubcf4\uace0 \uc9c4\ud589\ud55c \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c \uc544\uc26c\uc6e0\ub2e4. \\n\\n### 1, 2\ub2e8\uacc4\\n\\n1\ub2e8\uacc4\ub294 \uc694\uad6c\uc0ac\ud56d\uc744 \uc791\uc131\ud558\uace0, \ud14c\uc2a4\ud2b8 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc5ec \ucd94\ud6c4\uc5d0 \ub9ac\ud329\ud130\ub9c1 \ud560 \ub54c \uc548\uc815\uac10 \uc788\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \uc900\ube44\ud558\ub294 \uacfc\uc815\uc774\uc5c8\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d\uc744 \uc791\uc131\ud560 \ub54c \uc81c\uacf5\ub41c \uc6a9\uc5b4 \uc0ac\uc804\uc744 \ucd5c\ub300\ud55c \ud65c\uc6a9\ud558\uba74\uc11c \uae30\uc874\uc758 \ucf54\ub4dc\ub97c \ubcf4\uba74\uc11c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud588\ub2e4. \\n\ud14c\uc2a4\ud2b8\ub294 \uc2dc\uac04 \uad00\uacc4\uc0c1 API, \uc11c\ube44\uc2a4 \ub458 \uc911 \ud558\ub098\ub9cc \ud1b5\ud569 \ud14c\uc2a4\ud2b8\ub97c \uc9c4\ud589\ud574\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4. \\n\\n\ucd5c\uc885\uc801\uc73c\ub85c \uc11c\ube44\uc2a4 \uae30\uc900\uc73c\ub85c \ud1b5\ud569 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud588\ub294\ub370 \uc57d\uac04 \ud6c4\ud68c\ub418\ub294 \uacb0\uc815\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ub9ac\ud329\ud130\ub9c1 \uacfc\uc815\uc5d0\uc11c API \uba85\uc138\uac00 \ubc14\ub00c\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4\ub294 \uac83\uc744 \uae30\uc900\uc744 \uc7a1\uace0 \uc774\ubc88 \ubbf8\uc158\uc744 \ud55c\ub2e4\uace0 \uac00\uc815\ud588\uc744 \ub54c API \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uace0, \ub9ac\ud329\ud130\ub9c1\uc744 \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ub354 \uc548\uc815\uac10 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n2\ub2e8\uacc4\ub294 \uc791\uc131\ub41c \ud14c\uc2a4\ud2b8 \uae30\ubc18\uc73c\ub85c \ub9ac\ud329\ud130\ub9c1 \ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\uc11c\ube44\uc2a4\uc5d0\uc11c \ub3c4\uba54\uc778\uc744 \uc9c1\uc811 \ubc18\ud658\ud558\ub294 \uad6c\uc870\uc600\ub294\ub370, \ub3c4\uba54\uc778\uc5d0 JPA\ub97c \uc801\uc6a9\ud558\uba74 \uae30\uc874 \uba85\uc138\uc640 \ub2ec\ub77c\uc9c8 \uac83\uc744 \uc6b0\ub824\ud574\uc11c DTO\ub85c \uc218\uc815\ud558\ub294 \uc791\uc5c5\uc744 \uba3c\uc800 \uc9c4\ud589\ud588\ub2e4. \\nDTO \uc774\ud6c4\uc5d0 \uc11c\ube44\uc2a4\uc5d0 \uc788\ub294 \ub85c\uc9c1\uc744 \ub3c4\uba54\uc778\uc73c\ub85c \uc774\ub3d9\uc2dc\ud0a4\uace0, \ucd5c\uc885\uc801\uc73c\ub85c JPA\ub97c \uc801\uc6a9\ud558\ub294 \uc21c\uc11c\ub85c \ub9ac\ud329\ud130\ub9c1\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\uc774 \uacfc\uc815\uc5d0\uc11c \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \uc591\ubc29\ud5a5\uc778 \ubd80\ubd84\ub3c4 \uc0dd\uaca8\ub0ac\ub2e4. \\n\\n### \uc18c\ud504\ud2b8\uc6e8\uc5b4\uc758 \ubcf5\uc7a1\uc131\uc744 \ub2e4\ub8e8\ub294 \uc9c0\ud61c\\n\\n\uc911\uac04\uc5d0 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ubcf5\uc7a1\uc131\uc744 \ub2e4\ub8e8\ub294 \uc9c0\ud61c\uc5d0 \uad00\ud55c \uc81c\uc774\uc2a8\uc758 \uac15\uc758\uac00 \uc788\uc5c8\ub2e4. \\n\uc18c\ud504\ud2b8\uc6e8\uc5b4\uc758 \ubcf5\uc7a1\uc131\uc744 \ub2e4\ub8e8\ub294 \uc9c0\ud61c\ub294 \uc5d0\ub9ad \uc5d0\ubc18\uc2a4\uc758 \uc800\uc11c `\ub3c4\uba54\uc778 \uc8fc\ub3c4 \uc124\uacc4`\uc758 \ubd80\uc81c\uc774\ub2e4. \\n\\n\ub3c4\uba54\uc778 \uc8fc\ub3c4 \uc124\uacc4\ub294 \uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4, \uc804\ub7b5\uc801 \uc124\uacc4, \uc804\uc220\uc801 \uc124\uacc4\uac00 \uc911\uc694\ud558\ub2e4\uace0 \ud55c\ub2e4. \\n\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4, \uc804\ub7b5\uc801 \uc124\uacc4\uac00 \uc804\uccb4\uc758 90%\uc5d0 \ud574\ub2f9\ud560 \uc815\ub3c4\ub85c \uc911\uc694\ud558\ub2e4\uace0 \ud55c\ub2e4. \ub610\ud55c \uc804\uc220\uc801 \uc124\uacc4\ub9cc \ud558\ub294 \uacbd\uc6b0\ub97c DDD Lite \ub77c\uace0 \ud55c\ub2e4. \\n\\n\uac04\ub2e8\ud788 \ub3c4\uba54\uc778 \uc8fc\ub3c4 \uc124\uacc4\uc5d0\uc11c \ub098\uc624\ub294 \ub2e8\uc5b4\ub97c \uc815\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n| \ub2e8\uc5b4 | \uc124\uba85 |\\n| --- | --- |\\n| \ub3c4\uba54\uc778 | \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub85c \ud574\uacb0\ud558\uace0\uc790 \ud558\ub294 \ubb38\uc81c \uc601\uc5ed |\\n| \ubc14\uc6b4\ub514\ub4dc \ucee8\ud14d\uc2a4\ud2b8 | \ud574\uacb0 \uc601\uc5ed, \uad00\uc2ec\uc0ac\ub97c \ubd84\ub9ac\ud558\uace0 \uaca9\ub9ac\ud558\uc5ec \ubb38\uc81c \ud574\uacb0\uc5d0 \uc9d1\uc911\ud560 \ubc94\uc704 |\\n| \uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4 | \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc774\ud574\uad00\uacc4\uc790\ub4e4\uc758 \uacf5\ud1b5\ub41c \uc5b8\uc5b4\ub85c, \uc11c\ub85c\uc758 \uc758\uc0ac\uc18c\ud1b5 \ube44\uc6a9\uc744 \uc904\uc774\uae30 \uc704\ud574 \uc0ac\uc6a9\ud558\ub294 \uc5b8\uc5b4 |\\n| \uc804\ub7b5\uc801 \uc124\uacc4 | \ub3c4\uba54\uc778 \uc804\ubb38\uac00\uc640 \uac1c\ubc1c\uc790\uac00 \ud568\uaed8 \uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \ub3c4\uba54\uc778\uacfc \uad00\ub828\ub41c \uc9c0\uc2dd\uc744 \uc774\ud574\ud558\uace0 \uc774\ub97c \ubc14\ud0d5\uc73c\ub85c \uacbd\uacc4\ub97c \ub098\ub220 \ubc14\uc6b4\ub514\ub4dc \ucee8\ud14d\uc2a4\ud2b8\ub97c \uc815\uc758\ud558\uace0, \ucee8\ud14d\uc2a4\ud2b8 \ub9f5\uc744 \uc0dd\uc131\ud558\ub294 \uac83\uc744 \ud3ec\ud568\ud558\ub294 \uacfc\uc815 |\\n| \uc804\uc220\uc801 \uc124\uacc4 | \uc804\ub7b5\uc801 \uc124\uacc4\uc5d0\uc11c \uc815\uc758\ud55c \ubc14\uc6b4\ub514\ub4dc \ucee8\ud14d\uc2a4\ud2b8\uc640 \ub3c4\uba54\uc778\uc744 \uc774\uc6a9\ud558\uc5ec \uc560\uadf8\ub9ac\uac70\ud2b8, Entity\uc640 VO, Repository \ub4f1\uc744 \uad6c\ud604\ud558\ub294 \uacfc\uc815 |\\n\\n\uc774 \uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ub0b4\uc6a9\ub4e4\uc774 \ub098\uc654\uc9c0\ub9cc, \uc9c0\uc2dd\uc744 \uc81c\ub300\ub85c \ud761\uc218\ud558\uc9c0\ub294 \ubabb\ud588\ub2e4. \\n\\n### 3, 4\ub2e8\uacc4\\n\\n\uc81c\uc774\uc2a8\uc758 \uac15\uc758\ub97c \ub4e3\uace0, \uc870\uc601\ud638\ub2d8\uc758 \uc6b0\uc544\ud55c\uac1d\uccb4\uc9c0\ud5a5 \uc720\ud29c\ube0c \uc601\uc0c1\uc744 \ubcf8 \ub2e4\uc74c 3, 4\ub2e8\uacc4\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\\n3\ub2e8\uacc4\ub294 \uc758\uc874\uc131 \ub9ac\ud329\ud130\ub9c1\uc5d0 \uad00\ud55c \ub0b4\uc6a9\uc774\uc5c8\ub2e4. \ud074\ub798\uc2a4 \uac04 \ubc29\ud5a5, \ud328\ud0a4\uc9c0 \uac04 \ubc29\ud5a5\uc744 \ub2e8\ubc29\ud5a5\uc774 \ub418\ub3c4\ub85d \ub9ac\ud329\ud130\ub9c1\uc744 \uc9c4\ud589\ud574\uc57c \ud588\uc5c8\ub2e4. \\n\ud568\uaed8 \uc0dd\uc131\ub418\uace0 \uc0ad\uc81c\ub418\ub294 \uac1d\uccb4\ub4e4\uc744 \ubb36\uace0, \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uae30 \uc704\ud574 \uc0dd\uba85\uc8fc\uae30\uac00 \ub2e4\ub974\ub2e4\uba74 id\ub97c \uc774\uc6a9\ud558\uc5ec \ucc38\uc870\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4. \\n\\n\uc758\uc874\uc131\uc744 \ubd84\ub9ac\ud558\uae30 \uc704\ud574 \uc774\ubca4\ud2b8\ub3c4 \uc0ac\uc6a9\ud574\ubcf4\uc558\ub2e4. \uc774\ubca4\ud2b8\ub294 \ud604\uc7ac \uae30\uc900\uc73c\ub85c \uacfc\uac70\uc5d0 \ubc8c\uc5b4\uc9c4 \uac83\uc744 \ud45c\ud604\ud558\uae30 \ub54c\ubb38\uc5d0 \uc774\ubca4\ud2b8\uba85\uc740 \uacfc\uac70 \uc2dc\uc81c\uac00 \ub418\uc5b4\uc57c\ud558\ub294 \uac83\uc744 \uc54c\uc558\ub2e4. \\n\ucc98\uc74c\uc5d0\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud588\uc9c0\ub9cc, \uc11c\ube44\uc2a4 \ub85c\uc9c1\uc744 \ucd5c\ub300\ud55c \uac04\ub2e8\ud558\uac8c \ud558\uae30 \uc704\ud574 \ub3c4\uba54\uc778 \uc774\ubca4\ud2b8\ub3c4 \uc0ac\uc6a9\ud574\ubcf4\uc558\ub2e4. \\n\\n4\ub2e8\uacc4\ub294 \uba40\ud2f0\ubaa8\ub4c8\ub85c \ubd84\ub9ac\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub294\ub370 3\ub2e8\uacc4\uc5d0\uc11c \ubd84\ub9ac\ud574\ub454 \ud328\ud0a4\uc9c0 \uadf8\ub300\ub85c \ubd84\ub9ac\ud558\uc9c0\ub294 \uc54a\uc558\ub2e4. \\n3\ub2e8\uacc4\uc5d0\uc11c\ub294 \ud568\uaed8 \uc0dd\uc131\ub418\uace0 \uc0ad\uc81c\ub418\ub294 \uac1d\uccb4 \uae30\uc900\uc73c\ub85c \ubd84\ub9ac\ud588\ub2e4. 4\ub2e8\uacc4\uc5d0\uc11c\ub294 \ub0b4\uac00 \uc778\uc2dd\ud558\uae30 \ud3b8\ud55c \uae30\uc900\uc73c\ub85c \ubd84\ub9ac\ub97c \ud588\ub2e4. \\n\uc544\uc9c1 \ubd84\ub9ac\ud55c \uae30\uc900\uc5d0 \ub300\ud55c \uadfc\uac70\uac00 \ubaa8\ud638\ud588\uace0, \uc774\uc5d0 \ub300\ud55c \uacf5\ubd80\ub97c \uc870\uae08 \ub354 \ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph Table\\n\\t\\tOrderTable --\x3e TableGroup\\n\\tend\\n\\tsubgraph Order\\n\\t\\tO\\n\\tend\\n O[Order] --\x3e OrderTable\\n\\tsubgraph Menu\\n\\t\\tM[Menu] --\x3e MenuGroup\\n\\t\\tM --\x3e Product\\n\\tend\\n\\tO --\x3e M\\n```\\n\\n\ucd94\uac00\ub85c \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\ub97c \uc704\ud55c \uc9c1\uc811 \uc791\uc131\ud55c `@ServiceTest` \ucee4\uc2a4\ud140 \uc560\ub108\ud14c\uc774\uc158\uc774 \uc788\uc5c8\ub294\ub370, \uc0c1\uc704 \ubaa8\ub4c8\uc758 \ud14c\uc2a4\ud2b8\uc5d0\uc11c \ub9cc\ub4e0 \ud074\ub798\uc2a4\ub97c \ud558\uc704 \ubaa8\ub4c8\uc5d0\uc11c\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c TestFixtures\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud574\uacb0\ud588\ub2e4. \\n\\n### \ub9c8\ubb34\ub9ac\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc758 \ub9c8\uc9c0\ub9c9 \ubbf8\uc158\uc774\ub2c8 \ub9cc\ud07c, \uac00\uc7a5 \ud765\ubbf8\ub85c\uc6b4 \ubbf8\uc158\uc774\uc5c8\uace0 \ubc30\uc6b8\uc810\ub3c4 \ub9ce\uc558\ub358 \uac83 \uac19\ub2e4. \\n\ubc14\uc05c \uae30\uac04\uc774\ub77c \ub9ce\uc740 \ub9ac\ubdf0\ub97c \ub0a8\uae30\uc9c0 \ubabb\ud588\ub358 \ub9ac\ubdf0\uc774 \ud638\uc774\uc5d0\uac8c \ubbf8\uc548\ud558\uace0, \ucf54\uba58\ud2b8 \uaf3c\uaf3c\ud558\uac8c \ub2ec\uc544\uc8fc\uace0 \ubbf8\uc158\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub3c4 \uc624\ud504\ub77c\uc778\uc73c\ub85c \ub9ce\uc774 \ub098\ub208 \ub9ac\ubdf0\uc5b4 \ud14c\uc624\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[\ub3c4\uba54\uc778 \uc6d0\uc815\ub300, \uc6b0\uc544\ucf58 2021](https://www.youtube.com/watch?v=kmUneexSxk0) \\n[\uc6b0\uc544\ud55c\uac1d\uccb4\uc9c0\ud5a5, \uc6b0\uc544\ud55c\ud14c\ud06c\uc138\ubbf8\ub098](https://www.youtube.com/watch?v=dJ5C4qRqAgA) \\n[TestFixtures, \uad8c\ub0a8\ub2d8](https://kwonnam.pe.kr/wiki/gradle/testfixtures)"},{"id":"jdbc-retrospective","metadata":{"permalink":"/jdbc-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-10-Jdbc \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-4/2023-10-10-Jdbc \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-dashboard-jdbc/pull/267","date":"2023-10-10T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 10\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.83,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","slug":"jdbc-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","permalink":"/refactoring-retrospective"},"nextItem":{"title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/mvc-retrospective"}},"content":":::note PR \ub9c1\ud06c\\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/267 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/358 \\n3\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/448 \\n4\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/515 \\n:::\\n\\n### Jdbc \uad6c\ud604\\n\\n\uc774\ubc88 \ubbf8\uc158\uc740 Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uad6c\ud604\ud558\uace0, Transaction \uacbd\uacc4 \uc124\uc815\uacfc \ub3d9\uae30\ud654\ud558\ub294 \ubd80\ubd84\uc744 \uad6c\ud604\ud574 \ubcf4\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ubbf8\uc158 \ubaa9\ud45c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n- JDBC \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uad6c\ud604\ud558\uba74\uc11c \uc911\ubcf5\uc744 \uc81c\uac70\ud558\ub294 \uc5f0\uc2b5\uc744 \ud55c\ub2e4.\\n- \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\ub97c \ub192\uc778\ub2e4.\\n\\n\ucd5c\ub300\ud55c Java\uac00 \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub9ac\ud329\ud130\ub9c1 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud588\ub2e4. \\n\\n### JdbcTemplate\\n\\nJdbcTemplate\uc740 Connection\uc744 \uc774\uc6a9\ud558\uc5ec PreparedStatement\ub97c \uc0dd\uc131\ud558\ub294 \ubd80\ubd84, \uadf8\ub9ac\uace0 PreparedStatement\uac00 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ubd84\ub9ac\ud588\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc801\uc808\ud558\uac8c \uc801\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \ube44\uad50\uc801 \uac04\ub2e8\ud558\uac8c \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\uc608\uc804\uc5d0\ub3c4 \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c [JdbcTemplate\uc744 \uad6c\ud604](./custom-jdbc-template)\ud55c \uc801\uc774 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \uc790\uc6d0 \ud560\ub2f9\uacfc \ud574\uc81c \ubd80\ubd84\uc5d0 \ub300\ud55c \uc911\ubcf5\ub3c4 \uc81c\uac70\ud588\ub2e4. \\n\\n```java\\npublic class JdbcTemplate {\\n\\n private static final Logger log = LoggerFactory.getLogger(JdbcTemplate.class);\\n\\n private final DataSource dataSource;\\n private final StatementCreator statementCreator;\\n private final StatementExecutor statementExecutor;\\n\\n public JdbcTemplate(final DataSource dataSource) {\\n this(dataSource, new StatementCreator(), new StatementExecutor());\\n }\\n\\n JdbcTemplate(\\n final DataSource dataSource,\\n final StatementCreator statementCreator,\\n final StatementExecutor statementExecutor\\n ) {\\n this.dataSource = dataSource;\\n this.statementCreator = statementCreator;\\n this.statementExecutor = statementExecutor;\\n }\\n\\n private T query(\\n final String sql,\\n final PreparedStatementCallback preparedStatementCallback,\\n final Object... parameters\\n ) {\\n final Connection connection = DataSourceUtils.getConnection(dataSource);\\n try (final PreparedStatement preparedStatement = statementCreator.create(connection, sql, parameters)) {\\n return preparedStatementCallback.execute(preparedStatement);\\n } catch (final SQLException e) {\\n log.error(e.getMessage(), e);\\n throw new DataAccessException(e);\\n } finally {\\n DataSourceUtils.releaseConnection(connection, dataSource);\\n }\\n }\\n\\n public void update(final String sql, final Object... parameters) {\\n query(sql, PreparedStatement::executeUpdate, parameters);\\n }\\n\\n public Optional queryForObject(final String sql, final RowMapper rowMapper, final Object... parameters) {\\n final List results = query(sql, statement -> statementExecutor.execute(statement, rowMapper), parameters);\\n if (results.size() > 1) {\\n throw new DataAccessException(\\"2\uac1c \uc774\uc0c1\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\");\\n }\\n return results.stream().findAny();\\n }\\n\\n public List queryForList(final String sql, final RowMapper rowMapper, final Object... parameters) {\\n return query(sql, statement -> statementExecutor.execute(statement, rowMapper), parameters);\\n }\\n}\\n```\\n\\n### \ud2b8\ub79c\uc7ad\uc158 \uc801\uc6a9\\n\\n3, 4\ub2e8\uacc4\ub294 \uae30\uc874\uc758 \ucf54\ub4dc\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dc\uc791\ud558\uace0 \ub05d\ub098\ub294 \ubd80\ubd84\uc778 \ud2b8\ub79c\uc7ad\uc158 \uacbd\uacc4\ub97c \uc124\uc815\ud558\uace0 ThreadLocal\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \ub3d9\uae30\ud654(Transaction synchronization)\ub97c \uc801\uc6a9\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158 \ub3d9\uae30\ud654\ub780 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dc\uc791\ud558\uae30 \uc704\ud55c Connection \uac1d\uccb4\ub97c ThreadLocal\uacfc \uac19\uc740 \uacf5\uac04\uc5d0 \ub530\ub85c \uc800\uc7a5 \ud6c4, \ud544\uc694\ud560 \ub54c \uc800\uc7a5\ub41c Connection\uc744 \uac00\uc838\ub2e4 \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. \\n\uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub294\ub370, ThreadLocal\uc5d0 Connection \uac1d\uccb4\uac00 \uc544\ub2cc, Connection \uac1d\uccb4\uc640 Transaction\uc774 \uc9c4\ud589 \uc911\uc778\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 flag\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \uc800\uc7a5\ud574\uc11c \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tTransactionTemplate --\x3e TransactionManager\\n\\tTransactionManager --\x3e TransactionSynchronizationManager\\n\\tDataSourceUtils --\x3e TransactionSynchronizationManager\\n\\tJdbcTemplate --\x3e DataSourceUtils\\n```\\n\\n### \ub9c8\ubb34\ub9ac\\n\\nJdbc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c AOP\ub098 Transactional\uc5d0 \ub300\ud55c \ud559\uc2b5 \ud14c\uc2a4\ud2b8\ub3c4 \uc9c4\ud589\ud558\uace0, \uc57d\uac04 \uc54c\ucc2c \ubbf8\uc158\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\uaf3c\uaf3c\ud788 \ucf54\ub4dc\ub97c \ubd10\uc900 \ub9ac\ubdf0\uc5b4 \ud638\uc774 \uadf8\ub9ac\uace0 \uc5f0\ud734 \ub3d9\uc548 \uacc4\uc18d \ud2f0\ud0a4\ud0c0\uce74 \ud558\uba74\uc11c \uc7ac\ubc0c\uac8c \ub9ac\ubdf0\ud55c \ubbfc\ud2b8\uc5d0\uac8c \uac10\uc0ac\ud558\ub2e4. \\n\ud68c\uace0 \uc774\ub9cc \ub05d\ub0b4\uace0 \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud558\ub7ec\uac00\uc57c\uaca0\ub2e4. \ud83d\ude0a"},{"id":"mvc-retrospective","metadata":{"permalink":"/mvc-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-07-MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-4/2023-10-07-MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-dashboard-mvc/pull/404","date":"2023-10-07T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 7\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.175,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","slug":"mvc-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/jdbc-retrospective"},"nextItem":{"title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","permalink":"/spring-test-isolation"}},"content":":::note PR \ub9c1\ud06c\\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-mvc/pull/404 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-mvc/pull/465 \\n3\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-mvc/pull/580 \\n:::\\n\\n### MVC \uad6c\ud604\\n\\nReflection\uc744 \uc774\uc6a9\ud558\uc5ec Spring MVC\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ubbf8\uc158\uc758 \ubaa9\ud45c\ub294 \ub2e4\uc74c\uacfc \uac19\uc558\ub2e4.\\n\\n- MVC \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uad6c\ud604\ud558\uba74\uc11c \ub0b4\ubd80 \ub3d9\uc791 \uc6d0\ub9ac\ub97c \ud559\uc2b5\ud55c\ub2e4.\\n- \uc810\uc9c4\uc801\uc778 \ub9ac\ud329\ud1a0\ub9c1\uc744 \uacbd\ud5d8\ud55c\ub2e4.\\n\\n\ubbf8\uc158\uc758 \ubaa9\ud45c\uc640 \ub354\ubd88\uc5b4 \uac01 \ud074\ub798\uc2a4\ub4e4\uc774 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \uc801\uc808\ud788 \uac00\uc9c0\ub3c4\ub85d \ud558\uace0, \ud328\ud0a4\uc9c0\uc758 \uc758\uc874 \ubc29\ud5a5\uc744 \uace0\ubbfc\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac83\uc5d0 \uc911\uc810\uc744 \ub450\uc5c8\ub2e4. \\n\\n### \uc560\ub108\ud14c\uc774\uc158 \uae30\ubc18 \ud504\ub808\uc784\uc6cc\ud06c \ub9cc\ub4e4\uae30\\n\\n\uae30\uc874 \ucf54\ub4dc\uc5d0 ManualHandlerMapping\uc774\ub77c\ub294 \uc11c\ube14\ub9bf\uc744 \uc9c1\uc811 \ub4f1\ub85d\ud574\uc11c \uc0ac\uc6a9\ud558\ub294 HandlerMapping \ud074\ub798\uc2a4\uac00 \uc788\uc5c8\uace0, 1\ub2e8\uacc4\uc5d0\uc11c\ub294 \uc560\ub108\ud14c\uc774\uc158 \uae30\ubc18\uc758 AnnotationHandlerMapping\uc744 \uad6c\ud604\ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 @Controller, @RequestMapping\uc744 Reflection\uc744 \uc774\uc6a9\ud558\uc5ec \uc2a4\uce94\ud558\uace0, \ud578\ub4e4\ub7ec \ub9e4\ud551\uc744 \ub4f1\ub85d\ud558\ub294 \ubd80\ubd84\uae4c\uc9c0 \uc9c4\ud589\ud574\uc57c \ud588\ub2e4. \\n\ud14c\uc624\uac00 @GetMapping\uc774\ub098 @PostMapping \ubd80\ubd84\ub3c4 \uc9c4\ud589\ud558\uba74 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4\uace0 \ud574\uc11c \uac19\uc774 \uc9c4\ud589\ud574 \ubcf4\uc558\ub2e4. \\n\ucd94\uac00\ub85c \ubbf8\uc158 \uc694\uad6c\uc0ac\ud56d\uc740 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ud074\ub798\uc2a4 \ub808\ubca8\uc5d0 \uc801\uc6a9\ub41c @RequestMapping\ub3c4 \ub3d9\uc791\ud558\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\uc558\ub2e4. \\n\\n```mermaid\\ngraph LR\\n AHM[AnnotationHandlerMapping] --\x3e AS[AnnotationScanner]\\n\\tAHM --\x3e HKG[HandlerKeyGenerator] --\x3e HMAP[HttpMappingAnnotationParser]\\n```\\n\\n\ub2e4\uc74c\uacfc \uac19\uc740 Flow\ub85c Handler(\uc2e4\uc81c \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uba54\uc11c\ub4dc) \ub4f1\ub85d\uc744 \uc9c4\ud589\ud55c\ub2e4. \\n\\n1. @Controller\uac00 \uc801\uc6a9\ub41c \ud074\ub798\uc2a4\uc758 \uc815\ubcf4\ub97c \uc2a4\uce94\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4. \\n2. @Controller\uac00 \uc801\uc6a9\ub41c \ud074\ub798\uc2a4\uc758 @RequestMapping\uc774 \uc801\uc6a9\ub41c \uba54\uc11c\ub4dc\ub4e4\uc758 \uc815\ubcf4\ub97c \ubc18\ud658\ud55c\ub2e4. \\n3. \uac01 \uba54\uc11c\ub4dc\ub4e4\uc744 \uc21c\ud68c\ud558\uba70 HandlerKey(uri + httpMethod \uc815\ubcf4)\uc640 HandlerExecution(\uc778\uc2a4\ud134\uc2a4 + \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc)\uc744 \uc0dd\uc131\ud558\uc5ec `Map`\uc5d0 \ucd94\uac00\ud55c\ub2e4. \\n\\nAnnotationHandlerMapping\uc758 initialize \uba54\uc11c\ub4dc\uc5d0\uc11c Handler\ub97c \ub4f1\ub85d\ud55c\ub2e4. \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```java title=AnnotationHandlerMapping\\npublic void initialize() {\\n if (!initialized.compareAndSet(false, true)) {\\n return;\\n }\\n\\n final Map, ControllerInstance> controllers = annotationScanner.scanControllers();\\n final Set methods = annotationScanner.scanHttpMappingMethods(controllers.keySet());\\n for (final Method method : methods) {\\n final ControllerInstance controller = controllers.get(method.getDeclaringClass());\\n final HandlerExecution handlerExecution = new HandlerExecution(controller.getInstance(), method);\\n final List handlerKeys = handlerKeyGenerator.generate(controller.getUriPrefix(), method);\\n handlerKeys.forEach(handlerKey -> handlerExecutions.put(handlerKey, handlerExecution));\\n }\\n\\n log.info(\\"Initialized AnnotationHandlerMapping!\\");\\n handlerExecutions.keySet().forEach(key -> log.info(\\"key: {}, Handler: {}\\", key, handlerExecutions.get(key)));\\n}\\n```\\n\\n### Legacy MVC\uc640 @MVC \ud1b5\ud569\\n\\n2\ub2e8\uacc4\ub294 Legacy MVC\uc640 AnnotationHandlerMapping\uc744 \ud1b5\ud569\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. \\n\uae30\uc874\uc758 MVC\uc640 \uc560\ub108\ud14c\uc774\uc158\uc774 \uc801\uc6a9\ub41c MVC \ub450 \uac1c\ub97c \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5b4\uc57c \ud5c0\ub2e4. \\n\ub300\ub7b5\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n1. DispatcherServlet.service(request, response) \ud638\ucd9c\\n2. HandlerMappings\ub97c \ud1b5\ud574 \uc785\ub825\ubc1b\uc740 request\uc5d0 \ud574\ub2f9\ud558\ub294 Handler \uc870\ud68c\\n3. HandlerAdapters\ub97c \ud1b5\ud574 Handler\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\ub294 HandlerAdapter \uc870\ud68c\\n4. HandlerAdapter\uc758.handle \uba54\uc11c\ub4dc \uc2e4\ud589\\n5. View\uc758 render \ud638\ucd9c\\n\\n```mermaid\\ngraph LR\\n D[DispatcherServlet]\\n D --\x3e HMS[HandlerMappings]\\n D --\x3e HAS[HandlerAdapters]\\n\\n\\tHMS --\x3e HandlerMapping\\n\\tsubgraph HandlerMapping\\n\\t\\tdirection BT\\n\\t\\tAHM[AnnotationHandlerMapping] --\x3e HM[HandlerMapping]\\n\\t\\tMHM[ManualHandlerMapping] --\x3e HM\\n\\tend\\n\\n\\tHAS --\x3e HandlerAdapter\\n\\tsubgraph HandlerAdapter\\n\\t\\tdirection BT\\n\\t\\tHEHA[HandlerExecutionHandlerAdapter] --\x3e HA[HandlerAdapter]\\n\\t\\tCHA[ControllerHandlerAdapter] --\x3e HA\\n\\tend\\n```\\n\\n### \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815\\n\\n\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc1c\uc804 \uacfc\uc815 \ub300\ud55c \uad6c\uad6c\uc758 \uac15\uc758\uac00 \uc788\uc5c8\ub2e4. \\n\uac04\ub2e8\ud558\uac8c \uc815\ub9ac\ud558\uc790\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ud750\ub984\uc73c\ub85c \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ubc1c\uc804\ud588\ub2e4.\\n\\n```mermaid\\ngraph LR\\n WWW --\x3e CGI(Common Gateway Interface) --\x3e Servlet --\x3e JSP --\x3e MVC --\x3e Framework --\x3e Non-Blocking\\n```\\n\\n\ub0b4\uc6a9\uc774 \uae38\uc5b4\uc838\uc11c [\ub2e4\uc74c \ubb38\uc11c](./web-application-evolution)\uc5d0 \uc815\ub9ac\ud588\ub2e4.\\n\\n### \ucd94\uc0c1\uc801\uc778 \uac1c\ub150 \ud559\uc2b5 \ubc29\ubc95\\n\\n\uc9c1\uad00\uc801\uc774\uc9c0 \uc54a\uc740 \ucd94\uc0c1\uc801\uc778 \uac1c\ub150\uc744 \ud559\uc2b5\ud560 \ub54c\ub294 \uac1c\ub150\uc758 \uad6c\ud604\uc744 \ucc38\uace0\ud558\uba74 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub41c\ub2e4\uace0 \ud55c\ub2e4.\\n\\n| \uac1c\ub150 | \uad6c\ud604 |\\n| ---- | ------------------------------------------------ |\\n| OOP | Java |\\n| WAS | Tomcat, Jetty |\\n| IoC | Spring BeanFactory, Servlet Container, Framework |\\n| DI | Spring BeanFactory |\\n\\n### \uc815\ub9ac\\n\\n\uc9c0\uae08\uae4c\uc9c0 \uc2a4\ud504\ub9c1\uc758 DispatcherServlet\uc758 \ub3d9\uc791\uc744 \uc774\ub860\uc801\uc73c\ub85c\ub9cc \uc54c\uace0 \uc788\uc5c8\ub294\ub370, \uc2e4\uc81c\ub85c \uad6c\ud604\ud574 \ubcf4\ub2c8 \uc870\uae08 \ub354 \uc774\ud574\uac00 \uc798 \uac00\ub294 \uac83 \uac19\ub2e4. \\n\uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c \ub098\uc758 \ub9ac\ubdf0\uc5b4\ub294 \ub8e8\uce74, \ub9ac\ubdf0\uc774\ub294 \ud5e4\ub098\uc600\ub2e4. \\n\ub9e4 \ub2e8\uacc4\ub9c8\ub2e4 \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0\ud574 \uc900 \ub8e8\uce74\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\uace0, \ud5e4\ub098\uc5d0\uac8c \uc774\uc0c1\ud55c \ub9ac\ubdf0\ub97c \ub9ce\uc774 \ub0a8\uae34 \uac83 \uac19\uc740\ub370 \uaf3c\uaf3c\ud788 \ubc18\uc601\ud574\uc918\uc11c \uac10\uc0ac\ud558\ub2e4. \\n\uc624\ub7ab\ub3d9\uc548 \uae30\ub2e4\ub824\uc654\ub358 \ub808\ubca8 4 \ubbf8\uc158\uc774 \ud558\ub098\uc529 \ub9c8\ubb34\ub9ac \ub420 \ub54c \ub9c8\ub2e4 \uc544\uc26c\uc6c0\uc774 \ub0a8\ub294\ub2e4."},{"id":"spring-test-isolation","metadata":{"permalink":"/spring-test-isolation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-03-\ud14c\uc2a4\ud2b8 \uaca9\ub9ac.md","source":"@site/blog/2023-4/2023-10-03-\ud14c\uc2a4\ud2b8 \uaca9\ub9ac.md","title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","description":"\ud14c\uc2a4\ud2b8 \uaca9\ub9ac","date":"2023-10-03T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 3\uc77c","tags":[{"label":"test","permalink":"/tags/test"}],"readingTime":4.315,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","slug":"spring-test-isolation","tags":["test"]},"unlisted":false,"prevItem":{"title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/mvc-retrospective"},"nextItem":{"title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","permalink":"/web-application-evolution"}},"content":"### \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\\n\\n\ud14c\uc2a4\ud2b8\uc758 \uc21c\uc11c\uc5d0 \ub530\ub77c \uc131\uacf5 \uc2e4\ud328 \uc5ec\ubd80\uac00 \uacb0\uc815\ub418\ub294 \ube44\uacb0\uc815\uc801\uc778(non-determinism) \ud14c\uc2a4\ud2b8\uac00 \ub418\uc5b4\uc11c\ub294 \uc548\ub418\uace0, \ud14c\uc2a4\ud2b8\ub294 \ud56d\uc0c1 \uc21c\uc11c\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc218\ud589\ub418\ub3c4\ub85d \ubcf4\uc7a5\ub418\uc5b4\uc57c \ud55c\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uc790\uc6d0\uc758 \uacf5\uc720, \uc678\ubd80 API, \uc2dc\uac04 \ub4f1\uc73c\ub85c \ube44\uacb0\uc815\uc801\uc778 \ud14c\uc2a4\ud2b8\uac00 \ub41c\ub2e4. \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \uc0ac\uc6a9\ud558\uac70\ub098, \ucee8\ud14d\uc2a4\ud2b8\ub97c \uc7ac\uc2e4\ud589\ud558\ub294 `@DirtiesContext`, \uc790\uc6d0\uc744 \ucd08\uae30\ud654\ud558\uae30 \uc704\ud574 \ud14c\uc2a4\ud2b8 \uc774\ud6c4\uc5d0 \ud14c\uc774\ube14\uc744 \ub864\ubc31 \ud558\ub294 `@Transactional`\ub4f1 \ub2e4\uc591\ud55c \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\ud574\ub2f9 \uae00\uc5d0\uc11c\ub294 \uc2a4\ud504\ub9c1\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc790\uc6d0\uc758 \uacf5\uc720\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud574 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\ub97c \uc218\ud589\ud558\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc124\uba85\ud55c\ub2e4. \\n\\n:::note Independent - FIRST\\n\\n\ud14c\uc2a4\ud2b8\ub07c\ub9ac \uc11c\ub85c \uc758\uc874\ud558\uba74 \uc548 \ub41c\ub2e4. \\n\uc11c\ub85c \uc758\uc874\ud558\uac8c \ub41c\ub2e4\uba74 \ud558\ub098\uc758 \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud328\ud560 \ub54c, \ub610 \ub2e4\ub978 \ud558\ub098\uc758 \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud328\ud560 \uc218 \uc788\ub2e4. \\n\ub2e4\ub978 \ud14c\uc2a4\ud2b8\uc5d0 \uc758\uc874\ud558\uc9c0 \uc54a\uace0, \ub3c5\ub9bd\uc801\uc73c\ub85c \uc2e4\ud589 \uac00\ub2a5\ud55c \ud14c\uc2a4\ud2b8\uac00 \uc88b\uc740 \ud14c\uc2a4\ud2b8\ub2e4. \\n\\n:::\\n\\n### TestExecutionListener\\n\\n\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 TextExecutionListner\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 \ud14c\uc2a4\ud2b8 \uc2e4\ud589 \ub2e8\uacc4\uc5d0\uc11c \uc774\ubca4\ud2b8\ub97c \uc218\uc2e0\ud560 \uc218 \uc788\ub2e4. \\n\uc774\ub97c \uc774\uc6a9\ud558\uba74 JUnit\uc758 @BeforeEach\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uacfc \uc720\uc0ac\ud558\uac8c, \ud14c\uc2a4\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30 \uc774\uc804 \ub610\ub294 \uc774\ud6c4\uc5d0 \ud544\uc694\ud55c \uc791\uc5c5\uc744 \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\ub2e4. \\n\\n```java title=TextExecutionListner\\npublic interface TestExecutionListener {\\n default void beforeTestClass(TestContext testContext) throws Exception {}\\n default void prepareTestInstance(TestContext testContext) throws Exception {}\\n default void beforeTestMethod(TestContext testContext) throws Exception {}\\n default void beforeTestExecution(TestContext testContext) throws Exception {}\\n default void afterTestExecution(TestContext testContext) throws Exception {}\\n default void afterTestMethod(TestContext testContext) throws Exception {}\\n default void afterTestClass(TestContext testContext) throws Exception {}\\n}\\n```\\n\\n### AbstractTestExecutionListener \uc0c1\uc18d\ud558\uc5ec \uad6c\ud604\\n\\nAbstractTestExecutionListener\ub97c \uc0c1\uc18d\ubc1b\uc544 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac \ud658\uacbd\uc744 \ub9cc\ub4e4\uc5b4\uc8fc\ub294 \ud074\ub798\uc2a4\ub85c, \uc778\ud130\ud398\uc774\uc2a4\uc778 TextExecutionListner\uc640 \ub2ec\ub9ac Ordered\uac00 \uad6c\ud604\ub418\uc5b4 \uc788\uc5b4 \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\uc544 \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uac00 \uc81c\uacf5\ud558\ub294 \ub9ac\uc2a4\ub108 \ub2e4\uc74c\uc5d0 \uc2e4\ud589\uc2dc\ud0a4\ub3c4\ub85d \ud574\uc900\ub2e4. \\n\ub2e4\uc74c\uacfc \uac19\uc774 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac01\uac01\uc758 \ud14c\uc774\ube14\uc5d0 \ud574\ub2f9\ud558\ub294 Truncate \ucffc\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc870\ud68c\ud558\uace0, Test \uba54\uc11c\ub4dc\uac00 \ub05d\ub0a0\ub54c \ub9c8\ub2e4 \ud574\ub2f9 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uc5ec \ud14c\uc774\ube14\uc744 \ucd08\uae30\ud654\uc2dc\ud0a4\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n\\n```java title=DatabaseCleaner\\n\\npublic class DatabaseCleaner extends AbstractTestExecutionListener {\\n\\n private static final String TRUNCATE_TABLE_QUERY = \\"\\"\\"\\n SELECT Concat(\'TRUNCATE TABLE \', TABLE_NAME, \';\') \\n FROM INFORMATION_SCHEMA.TABLES\\n WHERE TABLE_SCHEMA = \'PUBLIC\'\\n \\"\\"\\";\\n\\n @Override\\n public void afterTestMethod(TestContext testContext) {\\n JdbcTemplate jdbcTemplate = getJdbcTemplate(testContext);\\n List truncateTableQueries = getTruncateTableQueries(jdbcTemplate);\\n truncateTables(jdbcTemplate, truncateTableQueries);\\n }\\n\\n private JdbcTemplate getJdbcTemplate(TestContext testContext) {\\n return testContext.getApplicationContext().getBean(JdbcTemplate.class);\\n }\\n\\n private List getTruncateTableQueries(JdbcTemplate jdbcTemplate) {\\n return jdbcTemplate.queryForList(TRUNCATE_TABLE_QUERY, String.class);\\n }\\n\\n private void truncateTables(JdbcTemplate jdbcTemplate, List truncateTableQueries) {\\n jdbcTemplate.execute(\\"SET REFERENTIAL_INTEGRITY FALSE\\");\\n truncateTableQueries.forEach(jdbcTemplate::execute);\\n jdbcTemplate.execute(\\"SET REFERENTIAL_INTEGRITY TRUE\\");\\n }\\n}\\n\\n```\\n\\n### Listener \ub4f1\ub85d\\n\\n@TestExecutionListeners\ub97c \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uc815\uc758 \ub9ac\uc2a4\ub108\ub97c \ub4f1\ub85d\ud560 \uc218 \uc788\ub2e4. \\nmergeMode\uc758 \uae30\ubcf8\uac12\uc740 REPLACE_DEFAULTS\ub85c \ub9ac\uc2a4\ub108\uac00 \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0 \ub4f1\ub85d\ub41c \ub9ac\uc2a4\ub108\ub85c \ubcc0\uacbd\ub41c\ub2e4. \\nMERGE_WITH_DEFAULTS\ub85c \uc124\uc815\ud55c\ub2e4\uba74 Ordered \uae30\uc900\uc73c\ub85c \uc21c\uc11c\uac00 \uacb0\uc815\ub41c\ub2e4. \\n\uc774\ud6c4 \uaca9\ub9ac\uac00 \ud544\uc694\ud55c \ud14c\uc2a4\ud2b8\ub4e4\uc740 \ub2e4\uc74c\uc758 \ucd94\uc0c1 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ud558\uc5ec \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4. \\n\\n```java title=AcceptanceTest\\n\\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\\n@TestExecutionListeners(\\n value = DatabaseCleaner.class,\\n mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS\\n)\\npublic abstract class AcceptanceTest {\\n\\n @LocalServerPort\\n private int port;\\n\\n @BeforeEach\\n public void setUp() {\\n RestAssured.port = port;\\n }\\n}\\n\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[The Spring TestExecutionListener, Baeldung](https://www.baeldung.com/spring-testexecutionlistener) \\n[\uc778\uc218\ud14c\uc2a4\ud2b8\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\ud558\uae30, \ud14c\ucf54\ube14](https://tecoble.techcourse.co.kr/post/2020-09-15-test-isolation/) \\n[Eradicating Non-Determinism in Tests, martin fowler](https://martinfowler.com/articles/nonDeterminism.html) \\n[@SpringBootTest\uc758 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\uc2dc\ud0a4\uae30, MangKyu](https://mangkyu.tistory.com/264)"},{"id":"web-application-evolution","metadata":{"permalink":"/web-application-evolution","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-30-\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815.mdx","source":"@site/blog/2023-3/2023-09-30-\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815.mdx","title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","description":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","date":"2023-09-30T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 30\uc77c","tags":[{"label":"web application","permalink":"/tags/web-application"}],"readingTime":7.5,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","slug":"web-application-evolution","tags":["web application"]},"unlisted":false,"prevItem":{"title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","permalink":"/spring-test-isolation"},"nextItem":{"title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","permalink":"/log-async-exception"}},"content":"### \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815\\n\\n\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc1c\uc804 \uacfc\uc815 \ub300\ud55c \uad6c\uad6c\uc758 \uac15\uc758\uac00 \uc788\uc5c8\ub2e4. \\n\uac04\ub2e8\ud558\uac8c \uc815\ub9ac\ud558\uc790\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ud750\ub984\uc73c\ub85c \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ubc1c\uc804\ud588\ub2e4. \\n\uc6d0\ub798 \ud68c\uace0\uc5d0 \uc791\uc131\ud558\ub824\uace0 \ud588\uc9c0\ub9cc, \uc815\ub9ac\ud558\ub2e4 \ubcf4\ub2c8 \uc870\uae08 \uae38\uc5b4\uc838\uc11c \ub530\ub85c \ubd84\ub9ac\ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n WWW --\x3e CGI(Common Gateway Interface) --\x3e Servlet --\x3e JSP --\x3e MVC --\x3e Framework --\x3e Non-Blocking\\n```\\n\\n### WWW(1989)\\n\\n\uc815\uc801 \ud398\uc774\uc9c0\ub97c \uc81c\uacf5\ud558\ub294 \uc6f9 \uc11c\ubc84\ub97c \uc2dc\uc791\uc73c\ub85c \ub3d9\uc801 \ud398\uc774\uc9c0\uac00 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 CGI\uac00 \ub4f1\uc7a5\ud588\ub2e4. \\n\\n### CGI(1993) \\n\\nCGI\ub294 \ub3d9\uc801 \ucf58\ud150\uce20\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud55c \uaddc\uc57d\uc73c\ub85c, \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc774\uc6a9\ud574\uc11c \ub9e4 \uc694\uccad\ub9c8\ub2e4 \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\uc2dc\ucf1c \uc815\ubcf4\ub97c \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. \ud558\uc9c0\ub9cc \ub9e4 \uc694\uccad\ub9c8\ub2e4 \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \uc11c\ubc84\uc5d0 \ub9ce\uc740 \ubd80\ud558\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc774\ub7ec\ud55c \ub2e8\uc810\uc744 \uadf9\ubcf5\ud558\uae30 \uc704\ud574 \ub098\uc628 \uac83\uc774 Servlet\uc774\ub2e4. \\n\\n### Servlet(1996)\\n\\nServlet\uc740 \uc6f9 \uc11c\ubc84\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 \uc790\ubc14 \ud504\ub85c\uadf8\ub7a8\uc73c\ub85c HTTP\ub97c \uc774\uc6a9\ud558\uc5ec \uc6f9 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc744 \uc218\uc2e0\ud558\uace0 \uc751\ub2f5\ud55c\ub2e4. CGI\uc640 \ub2e4\ub974\uac8c \ub9e4 \uc694\uccad\ub9c8\ub2e4 \ud504\ub85c\uc138\uc2a4\uac00 \uc544\ub2cc \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc5ec \uc751\ub2f5\ud55c\ub2e4. \\n\ud558\uc9c0\ub9cc View \uc601\uc5ed\uc758 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uae30 \uc704\ud574 Servlet\uc758 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \uc54c\uc544\uc57c \ud558\ub294 \ub4f1 \ubcf5\uc7a1\ub3c4\uac00 \ub108\ubb34 \ub192\uc558\ub2e4. \ub530\ub77c\uc11c \ud574\ub2f9 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 JSP\uac00 \ub4f1\uc7a5\ud588\ub2e4. \\n\\n### JSP(1999)\\n\\nJSP\ub294 HTML\uc5d0 \uc790\ubc14 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc5ec \ub3d9\uc801 \uc6f9 \ud398\uc774\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\uc220\ub85c, \uc720\uc0ac\ud55c \uae30\uc220\ub85c\ub294 ASP, PHP\uac00 \uc788\ub2e4. \\nJSP\ub9cc \uc0ac\uc6a9\ud558\uc5ec \ud504\ub85c\uadf8\ub798\ubc0d\ud55c\ub2e4\uba74 Model 1, \uc544\ub798 \uad6c\uc131\ub3c4\uc640 \uac19\uc774 JSP\uac00 View \uc601\uc5ed\ub9cc \ub2f4\ub2f9\ud55c\ub2e4\uba74 Model 2\ub77c\uace0 \ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: JSP Model 2\\n---\\ngraph LR\\n Client -- Request --\x3e Servlet <-- JDBC --\x3e Database\\n\\tServlet --\x3e Bean\\n\\tServlet --\x3e JSP\\n\\tBean <--\x3e JSP\\n\\tJSP -- Response --\x3e Client\\n```\\n\\n### MVC(2000)\\n\\n\uc704 JSP\uc758 \uad6c\uc131\ub3c4\ub97c \ubcf4\uba74 \ud604\uc7ac MVC\uc640 \ub9e4\uc6b0 \uc720\uc0ac\ud55c\ub370, Govind Seshadri\ub77c\ub294 \uc0ac\ub78c\uc774 JSP Model 2\ub97c MVC \ud328\ud134\uc73c\ub85c \uacf5\uc2dd\ud654\ub97c \uc81c\uc548\ud588\ub2e4. \\n\\n> I provide an in-depth look at how you can gain optimal separation of presentation from content by using the JSP Model 2 architecture. This model can also be seen as a server-side implementation of the popular Model-View-Controller (MVC) design pattern. \\n> Govind Seshadri\\n\\n\uc774\ub54c MVC \ud328\ud134\uc774 \ucc98\uc74c \ud0c4\uc0dd\ud55c \uac83\uc740 \uc544\ub2c8\uace0, \uc11c\ubc84 \uce21 \uad6c\ud604\uc774\ub77c\uace0 \ud558\ub294 \uac83\uc744 \ubcf4\ub2c8 MVC\uac00 \ucc98\uc74c \ub4f1\uc7a5\ud55c \uac74 \uc544\ub2cc \uac83 \uac19\ub2e4. \\n[\ud574\ub2f9 \ubb38\uc11c](https://folk.universitetetioslo.no/trygver/themes/mvc/mvc-index.html)\ub97c \ubcf4\uba74 MVC\ub77c\ub294 \uc6a9\uc5b4\uc758 \ub4f1\uc7a5\uc740 1978\ub144\uc5d0 \ub4f1\uc7a5\ud55c \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. \\n\\n### Spring Framework(2003)\\n\\nSpring\uc740 \ubcf5\uc7a1\ud588\ub358 J2EE\uc744 \ub300\uccb4\ud558\uae30 \uc704\ud574 2003\ub144\uc5d0 \ub4f1\uc7a5\ud588\ub2e4. \\nJ2EE\ub294 \uc6f9 \uae30\ubc18\uc758 \uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\uae30 \uc704\ud55c \ud50c\ub7ab\ud3fc\uc73c\ub85c \uc704\uc5d0\uc11c \uc124\uba85\ud55c Servlet, JSP, EJB \ub4f1\uc758 \uae30\uc220\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \uc774\uc911 EJB\ub77c\ub294 \uae30\uc220\uc774 J2EE\uc758 \ud575\uc2ec \uae30\uc220\uc774\uc5c8\ub294\ub370, \ud574\ub2f9 \uae30\uc220\uc774 \ub9e4\uc6b0 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub9ce\uc558\ub2e4\uace0 \ud55c\ub2e4. \\n2002\ub144\uc5d0 Rod Johnson\uc774 EJB\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 J2EE \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc800\uc220\ud55c `Expert One-to-One J2EE Development`\ub77c\ub294 \ucc45\uc744 \ubc1c\ud589\ud588\uace0, \ucd9c\uac04 \ud6c4 Juergen Hoeller, Yann Caroff\uac00 Rod Johnson\uc5d0\uac8c \uc624\ud508\uc18c\uc2a4 \uc81c\uc548\uc744 \ud558\uc5ec \uc2a4\ud504\ub9c1\uc774 \ud0c4\uc0dd\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n\uc2a4\ud504\ub9c1\uc740 \uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc11c\ube44\uc2a4 \uae30\ub2a5\uc744 POJO\uc5d0 \uc81c\uacf5\ud558\uba70, \uc774 \ub355\ubd84\uc5d0 \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\ub2e4. \\n\\n### WebFlux \uc774\uc804 Servlet 3.0(2009), 3.1(2013)\\n\\nTomcat\uc758 NIO \ub3d9\uc791 \ubc29\uc2dd\uc744 \ubcf4\uba74 Poller\uac00 \uc18c\ucf13 \ucee4\ub125\uc158\uc744 \ub4e4\uace0 \uc788\ub2e4\uac00 \ucc98\ub9ac\uac00 \uac00\ub2a5\ud560 \ub54c \uc2a4\ub808\ub4dc\ub97c \ud560\ub2f9\ud558\ub294 \uc2dd\uc73c\ub85c \ucc98\ub9ac\ub97c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \ud560\ub2f9 \ud6c4 Servlet\uacfc \ud1b5\uc2e0\ud558\ub294 \ubd80\ubd84\uc740 \ube14\ub85c\ud0b9 \ubc29\uc2dd\uc73c\ub85c \uc694\uccad\uc774 \ub05d\ub0a0 \ub54c\uae4c\uc9c0 \uc2a4\ub808\ub4dc\ub97c \uc810\uc720\ud558\uace0 \uc788\uc5c8\uace0, \uc2a4\ub808\ub4dc \uc810\uc720\ub85c \uc778\ud574 \uc694\uccad\uc774 max thread\uc5d0 \ub3c4\ub2ec\ud558\uba74 \uc694\uccad\uc744 \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uadf8\ub798\uc11c \ube44\ub3d9\uae30 \ubc29\uc2dd\uc758 Servlet\uc774 Servlet 3.0\uc5d0 \ub4f1\uc7a5\ud588\ub2e4. \ud558\uc9c0\ub9cc \uc804\ud1b5\uc801\uc778 I/O \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc740 \ube14\ub85c\ud0b9 \ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud588\ub2e4. Servlet 3.1\uc5d0\uc11c \ub17c\ube14\ub85c\ud0b9 I/O\uac00 \ucd94\uac00\ub418\uc5c8\uc9c0\ub9cc, \ub9ce\uc774 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc558\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### Spring WebFlux(2017)\\n\\n\uc801\uc740 \uc218\uc758 \uc2a4\ub808\ub4dc\ub85c \ub3d9\uc2dc\uc131\uc744 \ucc98\ub9ac\ud558\uace0, \uc801\uc740 \ub9ac\uc18c\uc2a4\ub85c \ud655\uc7a5\uc774 \uac00\ub2a5\ud55c \ub17c\ube14\ub85c\ud0b9 \ubc29\uc2dd\uc758 \uc6f9 \uae30\uc220\uc774 \ud544\uc694\ud588\uace0, \uae30\uc874\uc758 Servlet\uc758 \uacbd\uc6b0 \ube44\ub3d9\uae30\ub97c \uc9c0\uc6d0\ud55c\ub2e4 \ud574\ub3c4 \ub3d9\uae30\uc2dd API\ub4e4\uc774 \ub9ce\uc774 \ub0a8\uc544\uc788\uc5c8\uae30 \ub54c\ubb38\uc5d0 \uc774\ub7ec\ud55c Servlet\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294 \uae30\uc220\uc774 \ud544\uc694\ud588\ub2e4. \ub610\ud55c \uae30\uc874\uc5d0 Netty\uc640 \uac19\uc774 \ube44\ub3d9\uae30, \ub17c\ube14\ub85c\ud0b9 \ubc29\uc2dd \uc11c\ubc84\ub85c \uc790\ub9ac\ub97c \uc798 \uc7a1\uc740 \uc11c\ubc84\ub97c \uc704\ud574 Spring WebFlux\uac00 \ub4f1\uc7a5\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub370\uc774\ud130 \uc811\uadfc\uc744 \uc704\ud574 \uc0ac\uc6a9\ud558\ub294 JDBC\uc758 \uacbd\uc6b0 Blocking API\ub77c, Spring Webflux\uc5d0\uc11c\ub294 R2DBC\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### \ub9c8\uce58\uba70\\n\\n\ud574\ub2f9 \uc815\ub9ac \ub0b4\uc6a9\uc758 \uacbd\uc6b0 Async, Non Blocking \uad00\ub828\ub41c \ub0b4\uc6a9\uc744 \uae4a\uac8c \uacf5\ubd80\ud55c \uc801\uc774 \uc5c6\uc5b4\uc11c \uc815\ud655\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\ub2e4. \\n\uadf8\ub798\ub3c4 \uae30\uc220\uc758 \ub4f1\uc7a5 \ubc30\uacbd\uc774\ub098 \uacfc\uc815\uc744 \uc54c\uace0 \uc788\ub2e4\uba74 \uc870\uae08 \ub354 \uae4a\uc774 \uc788\ub294 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc1c\uc804 \uacfc\uc815, \uad6c\uad6c \uac15\uc758 \\n[Dynamic Content with CGI, Apache Tutorial](https://httpd.apache.org/docs/trunk/en/howto/cgi.html) \\n[History of Spring and the Spring Framework, Spring](https://docs.spring.io/spring-framework/reference/overview.html#overview-history) \\n[Understanding JavaServer Pages Model 2 architecture, Govind Seshadri](https://www.infoworld.com/article/2076557/understanding-javaserver-pages-model-2-architecture.html) \\n[MVC, XEROX PARC](https://folk.universitetetioslo.no/trygver/themes/mvc/mvc-index.html) \\n[Expert One-to-One J2EE Development, Rod Johnson](https://www.amazon.com/Expert-One-One-Development-without/dp/0764558315) \\n[\ubc30\ub2ec\uc758\ubbfc\uc871 \ucd5c\uc804\ubc29 \uc2dc\uc2a4\ud15c! \u2018\uac00\uac8c\ub178\ucd9c \uc2dc\uc2a4\ud15c\u2019\uc744 \uc18c\uac1c\ud569\ub2c8\ub2e4, \ubc30\ub2ec\uc758\ubbfc\uc871](https://techblog.woowahan.com/2667/) \\n[Asynchronous processing support in Servlet 3.0, Dr. Xinyu Liu](https://www.infoworld.com/article/2077995/java-concurrency-asynchronous-processing-support-in-servlet-3-0.html)\\n[WebFlux Overview, Spring](https://docs.spring.io/spring-framework/reference/web/webflux/new-framework.html)\\n[Spring WebFlux\uc640 Armeria\ub97c \uc774\uc6a9\ud558\uc5ec Microservice\uc5d0 \ud544\uc694\ud55c Reactive + RPC \ub3d9\uc2dc\uc5d0 \uc7a1\uae30, Naver D2](https://d2.naver.com/helloworld/6080222) \\n[Spring WebFlux\ub780 \ubb34\uc5c7\uc77c\uae4c](https://tweety1121.tistory.com/entry/Spring-WebFlux-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C)"},{"id":"log-async-exception","metadata":{"permalink":"/log-async-exception","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac.mdx","source":"@site/blog/2023-3/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac.mdx","title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","description":"\ubb38\uc81c \uc0c1\ud669","date":"2023-09-18T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 18\uc77c","tags":[{"label":"async","permalink":"/tags/async"},{"label":"exception","permalink":"/tags/exception"}],"readingTime":3.615,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","slug":"log-async-exception","tags":["async","exception"]},"unlisted":false,"prevItem":{"title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","permalink":"/web-application-evolution"},"nextItem":{"title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/tomcat-retrospective"}},"content":"### \ubb38\uc81c \uc0c1\ud669\\n\\n\ud604\uc7ac \ud2b8\ub9bd\ub4dc\ub85c\uc6b0\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ub418\uace0 \uc788\ub2e4. \ub85c\uadf8\ub97c \ud655\uc778\ud558\ub294 \ub3c4\uc911 `@Async`\uac00 \uc801\uc6a9\ub41c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ub85c\uadf8\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ucd9c\ub825\ub418\uc9c0 \uc54a\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\ud655\uc778\ud574 \ubcf4\ub2c8 Spring\uc758 `@ControllerAdvice` + `@ExceptionHandler`\uc758 \uacbd\uc6b0 \ub3d9\uae30 \uc608\uc678\ub9cc \ucc98\ub9ac\ud558\uace0, \ube44\ub3d9\uae30 \uc608\uc678\ub97c \ucc98\ub9ac\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \ubc1c\uc0dd\ud55c \ubb38\uc81c\uc600\ub2e4. \\n\\n### \ube44\ub3d9\uae30 \uc608\uc678 \ubc1c\uc0dd\uc2dc \ub85c\uae45 \uc124\uc815\\n\\n\uc2a4\ud504\ub9c1 4.1 \ubd80\ud130 \uc81c\uacf5\ub418\ub294 [AsyncUncaughtExceptionHandler](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/interceptor/AsyncUncaughtExceptionHandler.html)\uc758 \uacbd\uc6b0 \ubc18\ud658 \ud0c0\uc785\uc774 void\uc778 \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\ub97c \uc608\uc678 \ucc98\ub9ac\ud558\uae30 \uc27d\ub3c4\ub85d \ub3c4\uc640\uc900\ub2e4. \\n\\n\ub530\ub77c\uc11c AsyncUncaughtExceptionHandler \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud574\uc11c \uc608\uc678\ub97c \ud578\ub4e4\ub9c1\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud588\ub2e4. \\n\uae30\uc874\uc758 \ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac\uc758 \uacbd\uc6b0 \uc608\uc678\uac00 \ubc1c\uc0dd\ud560 \ub54c \uc2e4\ud589 \ud750\ub984\uc744 \ucd94\uc801\ud558\uae30 \uc704\ud574 MDC(Mapped Diagnostic Context)\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4. \\n\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\ub85c MDC\uc758 \uc815\ubcf4\ub97c \uac00\uc838\uc640\uc11c \ub85c\uadf8\ub97c \ucd9c\ub825\ud558\ub3c4\ub85d \uc124\uc815\ud588\ub2e4. \\n\\n```java title=AsyncExceptionHandler\\n@Slf4j\\npublic class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {\\n\\n private static final String LOG_FORMAT = \\"[%s] %s\\";\\n\\n @Override\\n public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {\\n log.info(String.format(LOG_FORMAT, MDC.get(REQUEST_ID.key()), throwable.getMessage()), throwable);\\n }\\n}\\n```\\n\\nAsyncExceptionHandler\uc758 \uacbd\uc6b0 AsyncConfigurer\ub97c \uad6c\ud604\ud55c Configuration \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub4f1\ub85d\ud560 \uc218 \uc788\ub2e4. \\ngetAsyncUncaughtExceptionHandler() \uba54\uc11c\ub4dc\ub97c \uc624\ubc84\ub77c\uc774\ub529\ud558\uc5ec AsyncExceptionHandler\ub97c \ubc18\ud658\ud558\ub3c4\ub85d \uc124\uc815\ud558\uba74 \ub41c\ub2e4. \\n\\n```java title=AsyncConfig\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig implements AsyncConfigurer {\\n\\n @Override\\n public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {\\n return new AsyncExceptionHandler();\\n }\\n}\\n```\\n\\n\uc774\uc81c \ube44\ub3d9\uae30 \uc0c1\ud669\uc5d0\uc11c \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 AsyncUncaughtExceptionHandler\uc758 \uad6c\ud604\uccb4\uc778 AsyncExceptionHandler\uac00 \uc608\uc678\ub97c \uc7a1\uc544 \ucc98\ub9ac\ud55c\ub2e4. \\n\\n### MDC \uc815\ubcf4 \uc5f0\ub3d9 \ubb38\uc81c\\n\\n\ube44\ub3d9\uae30 \ucc98\ub9ac\uc758 \uacbd\uc6b0 \ubcc4\ub3c4\uc758 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 ThreadLocal \uae30\ubc18\uc73c\ub85c \ub3d9\uc791\ud558\ub294 MDC\uc758 \uc815\ubcf4\ub97c \uc5bb\uc5b4\uc62c \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\\n![./mdc-null.png](./mdc-null.png)\\n\\n\uc2a4\ud504\ub9c1 4.3 \uc774\uc0c1\ubd80\ud130 \uc81c\uacf5\ub418\ub294 [TaskDecorator](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html)\ub97c \uc774\uc6a9\ud558\uba74 TaskExecutor\ub97c \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ud560 \uc218 \uc788\ub2e4. TaskDecorator\ub97c \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \ud558\ub098 \uc0dd\uc131\ud558\uace0, Task\uac00 \uc2e4\ud589\ub418\uae30 \uc804 MDC\uc758 \uc815\ubcf4\ub97c \ubcf5\uc0ac\ud558\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n\\n```java title=MdcTaskDecorator\\npublic class MdcTaskDecorator implements TaskDecorator {\\n\\n @Override\\n public Runnable decorate(final Runnable runnable) {\\n Map threadContext = MDC.getCopyOfContextMap();\\n return () -> {\\n MDC.setContextMap(threadContext);\\n runnable.run();\\n };\\n }\\n}\\n```\\n\\n\uc0dd\uc131\ud55c Decorator \ud074\ub798\uc2a4\ub97c \uc124\uc815 \ud30c\uc77c\uc5d0 \ub4f1\ub85d\ud574 \uc900\ub2e4.\\n\\n```java title=AsyncConfig\\n@RequiredArgsConstructor\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig implements AsyncConfigurer {\\n\\n private final AsyncConfigurationProperties properties;\\n\\n @Bean\\n public ThreadPoolTaskExecutor taskExecutor() {\\n ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();\\n executor.setCorePoolSize(properties.coreSize());\\n executor.setMaxPoolSize(properties.maxSize());\\n executor.setQueueCapacity(properties.queueCapacity());\\n \\n // highlight-next-line\\n executor.setTaskDecorator(new MdcTaskDecorator());\\n executor.setWaitForTasksToCompleteOnShutdown(true);\\n executor.initialize();\\n return executor;\\n }\\n\\n @Override\\n public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {\\n return new AsyncExceptionHandler();\\n }\\n}\\n```\\n\\n\uc124\uc815 \ud6c4\uc5d0\ub294 \uc815\uc0c1\uc801\uc73c\ub85c MDC\uc5d0 \ub4e4\uc5b4\uac00 \uc788\ub294 UUID\uac00 \ucd9c\ub825\ub418\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4.\\n\\n![./mdc-not-null.png](./mdc-not-null.png)\\n\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[spring async, baeldung](https://www.baeldung.com/spring-async) \\n[@Async will not call by @ControllerAdvice for global exception](https://stackoverflow.com/questions/61885358/async-will-not-call-by-controlleradvice-for-global-exception) \\n[Spring \uc758 \ub3d9\uae30, \ube44\ub3d9\uae30, \ubc30\uce58 \ucc98\ub9ac\uc2dc \ud56d\uc0c1 context \ub97c \uc720\uc9c0\ud558\uace0 \ub85c\uae45\ud558\uae30, \uac15\ub0a8\uc5b8\ub2c8](https://blog.gangnamunni.com/post/mdc-context-task-decorator/) \\n[TaskDecorator, Spring docs](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html) \\n[AsyncUncaughtExceptionHandler](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/interceptor/AsyncUncaughtExceptionHandler.html)"},{"id":"tomcat-retrospective","metadata":{"permalink":"/tomcat-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-11-\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-3/2023-09-11-\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","description":"1, 2\ub2e8\uacc4//github.com/woowacourse/jwp-dashboard-http/pull/302","date":"2023-09-11T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 11\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":12.345,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","slug":"tomcat-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","permalink":"/log-async-exception"},"nextItem":{"title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","permalink":"/performance-test-type"}},"content":":::note PR \ub9c1\ud06c \\n1, 2\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-http/pull/302 \\n3, 4\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-http/pull/431\\n:::\\n\\n### \ud1b0\ucea3 \uad6c\ud604\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c0\uc6d0\ud560 \ub54c \uac1d\uccb4\uc9c0\ud5a5\uacfc \uad00\ub828\ub41c \ubbf8\uc158\ub3c4 \uae30\ub300\ub97c \ub9ce\uc774 \ud588\uc9c0\ub9cc \ub808\ubca8 4\uc5d0 \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc774 \uc815\ub9d0 \ud558\uace0 \uc2f6\uc5c8\ub2e4. \\n\uadf8\ub798\uc11c \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc744\uae4c\ub77c\ub294 \uac71\uc815 \ubc18, \ubbf8\uc158\uc5d0 \ub300\ud55c \uae30\ub300 \ubc18\uc73c\ub85c \ubd80\ud47c \ub9c8\uc74c\uc744 \uac00\uc9c0\uace0 \ubbf8\uc158\uc744 \uc2dc\uc791\ud588\ub358 \uac83 \uac19\ub2e4. \\n\\n\uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc801\uc808\ud558\uac8c \ucd94\uc0c1\ud654\ud558\uace0, \ubbf8\uc158\uc758 \ubcf8\uc9c8\uc744 \uc774\ud574\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158\uc740 [RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616/)\uc5d0 \uba85\uc2dc\ub41c \uc2a4\ud399(\uc644\ubcbd\ud558\uc9c0 \uc54a\uc9c0\ub9cc \ubbf8\uc158\uc5d0\uc11c \uc8fc\uc5b4\uc9c4 \uc694\uad6c\uc0ac\ud56d\ub9cc \ub9cc\uc871\ud558\ub3c4\ub85d)\uc73c\ub85c \uc694\uccad\uc744 \ubc1b\uc544 \ucc98\ub9ac \ud6c4 \ubc18\ud658\ud558\ub294\ub370 \uc9d1\uc911\ud588\ub2e4. \\n\\n### \ub2e4\uc774\uc5b4\uadf8\ub7a8\\n\\nCatalina\ub294 Tomcat\uc758 \uc11c\ube14\ub9bf \ucee8\ud14c\uc774\ub108, Coyote\ub294 HTTP 1.1 \uc6f9 \uc11c\ubc84\ub97c \uc9c0\uc6d0\ud558\ub294 \uad6c\uc131 \uc694\uc18c\ub77c\uace0 \uc0dd\uac01\ud558\uace0 \uc544\ub798\uc640 \uac19\uc774 \uad6c\uc131\ud588\ub2e4. \\n\uc0ac\uc2e4 \ub0b4\ubd80 \uad6c\uc870\ub97c \uae4a\uac8c \uacf5\ubd80\ud560 \uc2dc\uac04\uc744 \uac00\uc9c0\uc9c0 \ubabb\ud574\uc11c \uac01 \uad6c\uc131 \uc694\uc18c\uac00 \uc65c \ud574\ub2f9 \uc704\uce58\uc5d0 \uc788\ub294\uc9c0 \uc644\ubcbd\ud558\uac8c \uc124\uba85\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc774\uac74 \uc5ec\uae30\uc5d0 \uc788\uc73c\uba74 \uc88b\uc744 \uac83 \uac19\uc740\ub370? \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e4\uba74 \uc801\uc808\ud55c \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\uc2dc\ud0a4\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\ub2e4. \\n\ub610\ud55c \uc801\uc808\ud558\uac8c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc744 \ub2e8\ubc29\ud5a5\uc73c\ub85c \ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph coyote\\n\\t\\tHP[Http11Processor] --\x3e A\\n\\t\\tHP --\x3e HttpRequestParser\\n\\t\\tHP --\x3e HttpResponseGenerator\\n\\t\\tA[Adapter]\\n end\\n\\n subgraph catalina\\n\\t\\tRA[RequestAdapter] -.-> A\\n\\t\\tAC[AbstractController] -.-> C[Controller]\\n\\t\\tStaticController -.-> AC\\n\\t\\tSM[SessionManger] -.-> Manager\\n\\t\\tTC[Tomcat] --\x3e RA\\n\\t\\tRA --\x3e C\\n\\t\\tRA --\x3e Manager\\n\\t\\tRA --\x3e RM\\n\\t\\tRM[RequestMapper] --\x3e C\\n end\\n\\n subgraph jwp\\n\\t\\tLC[LoginController] -.-> AC\\n\\t\\tApplication --\x3e TC\\n end\\n\\n```\\n\\n### \ucf54\ub4dc \ub9ac\ubdf0 \\n\\n\ud06c\ub8e8 \uc911 \ud55c \uba85\uc774 \ub098\uc758 \ub9ac\ubdf0\uc5b4\uac00 \ub418\uace0, \ub0b4\uac00 \ub2e4\ub978 \ud06c\ub8e8\uc758 \ub9ac\ubdf0\uc5b4\uac00 \ub418\ub294 \ud615\ud0dc\ub85c \uc9c4\ud589\uc774 \ub418\uc5c8\ub2e4. \\n\ub098\uc758 \ub9ac\ubdf0\uc5b4\ub294 \ub514\ub178, \ub9ac\ubdf0\uc774\ub294 \ud544\ub9bd\uc774\uc5c8\ub2e4. \\n\\n\ub514\ub178(\ub9e4\uc758 \ub208\uc774 \uc544\ub2cc \uacf5\ub8e1\uc758 \ub208?)\uac00 \ub9e4\uc6b0 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud574\uc8fc\uc5b4\uc11c \uc870\uae08 \ub354 \ub098\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc5c8\uace0, \ud544\ub9bd\uc758 \ucf54\ub4dc\uc5d0\uc11c\ub294 \uaf3c\uaf3c\ud558\uac8c \uc608\uc678\ucc98\ub9ac \ud558\ub294 \ubd80\ubd84\uc744 \ubc30\uc6b8 \uc218 \uc788\uc5c8\ub2e4. \\n\ud55c \uac00\uc9c0 \uc544\uc26c\uc6b4 \uc810\uc740 \ud544\ub9bd\uc5d0\uac8c \uc791\uc131\ud55c \ub098\uc758 \ucf54\uba58\ud2b8\ub4e4\uc774 \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uacbd\ud5d8 \uae30\ubc18\uc73c\ub85c \uc791\uc131\ud55c \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uadfc\uac70\uac00 \uc870\uae08 \ubd80\uc871\ud588\uace0, \uc815\ub9ac\ub418\uc9c0 \uc54a\uc740 \ubd80\ubd84\uc774 \ub9ce\uc558\ub358 \uac83 \uac19\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130 \ub9ac\ubdf0\ud560 \ub54c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ud22c\uc790\ud574\uc11c \ub354 \uc88b\uc740 \ub0b4\uc6a9\uc744 \ud06c\ub8e8\ub4e4\uacfc \uacf5\uc720\ud560 \uc218 \uc788\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### SessionConfig\\n\\n\ubbf8\uc158\uc744 \uc9c4\ud589 \uc911 catalina \ud328\ud0a4\uc9c0\uc758 Session \uad00\ub828 \ubd80\ubd84\uc744 \ubcf4\uba74\uc11c \uc911\ubcf5 \ub85c\uc9c1\uc744 \uac1c\uc120\ud574 \ubcfc \uc218 \uc788\uc744 \uac83 \uac19\uc544 [\ucee8\ud2b8\ub9ac\ubdf0\ud2b8](https://github.com/apache/tomcat/pull/660)\ub97c \uc2dc\ub3c4\ud588\ub2e4. \\n\uc138\uc158 \ucfe0\ud0a4\uc758 \uc774\ub984\uc744 \uac00\uc838\uc624\ub294 Util \ud074\ub798\uc2a4\uc758 \ucf54\ub4dc\ub97c \uc218\uc815\ud588\ub294\ub370 \uae30\ubcf8 \uac12\uc740 JSESSIONID \uc9c0\ub9cc \uc124\uc815\uc5d0 \ub530\ub77c\uc11c \uc138\uc158 \ucfe0\ud0a4\uba85\uc744 \ub2e4\ub974\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \ud574\ub2f9 \ub85c\uc9c1\uc774 \uc788\ub294 \uac83\uc73c\ub85c \uc0dd\uac01\ud588\ub2e4. \\n\uae30\uc874\uc758 \ucf54\ub4dc\ub294 \uba85\uc2dc\ub41c \uc8fc\uc11d\uc758 \ub0b4\uc6a9\uacfc \ucf54\ub4dc\uc758 \ud750\ub984\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc544\uc11c \uc57d\uac04 \uc774\ud574\ud558\uae30 \uc5b4\ub824\uc6e0\ub2e4. \\n\\n\ucd08\uae30\uc5d0 \uc694\uccad\ud588\ub358 PR\uc740 \uae30\uc874\uc758 \ucf54\ub4dc\ubcf4\ub2e4 \uc804\uccb4\uc801\uc73c\ub85c \ube44\uad50 \uc5f0\uc0b0\uc744 \ud55c \ubc88 \uc904\uc77c \uc218 \uc788\uc5c8\uace0, context\uac00 null\uc778 \uacbd\uc6b0 \ubc14\ub85c \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud568\uc73c\ub85c\uc368 \uc131\ub2a5 \uac1c\uc120\uc758 \ud6a8\uacfc\uac00 \uc788\uc744 \uac70\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uba54\uc778\ud14c\uc774\ub108\uc778 Mark Thomas \ud615\uc774 \ud574\ub2f9 \ub85c\uc9c1\uc758 \uacbd\uc6b0 \ucef4\ud30c\uc77c\ub7ec\uac00 \ud574\ub2f9 \ubd80\ubd84\uc744 \ucd5c\uc801\ud654 \ud560 \uc218 \uc788\uc744 \uac70\ub77c\uace0 \uae30\ub300\ud55c\ub2e4\uace0 \ud588\uace0, \uac00\ub3c5\uc131\uc744 \uac1c\uc120\uc2dc\ucf1c\ubcf4\ub77c\uace0 \uc870\uc5b8\ud574\uc8fc\uc168\ub2e4. \\n\ucef4\ud30c\uc77c\ub7ec \ucd5c\uc801\ud654\ub294 \uace0\ub824\ud574\ubcf4\uc9c0 \ubabb\ud55c \ubd80\ubd84\uc778\ub370, \uc55e\uc73c\ub85c \ud559\uc2b5\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc0b0\ub354\ubbf8\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n\ub0a8\uaca8\uc900 \ucf54\uba58\ud2b8\uc5d0 \ub530\ub77c \ucd5c\uc885\uc801\uc73c\ub85c\ub294 \uc911\ubcf5\ub41c \ucf54\ub4dc\ub97c \uc904\uc774\ub294 \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc218\uc815\ud588\ub2e4. \\n\uacb0\uacfc\uc801\uc73c\ub85c \uae30\uc874 \ub85c\uc9c1 \ub300\ube44 \ube44\uad50 \uc5f0\uc0b0\uc744 \ud55c \ubc88 \uc904\uc77c \uc218 \uc788\uc5c8\uace0, \uba85\uc2dc\ub41c \uc8fc\uc11d\uc758 \ub0b4\uc6a9\uacfc \uc720\uc0ac\ud55c \ud750\ub984\uc758 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc5ec \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub9ac\ud329\ud130\ub9c1\uc744 \ud588\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\\n\\n\\n```java\\npublic static String getSessionCookieName(Context context) {\\n\\n String result = getConfiguredSessionCookieName(context);\\n\\n if (result == null) {\\n result = DEFAULT_SESSION_COOKIE_NAME;\\n }\\n\\n return result;\\n}\\n\\npublic static String getSessionUriParamName(Context context) {\\n\\n String result = getConfiguredSessionCookieName(context);\\n\\n if (result == null) {\\n result = DEFAULT_SESSION_PARAMETER_NAME;\\n }\\n\\n return result;\\n}\\n\\nprivate static String getConfiguredSessionCookieName(Context context) {\\n\\n // Priority is:\\n // 1. Cookie name defined in context\\n // 2. Cookie name configured for app\\n // 3. Default defined by spec\\n if (context != null) {\\n String cookieName = context.getSessionCookieName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n SessionCookieConfig scc =\\n context.getServletContext().getSessionCookieConfig();\\n cookieName = scc.getName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n }\\n\\n return null;\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\npublic static String getSessionCookieName(Context context) {\\n if (context == null) {\\n return DEFAULT_SESSION_COOKIE_NAME;\\n }\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_COOKIE_NAME);\\n}\\n\\npublic static String getSessionUriParamName(Context context) {\\n if (context == null) {\\n return DEFAULT_SESSION_PARAMETER_NAME;\\n }\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_PARAMETER_NAME);\\n}\\n\\nprivate static String getConfiguredSessionCookieName(Context context, String defaultName) {\\n // Priority is:\\n // 1. Cookie name defined in context\\n // 2. Cookie name configured for app\\n // 3. Default defined by spec\\n String cookieName = context.getSessionCookieName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n SessionCookieConfig scc = context.getServletContext().getSessionCookieConfig();\\n cookieName = scc.getName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n return defaultName;\\n}\\n```\\n\\n\\n\\n\\n```java\\npublic static String getSessionCookieName(Context context) {\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_COOKIE_NAME);\\n}\\n\\npublic static String getSessionUriParamName(Context context) {\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_PARAMETER_NAME);\\n}\\n\\nprivate static String getConfiguredSessionCookieName(Context context, String defaultName) {\\n // Priority is:\\n // 1. Cookie name defined in context\\n // 2. Cookie name configured for app\\n // 3. Default defined by spec\\n if (context != null) {\\n String cookieName = context.getSessionCookieName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n SessionCookieConfig scc = context.getServletContext().getSessionCookieConfig();\\n cookieName = scc.getName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n }\\n return defaultName;\\n}\\n```\\n\\n\\n\\n\\n### HTTP \uc218\uc5c5\\n\\n\ubbf8\uc158 \uc911\uac04\uc5d0 \uc9c4\ud589\ub418\uc5c8\ub358 HTTP \uc218\uc5c5\uc5d0\ub294 HTTP\ub97c \uc801\uc808\ud558\uac8c \ud65c\uc6a9\ud558\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574 \ud559\uc2b5\ud588\ub2e4. \\n\ud56d\uc0c1 \uc131\ub2a5 \uac1c\uc120\uc744 \uc704\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub2e8\uc5d0\uc11c \ucd5c\uc801\ud654\ud574\ubcf4\ub824\uace0 \ub178\ub825\uc744 \ud588\uc9c0\ub9cc, \ub354 \uc801\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574\uc11c \ud6a8\uc728\uc801\uc73c\ub85c \uc131\ub2a5\uc744 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c \uc218 \uc788\uc5c8\ub358 \uc218\uc5c5\uc774\uc5c8\ub2e4. \\nHTTP \uc555\ucd95, HTTP \uce90\uc2f1, \ub9ac\uc18c\uc2a4 \ucd5c\uc801\ud654 \uae30\ubc95\uc5d0 \ub300\ud574 \ud559\uc2b5\ud588\ub2e4. \\n\\n\uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c\ub294 \ub2e4\uc74c \uc635\uc158\uc744 \uc124\uc815\ud558\uc5ec http\uc758 \uc1a1\uc218\uc2e0\uc758 \uc555\ucd95\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\ub2e4. \\n\\n```yml\\nserver:\\n compression:\\n enabled: true\\n```\\n\\n\uc218\uc5c5 \uc911 \ud574\ub2f9 \uc555\ucd95 \uc131\ub2a5\uc774 \uc88b\ub2e4\uba74 \uc65c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c\ub294 \uae30\ubcf8 \uac12\uc73c\ub85c \uc124\uc815\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\uc9c0 \uad81\uae08\ud574\uc84c\ub2e4. \\n\uad81\uae08\uc99d\uc744 \ud574\uc18c\ud558\uc9c0 \ubabb\ud588\ub294\ub370 \ub9d0\ub791\uc774 \uc7a1\ub2f4 \ucc44\ub110\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc740 [issue](https://github.com/spring-projects/spring-boot/issues/21369)\ub97c \ucc3e\uc544\uc8fc\uc5c8\ub2e4. \\n\ub0b4\uc6a9\uc744 \uc694\uc57d\ud574 \ubcf4\uc790\uba74 WAS \ubcc4\ub85c \uc555\ucd95\uc744 \ud558\uae30 \uc704\ud574 \uc124\uc815\ud574\uc57c \ud558\ub294 \uac83\uc774 \ub2e4\ub974\uace0, \ubb34\uc870\uac74 \uc555\ucd95\uc744 \ud558\ub294 \uac83\uc774 \ucd5c\uc801\uc758 \uacbd\uc6b0\uac00 \uc544\ub2d0 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uae30\ubcf8\uac12\uc73c\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 \uac19\ub2e4. \\n\\n> If you\'re developing a public-facing application then it\'s probably likely gzip compression would be worthwhile. If, however, you\'re a microservice application and you\'re in a dataceter, you may well prefer to reduce CPU load because you know you\'ll only be talking to other microservices and you have a reliable gigabit network.\\n\\nPhil Webb \ud615\ub2d8\uc758 \ub9d0\uc5d0 \ub530\ub974\uba74 \uc77c\ubc18\uc801\uc778 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\ub294 \uacbd\uc6b0 gzip \uc555\ucd95\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc9c0\ub9cc, MSA \ud658\uacbd + \ub370\uc774\ud130 \uc13c\ud130\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uc624\uc9c1 \ub2e4\ub978 MSA \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \ud1b5\uc2e0\ud558\uace0, \uace0\uc131\ub2a5 \ub124\ud2b8\uc6cc\ud06c\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0 CPU \ubd80\ud558\ub97c \uc904\uc774\ub294 \uac83\uc774 \uc6b0\uc120\uc2dc \ub420 \uc218\ub3c4 \uc788\ub2e4\ub294 \uac83\uc774\uc5c8\ub2e4. \\n\\n\uc774\uc678\uc5d0\ub3c4 \uc758\ub3c4\ud558\uc9c0 \uc54a\uc740 \uce90\uc2f1\uc744 \ub9c9\uae30 \uc704\ud574 \ud734\ub9ac\uc2a4\ud2f1 \uce90\uc2f1\uc744 \uc81c\uac70\ud558\uac70\ub098, \uac1c\uc778 \uc815\ubcf4 \uc720\ucd9c\uc744 \ub9c9\uae30 \uc704\ud574 \uc751\ub2f5 \ud5e4\ub354\uc5d0 private\uc744 \uc124\uc815, ETag\ub3c4 \ud559\uc2b5\ud588\ub2e4. \\n\\n:::note ETag\\nETag HTTP \uc751\ub2f5 \ud5e4\ub354\ub294 \ud2b9\uc815 \ubc84\uc804\uc758 \ub9ac\uc18c\uc2a4\ub97c \uc2dd\ubcc4\ud558\ub294 \uc2dd\ubcc4\uc790\ub2e4. \\n\uc6f9 \uc11c\ubc84\uac00 \ub0b4\uc6a9\uc744 \ud655\uc778\ud558\uace0 \ubcc0\ud558\uc9c0 \uc54a\uc558\uc73c\uba74, \uc6f9 \uc11c\ubc84\ub85c full \uc694\uccad\uc744 \ubcf4\ub0b4\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0, \uce90\uc2dc\uac00 \ub354 \ud6a8\uc728\uc801\uc774\uac8c \ub41c\ub2e4. \\nMDN\\n:::\\n\\n### Thread \uc218\uc5c5\\n\\n\uc2a4\ub808\ub4dc\uc5d0 \ub300\ud55c \uc218\uc5c5\uc744 \ub4e4\uc5c8\uc9c0\ub9cc, \ubcf5\uc7a1\ud55c \ub0b4\uc6a9\ub3c4 \uc6cc\ub099 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0 \uc124\uba85\ud558\ub77c\uace0 \ud558\uba74 \uc798 \ubabb\ud560 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e0\ub2e4. \\n\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8, \ubbf8\uc158, \ud14c\ucf54\ud1a1 \uc900\ube44\ub97c \ubcd1\ud589\ud574\uc57c \ud574\uc11c \uc138\ubd80\uc801\uc778 \ub0b4\uc6a9\uc740 \uc2dc\uac04 \ub0a0 \ub54c \ubcf5\uc2b5\ud558\ub824\uace0 \ud55c\ub2e4. \\n\\n\uc2a4\ub808\ub4dc\ub97c \uc774\ud574\ud558\uace0, WAS\uc5d0 \uc2a4\ub808\ub4dc \uc124\uc815 \uad00\ub828\ud55c \uc2e4\uc2b5\uc774 \uc788\uc5c8\ub294\ub370 \ud14c\uc624\uc640 \uac19\uc774 1\uc2dc\uac04 \uc815\ub3c4 \ud398\uc5b4\ub85c Thread \uc2e4\uc2b5\uc744 \uc9c4\ud589\ud574 \ubcf4\uc558\ub2e4. \\n\ud559\uc2b5\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n`threads.max`: Tomcat\uc758 \ucd5c\ub300 \uc2a4\ub808\ub4dc \uac1c\uc218 \\n`max-connections`: Tomcat\uc774 \uc720\uc9c0\ud560 \uc218 \uc788\ub294 \ucd5c\ub300 \ucee4\ub125\uc158 \uac1c\uc218 \\n`accept-count`: \ucd5c\ub300 \uc5f0\uacb0 \uc218\uc5d0 \ub3c4\ub2ec\ud588\uc744 \ub54c \uc5f0\uacb0 \uc694\uccad\uc5d0 \ub300\ud574 \uc6b4\uc601 \uccb4\uc81c\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub300\uae30\uc5f4\uc758 \ucd5c\ub300 \uae38\uc774. \ud574\ub2f9 Queue\uc5d0 \uc694\uccad\uc774 \uc313\uc774\ub294 \uac83\uc740 Tomcat\uc774 \ub354 \uc774\uc0c1 \uc694\uccad\uc744 \ubc1b\uc744 \uc218 \uc5c6\ub2e4\ub294 \ub73b\uc774\ub2e4. accpet-count queue\uc5d0\ub3c4 \uc694\uccad\uc774 \uac00\ub4dd\ucc28\uba74 \uadf8 \uc774\ud6c4\uc5d0 \uc624\ub294 \uc694\uccad\uc740 \uac70\ubd80\ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n C(\\"Client\\") -- request --\x3e ACQ(\\"\uc6b4\uc601\uccb4\uc81c\uc5d0 \uc758\ud574 \uad00\ub9ac\ub418\ub294 Queue \\n size = accept-count\\") --\x3e TCQ(\\"Tomcat Connector\uc5d0 \uc758\ud574 \uad00\ub9ac\ub418\ub294 Queue\\n size = max-connections\\") --\x3e TP(\\"Thread Pool\\n size = threads.max\\")\\n```\\n\\n### \ub9c8\uce58\uba70\\n\\n\uc2dc\uac04\uc740 \ub108\ubb34 \ube60\ub974\uac8c \uac00\uace0 \ud560 \uc77c\uc740 \ub9ce\uc740 \uac83 \uac19\ub2e4. \\n\uc6b0\uc120\uc21c\uc704\ub97c \uc798 \uc815\ud558\uace0 \ud559\uc2b5\uc744 \uc9c4\ud589\ud574\uc57c\uaca0\ub2e4. \\n\ud604\uc7ac \ub370\uc774\ud130 \ub2e4\ub8e8\ub294 \ubd80\ubd84(DB)\uc5d0 \ub300\ud55c \ud559\uc2b5\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\ub2e4. \ud574\ub2f9 \ubd80\ubd84\uc740 \ud14c\ucf54\ud1a1\uc774 \ub05d\ub098\ub294\ub300\ub85c \ucc44\uc6cc\uc57c\uaca0\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616/) \\n[ETag, mdn](https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/ETag) \\n[Apache Tomcat 8 Configuration Reference](https://tomcat.apache.org/tomcat-8.5-doc/config/http.html) \\n[Apache Tomcat Tuning, Terry Cho](https://bcho.tistory.com/788) \\n[maxThreads, maxConnections, acceptCount\ub85c Tomcat \ud29c\ub2dd\ud558\uae30](https://dev-ws.tistory.com/96)"},{"id":"performance-test-type","metadata":{"permalink":"/performance-test-type","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8.mdx","source":"@site/blog/2023-3/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8.mdx","title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","description":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8","date":"2023-09-10T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 10\uc77c","tags":[{"label":"performance test","permalink":"/tags/performance-test"}],"readingTime":5.8,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","slug":"performance-test-type","tags":["performance test"]},"unlisted":false,"prevItem":{"title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/tomcat-retrospective"},"nextItem":{"title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","permalink":"/db-replication"}},"content":"## \uc131\ub2a5 \ud14c\uc2a4\ud2b8\\n\\nAPI\uc758 \uc694\uccad\uc774 \ub9ce\uc740 \uc0c1\ud669\uc5d0\uc11c \uc11c\ubc84\uac00 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8\\n\\n\uc2dc\uc2a4\ud15c\uc5d0 \ubd80\ud558\uac00 \uac78\ub9ac\uba74 \ubb38\uc81c \uc0c1\ud669\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \\n\ub2e4\uc591\ud55c \uc0c1\ud669\uc5d0 \ub300\ube44\ud574\uc11c \uc131\ub2a5 \ud14c\uc2a4\ud2b8\ub97c \ud574\uc57c\ud55c\ub2e4. \\n\\n![./test.png](./test.png)\\n\\n### \uc2a4\ubaa8\ud06c \ud14c\uc2a4\ud2b8(Smoke Test)\\n\\n\ucd5c\uc18c\ud55c\uc758 \ubd80\ud558\ub97c \uc8fc\uc5b4 \uc2dc\uc2a4\ud15c\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\nVU\ub97c \ucd5c\uc18c\ud55c\uc73c\ub85c \ub450\uace0, \uc9e7\uc740 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \ud14c\uc2a4\ud2b8\ud55c\ub2e4. \\n\ub2e4\ub978 \ud14c\uc2a4\ud2b8\ub97c \uc2dc\uc791\ud558\uae30 \uc804\uc5d0 \uc2a4\ubaa8\ud06c \ud14c\uc2a4\ud2b8\ub97c \ud568\uc73c\ub85c\uc368 \ud14c\uc2a4\ud2b8 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc624\ub958\uac00 \uc5c6\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uace0, \uc131\ub2a5 \uc9c0\ud45c\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \uc218\uc9d1, \ubaa8\ub2c8\ud130\ub9c1 \ub418\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \uac00\uc0c1 \uc0ac\uc6a9\uc790(VU)\\n\uac00\uc0c1 \uc0ac\uc6a9\uc790\ub294 \uc11c\ubc84 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud574 \ud2b9\uc815 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud55c\ub2e4. \\n\uc774\ub294 \ub2e4\ub978 \uac00\uc0c1 \uc0ac\uc6a9\uc790\uc640 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc2e4\ud589\ub418\uba70, \uc5ec\ub7ec \uac00\uc0c1 \uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub3d9\uc2dc \uc5f0\uacb0\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\uc2a4\ub808\ub4dc\ub77c\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. \\n:::\\n\\n### \uc2a4\ud30c\uc774\ud06c \ud14c\uc2a4\ud2b8(Spike Test)\\n\\n\uc0ac\uc6a9\ub7c9\uc774 \uae09\uc99d\ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uc2dc\uc2a4\ud15c\uc774 \uacac\ub514\uace0 \uc131\ub2a5\uc5d0 \ubb38\uc81c\uac00 \uc5c6\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\ud2f0\ucf13 \ubc1c\uae09, \ud560\uc778 \ucfe0\ud3f0 \ubc1c\uae09\uacfc \uac19\uc740 \uc774\ubca4\ud2b8\ub97c \ud558\ub294 \uacbd\uc6b0 \ub300\uaddc\ubaa8 \ud2b8\ub798\ud53d\uc774 \ub4e4\uc5b4\uc628\ub2e4. \\n\uc2a4\ud30c\uc774\ud06c \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \uae09\uc99d\ud558\ub294 \ubd80\ud558 \uc0c1\ud669\uc5d0\uc11c \uc2dc\uc2a4\ud15c\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\uace0, \ubd80\ud558\ub97c \uc798 \ubc84\ud2f0\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n### \ubd80\ud558 \ud14c\uc2a4\ud2b8(Load Test)\\n\\n\ubaa9\ud46f\uac12\uc5d0 \ud574\ub2f9\ub418\ub294 \ubd80\ud558\ub97c \uacac\ub51c \uc218 \uc788\uc744\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\uc77c\ubc18\uc801\uc778 \ubd80\ud558 \uc0c1\ud669\uc5d0\uc11c \uc2dc\uc2a4\ud15c\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8\ub2e4. \\n\ub7a8\ud504\uc5c5 \ub610\ub294 \ubb19\ud46f\uac12\uc5d0 \ud574\ub2f9\ud558\ub294 \ubd80\ud558 \uae30\uac04\ub3d9\uc548 \uc131\ub2a5\uc774 \ubb38\uc81c\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uace0, \uc2dc\uc2a4\ud15c \ubcc0\uacbd \ud6c4\uc5d0\ub3c4 \ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \ub3cc\ub824 \ub3d9\uc77c\ud558\uac8c \ubaa9\ud46f\uac12\uc744 \ucc98\ub9ac\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \ub7a8\ud504 \uc5c5(Ramp-up)\\n\ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574 \uc124\uc815\ud55c \uac00\uc0c1 \uc0ac\uc6a9\uc790 \uc218\uc5d0 \ub3c4\ub2ec\ud558\ub294 \ub370 \uac78\ub9ac\ub294 \uc2dc\uac04\\n:::\\n\\n### \uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8(Stress Test) \\n\\n\uc2dc\uc2a4\ud15c\uc758 \ucd5c\ub300\uce58\uc5d0 \ud574\ub2f9\ub418\ub294 \ubd80\ud558\ub97c \ubc1b\uc558\uc744 \ub54c \uc2dc\uc2a4\ud15c\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\uadf8\ub798\ud504\ub97c \ubd24\uc744 \ub54c \ubd80\ud558 \ud14c\uc2a4\ud2b8\uc640 \uc720\uc0ac\ud55c \ud615\ud0dc\ub85c \ubcf4\uc774\uc9c0\ub9cc, \ubd80\ud558\ub7c9\uc774 \ub2e4\ub974\ub2e4. \\n\uc77c\ubc18\uc801\uc73c\ub85c \ud3c9\uade0\uc801\uc778 \ubaa9\ud46f\uac12 \ub300\ube44 \uc791\uac8c\ub294 50% \uc774\uc0c1, \ud544\uc694\uc758 \uacbd\uc6b0 \uadf8 \uc774\uc0c1\uc73c\ub85c \ubd80\ud558\ub97c \uc900\ub2e4. \\n\uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8\ub294 \ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud55c \ud6c4\uc5d0\ub9cc \uc2e4\ud589\ud574\uc57c \ud55c\ub2e4. \ubd80\ud558 \ud14c\uc2a4\ud2b8\uac00 \uc774\ub8e8\uc5b4\uc9c0\uc9c0 \uc54a\uc740 \uc0c1\ud669\uc5d0\uc11c \uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \ubcd1\ubaa9 \uc9c0\uc810\uc774\ub098 \ubb38\uc81c \uc0c1\ud669\uc744 \ucc3e\uae30 \uc5b4\ub824\uc6cc\uc9c4\ub2e4. \\n\ub610\ud55c \ubd80\ud558 \ud14c\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud55c \uc2a4\ud06c\ub9bd\ud2b8\ub97c VU\uac12(\uc2a4\ub808\ub4dc \uc218)\ub9cc \uc218\uc815\ud558\uc5ec \uc7ac\uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\\n### \ub0b4\uad6c \ud14c\uc2a4\ud2b8(Endurance Test) \\n\\n\ud3c9\uade0 \uc0ac\uc6a9\ub960\ub85c \uc77c\uc815 \ubd80\ud558\ub97c \uc9c0\uc18d\uc801\uc73c\ub85c \uc8fc\uba70 \uc2dc\uc2a4\ud15c\uc774 \ubb38\uc81c\ub418\ub294 \uc9c0\uc810\uc744 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\ud761\uc218 \ud14c\uc2a4\ud2b8(Soak Test)\ub77c\uace0\ub3c4 \ud558\uba70, \uae30\ubcf8\uc801\uc778 \ubd80\ud558 \ud14c\uc2a4\ud2b8\uc758 \ubcc0\ud615\uc774\ub77c\uace0 \ubcfc \uc218 \uc788\ub2e4. \\n\ub2e4\ub978 \ud14c\uc2a4\ud2b8\uc640 \ub2ec\ub9ac \uae34 \uc2dc\uac04\ub3d9\uc548 \ud14c\uc2a4\ud2b8\ub97c \ud558\ub294 \uac83\uc774 \ud2b9\uc9d5\uc774\uba70, \uba54\ubaa8\ub9ac \ub204\uc218 \ubb38\uc81c\uc640 \uac19\uc774 \uc7a5\uc2dc\uac04 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2e4\ud589\ud560 \ub54c \uc2dc\uc2a4\ud15c\uc758 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \ubd80\ubd84\uc744 \ud655\uc778\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4. \\n\\n### \uc911\ub2e8\uc810 \ud14c\uc2a4\ud2b8(Breakpoint Test)\\n\\n\uc784\uacc4 \uc9c0\uc810\uc744 \ucc3e\uae30 \uc704\ud574 \ubd80\ud558\ub97c \uc810\uc9c4\uc801\uc73c\ub85c \uc99d\uac00\uc2dc\ud0a4\uba70 \uc9c4\ud589\ud558\ub294 \ud14c\uc2a4\ud2b8\\n\\n\ubb38\uc81c\ub418\ub294 \ubd80\ubd84\uc744 \ub354 \ube68\ub9ac \ucc3e\uae30 \uc704\ud574 \ub2e4\ub978 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\ud55c \ub2e4\uc74c\uc5d0 \uc911\ub2e8\uc810 \ud14c\uc2a4\ud2b8\ub97c \uc9c4\ud589\ud558\uace0, \uc774 \ub54c \uc810\uc9c4\uc801\uc73c\ub85c \ubd80\ud558\ub97c \ub298\ub824\ub098\uac00\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8\ub97c \uc131\ub2a5 \ud29c\ub2dd\uacfc \ubc18\ubcf5\ud574\uc11c \uc9c4\ud589\ud55c\ub2e4\uba74, \uc2dc\uc2a4\ud15c\uc744 \ub354\uc6b1 \ubc1c\uc804\uc2dc\ud0ac \uc218 \uc788\ub2e4. \\n\ub2e4\ub9cc Auto Scaling\uc774 \uc801\uc6a9\ub41c \ud074\ub77c\uc6b0\ub4dc \ud658\uacbd\uc5d0\uc11c\ub294 \uc9c4\ud589\ud558\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Load test types, k6](https://k6.io/docs/test-types/load-test-types/) \\n\uc790\ubc14 \ucd5c\uc801\ud654 - \ubca4\uc800\ubbfc J. \uc5d0\ubc88\uc2a4, \uc81c\uc784\uc2a4 \uace0\ud504, \ud06c\ub9ac\uc2a4 \ub274\ub79c\ub4dc \\n\uc544\ub9c8\uc874 \uc6f9 \uc11c\ube44\uc2a4 \ubd80\ud558 \ud14c\uc2a4\ud2b8 \uc785\ubb38 - \ub098\uce74\uac00\uc640 \ud0c0\ub8e8\ud558\uce58, \ubaa8\ub9ac\uc2dc\ud0c0 \ucf04"},{"id":"db-replication","metadata":{"permalink":"/db-replication","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-22-DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30.mdx","source":"@site/blog/2023-3/2023-08-22-DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30.mdx","title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","description":"\ubcf5\uc81c(Replication)","date":"2023-08-22T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 22\uc77c","tags":[{"label":"mysql","permalink":"/tags/mysql"},{"label":"replication","permalink":"/tags/replication"}],"readingTime":21,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","slug":"db-replication","tags":["mysql","replication"]},"unlisted":false,"prevItem":{"title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","permalink":"/performance-test-type"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","permalink":"/woowacourse-level3-retrospective"}},"content":"## \ubcf5\uc81c(Replication)\\n\\n\ud55c \uc11c\ubc84\uc5d0\uc11c \ub2e4\ub978 \uc11c\ubc84\ub85c \ub370\uc774\ud130\ub97c \ub3d9\uae30\ud654\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4. \\n\uc6d0\ubcf8 \ub370\uc774\ud130\ub97c \uac00\uc9c0\ub294 \uc11c\ubc84\ub97c Primary \ub610\ub294 Source \ub77c\uace0 \ubd80\ub974\uace0, \ubcf5\uc81c\ub41c \ub370\uc774\ud130\ub97c \uac00\uc9c0\ub294 \uc11c\ubc84\ub97c Secondary \ub610\ub294 Replica \ub77c\uace0 \ubd80\ub978\ub2e4. \\n\\n### \ubcf5\uc81c\ub97c \ud558\ub294 \uc774\uc720\\n\\n**1. \uc2a4\ucf00\uc77c \uc544\uc6c3**\\n\\n\uc0ac\uc6a9\uc790\uc758 \ud2b8\ub798\ud53d\uc774 \uc99d\uac00\ud558\ub294 \uacbd\uc6b0, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uac00\ud574\uc9c0\ub294 \ubd80\ud558\ub3c4 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc99d\uac00\ud55c\ub2e4. \\n\uc774\ub97c \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \ubcf5\uc81c\ub97c \ud1b5\ud55c \uc2a4\ucf00\uc77c \uc544\uc6c3\uc744 \uc801\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucffc\ub9ac\ub4e4\uc744 \uac01\uac01\uc758 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c \ubd84\uc0b0 \uc2dc\ud0ac \uc218 \uc788\ub2e4. \\n\\n**2. \ub370\uc774\ud130 \ubc31\uc5c5**\\n\\n\uc2e4\uc81c \uc6b4\uc601\ub418\ub294 \uc11c\ube44\uc2a4\uac00 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 DB\uc5d0\uc11c \ubc31\uc5c5\uc744 \uc9c4\ud589\ud558\ub294 \uacbd\uc6b0, \uc11c\ube44\uc2a4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0 \uc601\ud5a5\uc774 \uac00\uc9c0 \uc54a\ub3c4\ub85d \ubcf5\uc81c\ub97c \ud1b5\ud574 Replica \uc11c\ubc84\ub97c \uad6c\ucd95\ud558\uc5ec, Replica \uc11c\ubc84\uc5d0\uc11c \ubcf5\uc81c\ub97c \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \uc601\ud5a5\uc744 \ucd5c\uc18c\ud654 \ud560 \uc218 \uc788\ub2e4. \\n\\n**3. \ub370\uc774\ud130 \ubd84\uc11d**\\n\\n\ubc31\uc5c5\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \ubcf5\uc7a1\ud558\uace0 \ubb34\uac70\uc6b4 \ubd84\uc11d\uc6a9 \ucffc\ub9ac\uc758 \uc11c\ube44\uc2a4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4. \\n\ub9c8\ucc2c\uac00\uc9c0\ub85c \ubcf5\uc81c\ub97c \uc0ac\uc6a9\ud574 \ubd84\uc11d\uc6a9 \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc744 \ub9cc\ub4e4 \uc218 \uc788\ub2e4. \\n\\n**4. \ub370\uc774\ud130\uc758 \uc9c0\ub9ac\uc801 \ubd84\uc0b0**\\n\\n\ube60\ub978 \uc751\ub2f5\uc744 \uc704\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ubc84\uc5d0 \uac00\uae5d\uac8c \uc11c\ubc84\ub97c \uad6c\uc131\ud558\uac70\ub098, \uace0\uac00\uc6a9\uc131(High Availability)\uc744 \uc704\ud574\uc11c\ub3c4 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ud30c\uc77c \uc704\uce58 \uae30\ubc18 \ubcf5\uc81c\\n\\nMySQL \uc11c\ubc84\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ubcc0\uacbd\uc0ac\ud56d\uc5d0 \ub300\ud55c \ub85c\uadf8 \ud30c\uc77c\uc744 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub77c\uace0 \ud55c\ub2e4. \\n\ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub97c \ud1b5\ud574 \ub370\uc774\ud130 \ubcc0\uacbd, \ud14c\uc774\ube14 \uad6c\uc870 \ubcc0\uacbd, \uacc4\uc815\uc774\ub098 \uad8c\ud55c \ubcc0\uacbd\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc800\uc7a5\ub41c\ub2e4. \\nMySQL\uc758 \ubcf5\uc81c\ub294 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \uae30\ubc18\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 \uc788\ub2e4. \uc774\ub97c Replica \uc11c\ubc84\ub85c \uc804\ub2ec\ud558\uace0 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\ub97c \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud55c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph Replica\\n\\t\\tdirection TB\\n\\t\\tIO[Replication I/O thread] -- save --\x3e RL[Relay Log]\\n\\t\\tSQL[Replication SQL Thread] -- read --\x3e RL\\n\\tend\\n\\n\\tsubgraph Source\\n\\t\\tdirection TB\\n\\t\\tBLD[Binary Log Dump Thread] -- Send Binary Log Dump--\x3e IO\\n\\tend\\n\\n```\\n\\n:::note \uc2a4\ub808\ub4dc\ubcc4 \uc5ed\ud560\\n\\nBinary Log Dump Thread: \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\uc758 \ub0b4\uc6a9\uc744 Replica \uc11c\ubc84\ub85c \uc804\ub2ec \\nReplication I/O Thread: Binary \ub85c\uadf8 \uc774\ubca4\ud2b8\ub97c \uac00\uc838\uc640 \ub85c\uceec \uc11c\ubc84\uc758 \ud30c\uc77c(Relay Log)\ub85c \uc800\uc7a5 \\nReplication SQL Thread: \ub9b4\ub808\uc774 \ub85c\uadf8 \ud30c\uc77c\uc758 \uc774\ubca4\ud2b8\ub97c \uc77d\uace0 \uc2e4\ud589\\n\\n:::\\n\\n### \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ubc29\uc2dd\uc758 \ubb38\uc81c\uc810\\n\\n\ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ubc29\uc2dd\uc740 \uc11c\ubc84\uc5d0 \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \ubcf5\uc81c \ud1a0\ud3f4\ub85c\uc9c0 \ubcc0\uacbd\uc774 \uae4c\ub2e4\ub86d\ub2e4. \\n\ud1a0\ud3f4\ub85c\uc9c0\ub780 \ub124\ud2b8\uc6cc\ud06c\uc758 \uc694\uc18c\ub4e4\uc744 \ubb3c\ub9ac\uc801\uc73c\ub85c \uc5f0\uacb0\ud574 \ub193\uc740 \uac83, \ub610\ub294 \uadf8 \uc5f0\uacb0 \ubc29\uc2dd\uc744 \ub9d0\ud55c\ub2e4.\\n\\n```mermaid\\ngraph TD\\n\\tA[A binary-log:300] --\x3e B[B Binary-log:300]\\n\\tA[A binary-log:300] --\x3e C[C Binary-log:200]\\n```\\n\\n\uc704\uc640 \uac19\uc774 Source \uc11c\ubc84, Replica 2\ub300\uac00 \uc874\uc7ac\ud558\uace0, C \uc11c\ubc84\uc5d0 \ubcf5\uc81c \uc9c0\uc5f0\uc774 \ub418\uc5c8\uc744 \ub54c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\tA[A binary-log:300]\\n\\tB[B Binary-log:300] --\x3e C[C Binary-log:200 \ubb38\uc81c \ubc1c\uc0dd]\\n```\\n\\nA \uc11c\ubc84\uc5d0\uc11c \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 B \uc11c\ubc84\ub97c Source \uc11c\ubc84\ub85c \uc2b9\uaca9\ud558\uace0, C\uc5d0\uac8c \uc870\ud68c \ucffc\ub9ac\ub97c \ubd84\uc0b0\uc2dc\ud0a8\ub2e4. \\n\ud558\uc9c0\ub9cc \uc5ec\uae30\uc11c C \uc11c\ubc84\uc5d0\ub294 A \uc11c\ubc84\uc640 \ub3d9\uae30\ud654\uac00 \uc548\ub418\uc5c8\uc73c\ub2c8 \uc870\ud68c \uc2dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\ub4a4\ub2a6\uac8c B \uc11c\ubc84\uc640 \ub3d9\uae30\ud654\ub97c \ud558\ub824\uace0 \ud574\ub3c4, \uc5b4\ub5a4 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8, \uc5b4\ub5a4 \uc704\uce58\uc640 \ub3d9\uae30\ud654\ud574\uc57c\ud558\ub294\uc9c0 \uc54c\uae30 \uc5b4\ub835\ub2e4. \\n\\n### \uae00\ub85c\ubc8c \ud2b8\ub79c\uc7ad\uc158 \uc544\uc774\ub514(GTID) \uae30\ubc18 \ubcf5\uc81c\\n\\nGTID \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucc38\uc5ec\ud55c \ubaa8\ub4e0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ubc1c\uc0dd\ud55c \uc774\ubca4\ud2b8\uc5d0 \uace0\uc720\ud55c \uc2dd\ubcc4\uac12\uc744 \ubd80\uc5ec\ud55c\ub2e4\uba74, \ub3d9\uae30\ud654\uc5d0 \ub300\ud55c \ubb38\uc81c\ub97c \uac04\ub2e8\ud558\uac8c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4. \\n\uc704\uc758 \uc608\uc2dc\uc640 \uac19\uc774 \ubcf5\uc81c \uc9c0\uc5f0\uacfc \ud568\uaed8 \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud55c\ub2e4\ud574\ub3c4 \ud2b9\uc815 GTID \ubd80\ud130 \ubcf5\uc81c\ub97c \uc7ac\uac1c\ud558\uba74 \ub41c\ub2e4. \\n\\n:::note GTID\\n\ubcf5\uc81c \ud1a0\ud3f4\ub85c\uc9c0\uc5d0 \ucc38\uc5ec\ud55c \ubaa8\ub4e0 \uc11c\ubc84\uc5d0\uc11c \uace0\uc720\ud558\ub3c4\ub85d \uac01 \uc774\ubca4\ud2b8\uc5d0 \ubd80\uc5ec\ub41c \uc2dd\ubcc4\uac12 \\n[source_id]:[transaction_id]\ub85c \uad6c\uc131\ub418\uba70, source_id\ub294 \uc11c\ubc84\ub97c \uc2dd\ubcc4\ud558\uae30 \uc704\ud55c \uac12\uc774\uace0 transaction_id\ub294 \ucee4\ubc0b\ub41c \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dd\ubcc4\ud558\uae30 \uc704\ud55c \uac12\uc73c\ub85c 1\uc529 \uc99d\uac00\ud558\ub294 \ud615\ud0dc\ub85c \ubc1c\uae09\ub41c\ub2e4. \\n:::\\n\\n### \ubcf5\uc81c \ud1a0\ud3f4\ub85c\uc9c0\\n\\n**\uc2f1\uae00 \ub808\ud50c\ub9ac\uce74 \ubcf5\uc81c \uad6c\uc131**\\n\\n\uac00\uc7a5 \uac04\ub2e8\ud55c \uad6c\uc131\uc73c\ub85c \uc81c\uc77c \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294 \ud615\ud0dc\ub2e4. \\nreplica \uc11c\ubc84\ub97c \uc77d\uae30 \uc804\uc6a9, \uc608\ube44 \uc11c\ubc84, \ubc31\uc5c5 \uc6a9\ub3c4\ub85c \ub9ce\uc774 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e S\\n W -- \uc77d\uae30 --\x3e R\\n S[Source] --\x3e R[Replica]\\n```\\n\\n**\uba40\ud2f0 \ub808\ud50c\ub9ac\uce74 \ubcf5\uc81c \uad6c\uc131**\\n\\n2\uac1c\uc758 replica \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\ub294 \ud615\ud0dc\ub2e4. \\n\ud558\ub098\uc758 replica\ub294 \uc608\ube44 \uc6a9\ub3c4\ub85c \ub0a8\uaca8\ub450\ub294 \ud615\ud0dc\ub2e4. \\n\ucd94\ud6c4\uc5d0 \ud2b8\ub798\ud53d\uc774 \uc99d\uac00\ud558\ub294 \uacbd\uc6b0 \uc608\ube44 \uc6a9\ub3c4\uc758 replica\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c \uc77d\uae30 \uc694\uccad\uc758 \ubd80\ud558 \ubd84\uc0b0\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e S\\n W -- \uc77d\uae30 --\x3e R1\\n S[Source] --\x3e R1[Replica1]\\n S --\x3e R2[Replica2]\\n```\\n\\n**\uccb4\uc778 \ubcf5\uc81c \uad6c\uc131**\\n\\nreplica \uc11c\ubc84\uac00 \ub9ce\uc740 \uacbd\uc6b0 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub97c \uc804\ub2ec\ud558\ub294 \uc791\uc5c5 \uc790\uccb4\uac00 \ubd80\ud558\uac00 \ub420 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c 1:M:M \uad6c\uc870\ub85c \uccb4\uc778 \ubcf5\uc81c \uad6c\uc131\uc744 \uace0\ub824\ud560 \uc218 \uc788\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e S\\n W -- \uc77d\uae30 --\x3e R1\\n S[Source] --\x3e R1[Replica1]\\n S --\x3e R2[Replica2]\\n S --\x3e R3[Replica3]\\n\\n R3 --\x3e R3-1[Replica 3-1]\\n R3 --\x3e R3-2[Replica 3-2]\\n\\n B[Batch Server] --\x3e R3-2\\n```\\n\\n**\ub4c0\uc5bc \uc18c\uc2a4 \ubcf5\uc81c \uad6c\uc131**\\n\\n2\uac1c\uc758 MySQL \uc11c\ubc84 \ubaa8\ub450 \uc77d\uae30\uc640 \uc4f0\uae30\uac00 \uac00\ub2a5\ud558\ub3c4\ub85d \ud558\ub294 \uad6c\uc131\uc774\ub2e4. \\n\uac01 \uc11c\ubc84\uc5d0\uc11c \ubcc0\uacbd\ub41c \ub370\uc774\ud130\ub294 \ub2e4\ub978 \uc11c\ubc84\uc5d0 \ubc18\uc601\ub41c\ub2e4. \\n\ubaa9\uc801\uc5d0 \ub530\ub77c ACTIVE-ACTIVE \ud615\ud0dc \ub610\ub294 ACTIVE-PASSIVE \ud615\ud0dc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\nACTIVE-PASSIVE \ud615\ud0dc\uc778 \uacbd\uc6b0 \uc2f1\uae00 \ub808\ud50c\ub9ac\uce74 \ubcf5\uc81c \uad6c\uc131\uacfc \ub3d9\uc77c\ud574\ubcf4\uc774\uc9c0\ub9cc, ACTIVE \uc11c\ubc84\uc5d0\uc11c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uba74 \uc124\uc815\uc758 \ubcc0\uacbd\uc5c6\uc774 PASSIVE \uc11c\ubc84\ub85c \uc4f0\uae30 \uc791\uc5c5\uc744 \uc804\ud658\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc774 \uc7a5\uc810\uc774\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e SR1\\n W -- \uc77d\uae30 + \uc4f0\uae30 --\x3e SR2\\n SR1[Source/Replica 1] --\x3e SR2[Source/Replica 2]\\n```\\n\\n:::note ACTIVE-ACTIVE, ACTIVE-PASSIVE\\nACTIVE-ACTIVE: 2\uac1c\uc758 \uc11c\ubc84 \ubaa8\ub450 \uc4f0\uae30 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ud615\ud0dc \\nACTIVE-PASSIVE: \ud558\ub098\uc758 \uc11c\ubc84\uc5d0\uc11c\ub9cc \uc4f0\uae30 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ud615\ud0dc\\n:::\\n\\n**\uba40\ud2f0 \uc18c\uc2a4 \ubcf5\uc81c \uad6c\uc131**\\n\\n\uc5ec\ub7ec\uac1c\uc758 source \uc11c\ubc84\uc640 \ud558\ub098\uc758 replica \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\ub294 \uad6c\uc131\uc774\ub2e4. \\n\uc774\ub294 source \uc11c\ubc84\uc758 \ub370\uc774\ud130\ub97c \ud55c \uacf3\uc5d0 \ubc31\uc5c5\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9, \uc5ec\ub7ec \uc11c\ubc84\uc5d0 \uc874\uc7ac\ud558\ub294 \ub370\uc774\ud130\ub97c \ud1b5\ud569, \uc0e4\ub529\ub418\uc5b4\uc788\ub294 \ud14c\uc774\ube14 \ub370\uc774\ud130\ub97c \ud1b5\ud569\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n S1[Source 1] --\x3e R[Replica]\\n S2[Source 2] --\x3e R\\n```\\n\\n## \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ubc29\uc2dd Replication \uad6c\uc131\ud558\uae30\\n\\nmysql 2\ub300\ub97c \uc774\uc6a9\ud558\uc5ec replication\uc744 \uad6c\uc131\ud558\uace0, spring boot application\uc73c\ub85c source, replica \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc811\uadfc\ud574\ubcf4\ub294 \uc608\uc81c\uc774\ub2e4. \\n[https://github.com/bbiac/db-replication](https://github.com/bbiac/db-replication) \\n\\n### MySQL \ud658\uacbd \uad6c\uc131\\n\\nMySQL \ubc84\uc804\uc740 8.1\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n13306, 13307 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud574\uc11c MySQL \uc11c\ubc84 2\ub300\ub97c \ub744\uc6e0\ub2e4. \\n\ub610\ud55c \uc0ac\uc2e4 IP \ub300\uc5ed\uc73c\ub85c \ud1b5\uc2e0\ud560 \uc218 \uc788\ub3c4\ub85d \ucee4\uc2a4\ud140 \ub124\ud2b8\uc6cc\ud06c\ub97c \ucd94\uac00\ud588\ub2e4. \\n\\n```yml\\nversion: \'3.8\'\\n\\nservices:\\n source:\\n platform: linux/x86_64\\n image: mysql:latest\\n restart: always\\n container_name: mysql-source\\n environment:\\n TZ: \'Asia/Seoul\'\\n MYSQL_DATABASE: \'db\'\\n MYSQL_USER: \'user\'\\n MYSQL_PASSWORD: \'password\'\\n MYSQL_ROOT_PASSWORD: \'password\'\\n ports:\\n - \\"13306:3306\\"\\n volumes:\\n - db-source:/var/lib/mysql\\n - db-source:/var/lib/mysql-files\\n - ./docker/source.cnf:/etc/mysql/my.cnf\\n networks:\\n - mysql_network\\n\\n replica:\\n platform: linux/x86_64\\n image: mysql:latest\\n restart: always\\n container_name: mysql-replica\\n environment:\\n TZ: \'Asia/Seoul\'\\n MYSQL_DATABASE: \'db\'\\n MYSQL_USER: \'user\'\\n MYSQL_PASSWORD: \'password\'\\n MYSQL_ROOT_PASSWORD: \'password\'\\n ports:\\n - \\"13307:3306\\"\\n volumes:\\n - db-replica:/var/lib/mysql\\n - db-replica:/var/lib/mysql-files\\n - ./docker/replica.cnf:/etc/mysql/my.cnf\\n networks:\\n - mysql_network\\n\\nvolumes:\\n db-source:\\n db-replica:\\n\\nnetworks:\\n mysql_network:\\n driver: bridge\\n```\\n\\n\ub610\ud55c source, replica \uac01\uac01 \ub2e4\uc74c\uacfc \uac19\uc774 db \uc124\uc815\uc744 \ud588\ub2e4. \\n\\n| \uc124\uc815 | \uc124\uba85 |\\n| --- | --- |\\n| server_id | \uac01\uac01\uc758 mysql \ub9c8\ub2e4 \uace0\uc720\ud55c \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. |\\n| log_bin | \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ud30c\uc77c \uacbd\ub85c \uc124\uc815\uc73c\ub85c \uc808\ub300\uacbd\ub85c\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 /var/lib/mysql \uc544\ub798 \ud574\ub2f9 log_bin\uc5d0 \uc124\uc815\ub41c \uac12\uc73c\ub85c \ub85c\uadf8\uac00 \uc0dd\uc131\ub41c\ub2e4. |\\n| sync_binlog | N\uac1c\uc758 \ud2b8\ub79c\uc7ad\uc158 \ub2f9 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub97c \ub514\uc2a4\ud06c\uc640 \ub3d9\uae30\ud654 \uc791\uc5c5\uc744 \ud558\ub3c4\ub85d \ud55c\ub2e4.\xa01\uc740 \uae30\ubcf8\uac12\uc73c\ub85c \uc548\uc815\uc801\uc774\uc9c0\ub9cc, \uac00\uc7a5 \ub290\ub9ac\ub2e4. |\\n| relay_log | \ub9b4\ub808\uc774 \ub85c\uadf8 \ud30c\uc77c \uacbd\ub85c \uc124\uc815 |\\n| relay_log_purge | \ud544\uc694 \uc5c6\ub294 \ub9b4\ub808\uc774 \ub85c\uadf8 \ud30c\uc77c\uc744 \uc790\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud558\ub294 \uc635\uc158 |\\n| read_only | \uc77d\uae30 \uc804\uc6a9 \uc124\uc815 |\\n| log_replica_updates | Replication SQL Thread\ub85c \uc778\ud574 \uc2e4\ud589\ub418\ub294 \uc815\ubcf4\ub97c \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\uc5d0 \uae30\ub85d \ucd94\ud6c4\uc5d0 \uc18c\uc2a4 \uc11c\ubc84\ub85c \uc2b9\uaca9\ub418\ub294 \uacbd\uc6b0\ub97c \uace0\ub824\ud558\uba74 \uc124\uc815\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. |\\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\\n\\n\\n```cnf title=\\"/docker/source.cnf\\"\\n[mysqld]\\nserver_id=1\\nlog_bin=mysql-bin\\nsync_binlog=1\\n```\\n\\n\\n\\n\\n\\n```cnf title=\\"/docker/replica.cnf\\"\\n[mysqld]\\nserver_id=2\\nrelay_log=mysql-relay-bin\\nrelay_log_purge=ON\\nread_only\\nlog_replica_updates\\n```\\n\\n\\n\\n\\n### \ub3c4\ucee4 \uc2e4\ud589\\n\\ndocker-compose up \uba85\ub839\uc5b4\ub85c docker-compose \uc124\uc815\uc73c\ub85c docker\ub97c \ub744\uc6b4\ub2e4. \\n-d \uc635\uc158\uc744 \ubd99\uc774\uba74 \ubc31\uadf8\ub77c\uc6b4\ub4dc \ubaa8\ub4dc\ub85c \uc2e4\ud589\ub41c\ub2e4. \\n\\n```\\ndocker-compose up -d\\n```\\n\\n### replication slave \uad8c\ud55c \uc124\uc815\\n\\nREPLICATION SLAVE \uad8c\ud55c\uc774 \uc124\uc815\ub418\uc5b4 \uc788\uc5b4\uc57c replica \uc11c\ubc84\uc5d0\uc11c source \uc11c\ubc84\uc5d0 \uc811\uadfc\ud558\uc5ec \ub85c\uadf8\ub97c \uc77d\uc5b4\uc62c \uc218 \uc788\ub2e4. \\nsource \uc11c\ubc84\uc5d0 \uc811\uadfc\ud558\uc5ec user \uacc4\uc815\uc5d0 \ud574\ub2f9 \uad8c\ud55c\uc744 \uc124\uc815\ud574\uc900\ub2e4. \\n\\nSOURCE \uc811\uc18d\\n\\n```bash\\ndocker exec -it mysql-source mysql -u root -p\\n```\\n\\nuser \uacc4\uc815\uc5d0 REPLICATION SLAVE \uad8c\ud55c \ucd94\uac00\\n\\n```mysql\\nGRANT REPLICATION SLAVE ON *.* TO \'user\'@\'%\';\\nFLUSH PRIVILEGES;\\n```\\n\\n### SOURCE DB \uc815\ubcf4 \ud655\uc778\\n\\nreplica \uc124\uc815\uc5d0 \ud544\uc694\ud55c source db\uc758 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ud30c\uc77c\uba85\uacfc Position\uc744 \ud655\uc778\ud55c\ub2e4. \\nPosition \uac12\uc740 \uc2e4\uc81c \ud30c\uc77c\uc758 \ubc14\uc774\ud2b8 \uc218\ub97c \uc758\ubbf8\ud55c\ub2e4. \\n\ud655\uc778\ud55c File(SOURCE_LOG_FILE)\uacfc Position(SOURCE_LOG_POS) \uac12\uc740 replica \uc124\uc815\uc5d0\uc11c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n```mysql\\nSHOW MASTER STATUS;\\n\\n+------------------+----------+--------------+------------------+-------------------+\\n| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |\\n+------------------+----------+--------------+------------------+-------------------+\\n| mysql-bin.000003 | 1082 | | | |\\n+------------------+----------+--------------+------------------+-------------------+\\n```\\n\\n### SOURCE ip \uc8fc\uc18c \ud655\uc778\\n\\ndocker inspect -f \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 \ud574\ub2f9 \ucee8\ud14c\uc774\ub108\uc758 \uc138\ubd80 \uc815\ubcf4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud574 docker-compose \ud30c\uc77c\uc5d0 \uc124\uc815\ud574\ub454 mysql_network\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc0ac\uc124 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \ud655\uc778\ud55c\ub2e4. \\n\\n```bash\\ndocker inspect -f \\"{{with index .NetworkSettings.Networks \\\\\\"db-replication_mysql_network\\\\\\"}}{{.IPAddress}}{{end}}\\" mysql-source\\n```\\n\\nip \uc8fc\uc18c\uac00 \ub098\uc624\uc9c0 \uc54a\ub294 \uacbd\uc6b0 docker inspect mysql-source\ub85c \ud655\uc778\ud55c\ub2e4. \\n\ud655\uc778\ud55c IP\uc8fc\uc18c(SOURCE_HOST) \uac12\uc740 replica \uc124\uc815\uc5d0\uc11c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n### replica mysql \uc811\uc18d\\n\\nsource db\uc5d0 \uc811\uc18d\ud588\ub358 \ubc29\ubc95\uacfc \ub3d9\uc77c\ud558\uac8c replica db\uc5d0 \uc811\uc18d\ud55c\ub2e4. \\n\\n```bash\\ndocker exec -it mysql-replica mysql -u root -p\\n```\\n\\n### replica \uc124\uc815\\n\\n\uc774\uc804\uc5d0 source db\uc5d0\uc11c \uc5bb\uc5c8\ub358 \uc815\ubcf4\ub4e4\uc744 \uc0ac\uc6a9\ud558\uc5ec replica \uc124\uc815\uc744 \uc9c4\ud589\ud55c\ub2e4. \\n\uc2e4\uc81c DB \uc11c\ubc84\uc5d0\uc11c \ubcf5\uc81c\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc73c\ub85c source DB\uc758 \ud30c\uc77c\uc744 \ubcf5\uc81c\ud574\uc57c\ud558\uc9c0\ub9cc \ud604\uc7ac \ubcf5\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ud574\ub2f9 \ubd80\ubd84\uc740 \uc0dd\ub7b5\ud588\ub2e4. \\nSOURCE_HOST, SOURCE_LOG_FILE, SOURCE_LOG_POS \ub97c \uc801\uc808\ud788 \ubcc0\uacbd\ud55c\ub2e4.\\n\\n```mysql\\nSTOP REPLICA;\\n\\nCHANGE REPLICATION SOURCE TO \\nSOURCE_HOST=\'172.29.0.2\', \\nSOURCE_USER=\'user\', \\nSOURCE_PASSWORD=\'password\', \\nSOURCE_LOG_FILE=\'mysql-bin.000001\', \\nSOURCE_LOG_POS=0, \\nGET_SOURCE_PUBLIC_KEY=1;\\n\\nSTART REPLICA;\\n```\\n\\n### \uc124\uc815 \ud655\uc778\\n\\n```mysql\\nSHOW REPLICA STATUS;\\n\\n+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+\\n| Replica_IO_State | Source_Host | Source_User | Source_Port | Connect_Retry | Source_Log_File | Read_Source_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Source_Log_File | Replica_IO_Running | Replica_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Source_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Source_SSL_Allowed | Source_SSL_CA_File | Source_SSL_CA_Path | Source_SSL_Cert | Source_SSL_Cipher | Source_SSL_Key | Seconds_Behind_Source | Source_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Source_Server_Id | Source_UUID | Source_Info_File | SQL_Delay | SQL_Remaining_Delay | Replica_SQL_Running_State | Source_Retry_Count | Source_Bind | Last_IO_Error_Timestamp | Last_SQL_Error_Timestamp | Source_SSL_Crl | Source_SSL_Crlpath | Retrieved_Gtid_Set | Executed_Gtid_Set | Auto_Position | Replicate_Rewrite_DB | Channel_Name | Source_TLS_Version | Source_public_key_path | Get_Source_public_key | Network_Namespace |\\n+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+\\n| Waiting for source to send event | 172.25.0.3 | user | 3306 | 60 | mysql-bin.000003 | 1082 | mysql-relay-bin.000002 | 868 | mysql-bin.000003 | Yes | Yes | | | | | | | 0 | | 0 | 1082 | 1078 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 1 | 5a396b02-41c6-11ee-a56d-0242ac190003 | mysql.slave_master_info | 0 | NULL | Replica has read all relay log; waiting for more updates | 86400 | | | | | | | | 0 | | | | | 1 | |\\n+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+\\n```\\n\\nReplica_IO_Running, Replica_SQL_Running \uac12\uc774 YES\ub77c\uba74 \uc815\uc0c1\uc801\uc73c\ub85c replication \uad6c\uc131\uc774 \uc644\ub8cc\ub41c \uac83\uc774\ub2e4. \\n\\n\uc124\uc815\uc744 \ub9c8\uce5c \ud6c4 source db\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 create table \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud55c\ub2e4. \\nreplica db\uc5d0 \ub3d9\uc77c\ud55c member table\uc774 \uc0dd\uc131\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\nCREATE TABLE member\\n(\\n id BIGINT PRIMARY KEY AUTO_INCREMENT,\\n name VARCHAR(255)\\n);\\n```\\n\\n## \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub85c DB \uc811\uadfc\ud558\uae30\\n\\n\uc77c\ubc18\uc801\uc778 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 source, \uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158\uc778 \uacbd\uc6b0 replica\ub85c \uc694\uccad\uc774 \uac00\ub3c4\ub85d \uad6c\uc131\ud574\ubcf4\uc790. \\n\\n### Environment \uc124\uc815\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 source, replica\ub85c \uad6c\ubd84\ud558\uc5ec \uc124\uc815\ud55c\ub2e4. \\n\\n```yml title=\\"application.yml\\"\\nspring:\\n datasource:\\n source:\\n username: user\\n password: password\\n driver-class-name: com.mysql.cj.jdbc.Driver\\n jdbc-url: jdbc:mysql://localhost:13306/db\\n replica:\\n username: user\\n password: password\\n driver-class-name: com.mysql.cj.jdbc.Driver\\n jdbc-url: jdbc:mysql://localhost:13307/db\\n```\\n\\n### DataSourceType \uc124\uc815\\n\\n\ub2e8\uc21c \ubb38\uc790\uc5f4\ub85c\ub3c4 \uad6c\ubd84\ud560 \uc218 \uc788\uc9c0\ub9cc, enum\uc744 \uc774\uc6a9\ud574\uc11c \ud2b8\ub79c\uc7ad\uc158\uc744 \uad6c\ubd84\ud558\ub3c4\ub85d \uc0dd\uc131\ud55c\ub2e4. \\nKey\ub294 \ucd94\ud6c4\uc5d0 \ube48 \uc124\uc815\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n```java title=\\"DataSourceType\\"\\npublic enum DataSourceType {\\n SOURCE(SOURCE_NAME),\\n REPLICA(REPLICA_NAME),\\n ;\\n\\n private final String key;\\n\\n DataSourceType(String key) {\\n this.key = key;\\n }\\n\\n public static class Key {\\n public static final String ROUTING_NAME = \\"ROUTING\\";\\n public static final String SOURCE_NAME = \\"SOURCE\\";\\n public static final String REPLICA_NAME = \\"REPLICA\\";\\n }\\n}\\n```\\n\\n### AbstractRoutingDataSource \uc124\uc815\\n\\n\uc2a4\ud504\ub9c1\uc774 \uc9c0\uc6d0\ud574\uc8fc\ub294 AbstractRoutingDataSource\ub97c \uc0c1\uc18d\ubc1b\uc544 \ud2b8\ub79c\uc7ad\uc158\uc758 \uc77d\uae30 \uc5ec\ubd80\uc5d0 \ub530\ub77c \ub2e4\ub978 DataSource\ub97c \ud5a5\ud558\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n\\n\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub294 `Map`\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\uc744 \ubc1b\uc544 \ub370\uc774\ud130 \uc18c\uc2a4\ub97c \uc124\uc815\ud55c\ub2e4. \\n- setDefaultTargetDataSource: \uae30\ubcf8 \ub370\uc774\ud130 \uc18c\uc2a4\ub97c \uc124\uc815\ud55c\ub2e4. \\n- setTargetDataSources: \ub9f5 \ud615\ud0dc\ub85c \ubc1b\uc740 \ub370\uc774\ud130 \uc18c\uc2a4 \uac12\ub4e4\uc744 \uc124\uc815\ud55c\ub2e4. \\n\\ndetermineCurrentLookupKey\ub97c \uc624\ubc84\ub77c\uc774\ub529\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158\uc758 \uc77d\uae30 \uc5ec\ubd80\uc5d0 \ub530\ub77c \ub2e4\ub978 DataSourceType\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n- isCurrentTransactionReadOnly() \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \ud2b8\ub79c\uc7ad\uc158\uc774 \uc77d\uae30 \uc804\uc6a9\uc778\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n- DataSourceType\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \uc124\uc815\ud558\uace0, \ubc18\ud658\ud55c \uac12\uc5d0 \ud574\ub2f9\ud558\ub294 \ub370\uc774\ud130 \uc18c\uc2a4\uac00 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n```java title=\\"RoutingDataSource\\"\\npublic class RoutingDataSource extends AbstractRoutingDataSource {\\n\\n private final Logger log = LoggerFactory.getLogger(getClass());\\n\\n public static RoutingDataSource from(Map dataSources) {\\n RoutingDataSource routingDataSource = new RoutingDataSource();\\n routingDataSource.setDefaultTargetDataSource(dataSources.get(DataSourceType.SOURCE));\\n routingDataSource.setTargetDataSources(dataSources);\\n return routingDataSource;\\n }\\n\\n @Override\\n protected Object determineCurrentLookupKey() {\\n boolean readOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();\\n\\n if (readOnly) {\\n log.info(\\"readOnly = true, request to replica\\");\\n return DataSourceType.REPLICA;\\n }\\n log.info(\\"readOnly = false, request to source\\");\\n return DataSourceType.SOURCE;\\n }\\n}\\n```\\n\\n### DataSource \uc124\uc815\\n\\n\uc704\uc5d0\uc11c\ubd80\ud130 \uc21c\uc11c\ub300\ub85c Source, Replica, RoutingDataSource, LazyConnectionDataSourceProxy \uc124\uc815\uc774\ub2e4. \\n\uc2a4\ud504\ub9c1\uc740 \ud2b8\ub79c\uc7ad\uc158 \uc2dc\uc791\uc2dc\uc5d0 \ucee4\ub125\uc158\uc758 \uc0ac\uc6a9\uc5ec\ubd80\uc640 \uc0c1\uad00\uc5c6\uc774 \ucee4\ub125\uc158\uc744 \ud655\ubcf4\ud55c\ub2e4. \\n\ub530\ub77c\uc11c readOnly \ud2b8\ub79c\uc7ad\uc158\uc774 \uc124\uc815\ub41c \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ubbf8\ub9ac \ud655\ubcf4\ub41c \ucee4\ub125\uc158\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 replica db\ub85c \uc694\uccad\uc744 \ud558\uc9c0 \uc54a\uace0 source db\ub85c \uc694\uccad\uc744 \ud55c\ub2e4. \\n\\nTransactionSynchronizationManager.isCurrentTransactionReadOnly() \uba54\uc11c\ub4dc \ud638\ucd9c \uc2dc currentTransactionReadOnly\ub77c\ub294 `ThreadLocal`\uc5d0 \uc124\uc815\ub41c \uac12\uc744 \ubc18\ud658\ud558\ub294\ub370 readOnly \uc124\uc815\uc774 \ub418\uba74 \uc774 \uac12\uc744 true\ub85c \uc124\uc815\ud55c\ub2e4. \ud558\uc9c0\ub9cc determineCurrentLookupKey\ub97c \ud638\ucd9c\ud558\uc5ec key \uac12\uc744 \uac00\uc838\uc624\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc774\ud6c4\uc5d0 \uc124\uc815\ub418\uae30 \ub54c\ubb38\uc5d0 determineCurrentLookupKey \uba54\uc11c\ub4dc\uc5d0\uc11c \ud56d\uc0c1 DataSourceType.SOURCE\uac00 \ubc18\ud658\ub418\uc5b4 source db\ub85c \uc694\uccad\uc744 \ud55c\ub2e4. \\n\\nLazyConnectionDataSourceProxy\ub97c \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc2e4\uc81c DataSource\ub97c \uc0ac\uc6a9\ud558\ub294 \uc2dc\uc810\uc5d0 \ucee4\ub125\uc158\uc744 \ud68d\ub4dd\ud574\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc124\uc815\ud55c\ub300\ub85c replica db\ub85c \uc870\ud68c \uc694\uccad\uc744 \ud55c\ub2e4. \\n\\n```java title=\\"DataSourceConfiguration\\"\\n@Configuration\\npublic class DataSourceConfiguration {\\n\\n @Bean\\n @Qualifier(SOURCE_NAME)\\n @ConfigurationProperties(prefix = \\"spring.datasource.source\\")\\n public DataSource sourceDataSource() {\\n return DataSourceBuilder.create().build();\\n }\\n\\n @Bean\\n @Qualifier(REPLICA_NAME)\\n @ConfigurationProperties(prefix = \\"spring.datasource.replica\\")\\n public DataSource replicaDataSource() {\\n return DataSourceBuilder.create().build();\\n }\\n\\n @Bean\\n @Qualifier(ROUTING_NAME)\\n public DataSource routingDataSource(\\n @Qualifier(SOURCE_NAME) DataSource sourceDataSource,\\n @Qualifier(REPLICA_NAME) DataSource replicaDataSource\\n ) {\\n return RoutingDataSource.from(Map.of(\\n DataSourceType.SOURCE, sourceDataSource,\\n DataSourceType.REPLICA, replicaDataSource\\n ));\\n }\\n\\n @Bean\\n @Primary\\n public DataSource dataSource(\\n @Qualifier(ROUTING_NAME) DataSource routingDataSource\\n ) {\\n return new LazyConnectionDataSourceProxy(routingDataSource);\\n }\\n}\\n```\\n\\n\ucd5c\uc885\uc801\uc73c\ub85c DataSource \ube48\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\uac00 \ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n DSP[LazyConnectionDataSourceProxy] --\x3e RDS[RoutingDataSource]\\n\\tRDS --\x3e S[SourceDataSource]\\n\\tRDS --\x3e R[ReplicaDataSource]\\n```\\n\\n### \ub3d9\uc791 \ud655\uc778\\n\\n\uac04\ub2e8\ud558\uac8c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud574\uc11c \uc124\uc815\ud55c\ub300\ub85c \ub3d9\uc791\uc774 \ub418\ub294\uc9c0 \ud655\uc778\ud574\ubcf4\uc558\ub2e4. \\nsave \uba54\uc11c\ub4dc\uc758 \uacbd\uc6b0 `@Transactional`, findById \uba54\uc11c\ub4dc\uc758 \uacbd\uc6b0 `@Transactional(readOnly = true)`\uac00 \uc124\uc815\ub418\uc5b4\uc788\ub2e4. \\n\ub85c\uadf8\ub97c \ud1b5\ud574 save\uc758 \uacbd\uc6b0 source db\ub85c findById\uc758 \uacbd\uc6b0 replica db\ub85c \uc694\uccad\uc744 \ud558\ub294 \uac83\uc744 \uc54c \uc218 \uc788\ub2e4. \\n\\n```java title=\\"MemberServiceTest\\"\\n@SpringBootTest\\nclass MemberServiceTest {\\n\\n @Autowired\\n private MemberService memberService;\\n\\n @Test\\n void \uc0ac\uc6a9\uc790\ub97c_\uc800\uc7a5\ud55c\ub2e4() {\\n // RoutingDataSource log: readOnly = false\\n memberService.save(\\"bbiac\\");\\n }\\n\\n @Test\\n void \uc0ac\uc6a9\uc790\ub97c_\uc870\ud68c\ud55c\ub2e4() {\\n // RoutingDataSource log: readOnly = true\\n assertThatThrownBy(() -> memberService.findById(MAX_VALUE))\\n .isInstanceOf(NoSuchElementException.class);\\n }\\n}\\n```\\n\\nDB\uc5d0\uc11c\ub294 \ud655\uc778\ud558\ub824\uba74 root \uacc4\uc815\uc73c\ub85c \uc811\uc18d\ud55c \ud6c4 general log\ub97c \ud65c\uc131\ud654 \uc2dc\ud0a8\ub2e4. \\n\\n```sql\\nSET GLOBAL log_output = \'table\';\\nSET GLOBAL general_log = 1;\\n```\\n\\ngeneral log\ub97c \ud65c\uc131\ud654 \ud55c \ud6c4 \uc77d\uae30 \uc804\uc6a9 \uba54\uc11c\ub4dc\ub97c \uc2e4\ud589\ud55c\ub2e4. \\nserver_id, \uc2e4\ud589\ud55c \ucffc\ub9ac\ubb38\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\nSELECT user_host, thread_id, server_id, convert(argument using utf8) FROM mysql.general_log where argument like \'%select%\';\\n\\n+----------------------------+-----------+-----------+-----------------------------------------------------------------------------+\\n| user_host | thread_id | server_id | convert(argument using utf8) |\\n+----------------------------+-----------+-----------+-----------------------------------------------------------------------------+\\n| user[user] @ [172.25.0.1] | 277 | 2 | select m1_0.id,m1_0.name from member m1_0 where m1_0.id=9223372036854775807 |\\n+----------------------------+-----------+-----------+-----------------------------------------------------------------------------+\\n```\\n\\n\ud655\uc778 \ud6c4 general log\ub97c \ube44\ud65c\uc131\ud654 \ud55c \ud6c4 \ube44\ud65c\uc131\ud654 \ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n```sql\\nSET GLOBAL general_log = 0;\\nSHOW VARIABLES LIKE \'%general%\';\\n\\n+------------------+---------------------------------+\\n| Variable_name | Value |\\n+------------------+---------------------------------+\\n| general_log | OFF |\\n| general_log_file | /var/lib/mysql/4b6b9db98290.log |\\n+------------------+---------------------------------+\\n```\\n\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n16\uc7a5 \ubcf5\uc81c, Real MySQL 8.0 - \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Replication, MySQL Docs](https://dev.mysql.com/doc/refman/8.1/en/replication.html) \\n[MySql - Master Slave Replication \uad6c\uc870 \ub9cc\ub4e4\uc5b4\ubcf4\uae30](https://huisam.tistory.com/entry/mysql-replication) \\n[Spring \ub808\ud50c\ub9ac\ucf00\uc774\uc158 \ud2b8\ub79c\uc7ad\uc158 \ucc98\ub9ac \ubc29\uc2dd](https://cheese10yun.github.io/spring-transaction/) \\n[replication-datasource](https://github.com/kwon37xi/replication-datasource) \\n[Simplified Guide to MySQL Replication with Docker Compose](https://www.linkedin.com/pulse/simplified-guide-mysql-replication-docker-compose-rakesh-shekhawat/) \\n[Dockerfile\uc5d0\uc11c \uc790\uc8fc \uc4f0\uc774\ub294 \uba85\ub839\uc5b4](https://www.daleseo.com/dockerfile/) \\n[CHANGE REPLICATION SOURCE TO Statement](https://dev.mysql.com/doc/refman/8.1/en/change-replication-source-to.html) \\n[LazyConnectionDataSourceProxy](https://kwonnam.pe.kr/wiki/springframework/lazyconnectiondatasourceproxy) \\n[\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub808\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud1b5\ud55c \ucffc\ub9ac \uc131\ub2a5 \uac1c\uc120 (feat. Mysql, SpringBoot)](https://hudi.blog/database-replication-with-springboot-and-mysql/) \\n[\ubd80\ud558 \ubd84\uc0b0\uc744 \uc704\ud55c MySQL Replication \uad6c\uc131 \ubc0f \ucffc\ub9ac \uc694\uccad \ubd84\uae30](https://chagokx2.tistory.com/100) \\n[Use Docker Compose, Docker](https://docs.docker.com/get-started/08_using_compose/)"},{"id":"woowacourse-level3-retrospective","metadata":{"permalink":"/woowacourse-level3-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-19-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca83 \ud68c\uace0/2023-08-19-\ub808\ubca8 3 \ud68c\uace0.mdx","source":"@site/blog/2023-3/2023-08-19-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca83 \ud68c\uace0/2023-08-19-\ub808\ubca8 3 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","description":"\ud68c\uace0","date":"2023-08-19T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 19\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.945,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","slug":"woowacourse-level3-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","permalink":"/db-replication"},"nextItem":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","permalink":"/cloudwatch"}},"content":"import logo from \'./logo.png\';\\n\\n### \ud68c\uace0\\n\\n\uc9c0\ub09c 8\uc8fc\ub294 \ub808\ubca8 1, 2 \ub54c\ubcf4\ub2e4 5\ubc30 \uc815\ub3c4 \ube60\ub974\uac8c \uc9c0\ub098\uac04 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub808\ubca8 3\uc5d0\ub294 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc5d0\uc11c\ub3c4, \uae30\uc220 \uc678\uc801\uc778 \ubd80\ubd84\uc5d0\uc11c\ub3c4 \ubd80\uc871\ud568\uc774 \ub9ce\uc774 \ubcf4\uc600\ub358 \uac83 \uac19\ub2e4. \\n\ubd80\uc871\ud55c \ubd80\ubd84\uc744 \uc54c\uc558\uae30\uc5d0, \uc55e\uc73c\ub85c \ub354\uc6b1 \uc131\uc7a5\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ub0b4\uac00 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud300\uc6d0\ub4e4\uc774 \uc798 \ubcf4\ucda9\ud574 \uc918\uc11c \ub4e0\ub4e0\ud588\ub2e4. \\n\\n### \uc544\uc26c\uc6b4 \uc810\\n\\n**\ubb38\uc11c\ud654**\\n\\n\uac1c\uc778\uc801\uc73c\ub85c\ub294 \uae30\uc220 \uc678\uc801\uc73c\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub0b4\uac00 \ud55c \ubd80\ubd84\uc744 \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c, \uc774\ud574\ud558\uae30 \uc27d\uac8c \ubb38\uc11c\ud654\ub97c \ud588\ub354\ub77c\uba74 \ud300\uc6d0\ub4e4\uc5d0\uac8c \ub354\uc6b1 \ub3c4\uc6c0\uc774 \ub418\uc5c8\uc744 \ud150\ub370 \uc774 \ubd80\ubd84\uc5d0 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ud22c\uc790\ud558\uc9c0 \ubabb\ud588\ub358 \ubd80\ubd84\uc5d0\uc11c \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\ubc29\ud559 \uae30\uac04 \ub3d9\uc548 \ubb38\uc11c\ud654\ub97c \ud558\uc9c0 \ubabb\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc778 \ube14\ub85c\uadf8 \uc62c\ub9ac\uba74\uc11c \uc870\uae08 \ub354 \ucc44\uc6cc\ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n**\ub0b4\uac00 \ubabb\ud558\ub294 \ubd80\ubd84\uc774\ub77c\uba74 \uc2dc\uac04\uc744 \ub4e4\uc774\uc790**\\n\\n\uc798 \ubabb\ud558\ub294 \ubd80\ubd84\uc774\ub77c\uba74 \uc2dc\uac04\uc744 \ub4e4\uc5ec\uc11c\ub77c\ub3c4 \uc911\uac04\uc740 \uac00\ub3c4\ub85d \ud574\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub9d0\uc744 \ud558\uae30 \uc804\uc5d0 \uc815\ub9ac\ud574\uc11c \uc758\uacac\uc744 \ub0b4\ub294 \uac83, \ubc1c\ud45c \uc900\ube44, \uac10\uc815 \uc870\uc808 \ub4f1\ub4f1\\n\ubabb\ud558\ub294 \ubd80\ubd84\uc744 \uc778\uc9c0\ud558\uace0, \uac1c\uc120\ud558\uc790. \\n\\n**\ucef4\ud3ec\ud2b8 \uc874 \ubc97\uc5b4\ub098\uae30**\\n\\n\uc870\uae08 \ub354 \ub3c4\uc804\uc801\uc73c\ub85c \ubaa9\ud45c\ub97c \uc7a1\uc558\uc73c\uba74 \uc88b\uc558\uc744 \uac83 \uac19\ub2e4. \\n\ub9e4\ubc88 \uadfc\uac70\ub97c \uac00\uc9c0\uace0 \uae30\uc220\uc744 \ub3c4\uc785\ud558\uace0, \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \uc9c0\uc18d\uc801\uc73c\ub85c \uac1c\uc120\ud558\ub824\uace0 \ud558\ub294 \ubd80\ubd84\uc774 \ub2e4\uc18c \ubd80\uc871\ud588\ub2e4. \\n\\n### \uc88b\uc558\ub358 \uc810\\n\\n**\uc88b\uc558\ub358 \uc810\ub3c4 \ubb38\uc11c\ud654**\\n\\n[\ud300 \ube14\ub85c\uadf8](https://tripdraw.blog)\ub3c4 \uba3c\uc800 \ub3c4\uc785\ud558\uc790\uace0 \uc81c\uc548\ud558\uace0, \ub0b4\uac00 \ud588\ub358 \ubd80\ubd84\uc740 \ubb38\uc11c\ud654\ub97c \uaf64 \ub9ce\uc774 \ud574\uc11c \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubc31\uc5d4\ub4dc \ud06c\ub8e8 4\uba85\uc774\uc11c \uac19\uc774 \ud55c \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c\ub294 \uae30\ub2a5 \uad6c\ud604\ud55c\ub2e4\uace0 \ubb38\uc11c\ud654\uac00 \uc870\uae08 \ubbf8\ud761\ud574\uc11c \ubcf4\ucda9\uc744 \ud574\uc57c\uaca0\ub2e4. \\n\\n**\ub0b4\uac00 \ub514\uc790\uc778\ud55c \ud2b8\ub9bd\ub4dc\ub85c\uc6b0 \ub85c\uace0**\\n\\n\\n\\n\ud2b8\ub9bd\ub4dc\ub85c\uc6b0 \ub85c\uace0\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \\n\ud300\uc6d0\ub4e4\uc774 \ub300\ud45c \uc0c9\uc0c1(\ud30c\ub780\uc0c9)\uc744 \uc815\ud574\uc92c\uace0, \uc8fc\ub9d0 \ub3d9\uc548 \uc2e0\ub098\uac8c \ub85c\uace0 \ub514\uc790\uc778\uc744 \ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc544\ub798\uc758 D \ubd80\ubd84\uc740 \uc720\ud29c\ube0c \uac15\uc758 \ub4e4\uc73c\uba74\uc11c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\uc11c \ubfcc\ub4ef\ud558\ub2e4. \\n\\n**\uae30\uc220 \uc120\ud0dd\uc758 \uc774\uc720**\\n\\n\uae30\uc220\uc758 \ud559\uc2b5 \ube44\uc6a9, \ud604\uc7ac \uad6c\uc870\uc5d0 \uc801\ud569\ud55c\uc9c0, \uc2e4\uc81c \uac00\uc9c0\uace0 \uc788\ub294 \ub9ac\uc18c\uc2a4\ub97c \uace0\ub824\ud574\uc11c \uae30\uc220 \uc120\ud0dd\uc744 \ud558\uace0, \ub3c4\uc785\ud588\ub358 \ubd80\ubd84\uc774 \uc88b\uc558\ub2e4. \\n100% \uc88b\uc740 \uc120\ud0dd\uc77c \uc21c \uc5c6\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \uc120\ud0dd\uc5d0 \ub300\ud55c \uadfc\uac70\uac00 \uc874\uc7ac\ud55c\ub2e4\uba74 \ud655\ub960\uc744 \ub192\ud600\uc8fc\ub294 \uac83 \uac19\ub2e4. \\n\\n### \ub9c8\uce58\uba70\\n\\n\ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \uc571\uc774 \uc62c\ub77c\uac00 \uc788\ub294 \uac70 \ub108\ubb34 \uc2e0\uae30\ud558\ub2e4. \\n\uc548\ub4dc\ub85c\uc774\ub4dc \ube0c\ub808\uba58 \uc74c\uc545\ub300(\uba67\ub3fc\uc9c0, \uc218\ub2ec, \ud551\uad6c), \uadf8\ub9ac\uace0 \ubc31\uc5d4\ub4dc \ud300\uc6d0\ub4e4(\uccb4\uc778\uc800, \ud6c4\ucd94, \ub9ac\uc624) \ub108\ubb34 \uace0\uc0dd\uc774 \ub9ce\uc558\ub2e4."},{"id":"cloudwatch","metadata":{"permalink":"/cloudwatch","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md","source":"@site/blog/2023-3/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md","title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","description":"CloudWatch","date":"2023-08-17T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 17\uc77c","tags":[{"label":"cloudwatch","permalink":"/tags/cloudwatch"},{"label":"log","permalink":"/tags/log"},{"label":"monitoring","permalink":"/tags/monitoring"}],"readingTime":5.35,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","slug":"cloudwatch","tags":["cloudwatch","log","monitoring"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","permalink":"/woowacourse-level3-retrospective"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/route-image-async-with-event"}},"content":"## CloudWatch\\n\\nAWS \ub9ac\uc18c\uc2a4\uc640 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc9c0\ud45c\uc640 \ub85c\uadf8\uc5d0 \ub300\ud55c \ubaa8\ub2c8\ud130\ub9c1\uc744 \uc81c\uacf5\ud558\ub294 \uc11c\ube44\uc2a4\ub2e4. \\n\uc9c0\ud45c\ub97c \uac10\uc2dc\ud558\uc5ec \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \uae30\ub2a5\ub3c4 \uc81c\uacf5\ud55c\ub2e4. \\n\ud504\ub9ac\ud2f0\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \ub300\uc2dc\ubcf4\ub4dc\ub2f9 3$/M \uc758 \ube44\uc6a9\uc774 \uccad\uad6c\ub418\uace0, \uc9c0\ud45c\ub098 \ub85c\uadf8\uc758 \uc591\uc5d0 \ub530\ub77c \ube44\uc6a9\uc774 \ucd94\uac00\uc801\uc73c\ub85c \uccad\uad6c\ub41c\ub2e4. \\n\uc694\uae08 \uc815\ubcf4\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub294 [\ub2e4\uc74c \ub9c1\ud06c](https://aws.amazon.com/ko/cloudwatch/pricing/)\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n## CloudWatch Metrics\\n\\n\uae30\ubcf8\uc801\uc73c\ub85c 5\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc218\uc9d1\ub41c\ub2e4. \\n\uc138\ubd80 \ubaa8\ub2c8\ud130\ub9c1(Detailed Monitoring)\uc744 \ud65c\uc131\ud654\ud558\uba74 1\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\ub97c \uc218\uc9d1\ud55c\ub2e4. \\n\ub300\uc2dc\ubcf4\ub4dc\uc5d0\uc11c InstanceId\ub85c \uac80\uc0c9\ud558\uc5ec \uc218\uc9d1\ub41c \uc9c0\ud45c\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.\\n\\n![./cloudwatch1.png](./cloudwatch1.png)\\n\\nCPUUtilization, NetworkIn, NetworkOut\uacfc \uac19\uc740 \uae30\ubcf8\uc801\uc778 \uc9c0\ud45c\ub97c \uc81c\uacf5\ud558\uace0, \uba54\ubaa8\ub9ac, \ub514\uc2a4\ud06c \uacf5\uac04\uacfc \uac19\uc740 \uc9c0\ud45c\ub97c \ud655\uc778\ud558\ub824\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\ub97c \uc124\uc815\ud574\uc57c \ud55c\ub2e4.\\n\\n## CloudWatch Agent \uc124\uce58\\n\\nCloudWatch Agent \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\uc640 \ub85c\uadf8\ub97c \uc218\uc9d1\ud560 \uc218 \uc788\ub2e4. \\n\\n### IAM \uc5ed\ud560 \uc124\uc815\\n\\n\uae30\ubcf8\uc801\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4\uac00 CloudWatchAgentServerPolicy\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4. \\nIAM \u2192 \uc5ed\ud560\uc5d0\uc11c \uc5ed\ud560 \uc0dd\uc131\uc744 \ud074\ub9ad\ud55c\ub2e4.\\n\\n![./cloudwatch2.png](./cloudwatch2.png)\\n\\nCloudWatchAgentServerPolicy \uad8c\ud55c \uc815\ucc45\uc744 \uc120\ud0dd\ud558\uace0, \uc801\ub2f9\ud55c \uc5ed\ud560 \uc774\ub984\uc744 \uc785\ub825\ud574\uc11c \uc5ed\ud560\uc744 \uc0dd\uc131\ud55c\ub2e4.\\n\\n![./cloudwatch3.png](./cloudwatch3.png)\\n\\nEC2 \uc778\uc2a4\ud134\uc2a4 \ubaa9\ub85d\uc73c\ub85c \ub4e4\uc5b4\uac00\uc11c, CloudWatch Agent\ub97c \uc124\uce58\ud560 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud074\ub9ad\ud55c\ub2e4. \\n\uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc5d0\uc11c \uc774\uc804\uc5d0 \uc0dd\uc131\ud55c \uc5ed\ud560\uc744 \uc9c0\uc815\ud55c\ub2e4.\\n\\n![./cloudwatch4.png](./cloudwatch4.png)\\n\\n### \uc124\uce58\\n\\n\ud658\uacbd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\nOS: ubuntu 22.04 \\n\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small (ARM64) \\n\\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uce58\ud55c\ub2e4.\\n\\n```bash\\nwget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb\\nsudo dpkg -i -E ./amazon-cloudwatch-agent.deb\\n```\\n\\n[\uc0ac\uc6a9 \uc124\uba85\uc11c](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)\uc5d0 \uac01 \uc778\uc2a4\ud134\uc2a4 \uc720\ud615\ub9c8\ub2e4 \ub2e4\uc6b4\ub85c\ub4dc \ub9c1\ud06c\uac00 \uc790\uc138\ud558\uac8c \uc548\ub0b4\ub418\uc5b4 \uc788\ub2e4.\\n\\n### Wizard\\n\\nCloudWatch Wizard\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uc124\uc815 \ud30c\uc77c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4. \\n\ub85c\uadf8\ub97c \uc218\uc9d1\ud558\ub3c4\ub85d \uc124\uc815\ud558\ub294 \uacbd\uc6b0 Wizard \uc2e4\ud589 \uba85\ub839\uc5b4 \uc785\ub825 \uc804 log \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \ubcf5\uc0ac\ud574\ub450\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec Wizard\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nsudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard\\n```\\n\\n\uc124\uc815\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74 \uc124\uc815 \ud30c\uc77c\uc774 \uc5b4\ub5bb\uac8c \uad6c\uc131\ub420\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\ub85c\uadf8\ub97c \ucd94\uac00\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \uc785\ub825\ucc3d\uc774 \ub098\uc624\uba74 \uc900\ube44\ud574\ub480\ub358 \ub85c\uadf8 \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \uc785\ub825\ud55c\ub2e4. \\n\\n![./cloudwatch5.png](./cloudwatch5.png)\\n\\n\uc911\uac04\uc5d0 SSM parameter store\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4. \\n\\n```bash\\nDo you want to store the config in the SSM parameter store?\\n1. yes\\n2. no\\n```\\n\\n\ucd94\uac00\uc801\uc73c\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 2\ubc88\uc744 \uc120\ud0dd\ud55c\ub2e4. \\nParameter Store \uad00\ub9ac\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc758 [\ubb38\uc11c](https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/)\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac70 \uac19\ub2e4. \\n\uc124\uc815\uc774 \uc644\ub8cc\ub418\uba74 `/opt/aws/amazon-cloudwatch-agent/bin/config.json` \uc5d0 \uc124\uc815\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc774 \uc800\uc7a5\ub41c\ub2e4. \\n\\n### \uc124\uc815 \ud30c\uc77c \uc801\uc6a9\\n\\n\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uc815\ud30c\uc77c\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4. \\nfile \ub4a4\uc5d0\ub294 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub300\ud55c \uc808\ub300\uacbd\ub85c(\uc544\ub798 \uba85\ub839\uc5b4 \uae30\uc900 \uae30\ubcf8 \uc0dd\uc131 \uc704\uce58)\ub97c \uc785\ub825\ud558\uba74 \ub41c\ub2e4. \\n\\n```bash\\nsudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json\\n```\\n\\n### types.db: no such file or directory \uc5d0\ub7ec\\n\\n\ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 types.db \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4.\\n\\n```bash\\nError running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory\\n```\\n\\ntypes.db \ud30c\uc77c \uc0dd\uc131\\n\\n```bash\\nsudo mkdir /usr/share/collectd\\nsudo touch /usr/share/collectd/types.db\\n```\\n\\n### \uc9c0\ud45c \ud655\uc778\\n\\nCloudWatch Metrics\uc5d0 \uac00\ubcf4\uba74 CWAgent\ub77c\ub294 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\uac00 \ucd94\uac00\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \\n\\n![./cloudwatch6.png](./cloudwatch6.png)\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \ucd94\uac00\ud558\uc5ec \uc9c0\ud45c\uc5d0 \ub300\ud55c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. \\n\\n```json\\n{\\n \\"metrics\\": {\\n \\"namespace\\": \\"2023-hello-world\\",\\n ......\\n },\\n} \\n```\\n\\n### \ub85c\uadf8\\n\\nCloudWatch \u2192 \ub85c\uadf8 \uadf8\ub8f9\uc73c\ub85c \uac00\uba74 Wizard\ub85c \ucd94\uac00\ud55c \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.\\n\\n![./cloudwatch7.png](./cloudwatch7.png)\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[CloudWatch\ub780 \ubb34\uc5c7\uc785\ub2c8\uae4c?](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) \\n[Amazon CloudWatch \uc694\uae08](https://aws.amazon.com/ko/cloudwatch/pricing/) \\n[Linux \uc778\uc2a4\ud134\uc2a4 \uc9c0\ud45c](https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html) \\n[\uc11c\ubc84\uc5d0 CloudWatch \uc5d0\uc774\uc804\ud2b8 \uc124\uce58 \ubc0f \uc2e4\ud589](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html) \\n[CloudWatch Agent\ub97c Parameter Store\uc5d0\uc11c \uad00\ub9ac\ud574 \ubcf4\uae30](https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/) \\n[CloudWatch\uc5d0\uc774\uc804\ud2b8 \uad6c\uc131 \ud30c\uc77c](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html)"},{"id":"route-image-async-with-event","metadata":{"permalink":"/route-image-async-with-event","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","source":"@site/blog/2023-3/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","description":"\uc774\uc804 \uae00","date":"2023-08-13T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 13\uc77c","tags":[{"label":"async","permalink":"/tags/async"},{"label":"event","permalink":"/tags/event"}],"readingTime":11.2,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","slug":"route-image-async-with-event","tags":["async","event"]},"unlisted":false,"prevItem":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","permalink":"/cloudwatch"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/route-image-implementation"}},"content":"## \uc774\uc804 \uae00\\n\\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd](./route-image-intro) \\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604](./route-image-implementation)\\n\\n## \uac1c\uc694\\n\\n\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120\\n\\n\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4. \\n\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. \\n\\n### \ud655\uc7a5\uc131 \ub300\ube44\\n\\n\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4. \\n\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. \\n\\n## \ube44\ub3d9\uae30 \ucc98\ub9ac\\n\\n@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. \\n\\n### \ube44\ub3d9\uae30 \uc124\uc815\\n\\n\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4. \\n\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. \\n\\n```java title=\\"AsyncConfig\\"\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig {\\n}\\n```\\n\\n\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. \\n\\n> In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\\n> 7.7. Task Execution and Scheduling, Spring Boot Docs\\n\\n### @Async \uc801\uc6a9\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java title=\\"RouteImageGenerator\\"\\n@Async\\npublic void generate(\\n List latitudes,\\n List longitudes,\\n List pointedLatitudes,\\n List pointedLongitudes,\\n Long tripId\\n) {\\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\\n\\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\\n\\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\\n routeImageDrawer.dispose();\\n\\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\\n Trip trip = tripRepository.findById(tripId)\\n .orElseThrow();\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n}\\n```\\n\\n### \ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810\\n\\n\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. \\n\\n```mermaid\\ngraph LR\\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\\n draw --\x3e trip\\n```\\n\\n\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph draw\\n\\t\\tdirection LR\\n\\t\\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\\n\\tend\\n subgraph trip\\n\\t\\tdirection LR\\n\\t\\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\\n\\t\\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\\n\\tend\\n\\n\\ttrip --\x3e draw\\n```\\n\\n\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n## \uc774\ubca4\ud2b8 \uc0ac\uc6a9\\n\\n\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.\\n\\n### \uc774\ubca4\ud2b8 \ubc1c\ud589\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4. \\n\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. \\n\\n```java title=\\"TripService & TripUpdateEvent\\"\\npublic void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\\n ...\\n\\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\\n}\\n\\npublic record TripUpdateEvent(Long tripId) {\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4. \\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4. \\n\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. \\n\\n### \uc774\ubca4\ud2b8 \uad6c\ub3c5\\n\\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec `@Async` \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4. \\n\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 `@TransactionalEventListener`\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n:::note TransactionPhase \uc124\uc815\\nTransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\nAFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nBEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\n:::\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```java title=\\"TripUpdateEventHandler\\"\\n@Component\\npublic class TripUpdateEventHandler {\\n\\n private final RouteImageGenerator routeImageGenerator;\\n private final TripRepository tripRepository;\\n\\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\\n this.routeImageGenerator = routeImageGenerator;\\n this.tripRepository = tripRepository;\\n }\\n\\n @Async\\n @TransactionalEventListener(phase = AFTER_COMMIT)\\n public void handle(TripUpdateEvent tripUpdateEvent) {\\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\\n\\n String imageUrl = routeImageGenerator.generate(\\n trip.getLatitudes(),\\n trip.getLongitudes(),\\n trip.getPointedLatitudes(),\\n trip.getPointedLongitudes()\\n );\\n\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n }\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4. \\n\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4.\\n\\n```mermaid\\ngraph LR\\n subgraph trip\\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\\n TripRepository\\n end\\n\\n subgraph draw\\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\\n end\\n```\\n\\n### \ud14c\uc2a4\ud2b8\\n\\n\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\\n\\n\\n```java\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(Mockito.timeout(5000).times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\n@ContextConfiguration(classes = TestSyncConfig.class)\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n\\n\\n\\n\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4. \\n\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 `\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0` \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c `Mockito.timeout` \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. \\n\\n## \uacb0\uacfc\\n\\n![./time.png](./time.png)\\n\\n\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4. \\n\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[7.7. Task Execution and Scheduling, Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling) \\n[Spring Events, Baeldung](https://www.baeldung.com/spring-events) \\n[\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30](https://techblog.woowahan.com/7835/)"},{"id":"route-image-implementation","metadata":{"permalink":"/route-image-implementation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","source":"@site/blog/2023-3/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","description":"\uac1c\uc694","date":"2023-08-02T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 2\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":11.665,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","slug":"route-image-implementation","tags":["image","awt"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/route-image-async-with-event"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/route-image-python"}},"content":"## \uac1c\uc694\\n\\n\uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 [\ub9c1\ud06c](./route-image-intro)\uc5d0 \uc788\ub2e4.\\n\\n### \uad6c\ud604 \uacb0\uacfc\\n\\n![./result.png](./result.png)\\n\\n\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n**\uc11c\uc6b8\uc5ed(\uc810)** \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 **\uad6c\ub85c\uc5ed(\uc810)** \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed\\n\\n```java title=\\"\uc608\uc2dc \ub370\uc774\ud130\\"\\nList x = List.of(\\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\\n);\\nList y = List.of(\\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\\n);\\nList xPoints = List.of(126.97094933811682, 126.88474839801178);\\nList yPoints = List.of(37.55302829553499, 37.50129417536773);\\n```\\n\\n### IMAGE_SIZE & ROUTE_SIZE\\n\\n```java title=\\"RouteImageGenerator.java\\"\\nprivate static final int IMAGE_SIZE = 800;\\nprivate static final int ROUTE_SIZE = 600;\\n```\\n\\n\ucf54\ub4dc\ub97c \ubcf4\uba74 IMAGE_SIZE\uc640 ROUTE_SIZE\uac00 \uc788\ub2e4. \\nIMAGE_SIZE\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4. \\nROUTE_SIZE\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. \\n\\n![./600.png](./600.png)\\n\\n**\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720**\\n\\n255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370, \uc774\ubbf8\uc9c0\uc758 \uc120\uba85\ub3c4\uac00 \uc88b\uc9c0 \uc54a\uc544 800 * 800 \uc0ac\uc774\uc988\ub85c \ubcc0\uacbd\ud588\ub2e4.\\n\\n## \uc8fc\uc694 \ud074\ub798\uc2a4\\n\\n### \uc694\uc57d\\n\\n| \ud074\ub798\uc2a4\uba85 | \uc124\uba85 | \ud2b9\uc774\uc0ac\ud56d |\\n| --- | --- | --- |\\n| Coordinate | \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12 | \uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc \uc5ec\ud589 \ub3c4\uba54\uc778\uc5d0 \ud3ec\ud568\ub41c Point \ud074\ub798\uc2a4\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9 |\\n| Coordinates | Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| Position | \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12 | Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9 |\\n| Positions | Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| RouteImageDrawer | \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c | \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c |\\n| RouteImageUploader | BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4 | \ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131 |\\n| RouteImageGenerator | \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4 | \uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad |\\n| BufferedImage(AWT) | \uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9 | \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0) |\\n| Graphics2D(AWT) | \uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc | JDK 1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131 |\\n\\n### \uc758\uc874\uad00\uacc4\\n\\n```mermaid\\ngraph TD\\n C1[Coordinates] --\x3e C[Coordinate]\\n P1[Positions] --\x3e P[Position]\\n\\n\\tRID[RouteImageDrawer] -- \\"\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131\\" --\x3e P1\\n\\tRID --\x3e B[BufferedImage]\\n\\tRID --\x3e G[Graphics2D]\\n\\n\\tC1 -- \\"calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0\\" --\x3e P1\\n\\n\\tRIU[RouteImageUploader] --\x3e B\\n\\tRIG[RouteImageGenerator] --\x3e RID\\n\\tRIG --\x3e RIU\\n\\tRIG --\x3e C1\\n\\tRIG --\x3e P1\\n```\\n\\n### Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)\\n\\n`List` 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4. \\nCoordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658\\n- indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 \\n\\nPositions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n```java title=\\"Coordinates.java\\"\\n// \ud638\ucd9c\\n// List xPositions = toPositions(xValues, maxDifference, routeImageSize);\\n// List yPositions = toPositions(yValues, maxDifference, routeImageSize);\\n\\nprivate List toPositions(List values, Double maxDifference, Integer routeImageSize) {\\n Double minValue = Collections.min(values);\\n return values.stream()\\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\\n .map(value -> mapToPosition(value, routeImageSize))\\n .toList();\\n}\\n\\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\\n return (coordinate - minValue) / maxDifference;\\n}\\n\\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\\n return (int) (coordinate * routeImageSize);\\n}\\n```\\n\\n\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4.\\n\\n1. Collections.min(values) \u2192 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4.\\n2. normalizeCoordinate \u2192 \uac01\uac01\uc758 \uc704\ub3c4 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 **\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774**\ub85c \ub098\ub208\ub2e4.\\n3. mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n### Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)\\n\\nPositions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4.\\n- getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4.\\n- xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```java title=\\"Positions.java\\"\\npublic Positions align(int imageSize, int routeSize) {\\n int xOffset = calculateOffset(Position::x, imageSize);\\n int yOffset = calculateOffset(Position::y, imageSize);\\n\\n return items.stream()\\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\\n .collect(collectingAndThen(toList(), Positions::new));\\n}\\n\\nprivate int calculateOffset(ToIntFunction positionToInteger, int imageSize) {\\n List positions = items.stream()\\n .mapToInt(positionToInteger)\\n .boxed()\\n .toList();\\n\\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\\n return imageSize / 2 - midValue;\\n}\\n```\\n\\n\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4. \\nBufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. \\n\\n![./800.png](./800.png)\\n\\n\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4.\\n\\nx \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4. \\ny \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. \\n\\n### RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)\\n\\nBufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4. \\n\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.\\n\\n```java title=\\"RouteImageDrawer.java\\"\\n// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\\n// \ubc30\uacbd \ud22c\uba85\uc0c9\\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\\nprivate static final int LINE_STROKE_WIDTH = 7;\\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\\nprivate static final int POINT_STROKE_WIDTH = 20;\\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8 \uac1c\uc120\uc744 \uc704\ud55c \uc124\uc815\\nprivate static final Map renderingHints = Map.of(\\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\\n);\\n```\\n\\nRouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4.\\n- drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4.\\n- dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. \\n\\ndispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4.\\n\\n## \uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow\\n\\n### 1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n\\n```\\n\\n### 2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 4. \uc5c5\ub85c\ub4dc \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n \\tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n \\tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n \\tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n```\\n\\n### \uc804\uccb4 Flow\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n\\t\\n```"},{"id":"route-image-python","metadata":{"permalink":"/route-image-python","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","source":"@site/blog/2023-3/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","description":"\uac1c\uc694","date":"2023-07-31T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 31\uc77c","tags":[{"label":"Image","permalink":"/tags/image"},{"label":"Python","permalink":"/tags/python"}],"readingTime":6.185,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","slug":"route-image-python","tags":["Image","Python"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/route-image-implementation"},"nextItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/mock-static-method"}},"content":"### \uac1c\uc694\\n\\n\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. \\n\\n### \uc0ac\uc6a9 \uae30\uc220\\n\\n\uc5b8\uc5b4: Python 3.10 \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib \\n\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront \\n\\n\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```mermaid\\ngraph LR\\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\\n Client --\x3e CloudFront --\x3e S3\\n```\\n\\n### \uc694\uad6c\uc0ac\ud56d\\n\\n![./route.png](./route.png)\\n\\n\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. \\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n- \uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\\n\\n1. \uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n2. \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n\\n\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4. \\n\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604\\n\\n```python\\nimport time\\n\\nimport matplotlib.pyplot as plt\\n\\n\\ndef draw(point):\\n start = time.time()\\n x, y = zip(*point)\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n draw_lines(pixel_x, pixel_y)\\n end = time.time()\\n print(end - start)\\n \\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n return scaled_coordinates\\n\\n\\ndef draw_lines(x, y):\\n figure = plt.gcf()\\n figure.set_size_inches(5, 5)\\n plt.plot(x, y, c = \'w\',linewidth=5)\\n plt.scatter(x[3],y[3], c = \'w\', s = 125)\\n plt.axis(\'off\')\\n plt.savefig(\'name.png\', transparent=True, format=\'png\')\\n\\npoint = [\\n [126.96352960597338, 37.590841000217125],\\n [126.96987292787792, 37.58435564234159],\\n [126.98128481452298, 37.58594375113966],\\n [126.99360339342958, 37.58248524741927],\\n [126.99867565340067, 37.56778118088622],\\n [127.001935378366117, 37.55985240444085],\\n [126.9831048919687, 37.548030119488665],\\n [126.97189273528845, 37.5119879225856],\\n [127.02689859997221, 37.48488593333883]\\n]\\n\\ndraw(point)\\n```\\n\\n\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)\\n\\n![./routeImage.png](./routeImage.png)\\n\\n### AWS Lambda\\n\\n\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4. \\n\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131\\n\\nAmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc\\n\\n\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```python\\n\\nimport io\\nimport uuid\\n\\nimport boto3\\nimport matplotlib.pyplot as plt\\n\\nPIXEL = 255\\nBUCKET_NAME = \'image-plot\'\\nS3 = \'s3\'\\n\\ndef lambda_handler(event, context):\\n x = event[\'x\']\\n y = event[\'y\']\\n image_name = str(uuid.uuid4())\\n\\n img_data = draw(x, y)\\n s3 = boto3.client(S3)\\n s3.put_object(Body=img_data.getvalue(), ContentType=\'image/png\', Bucket=BUCKET_NAME, Key=image_name)\\n url = f\'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}\'\\n\\n return {\\n \'statusCode\': 200,\\n \'body\': url\\n }\\n\\ndef draw(x, y):\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n img_data = draw_lines(pixel_x, pixel_y)\\n plt.close()\\n return img_data\\n\\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\\n return pixel_values\\n\\ndef draw_lines(x, y):\\n plt.plot(x, y, \'k-\', linewidth=10)\\n plt.axis(\'off\')\\n img_data = io.BytesIO()\\n plt.savefig(img_data, transparent=True, format=\'png\')\\n img_data.seek(0)\\n return img_data\\n\\n```\\n\\n### Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131\\n\\nmatplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4. \\nzip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4. \\n\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4. \\n\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```\\npillow.zip\\n\u2502 python/PIL\\n\u2514 python/Pillow-5.3.0.dist-info\\n```\\n\\nUbuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\\n```\\nsudo apt update\\nsudo apt install zip\\nsudo apt install python3-pip\\n\\nmkdir python\\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\\n```\\n\\n### `No module named \'numpy.core._multiarray_umath\'` \uc5d0\ub7ec\\n\\nLayer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4. \\n\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4. \\n\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### \uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01\\n\\n\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4. \\nAWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. \\n\\n**\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.**\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[AWS Lambda](https://aws.amazon.com/ko/lambda/) \\n[Lambda Layer](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html) \\n[Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html) \\n[No module named \'numpy.core._multiarray_umath\'](https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b) \\n[\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc](https://techblog.woowahan.com/6217/)"},{"id":"mock-static-method","metadata":{"permalink":"/mock-static-method","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","source":"@site/blog/2023-3/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","description":"\uac1c\uc694","date":"2023-07-30T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 30\uc77c","tags":[{"label":"Mockito","permalink":"/tags/mockito"},{"label":"static","permalink":"/tags/static"}],"readingTime":2.635,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","slug":"mock-static-method","tags":["Mockito","static"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/route-image-python"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/route-image-intro"}},"content":"### \uac1c\uc694\\n\\n\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \\n\\n\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4. \\n\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4. \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. \\n\\n```java\\npublic void upload(BufferedImage bufferedImage) {\\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\\n try {\\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\\n } catch (IOException e) {\\n throw new DrawException(IMAGE_SAVE_FAIL);\\n }\\n}\\n```\\n\\n### Mocking static methods\\n\\nMockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\nmockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 `MockedStatic`\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. \\n\\nJUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc `MockedStatic`\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. \\n\\n```java\\n// given\\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\\nRouteImageUploader routeImageUploader = new RouteImageUploader();\\n\\n// expect\\ntry (MockedStatic imageIO = Mockito.mockStatic(ImageIO.class)) {\\n routeImageUploader.upload(bufferedImage);\\n imageIO.verify(\\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\\n times(1)\\n );\\n}\\n```\\n\\n### \ub9c8\uce58\uba70\\n\\n\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uc73c\ub85c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790. \\n\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4. \\n\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Mocking static methods](https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks) \\n[Mockito mock static methods](https://www.baeldung.com/mockito-mock-static-methods) \\n[Enable mocking static methods in Mockito](https://github.com/mockito/mockito/issues/1013)"},{"id":"route-image-intro","metadata":{"permalink":"/route-image-intro","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","source":"@site/blog/2023-3/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","description":"./route.png","date":"2023-07-27T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 27\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":5.865,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","slug":"route-image-intro","tags":["image","awt"]},"unlisted":false,"prevItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/mock-static-method"},"nextItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/java-spring-springboot"}},"content":"![./route.png](./route.png)\\n\\n### \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784\\n\\n\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c `\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac`\uc640 `\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0`\uc758 \uacbd\uc6b0 \ub124\uc774\ubc84 \uc9c0\ub3c4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud574\ub2f9 \uae30\ub2a5\uc744 \uad6c\ud604\ud560 \uc218 \uc5c6\uc73c\ub2c8 \ub2f9\uc5f0\ud788 \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4.\\n\\n\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.\\n\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n\\n\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uc5ec \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4.\\n\\n### \uace0\ub824\ud55c \uae30\uc220\\n\\n\ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uae30 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. \\n\\n- Python\uc758 Matplotlib\\n- **AWT(Abstract Window Toolkit) [\ucd5c\uc885 \uc120\ud0dd]**\\n- \uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)\\n- Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)\\n\\n## Python & Matplotlib\\n\\n\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 \\n\\n- \ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. \\n- AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.\\n- Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.\\n\\n### Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\\n\\nPython\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4.\\n\\n\ub77c\uc774\ube0c\ub7ec\ub9ac | \uc124\uba85 | \uc81c\uc678 \uc774\uc720\\n-- | -- | --\\nSwing | AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\nJavaFX | Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\n[simple-java-plot](https://github.com/yuriy-g/simple-java-plot) | AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac | AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c\\n[matplotlib4j](https://github.com/sh0nk/matplotlib4j) | Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac | \ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c\\n\\n### Java & AWT(Abstract Window Toolkit)\\n\\n\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 \\n\\n- \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4.\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.\\n- \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n\\n### \uae30\uc220 \uc120\ud0dd\\n\\nAWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.\\n\\n### \uc720\uc9c0 \ubcf4\uc218\\n\\nAWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n1. \ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. \\n2. AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4.\\n\\n### \ub808\ubca8 3\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70 \ub0b4\uc6a9 \ucd94\uac00\\n\\n\uae30\uc220 \uc120\ud0dd\uc744 \ud558\uae30 \uc704\ud55c \uc2e4\ud589 \uc2dc\uac04 \uce21\uc815\uc5d0 \uc624\ub958\uac00 \uc788\uc5c8\ub2e4. \\nAWT\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc2e4\ud589 \uc2dc\uac04\uc744 \uc81c\uc678\ud558\uba74 \ud30c\uc774\uc36c\uacfc \ube44\uc2b7\ud55c \uc2dc\uac04\uc548\uc5d0 \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc5c8\ub2e4."},{"id":"java-spring-springboot","metadata":{"permalink":"/java-spring-springboot","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","source":"@site/blog/2023-3/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","description":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","date":"2023-07-24T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 24\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Spring Boot","permalink":"/tags/spring-boot"},{"label":"Spring","permalink":"/tags/spring"}],"readingTime":4.725,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","slug":"java-spring-springboot","tags":["Java","Spring Boot","Spring"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/route-image-intro"},"nextItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/websocket"}},"content":"## \uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\\n\\n\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4. \\n2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4.\\n\\n## \uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### Switch Expressions(Java 14)\\n\\nJava 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n```java\\nenum RESULT {\\n WIN, LOSE, DRAW\\n}\\n\\nRESULT result = RESULT.WIN;\\n\\nint prize = switch (result) {\\n case WIN -> 10_000_000;\\n case LOSE, DRAW -> 5_000_000;\\n\\tdefault -> 0;\\n};\\n```\\n\\n\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- `->` \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.\\n- case\ub97c \ucf64\ub9c8(`,`)\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n- break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4.\\n- default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\n### Text Block(Java 15)\\n\\nJava 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@Repository\\npublic interface PostRepository extends JpaRepository {\\n @Query(\\"\\"\\"\\n SELECT p FROM Post p\\n WHERE p.title LIKE %:keyword%\\n OR p.content LIKE %:keyword%\\n \\"\\"\\")\\n List findPostsByTitleOrContentContainingKeyword(String keyword);\\n}\\n```\\n\\n### NPE \uba54\uc2dc\uc9c0(Java 15)\\n\\n```java\\nString name = null;\\nname.chars();\\n\\n/** \\n# before\\njava.lang.NullPointerException\\n\\tat com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\\n\\n# after\\nCannot invoke \\"String.chars()\\" because \\"name\\" is null\\njava.lang.NullPointerException: Cannot invoke \\"String.chars()\\" because \\"name\\" is null\\n*/\\n```\\n\\n### Record(Java 16)\\n\\nLombok\uc758 `@Data`, kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nRecord\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4. \\n\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. \\n\\n```java\\npublic record PostDto(String title, String content) {\\n}\\n```\\n\\n### \ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d\\n\\n\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n## \uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. \\n\\n### \uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d\\n\\nJava 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n### \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd\\n\\nJakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. \\n\\n### PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c\\n\\n6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c `@GetMapping(\\"/hello\\")`\uc640 `@GetMapping(\\"/hello/\\")`\uac00 \ub3d9\uc77c\ud588\ub2e4. \\n6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, `/hello`\uc640 `/hello/`\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. \\n\\n> PathPatternParser used by default (with the ability to opt into PathMatcher). \\n\\n### HTTP interface client\\n\\n\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [\ud1a0\ube44\ub2d8\uc758 \uac15\uc758](https://www.youtube.com/watch?v=Kb37Q5GCyZs)\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d\\n\\nGradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6 \\n\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30](https://www.youtube.com/watch?v=1WT6oxchM9M) \\n[\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30](https://www.youtube.com/watch?v=7SlDdzVk6GE) \\n[Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658](https://www.samsungsds.com/kr/insights/java_jakarta.html) \\n[Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529](https://www.youtube.com/watch?v=Kb37Q5GCyZs) \\n[What\'s New in Spring Framework 6.x](https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x) \\n[Spring Boot 3.0 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes) \\n[Spring Boot 3.1 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes)"},{"id":"websocket","metadata":{"permalink":"/websocket","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-26-WebSocket.mdx","source":"@site/blog/2023-2/2023-06-26-WebSocket.mdx","title":"\uc6f9\uc18c\ucf13","description":"\uc6f9\uc18c\ucf13","date":"2023-06-26T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 26\uc77c","tags":[{"label":"WebSocket","permalink":"/tags/web-socket"}],"readingTime":4.165,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9\uc18c\ucf13","slug":"websocket","tags":["WebSocket"]},"unlisted":false,"prevItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/java-spring-springboot"},"nextItem":{"title":"Docusaurus","permalink":"/docusaurus"}},"content":"### \uc6f9\uc18c\ucf13\\n\\n\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c \\n\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\\n\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. \\n\\n### \uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd\\n\\n\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Long polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4. \\n\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\\n:::note polling, long polling, streaming\\n\\nPolling: \uc8fc\uae30\uc801\uc73c\ub85c \uc11c\ubc84\uc5d0 \uc694\uccad\uc744 \ubcf4\ub0b4 \uc218\uc2e0\ud560 \uc815\ubcf4\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubc29\ubc95\\n- \uc11c\ubc84\uc5d0\uc11c \ubcf4\ub0bc \ub0b4\uc6a9\uc774 \uc5c6\uc5b4\ub3c4 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc54c \uc218 \uc5c6\ub2e4. \\n- \uacc4\uc18d\ud574\uc11c \uc694\uccad\uc744 \ubcf4\ub0b4 \ud655\uc778\uc744 \ud574\uc57c\ud558\uae30 \ub54c\ubb38\uc5d0 \uc11c\ubc84\uc5d0 \ubd88\ud544\uc694\ud55c \ubd80\ud558\ub97c \uc8fc\uc5b4\uc57c \ud55c\ub2e4. \\n\\nLong Polling: \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc5d0 \ub300\ud574 \uc751\ub2f5\uc744 \ubcf4\ub0b4\uc9c0 \uc54a\uace0 \uc788\ub2e4\uac00 \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud588\uc744\ub54c \uc751\ub2f5\ud558\ub294 \ubc29\ubc95\\n- \ud3f4\ub9c1 \ubc29\uc2dd\ubcf4\ub2e4 \uc11c\ubc84\uc5d0 \uc801\uc740 \ubd80\ud558\ub97c \uc904 \uc218 \uc788\uc9c0\ub9cc, \uc694\uccad\uc758 \uc8fc\uae30\uac00 \uc9e7\uc73c\uba74 \ud3f4\ub9c1\uacfc \ucc28\uc774\uac00 \uc5c6\uc5b4\uc9c4\ub2e4.\\n\\nStreaming: \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 request\ub97c \ubcf4\ub0b4\uba74 \ucee4\ub125\uc158\uc744 \ub9fa\uace0, \uc774 \ucee4\ub125\uc158\uc744 \uc720\uc9c0\ud558\uba74\uc11c \uc11c\ubc84\uac00 \uacc4\uc18d \ub370\uc774\ud130\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95\\n- \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ubc84\uc5d0 \uc694\uccad\uc744 \ud558\uace0 \uc2f6\ub2e4\uba74 \uc0c8\ub85c\uc6b4 \ucee4\ub125\uc158\uc744 \ub9fa\uc5b4\uc57c \ud55c\ub2e4. \\n:::\\n\\n### \uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791\\n\\n```mermaid\\nsequenceDiagram\\n participant Client\\n participant Server\\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\\n\\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\\n Server->>Client: \\n\\n Client->>Server: \uc885\ub8cc\\n Server->>Client: \\n```\\n\\n### 1. Upgrade \uc694\uccad\\n\\nWebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4. \\n\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4. \\nSec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4. \\nSec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. \\n\\n```\\nGET /chats HTTP/1.1\\nHost: localhost:8080\\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\\nSec-WebSocket-Version: 13\\nOrigin: http://localhost:8080\\n```\\n\\n### 2. Switching Protocols\\n\\n\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4. \\nSec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 `258EAFA5-E914-47DA-95CA-C5AB0DC85B11`\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\\n```\\nHTTP/1.1 101 Switching Protocols \\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\\nSec-WebSocket-Protocol: v10.stomp\\n```\\n\\n### 3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc\\n\\n\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4. \\n\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\nhttps://datatracker.ietf.org/doc/html/rfc6455 \\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications \\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers \\nhttps://docs.spring.io/spring-framework/reference/web/websocket.html"},{"id":"docusaurus","metadata":{"permalink":"/docusaurus","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","source":"@site/blog/2023-2/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","title":"Docusaurus","description":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.","date":"2023-06-18T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 18\uc77c","tags":[{"label":"Documentation","permalink":"/tags/documentation"}],"readingTime":10.095,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Docusaurus","slug":"docusaurus","tags":["Documentation"]},"unlisted":false,"prevItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/websocket"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/woowacourse-level2-retrospective"}},"content":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. \\n\\n## \uc124\uce58\\n\\n[\uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://docusaurus.io/docs/installation)\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. \\n\\n```bash\\nyarn create docusaurus\\n````\\n\\n## \ubc30\ud3ec\\n\\n[\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c](https://docusaurus.io/docs/next/deployment#deploying-to-github-pages) \\nnetlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4.\\n\\n### \ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131\\n\\ngithub pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 [\uc608\uc2dc](https://github.com/greeng00se/greeng00se.github.io)\uc640 \uac19\uc774 `username.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\n\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 `organization.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n### \uc124\uc815 \ud30c\uc77c \uc218\uc815\\n\\n```js title=\\"docusaurus.config\\"\\nmodule.exports = {\\n // ...\\n url: \'https://greeng00se.github.io\',\\n baseUrl: \'/\',\\n projectName: \'greeng00se.github.io\',\\n organizationName: \'greeng00se\',\\n trailingSlash: false,\\n // ...\\n};\\n```\\n\\n### \ud1a0\ud070 \uc124\uc815\\n\\ngithub action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 [repo, user, workflow] \uc744 \uc124\uc815\ud588\ub2e4. \\n\\n![github](./github.png)\\n\\n### \ube0c\ub79c\uce58 \uc0dd\uc131\\n\\ngithub\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4. \\nrepository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4. \\n\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\\n### \uc6cc\ud06c\ud50c\ub85c \uc791\uc131\\n\\nDocusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. \\n\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. \\n\\n```yml title=\\".github/workflows/deploy.yml\\"\\nname: blog\\n\\non:\\n push:\\n branches: [main]\\n\\njobs:\\n deploy:\\n name: Deploy to GitHub Pages\\n runs-on: ubuntu-latest\\n steps:\\n - uses: actions/checkout@v2\\n - uses: actions/setup-node@v3\\n with:\\n node-version: 18\\n cache: yarn\\n\\n - name: Install dependencies\\n run: yarn install --frozen-lockfile\\n - name: Build website\\n run: yarn build\\n\\n - name: Deploy to GitHub Pages\\n uses: peaceiris/actions-gh-pages@v3\\n with:\\n github_token: ${{ secrets.DEPLOY_TOKEN }}\\n publish_dir: ./build\\n user_name: github-actions[bot]\\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\\n```\\n\\n## \ub313\uae00 \uae30\ub2a5\\n\\ngiscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. \\n\\n### giscus \uc124\uc815\\n\\n1. \uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4.\\n2. giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n3. Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n\\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [giscus](https://giscus.app/ko)\ub97c \ud655\uc778\ud558\uc790.\\n\\n### docusaurus \uc124\uc815\\n\\n[swizzling](https://docusaurus.io/ko/docs/next/swizzling)\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4. \\n\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nyarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\\n```\\n\\n\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 `/src/theme/BlogPostItem/index.js` \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4. \\n\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. \\n\\n```js title=\\"/src/theme/BlogPostItem/index.js\\"\\nimport OriginalBlogPostItem from \\"@theme-original/BlogPostItem\\";\\nimport React, { useEffect, useRef } from \\"react\\";\\n// @ts-expect-error internal code\\nimport { useColorMode } from \\"@docusaurus/theme-common\\";\\nimport { useBlogPost } from \\"@docusaurus/theme-common/internal\\";\\n\\nconst giscusSelector = \\"iframe.giscus-frame\\";\\n\\nfunction BlogPostItem(props) {\\n const { colorMode } = useColorMode();\\n const { isBlogPostPage } = useBlogPost();\\n const giscusTheme = colorMode === \\"dark\\" ? \\"dark\\" : \\"light\\";\\n const containerRef = useRef(null);\\n\\n useEffect(() => {\\n if (!isBlogPostPage) return;\\n\\n const giscusEl = containerRef.current.querySelector(giscusSelector);\\n\\n const createGiscusEl = () => {\\n const script = document.createElement(\\"script\\");\\n\\n script.src = \\"https://giscus.app/client.js\\";\\n script.setAttribute(\\"data-repo\\", \\"teco-chat/teco-chat.github.io\\");\\n script.setAttribute(\\"data-repo-id\\", \\"R_kgDOJZ5j0Q\\");\\n script.setAttribute(\\"data-category\\", \\"Announcements\\");\\n script.setAttribute(\\"data-category-id\\", \\"DIC_kwDOJZ5j0c4CXS_Q\\");\\n script.setAttribute(\\"data-mapping\\", \\"pathname\\");\\n script.setAttribute(\\"data-strict\\", \\"0\\");\\n script.setAttribute(\\"data-reactions-enabled\\", \\"1\\");\\n script.setAttribute(\\"data-emit-metadata\\", \\"0\\");\\n script.setAttribute(\\"data-input-position\\", \\"bottom\\");\\n script.setAttribute(\\"data-theme\\", giscusTheme);\\n script.setAttribute(\\"data-lang\\", \\"ko\\");\\n script.crossOrigin = \\"anonymous\\";\\n script.async = true;\\n \\n containerRef.current.appendChild(script);\\n };\\n\\n const postThemeMessage = () => {\\n const message = {\\n setConfig: {\\n theme: giscusTheme,\\n }\\n };\\n\\n giscusEl.contentWindow.postMessage({ giscus: message }, \\"https://giscus.app\\");\\n };\\n\\n giscusEl ? postThemeMessage() : createGiscusEl();\\n }, [giscusTheme]);\\n\\n return (\\n <>\\n \\n {isBlogPostPage &&
}\\n \\n );\\n}\\n\\nexport default BlogPostItem;\\n```\\n\\n## \uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30\\n\\n\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4. \\n\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. \\n\\n\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, [docsearch](https://docsearch.algolia.com/)\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\ndocsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n- [\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1](https://docsearch.algolia.com/docs/legacy/run-your-own/) \\n- [\uc124\uc815 \ud30c\uc77c](https://docsearch.algolia.com/docs/legacy/config-file)\\n\\n### \uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778\\n\\n\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4. \\n\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n![algolia](./algolia.png)\\n\\n### \ud0a4 \uc0dd\uc131\\n\\n\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4. \\naddObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. \\n\\n![key](./key.png)\\n\\n### .env \ud30c\uc77c \uc0dd\uc131\\n\\n\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\\n```bash title=\\".env\\"\\nAPPLICATION_ID=MVIU5UEMOM\\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\\n```\\n\\n### config \ud30c\uc77c \uc0dd\uc131\\n\\n\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 [\ub9c1\ud06c](https://docsearch.algolia.com/docs/legacy/config-file)\ub97c \ucc38\uace0\ud55c\ub2e4. \\n\ub610\ub294 Docusaurus\uc758 [\uc124\uc815 \ud30c\uc77c](https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json)\uc744 \ucc38\uace0\ud55c\ub2e4.\\n\\n```json title=\\"config.json\\"\\n{\\n \\"index_name\\": \\"teco\\",\\n \\"start_urls\\": [\\n \\"https://teco-chat.github.io/\\"\\n ],\\n \\"sitemap_urls\\": [\\n \\"https://teco-chat.github.io/sitemap.xml\\"\\n ],\\n \\"sitemap_alternate_links\\": true,\\n \\"stop_urls\\": [\\n \\"/tests\\"\\n ],\\n \\"selectors\\": {\\n \\"lvl0\\": {\\n \\"selector\\": \\"(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]\\",\\n \\"type\\": \\"xpath\\",\\n \\"global\\": true,\\n \\"default_value\\": \\"Documentation\\"\\n },\\n \\"lvl1\\": \\"header h1\\",\\n \\"lvl2\\": \\"article h2\\",\\n \\"lvl3\\": \\"article h3\\",\\n \\"lvl4\\": \\"article h4\\",\\n \\"lvl5\\": \\"article h5, article td:first-child\\",\\n \\"lvl6\\": \\"article h6\\",\\n \\"text\\": \\"article p, article li, article td:last-child\\"\\n },\\n \\"strip_chars\\": \\" .,;:#\\",\\n \\"custom_settings\\": {\\n \\"separatorsToIndex\\": \\"_\\",\\n \\"attributesForFaceting\\": [\\n \\"language\\",\\n \\"version\\",\\n \\"type\\",\\n \\"docusaurus_tag\\"\\n ],\\n \\"attributesToRetrieve\\": [\\n \\"hierarchy\\",\\n \\"content\\",\\n \\"anchor\\",\\n \\"url\\",\\n \\"url_without_anchor\\",\\n \\"type\\"\\n ]\\n },\\n \\"conversation_id\\": [\\n \\"833762294\\"\\n ],\\n \\"nb_hits\\": 46250\\n}\\n```\\n\\n### docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\\n\\ndocker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4. \\njq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nbrew install jq\\n```\\n\\n\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. \\n\\n```bash\\ndocker run -it --env-file=.env -e \\"CONFIG=$(cat ./config.json | jq -r tostring)\\" algolia/docsearch-scraper\\n```\\n\\n### docusaurus \uc124\uc815\\n\\n\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n algolia: {\\n appId: \'MVIU5UEMOM\', // Application ID\\n apiKey: \'b68f378013817d9a190df88cdde226a0\', // Search-Only API Key\\n indexName: \'teco\', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\\n contextualSearch: true,\\n },\\n })\\n```\\n\\n## \ubd80\uac00 \uc124\uc815\\n\\n### \ud654\uba74 \uc0c1\ub2e8 Github Icon\\n\\n\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```css title=\\"/src/css/custom.css\\"\\n.header-github-link:hover {\\n opacity: 0.6;\\n}\\n\\n.header-github-link:before {\\n content: \'\';\\n width: 24px;\\n height: 24px;\\n display: flex;\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n\\nhtml[data-theme=\'dark\'] .header-github-link:before {\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath fill=\'white\' d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n```\\n\\nthemeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nnavbar: {\\n title: \'HELLO\',\\n items: [\\n {\\n href: \'https://github.com/greeng00se\',\\n position: \'right\',\\n className: \'header-github-link\',\\n \'aria-label\': \'GitHub repository\',\\n },\\n ],\\n},\\n```\\n\\n### \ucf54\ub4dc\ube14\ub7ed\\n\\njava\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4. \\nprism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nprism: {\\n theme: lightCodeTheme,\\n darkTheme: darkCodeTheme,\\n additionalLanguages: [\'java\', \'kotlin\'],\\n}\\n```\\n\\n### mermaid\\n\\nmermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 `@docusaurus/theme-mermaid` \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4.\\n\\n```bash\\nyarn add @docusaurus/theme-mermaid\\n```\\n\\n\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```js title=\\"docusaurus.config\\"\\nconst config = {\\n ...\\n markdown: {\\n mermaid: true,\\n },\\n themes: [\\n \'@docusaurus/theme-mermaid\'\\n ],\\n};\\n```\\n\\nthemeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n mermaid: {\\n theme: {\\n light: \'neutral\', \\n dark: \'dark\'\\n },\\n },\\n }),\\n```\\n\\n### \uad6d\uc81c\ud654 \uc124\uc815\\n\\n\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 `Older Entries` \ud615\ud0dc\uc758 \uc124\uba85\uc774 `\ub2e4\uc74c \ud398\uc774\uc9c0` \ub85c \ubcc0\uacbd\ub41c\ub2e4. \\n\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\ni18n: {\\n defaultLocale: \\"ko\\",\\n locales: [\\"ko\\"],\\n},\\n```\\n\\n### \ube14\ub85c\uadf8 \uae00 author\\n\\n\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. \\n\\n![author](./author.png)\\n\\n`authors.yml` \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n```yml title=\\"/blog/authors.yml\\"\\nherb:\\n name: \ud5c8\ube0c\\n title: Backend\\n url: https://github.com/greeng00se\\n image_url: https://github.com/greeng00se.png\\n\\nmallang:\\n name: \ub9d0\ub791\\n title: Backend\\n url: https://github.com/shin-mallang\\n image_url: https://github.com/shin-mallang.png\\n```\\n\\n\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. \\n\\n```mdx\\n---\\nslug: 1\\ntitle: Hello World\\nauthors: [herb, mallang]\\ntags: [hello, docusaurus]\\n---\\n\\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\\n```"},{"id":"woowacourse-level2-retrospective","metadata":{"permalink":"/woowacourse-level2-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","description":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.","date":"2023-06-11T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 11\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":2.545,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","slug":"woowacourse-level2-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"Docusaurus","permalink":"/docusaurus"},"nextItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/level2-interview-retrospective"}},"content":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4. \\n\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. \\n\\n### \ud559\uc2b5\\n\\n\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4. \\n\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. \\n\\n\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4. \\n\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. \\n\\n\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4. \\n\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc218\uba74\\n\\n\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### \ud611\uc5c5\\n\\n\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4. \\n\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. \\n\\n\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4. \\n\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70\\n\\n\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."},{"id":"level2-interview-retrospective","metadata":{"permalink":"/level2-interview-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","description":"\ub808\ubca8 \uc778\ud130\ubdf0","date":"2023-06-08T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 8\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.435,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","slug":"level2-interview-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/woowacourse-level2-retrospective"},"nextItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/order-retrospective"}},"content":"### \ub808\ubca8 \uc778\ud130\ubdf0\\n\\n\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4. \\n\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd\\n\\n\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4. \\n\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4.\\n\\n\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4.\\n\\n> \ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c. \\n> \uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d\\n>\\n\\n### PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158\\n\\nPUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4. \\n\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. \\n\\n\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. \\n\\n### \uadf8 \uc678 \uac1c\uc120\ud560 \uc810\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30 \\n\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c \\"\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?\\"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30 \\n\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30 \\n\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"},{"id":"order-retrospective","metadata":{"permalink":"/order-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4: AWS \ubc30\ud3ec","date":"2023-06-04T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 4\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.67,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","slug":"order-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/level2-interview-retrospective"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/tecochat-retrospective-3"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: AWS \ubc30\ud3ec \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-shopping-order/pull/7 \\n:::\\n\\n### \uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158\\n\\n\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. \\n\\n### \ubc30\ud3ec\\n\\n\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4. \\n\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4.\\n\\n```bash\\necho \\"Start Deploy Script\\"\\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\\nPROJECT_NAME=jwp-shopping-order\\n\\necho \\"Change Directory\\"\\ncd $REPOSITORY_NAME\\n\\necho \\"Git Pull\\"\\ngit pull origin step2\\n\\necho \\"Build\\"\\n./gradlew bootJar\\n\\necho \\"Copy, Start Server\\"\\nmv ./build/libs/$PROJECT_NAME.jar .\\n\\nPID=$(pgrep -f $PROJECT_NAME)\\n\\nif [ -n $PID ]; then\\n kill -9 $PID\\n\\tsleep 5\\nfi\\n\\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\\n```\\n\\n### \ud611\uc5c5\\n\\n\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4. \\n\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30**\\n\\n\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c? \\n\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84\\n\\n**expose headers**\\n\\n\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c [\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354](https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header)\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nnginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. \\n\\n```bash\\nadd_header \'Access-Control-Expose-Headers\' \'Location\'\\n```\\n\\n**\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158** \\n\\n\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4. \\nTransactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4.\\n\\nsetReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4.\\n- h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. \\n- MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.\\n\\nORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. \\n\\n**DAO\uc5d0 `@Transactional` \uc801\uc6a9** \\n\\nDAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nService \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\nDAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) `@Transactional`\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."},{"id":"tecochat-retrospective-3","metadata":{"permalink":"/tecochat-retrospective-3","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","source":"@site/blog/2023-2/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","description":"\uac1c\uc694","date":"2023-06-01T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.005,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","slug":"tecochat-retrospective-3","tags":["TecoChat","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/order-retrospective"},"nextItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/composite"}},"content":"### \uac1c\uc694\\n\\n\uc6d0\ub798 \ubaa9\uc801\uc778 `\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0`\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### \ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\nGPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. \\n\\n![chat1](./chat1.png)\\n\\n### \uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5\\n\\n\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4. \\n\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.\\n\\n### \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\\n\\n\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4. \\n\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\nCSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. \\n\\n![chat2](./chat2.png)\\n\\n### \ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\n\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. \\n\\n### \uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30\\n\\n![chat3](./chat3.png)\\n\\n\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4. \\n\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4. \\n\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ud5a5\ud6c4 \uacc4\ud68d\\n\\n\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4. \\n\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4. \\n\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."},{"id":"composite","metadata":{"permalink":"/composite","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","source":"@site/blog/2023-2/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","description":"\uc694\uad6c\uc0ac\ud56d","date":"2023-05-26T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 26\uc77c","tags":[{"label":"Pattern","permalink":"/tags/pattern"},{"label":"Composite","permalink":"/tags/composite"}],"readingTime":4.74,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","slug":"composite","tags":["Pattern","Composite"]},"unlisted":false,"prevItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/tecochat-retrospective-3"},"nextItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/subway-retrospective"}},"content":"### \uc694\uad6c\uc0ac\ud56d\\n\\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.\\n\\n- \uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4. \\n\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4.\\n\\n```java\\npublic interface FarePolicy {\\n int calculate(Path path, Passenger passenger, int fare);\\n}\\n\\npublic class BaseFarePolicy implements FarePolicy { ... }\\npublic class DistanceFarePolicy implements FarePolicy { ... }\\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\\n```\\n\\n![composite1](./composite1.png)\\n\\n### \ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30\\n\\n\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \\n\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n```java\\npublic class SubwayFarePolicy implements FarePolicy {\\n\\n private final List farePolicies;\\n\\n public SubwayFarePolicy(final List farePolicies) {\\n this.farePolicies = farePolicies;\\n }\\n\\n @Override\\n public int calculate(final Path path, final Passenger passenger, final int fare) {\\n int calculatedFare = fare;\\n for (FarePolicy farePolicy : farePolicies) {\\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\\n }\\n return calculatedFare;\\n }\\n}\\n```\\n\\n\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4.\\n\\n![composite2](./composite2.png)\\n\\n### \uc815\ucc45\uc758 \uc21c\uc11c\\n\\n\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4. \\n\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4. \\nConfiguration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. \\n\\n```java\\n@Configuration\\npublic class FareConfiguration {\\n\\n @Bean\\n public FarePolicy farePolicy() {\\n return new SubwayFarePolicy(List.of(\\n new BaseFarePolicy(),\\n new DistanceFarePolicy(),\\n new AgeDiscountFarePolicy()\\n ));\\n }\\n}\\n```\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?\\n\\n![composite3](./composite3.png)\\n\\nGOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n> \ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4. \\n\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.\\n> \\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c\\n\\nComponent\\n\\n- \uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 \\n- ex) \uc694\uae08 \uc815\ucc45(FarePolicy) \\n\\nLeaf\\n\\n- \uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 \\n- ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) \\n\\nComposite\\n\\n- \uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 \\n- ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) \\n\\nClient\\n\\n- \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c\\n\\n\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c \\nClient \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c\\n\\n### \ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84\\n\\n\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4. \\n\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4. \\n\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134 \\n\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"},{"id":"subway-retrospective","metadata":{"permalink":"/subway-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-subway-path/pull/16","date":"2023-05-25T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 25\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.98,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","slug":"subway-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/composite"},"nextItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/accidental-duplication"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-subway-path/pull/16 \\n2, 3\ub2e8\uacc4: https://github.com/woowacourse/jwp-subway-path/pull/126 \\n:::\\n\\n### \uc9c0\ud558\ucca0 \ubbf8\uc158\\n\\n\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4. \\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nAPI\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4.\\n\\n**\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c**\\n\\n\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4.\\n\\n1. \uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95\\n2. \ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4. \\n\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654**\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4.\\n\\n**\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac**\\n\\n\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4. \\n\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4. \\n\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n:::note \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n:::\\n\\n**\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131**\\n\\n\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4. \\n\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4. \\n\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4. \\n\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4.\\n\\n\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4.\\n\\n```java\\n@Nested\\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\\n\\n @Test\\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\\n // given\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", 5);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \uc624\ub978\ucabd, 5);\\n\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", 3);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\", \uc624\ub978\ucabd, 7);\\n\\n // when\\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\\n\\n // then\\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\\n \uc870\ud68c_\uacb0\uacfc,\\n \ub178\uc120_\uc815\ubcf4(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0, \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\"),\\n \ub178\uc120_\uc815\ubcf4(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0, \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\")\\n );\\n }\\n}\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc758\uacac \uc870\uc728\ud558\uae30**\\n\\n\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4. \\n\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30**\\n\\n\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4. \\n\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! \\n\\n**\ud3b8\ud55c \ubd84\uc704\uae30**\\n\\n\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"},{"id":"accidental-duplication","metadata":{"permalink":"/accidental-duplication","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","source":"@site/blog/2023-2/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","description":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.","date":"2023-05-24T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 24\uc77c","tags":[{"label":"DTO","permalink":"/tags/dto"}],"readingTime":7.525,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","slug":"accidental-duplication","tags":["DTO"]},"unlisted":false,"prevItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/subway-retrospective"},"nextItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/shopping-cart-retrospective"}},"content":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4.\\n\\n### \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815\\n\\n![\uc911\ubcf51](./\uc911\ubcf51.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?\\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4.\\n\\n> `ProductSaveRequest`\uc640 `ProductUpdateRequest`\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e\\n> \\n\\n\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4.\\n\\n> \uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!\\n> \\n\\n### \uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5\\n\\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n### \ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\\n\\n\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c? \\n\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c? \\n\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! \\n\\n### \uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc\\n\\n\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4. \\nController\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\\n\u251c\u2500\u2500 dto\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n![\uc911\ubcf52](./\uc911\ubcf52.png)\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf53](./\uc911\ubcf53.png)\\n\\n\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic interface ProductSaveRequest {\\n\\n String getName();\\n\\n String getImage();\\n\\n Long getPrice();\\n}\\n\\n// ProductService\\npublic Long save(final ProductSaveRequest request) {\\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\\n return productDao.saveAndGetId(product);\\n}\\n```\\n\\n### \uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf54](./\uc911\ubcf54.png)\\n\\n\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4. \\n\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\\n\\n @NotBlank(message = \\"\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n @Size(min = 1, max = 100, message = \\"\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final String name;\\n\\n @NotBlank(message = \\"\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n private final String image;\\n\\n @Range(message = \\"\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final long price;\\n\\n public ProductRequest(final String name, final String image, final long price) {\\n this.name = name;\\n this.image = image;\\n this.price = price;\\n }\\n\\n @Override\\n public String getName() {\\n return name;\\n }\\n\\n @Override\\n public String getImage() {\\n return image;\\n }\\n\\n @Override\\n public long getPrice() {\\n return price;\\n }\\n}\\n\\n// ProductController\\n@PostMapping(\\"/products\\")\\npublic ResponseEntity save(@Valid @RequestBody final ProductRequest request) {\\n final Long id = productService.save(request);\\n return ResponseEntity.created(URI.create(\\"/products/\\" + id)).build();\\n}\\n```\\n\\n### \uc815\ub9ac\\n\\n\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\\n1. Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n2. \uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4.\\n3. \uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n[https://techblog.woowahan.com/2647/](https://techblog.woowahan.com/2647/) \\n[https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/](https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/)"},{"id":"shopping-cart-retrospective","metadata":{"permalink":"/shopping-cart-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-shopping-cart/pull/244","date":"2023-05-12T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 12\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.845,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","slug":"shopping-cart-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/accidental-duplication"},"nextItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/web-racing-car-retrospective"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-shopping-cart/pull/244 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-shopping-cart/pull/300 \\n:::\\n\\n### \uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\nInterceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4. \\n\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5**\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\\n![dto1](./dto1.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. \\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4. \\n\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. \\n\\n![dto2](./dto2.png)\\n\\n**Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9**\\n\\n\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. \\n\\n\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4. \\n\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4. \\n\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uae30\ub85d**\\n\\n\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4. \\n\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4. \\n\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!\\n\\n**\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30**\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"},{"id":"web-racing-car-retrospective","metadata":{"permalink":"/web-racing-car-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-racingcar/pull/24","date":"2023-05-02T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 2\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.6,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","slug":"web-racing-car-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/shopping-cart-retrospective"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/tecochat-retrospective-2"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-racingcar/pull/24 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-racingcar/pull/128 \\n:::\\n\\n### \uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\\n\\n\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4. \\n\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4. \\n\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4. \\n\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. \\n\\n\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4. \\n\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4. \\n\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. \\n\\n\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 `\ub09c\uc774\ub3c4 \ub192\uc774\uae30`\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30**\\n\\n```java\\n@SuppressWarnings(\\"NonAsciiCharacters\\")\\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\\n@Transactional\\n@AutoConfigureMockMvc\\n@SpringBootTest\\npublic class RacingGameIntegrationTest {\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ube44\ubc84\uc758 \uc131\uaca9** \\n\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84** \\n\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4. \\n\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00? \\n\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n**\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815** \\n\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."},{"id":"tecochat-retrospective-2","metadata":{"permalink":"/tecochat-retrospective-2","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","source":"@site/blog/2023-2/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","description":"\ud504\ub860\ud2b8\uc5d4\ud2b8","date":"2023-05-01T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.67,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","slug":"tecochat-retrospective-2","tags":["TecoChat","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/web-racing-car-retrospective"},"nextItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/jenkins"}},"content":"### \ud504\ub860\ud2b8\uc5d4\ud2b8\\n\\n\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4. \\n\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4. \\n\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. \\n\\n### \ubc31\uc5d4\ub4dc\\n\\n\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4. \\n\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Http Request Header\\n\\n\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n```ts\\nconst encodedName = () => {\\n const uriComponent = unescape(encodeURIComponent(name.value));\\n return btoa(uriComponent);\\n};\\n```\\n\\n### Elastic Beanstalk\\n\\n\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\nElastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\n\\n### Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac\\n\\n\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4. \\nRDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4. \\n\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. \\n\\n### Elastic Beanstalk nginx \uc124\uc815\\n\\n\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 `.platform/nginx/conf.d/` \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### Jenkins\\n\\n\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nt4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4. \\n\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. \\n\\n```groovy\\ntest {\\n maxHeapSize = \\"1024m\\"\\n}\\n```\\n\\n### Jenkins Blue Ocean\\n\\nBlue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4. \\n\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4. \\n\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 \\"Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?\\" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Elastic Beanstalk, AWS](https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html) \\n[EC2 AWS Graviton, AWS](https://aws.amazon.com/ko/ec2/graviton/) \\n[Default Memory Settings, AWS](https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings)"},{"id":"jenkins","metadata":{"permalink":"/jenkins","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","source":"@site/blog/2023-2/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","title":"Jenkins\ub85c CI/CD \uc124\uc815","description":"\uc124\uc815 \ud658\uacbd","date":"2023-04-30T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 30\uc77c","tags":[{"label":"Jenkins","permalink":"/tags/jenkins"},{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk"}],"readingTime":7.495,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","slug":"jenkins","tags":["Jenkins","Elastic Beanstalk"]},"unlisted":false,"prevItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/tecochat-retrospective-2"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/tecochat-retrospective-1"}},"content":"### \uc124\uc815 \ud658\uacbd\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI \\n\uc544\ud0a4\ud14d\uccd0: ARM \\n\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small \\n\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk \\n\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository\\n\\n### \\\\[EC2 CLI\\\\] Swap \uba54\ubaa8\ub9ac \uc124\uc815\\n\\nt4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n``` bash\\n# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\\nsudo fallocate -l 2G /swapfile\\n\\n# \uad8c\ud55c \uc124\uc815\\nsudo chmod 600 /swapfile\\n\\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\\nsudo mkswap /swapfile\\nsudo swapon /swapfile\\n\\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\\nsudo vim /etc/fstab\\n```\\n\\n\\n### \\\\[EC2 CLI\\\\] jenkins \uc124\uce58\\n\\n```bash\\nsudo wget -O /etc/yum.repos.d/jenkins.repo \\\\\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\\nsudo yum upgrade\\nsudo yum install java-17-amazon-corretto-devel\\nsudo yum install jenkins\\nsudo systemctl daemon-reload\\n```\\n\\n[Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] Jenkins \uc2dc\uc791\\n\\n```bash\\nsudo systemctl enable jenkins\\nsudo systemctl start jenkins\\n```\\n\\nenable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx & git \uc124\uce58\\n\\n```bash\\nsudo yum install nginx\\nsudo systemctl enable nginx\\nsudo systemctl start nginx\\n\\nsudo yum install git\\n```\\n\\nnginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815\\n\\n\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4.\\n\\n```bash\\nupstream jenkins {\\n keepalive 32; # keepalive connections\\n server 127.0.0.1:8080; # jenkins ip and port\\n}\\n\\n# Required for Jenkins websocket agents\\nmap $http_upgrade $connection_upgrade {\\n default upgrade;\\n \'\' close;\\n}\\n\\nserver {\\n listen 80; # Listen on port 80 for IPv4 requests\\n\\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\\n\\n # this is the jenkins web root directory\\n # (mentioned in the output of \\"systemctl cat jenkins\\")\\n root /var/run/jenkins/war/;\\n\\n access_log /var/log/nginx/jenkins.access.log;\\n error_log /var/log/nginx/jenkins.error.log;\\n\\n # pass through headers from Jenkins that Nginx considers invalid\\n ignore_invalid_headers off;\\n\\n location ~ \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)$\\" {\\n # rewrite all static files into requests to the root\\n # E.g /static/12345678/css/something.css will become /css/something.css\\n rewrite \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)\\" /$1 last;\\n }\\n\\n location /userContent {\\n # have nginx handle all the static requests to userContent folder\\n # note : This is the $JENKINS_HOME dir\\n root /var/lib/jenkins/;\\n if (!-f $request_filename){\\n # this file does not exist, might be a directory or a /**view** url\\n rewrite (.*) /$1 last;\\n break;\\n }\\n sendfile on;\\n }\\n\\n location / {\\n sendfile off;\\n proxy_pass http://jenkins;\\n proxy_redirect default;\\n proxy_http_version 1.1;\\n\\n # Required for Jenkins websocket agents\\n proxy_set_header Connection $connection_upgrade;\\n proxy_set_header Upgrade $http_upgrade;\\n\\n proxy_set_header Host $host;\\n proxy_set_header X-Real-IP $remote_addr;\\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\\n proxy_set_header X-Forwarded-Proto $scheme;\\n proxy_max_temp_file_size 0;\\n\\n #this is the maximum upload size\\n client_max_body_size 10m;\\n client_body_buffer_size 128k;\\n\\n proxy_connect_timeout 90;\\n proxy_send_timeout 90;\\n proxy_read_timeout 90;\\n proxy_buffering off;\\n proxy_request_buffering off; # Required for HTTP CLI commands\\n proxy_set_header Connection \\"\\"; # Clear for keepalive\\n }\\n\\n}\\n```\\n\\nJenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4. \\n`/etc/nginx/conf.d`\xa0\uc544\ub798\xa0`default.conf`\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4. \\nnginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0`include /etc/nginx/conf.d/*.conf;`\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0`.conf`\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4. \\n\uc124\uc815 \ud6c4\xa0`sudo nginx -t`\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0`sudo systemctl restart nginx`\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins \uc811\uc18d\\n\\nJenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\nEC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4.\\n\\n![jenkins-start](./jenkins-start.png)\\n\\n\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 `sudo cat /var/lib/jenkins/secrets/initialAdminPasswor` \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 `install suggested plugins`\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4. \\n\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins Blue Ocean \uc124\uce58\\n\\nJenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[AWS IAM & EC2\\\\] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30\\n\\nS3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\nIAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4.\\n\\n1. \uc5d4\ud130\ud2f0 \uc120\ud0dd\\n\\n![aws-iam1](./aws-iam1.png)\\n\\n2. \uad8c\ud55c \ucd94\uac00\\n\\n![aws-iam2](./aws-iam2.png)\\n\\n3. \uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131\\n\\n![aws-iam3](./aws-iam3.png)\\n\\n4. \uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815\\n\\n![aws-iam4](./aws-iam4.png)\\n\\n### \\\\[AWS S3\\\\] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131\\n\\n\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4.\\n\\n- `\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8`\\n\\n![aws-s3](./aws-s3.png)\\n\\n### \\\\[Github\\\\] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131\\n\\nrepo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. \\n\\n### \\\\[Jenkins\\\\] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\\n\\n![jenkins-blue-ocean1](./jenkins-blue-ocean1.png)\\n\\n\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4. \\nJenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. \\n\\n![jenkins-blue-ocean2](./jenkins-blue-ocean2.png)\\n\\n\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4.\\n\\n![jenkins-blue-ocean3](./jenkins-blue-ocean3.png)\\n\\n### \\\\[Github Repsoitory\\\\] Jenkinsfile \uc124\uc815\\n\\n\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n```bash\\npipeline {\\n agent any\\n stages {\\n stage(\'build and test\') {\\n steps {\\n sh \'/gradlew clean build\'\\n }\\n }\\n stage(\'zip\') {\\n steps {\\n sh \'mv ./build/libs/woowachat.jar .\'\\n sh \'zip -r woowachat.zip .platform delivery.jar Procfile\'\\n }\\n }\\n stage(\'upload\') {\\n steps {\\n sh \'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2\'\\n }\\n }\\n stage(\'deploy\') {\\n steps {\\n sh \'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\\"woowa-chat\\",S3Key=\\"woowachat.zip\\"\'\\n sh \'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}\'\\n }\\n }\\n }\\n}\\n```\\n\\n### \\\\[Github\\\\] Webhooks \uc124\uc815\\n\\n![github-hook](./github-hook.png)\\n\\npush \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c `http://Jenkins\uc8fc\uc18c/github-webhook/` \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Install Jenkins - CentOS, Jenkins](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \\n[Nginx Reverse Proxy Configuration, Jenkins](https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/) \\n[Amazon Corretto 17 JDK Install, AWS](https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html) \\n[Amazon Linux 2023 packages, AWS](https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html)"},{"id":"tecochat-retrospective-1","metadata":{"permalink":"/tecochat-retrospective-1","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023-2/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","description":"4\uc6d4 21\uc77c \uae08\uc694\uc77c","date":"2023-04-22T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 22\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.68,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","slug":"tecochat-retrospective-1","tags":["TecoChat","Retrospective"]},"unlisted":false,"prevItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/jenkins"},"nextItem":{"title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","permalink":"/healthful-growth"}},"content":"### 4\uc6d4 21\uc77c \uae08\uc694\uc77c\\n\\n\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. \\n\\n\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4. \\n`Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?` \\n\\n\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4. \\n\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. \\n\\n\uc774\uac74 \ubabb\ucc38\uc9c0\\n\\n### \ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?\\n\\n\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4. \\n\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4. \\ndev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4.\\n\\n### \ub9d0\ub791\uc758 DM\\n\\n\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4. \\n\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\\n\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4. \\n\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!\\n\\n### \ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec\\n\\n\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4. \\n\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. \\n\\n### GPT\\n\\n\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. \\n\\n### Sonarcloud\\n\\n\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4. \\nSonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4. \\n\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4. \\nSonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4. \\n\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124\\n\\n### Tiptap\\n\\n\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\nTiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4. \\n\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4. \\napi \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c `
`\ub85c \ubcc0\ud658\ud588\ub2e4.  \\n\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c `\\\\n`\ub97c `
`\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4. \\n\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. \\n\\n```ts\\nconst replaceCodeFences = (input: String) => {\\n const codeFencesRegex = /```([\\\\w-]*)\\\\n([\\\\s\\\\S]*?)\\\\n```/g;\\n return input\\n .replace(codeFencesRegex, (match, p1, p2) => {\\n const languageClass = p1 ? ` class=\\"language-${p1}\\"` : \\"\\";\\n return `
${p2}
`;\\n })\\n .replace(/\\\\n/g, \\"
\\");\\n};\\n```\\n\\nTiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\\n![tecochat](./teco-chat.png)\\n\\n### \ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9\\n\\n\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."},{"id":"healthful-growth","metadata":{"permalink":"/healthful-growth","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-19-\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30.mdx","source":"@site/blog/2023-2/2023-04-19-\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30.mdx","title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","description":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c","date":"2023-04-19T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 19\uc77c","tags":[{"label":"etc","permalink":"/tags/etc"}],"readingTime":4.025,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","slug":"healthful-growth","tags":["etc"]},"unlisted":false,"prevItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/tecochat-retrospective-1"},"nextItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/book-leadership-and-self-deception"}},"content":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c \\n\uc774\ub3d9\uc6b1\ub2d8 \ud2b9\uac15\\n\\n### \uc790\uc874\uac10 \uae30\ub465 \ub9cc\ub4e4\uae30\\n\\n\ub6f0\uc5b4\ub09c \ub3d9\ub8cc, \uc0c8\ub85c\uc6b4 \ud658\uacbd \uadf8\ub9ac\uace0 \ud504\ub85c\uc81d\ud2b8\ub97c \uc2e4\ud328\ud558\uba74\uc11c \uc790\uc874\uac10\uc774 \ub5a8\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \\n\uc790\uc874\uac10\uc774 \ubb34\ub108\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \ub098\ub97c \uc9c0\ud0f1\ud560 \uc218 \uc788\ub294 \uae30\ub465\uc774 \ud544\uc694\ud558\ub2e4. (\ud55c \uac1c\uac00 \uc544\ub2cc \uc5ec\ub7ec \uac1c) \\n\\n### \ub098\ub9cc\uc758 \ud559\uc2b5 \ubc29\ubc95 \ucc3e\uae30\\n\\n\ud68c\uc0ac \uc77c\uc744 \uc9c0\uc18d\uc801\uc73c\ub85c \ud55c\ub2e4\uba74 \ud68c\uc0ac \uc77c\uc758 \uc219\ub828\uc790\uac00 \ub418\uc9c0\ub9cc, \uac1c\ubc1c \uc804\ubb38\uac00\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4. \\n\uc8fc\ub2c8\uc5b4 \uc77c\ub54c\ub294 \uc131\uacfc\uac00 \uc544\ub2cc \ud559\uc2b5\uc73c\ub85c! \\n\uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uc0ac\ub78c\uc778\uc9c0? \uace0\ubbfc\ud558\uae30\\n\\n**\ub3d9\uc6b1\ub2d8\uc774 \uadf8\ub3d9\uc548 \uc2dc\ub3c4\ud55c \ubc29\ubc95**\\n\\n\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8 \uc9c4\ud589\ud558\uae30 \u2192 A-Z \uad6c\ud604 \uacbd\ud5d8 \\n\ucc45 \uc2a4\ud130\ub514 \u2192 \ub192\uc740 \uc644\uc8fc\uc728, \ud558\uc9c0\ub9cc \ub0b4\uac00 \ubc1c\ud45c\ud55c \uc8fc\uc81c\ub9cc \uae30\uc5b5\uc5d0 \ub0a8\ub294\ub2e4. \\n\uac15\uc758 \uc900\ube44 \u2192 100% \ub0b4\uc6a9 \uc2b5\ub4dd, \ub0ae\uc740 \uc2dc\uac04 \uac00\uc131\ube44, \uac15\uc758 \uc678\uc801\uc778 \ubd80\uac00\uc791\uc5c5 \\n\ube14\ub85c\uadf8 \u2192 \uc628\ub77c\uc778 \ubaa8\ub450\uac00 \ub9ac\ubdf0\uc5b4, \ub3d9\ub8cc\uc640 \uacf5\uc720 \uac00\ub2a5, \ud53c\ub4dc\ubc31\uc758 \ubd80\ub044\ub7ec\uc6c0 \ud83d\ude33 \\n\\n\uc2e4\ud328\ud558\uac70\ub098, \uc798\ubabb \uc801\uc5b4\ub3c4 \ub0a8\ub4e4\uc758 \uc2dc\uc120\ubcf4\ub2e8 \ub098 \uc790\uc2e0\uc758 \uc131\uc7a5\uc774 \uc911\uc694\ud558\ub2e4. \\n\uac00\ub2a5\ud558\uba74 \uc778\uc99d\ub418\uace0, \uc815\uc81c\ub41c \uc790\ub8cc\ub85c \uc2b5\ub4dd\ud55c\ub2e4. \\n\ub098\uc5d0\uac8c \ub9de\ub294 \uac00\uc7a5 \ud6a8\uc728\uc774 \uc88b\uc740 \ud559\uc2b5 \ubc29\ubc95\uc73c\ub85c \ucc3e\uace0, \uc218\uc2dc\ub85c \uc810\uac80\ud558\uc5ec \ub354 \uc88b\uc740 \ubc29\ubc95\uc744 \ucc3e\uace0 \uc2dc\ub3c4\ud55c\ub2e4. \\n\\n### \uc0c8\ub85c\uc6b4 \ud658\uacbd\uc744 \uc798 \ubc30\uc6b0\ub294 \ubc29\ubc95\\n\\n\uc2dc\uac04 > \ub3c8\uc774\uae30 \ub54c\ubb38\uc5d0 \uc2dc\uac04\uc744 \ub3c8\uc73c\ub85c \uad6c\ub9e4\ud558\uc790. \\n\uc2e0\ub8b0\ud560\ub9cc\ud55c \ubd84\uaed8 \uc9c8\ubb38 \ub610\ub294 \ucf54\ub4dc \ub9ac\ubdf0\uac00 \uac00\ub2a5\ud55c \uac15\uc758\ub97c \uad6c\ub9e4\ud55c\ub2e4. \\n\uc5b4\ub5a4 \ud559\uc2b5 \ubc29\uc2dd, \uc5b8\uc81c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0, \uc5b4\ub5a4 \ud658\uacbd\uc5d0\uc11c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n\\n### \ud559\uc2b5 \uc8fc\uc81c\\n\\n\ud68c\uc0ac \uc5c5\ubb34\uc5d0\uc11c \ub9cc\ub09c \ubb38\uc81c\ub97c \uc5f0\uad6c, \uc815\ub9ac, \ud574\uacb0\ud574\uc11c \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uacf5\uc720\ud558\uace0 \ud53c\ub4dc\ubc31\uc744 \ubc1b\ub294\ub2e4. \\n\uc8fc\ubcc0 \ub3d9\ub8cc\ub4e4\uc5d0\uac8c \uc778\uc815\ubc1b\ub294\uac8c \uc6b0\uc120\uc774\ub2e4. \\n\\n### \uc0b0\ub9cc\ud568 \uad00\ub9ac\ud558\uae30\\n\\n\ucee8\ud14d\uc2a4\ud2b8 \uc2a4\uc704\uce6d\uc774 \uc790\uc8fc \uc77c\uc5b4\ub098\uba74 \uc0b0\ub9cc\ud574\uc9c0\uae30 \ub54c\ubb38\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. \\nex) \uc9d1\uc911\uc774 \uc798 \ub418\ub294 \ud658\uacbd \uad6c\uc131\ud558\uae30, \ucd9c\uadfc \uc804 1~2\uc2dc\uac04 \uc9d1\uc911\ud558\uace0 \ucd9c\uadfc\ud558\uae30, \uc810\uc2ec \uc800\ub141 \uc0b0\ucc45\ud558\uae30, \uc8fc 2~3\ud68c \uc6b4\ub3d9\ud558\uae30\\n\\n### \uac70\uc778\uc5d0 \uc5b4\uae68\uc704\uc5d0 \uc62c\ub77c\ud0c0\uae30\\n\\n\ub6f0\uc5b4\ub09c \uc0ac\ub78c \uc606\uc5d0\uc11c \ubc30\uc6cc\uc57c \ud55c\ub2e4. \\nC\ub808\ubca8, \ud14c\ud06c \ub9ac\ub4dc\uc640 \uac19\uc774 \uc77c\ud560 \uc218 \uc788\ub294 \uac83\uc740 \ud070 \uae30\ud68c\ub2e4. \\n\ucee4\ubba4\ub2c8\ucf00\uc774\uc158 \ubc29\ubc95, \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud558\ub294 \ubc29\ubc95, \ubb38\ud654\ub97c \ub9cc\ub4e4\uc5b4\uac00\ub294 \ubc29\ubc95, \uacb0\uc815\uc758 \uae30\uc900\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \ud559\uc2b5\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ubcf4\uc0c1\\n\\n\uc2dc\ub828 \ub4a4\uc5d0\ub294 \ud56d\uc0c1 \ubcf4\ubb3c\uc774 \uae30\ub2e4\ub9ac\uace0 \uc788\ub2e4. \\n\ubcf4\uc0c1\uc744 \ud1b5\ud574 \uafb8\uc900\ud568\uc744 \uc720\uc9c0\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\ub77c. \\n\\n### \ub0a8\uc744 \uc124\ub4dd\ud558\ub294 \ubc29\ubc95 \ubc30\uc6b0\uae30\\n\\n\ud300\uc6d0\ub4e4\uc774 \ub9e4\ubc88 \ub0b4 \uc758\uacac\uc744 \ubc18\ub300\ud55c\ub2e4\uba74 \uc644\ubcbd\ud55c \ub17c\ub9ac\uac00 \uc911\uc694\ud55c\uac8c \uc544\ub2c8\ub2e4. \\n\uc5b4\ub5bb\uac8c \ud558\uba74 \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\ub294\uac00? \\n\ucee4\ubba4\ub2c8\ucf00\uc774\uc158, \ud611\uc5c5, \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0\uc11c \ubd80\uc871\ud568\uc774 \uc788\uc73c\uba74 \uc548\ub41c\ub2e4."},{"id":"book-leadership-and-self-deception","metadata":{"permalink":"/book-leadership-and-self-deception","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","source":"@site/blog/2023-2/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","description":"\ucc45 \uc815\ubcf4","date":"2023-04-08T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 8\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.16,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","slug":"book-leadership-and-self-deception","tags":["Book"]},"unlisted":false,"prevItem":{"title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","permalink":"/healthful-growth"},"nextItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/innodb-lock"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c \\n> \uc544\ube48\uc800\uc5f0\uad6c\uc18c\\n> \\n\\n### \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\\n\\n\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. \\n- \uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 \\n- \uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704\\n\\n\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4. \\n\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. \\n\\n\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098 \\n\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4. \\n\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\\n\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4. \\n\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. \\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4. \\nR. D. \ub7ad \\np.19\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4. \\np.66\\n>\\n\\n> \ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4. \\n\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4. \\n\uc54c\ub7ad, \ud0c1\ub2db\ud55c \\np.103\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. \\n\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. \\n\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\np.175\\n> \\n\\n> \uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0. \\np.188\\n> \\n\\n> \ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4. \\np.214\\n> \\n\\n> \ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. \\n\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4. \\np.224\\n>\\n\\n> \uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. \\np.280\\n>"},{"id":"innodb-lock","metadata":{"permalink":"/innodb-lock","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023-2/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-07T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 7\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"InnoDB","permalink":"/tags/inno-db"}],"readingTime":5.805,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"innodb-lock","tags":["DataBase","Lock","InnoDB"]},"unlisted":false,"prevItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/book-leadership-and-self-deception"},"nextItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/mysql-lock"}},"content":"## InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4. \\nInnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n:::note \ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd \\n\\n:::\\n\\n:::note \ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd \\n\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.\\n\\n:::\\n\\n### Shared & Exclusive Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n**\uacf5\uc720 \uc7a0\uae08(S, shared lock)**\\n\\n\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;`\\n\\n**\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)** \\n\\n\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 FOR UPDATE;`\\n\\n### Intention Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4. \\n\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n**\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)**\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n**\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)** \\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n** \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 **\\n\\n| | X | IX | S | IS |\\n| --- | --- | --- | --- | --- |\\n| X | Conflict | Conflict | Conflict | Conflict |\\n| IX | Conflict | Compatible | Conflict | Compatible |\\n| S | Conflict | Conflict | Compatible | Compatible |\\n| IS | Conflict | Compatible | Compatible | Compatible |\\n\\n### Record Locks\\n\\n\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. \\n\\n### Gap Locks\\n\\n\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### Next-Key Locks\\n\\n\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4. \\n`REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. \\n\\n### AUTO-INC Locks\\n\\n`AUTO_INCREMENT` \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 `INSERT`\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. \\nInnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 `INSERT`\ub098 `REPLACE` \ubb38\uc7a5\uc5d0\uc11c `AUTO_INCREMENT` \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4.\\n\\n### \uc7a0\uae08 \uc608\uc2dc\\n\\n```sql\\n-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id = 10 for update;\\n\\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id > 100 for update;\\n\\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Optimistic and Pessimistic record locking, IBM](https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking) \\n[MySQL Innodb Locks, cecil1018](https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/) \\n[MySQL 8.0 InnoDB Locks, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html) \\n[Locks Set by Different SQL Statements in InnoDB, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html)"},{"id":"mysql-lock","metadata":{"permalink":"/mysql-lock","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023-2/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-06T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 6\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"MySQL","permalink":"/tags/my-sql"}],"readingTime":4.405,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"mysql-lock","tags":["DataBase","Lock","MySQL"]},"unlisted":false,"prevItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/innodb-lock"},"nextItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/transaction-and-isolation"}},"content":"## MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4. \\nMySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. \\n\\n### \uae00\ub85c\ubc8c \ub77d(Global lock)\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. \\n - \uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4.\\n - \uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.\\n\\n\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- GLOBAL LOCK\\nFLUSH TABLES WITH READ LOCK;\\n-- UNLOCK\\nUNLOCK TABLES;\\n\\n-- BACKUP LOCK\\nLOCK INSTANCE FOR BACKUP;\\n-- UNLOCK\\nUNLOCK INSTANCE;\\n```\\n\\n:::note MyISAM\\n\\nMySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.\\n\\n:::\\n\\n### \ud14c\uc774\ube14 \ub77d(Table lock)\\n\\n\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4. \\n\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4. \\nInnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4.\\n\\n```sql\\n-- TABLE LOCK\\nLOCK TABLES table_name [ READ | WRITE ]\\n\\n-- UNLOCK\\nUNLOCK TABLES;\\n```\\n\\n### \ub124\uc784\ub4dc \ub77d(Named lock)\\n\\n\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\\nSELECT GET_LOCK(\'aGVyYg==\', 1);\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\\nSELECT IS_FREE_LOCK(\'aGVyYg==\');\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\\nSELECT RELEASE_LOCK(\'aGVyYg==\');\\n\\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\\nSELECT RELEASE_ALL_LOCKS();\\n```\\n\\n### \uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4.\\n\\n```sql\\n-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi](https://gywn.net/2013/12/mysql-user-level-lock/) \\n[Locking Functions, MySQL 5.7 Reference](https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks) \\n[Locking Functions, MySQL 8.0 Reference](https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks)"},{"id":"transaction-and-isolation","metadata":{"permalink":"/transaction-and-isolation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","source":"@site/blog/2023-2/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","description":"\ud2b8\ub79c\uc7ad\uc158(Transaction)","date":"2023-04-05T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 5\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Transaction","permalink":"/tags/transaction"},{"label":"Isolation","permalink":"/tags/isolation"}],"readingTime":9.57,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","slug":"transaction-and-isolation","tags":["DataBase","Transaction","Isolation"]},"unlisted":false,"prevItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/mysql-lock"},"nextItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/test-double"}},"content":"## \ud2b8\ub79c\uc7ad\uc158(Transaction)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4. \\n\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)\\n\\n\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4. \\n\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4. \\n\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4. \\n\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c) \\n\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\\n:::info \uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14\\n\\n\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \\n- \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)\\n- \ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)\\n\\n:::\\n\\n## \uaca9\ub9ac \uc218\uc900(Isolation level)\\n\\n\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4. \\n\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, `SERIALIZABLE`\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### READ UNCOMMITTED\\n\\n\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 `COMMIT`\uc774\ub098 `ROLLBACK` \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4. \\n\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c `READ COMMITTED` \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ UNCOMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: INSERT(Alice)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: COMMIT(Alice)\\n```\\n\\n### READ COMMITTED\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\n\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\n`REPEATABLE READ`\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 `NON-REPEATABLE READ` \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ COMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n Alice->>Database: COMMIT\\n```\\n\\n### REPEATABLE READ\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\nMySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4. \\n\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n - \ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4.\\n - Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4.\\n - Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4.\\n - `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\nInnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n```\\n\\n:::note \uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)\\n\\n\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.\\n\\n:::\\n\\n:::note MVCC(Multi Version Concurrency Control)\\n\\n\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4.\\n - PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4.\\n - Oracle, InnoDB\ub294 `Undo log`\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)\\n\\n\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.\\n\\n:::\\n\\n### SERIALIZABLE\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4. \\nInnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. \\n\\n## \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c\\n\\n\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n| \uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c | \ub354\ud2f0 \ub9ac\ub4dc | \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c | \ud32c\ud140 \ub9ac\ub4dc |\\n| --- | --- | --- | --- |\\n| READ UNCOMMITTED | O | O | O |\\n| READ COMMITTED | X | O | O |\\n| REPEATABLE READ | X | X | O(InnoDB\ub294 X) |\\n| SERIALIZABLE | X | X | X |\\n\\n### \ub354\ud2f0 \ub9ac\ub4dc(Dirty read)\\n\\n\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1 \\n\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4. \\n\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0\\n\\n### \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: NON REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Bob\\n```\\n\\n### \ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: PHANTOM READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 1\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: INSERT(Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 2\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Isolation Level, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html)"},{"id":"test-double","metadata":{"permalink":"/test-double","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","source":"@site/blog/2023-2/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","description":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?","date":"2023-04-04T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 4\uc77c","tags":[{"label":"Test","permalink":"/tags/test"},{"label":"Mock","permalink":"/tags/mock"}],"readingTime":4.81,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","slug":"test-double","tags":["Test","Mock"]},"unlisted":false,"prevItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/transaction-and-isolation"},"nextItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/java-class-file"}},"content":"### \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?\\n\\n\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4. \\nGerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4.\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. \\n\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870**\\n\\n```mermaid\\nflowchart LR\\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\\n Fake --\x3e TestDouble\\n```\\n\\n### \ub354\ubbf8(Dummy)\\n\\n\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n### \uc2a4\ud141(Stub)\\n\\n\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n### \uc2a4\ud30c\uc774(Spy)\\n\\n\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4. \\n\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. \\n\\n### \ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)\\n\\n\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4. \\n\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### \uac00\uc9dc(Fake)\\n\\nDOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4. \\n\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note DOC(depended-on component)\\n\\n\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4. \\n\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. \\n\\n:::\\n\\n### \uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84\\n\\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4. \\n\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. \\n\uac04\ub2e8\ud788 \uc124\uba85\ud558\uc790\uba74 \ubaa9\uc758 \uacbd\uc6b0 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc5d0 \ub300\ud55c \uac80\uc99d(e.g. verify)\uc774 \ub4e4\uc5b4\uac00\uace0, \uc2a4\ud141\uc758 \uacbd\uc6b0 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \uac80\uc99d\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n| TestDouble | Mock | Stub |\\n| --- | --- | --- |\\n| \ud3ec\ud568 \uc720\ud615 | \ubaa9, \uc2a4\ud30c\uc774 | \uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c |\\n| \uc6a9\ub3c4 | \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9 | \ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9 |\\n| \uc124\uba85 | SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9 | SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9\\n| \uc608\uc2dc | \uc774\uba54\uc77c \ubc1c\uc1a1 | \ub370\uc774\ud130 \uac80\uc0c9 |\\n\\n:::note SUT(system under test)\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c \\n\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1\\n\\n:::\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504 \\n\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0 \\n[\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler](https://www.martinfowler.com/bliki/TestDouble.html) \\n[\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib](https://johngrib.github.io/wiki/test-terms/) \\n[Test Double, Gerard Meszaros](http://xunitpatterns.com/Test%20Double.html) \\n[\ub2e8\uc704 \ud14c\uc2a4\ud2b8 \ubaa8\ubc94 \uc0ac\ub840, Microsoft](https://learn.microsoft.com/ko-kr/dotnet/core/testing/unit-testing-best-practices)"},{"id":"java-class-file","metadata":{"permalink":"/java-class-file","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","source":"@site/blog/2023-2/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","description":"\ud074\ub798\uc2a4 \ud30c\uc77c","date":"2023-04-03T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 3\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Class","permalink":"/tags/class"}],"readingTime":5.63,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","slug":"java-class-file","tags":["Java","Class"]},"unlisted":false,"prevItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/test-double"},"nextItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/custom-jdbc-template"}},"content":"### \ud074\ub798\uc2a4 \ud30c\uc77c\\n\\n\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?\\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd\\n\\n8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4. \\n16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4. \\n\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. \\n\\nu1 \u2192 unsigned 1byte \\nu2 \u2192 unsigned 2byte \\nu4 \u2192 unsigned 4byte \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870\\n\\n```\\nClassFile {\\n u4 magic;\\n u2 minor_version;\\n u2 major_version;\\n u2 constant_pool_count;\\n cp_info constant_pool[constant_pool_count-1];\\n u2 access_flags;\\n u2 this_class;\\n u2 super_class;\\n u2 interfaces_count;\\n u2 interfaces[interfaces_count];\\n u2 fields_count;\\n field_info fields[fields_count];\\n u2 methods_count;\\n method_info methods[methods_count];\\n u2 attributes_count;\\n attribute_info attributes[attributes_count];\\n}\\n```\\n\\n### \ub9e4\uc9c1\ub118\ubc84\\n\\n\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804\\n\\n\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. \\n- Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D\\n\\n\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 `UnsupportedClassVersionError` \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n**class\xa0file format major versions**\\n\\n| Java SE | Released | Major | Supported majors |\\n| --- | --- | --- | --- |\\n| 8 | March 2014 | 52 | 45 .. 52 |\\n| 9 | September 2017 | 53 | 45 .. 53 |\\n| 10 | March 2018 | 54 | 45 .. 54 |\\n| 11 | September 2018 | 55 | 45 .. 55 |\\n| 12 | March 2019 | 56 | 45 .. 56 |\\n| 13 | September 2019 | 57 | 45 .. 57 |\\n| 14 | March 2020 | 58 | 45 .. 58 |\\n| 15 | September 2020 | 59 | 45 .. 59 |\\n| 16 | March 2021 | 60 | 45 .. 60 |\\n| 17 | September 2021 | 61 | 45 .. 61 |\\n\\n### \uc0c1\uc218 \ud480\\n\\n2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4. \\n\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4. \\nJVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4.\\n\\n### \uc561\uc138\uc2a4 \ud50c\ub798\uadf8\\n\\n\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. \\n- \uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. `ACC_PUBLIC` xor `ACC_INTERFACE` xor `ACC_ABSTRACT`\\n\\n\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4.\\n\\n**Class access and property modifiers**\\n\\n| Flag Name | Value | Interpretation |\\n| --- | --- | --- |\\n| ACC_PUBLIC | 0x0001 | Declared\xa0public; may be accessed from outside its package. |\\n| ACC_FINAL | 0x0010 | Declared\xa0final; no subclasses allowed. |\\n| ACC_SUPER | 0x0020 | Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction. |\\n| ACC_INTERFACE | 0x0200 | Is an interface, not a class. |\\n| ACC_ABSTRACT | 0x0400 | Declared\xa0abstract; must not be instantiated. |\\n| ACC_SYNTHETIC | 0x1000 | Declared synthetic; not present in the source code. |\\n| ACC_ANNOTATION | 0x2000 | Declared as an annotation type. |\\n| ACC_ENUM | 0x4000 | Declared as an\xa0enum\xa0type. |\\n| ACC_MODULE | 0x8000 | Is a module, not a class or interface. |\\n\\n### this_class\\n\\n\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 `CONSTANT_Class_infoclass` \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### super_class\\n\\n\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 `java.lang.Object`\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.\\n\\n### interface, field, method\\n\\n\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4. \\ninterface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4.\\n\\n### attributes\\n\\n\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85 \\n\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234\\n\\nIntelliJ plugin - BinEd \\nIntelliJ plugin - jclasslib Bytecode Viewer\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654 \\n[Class file in Java, File Format](https://docs.fileformat.com/ko/programming/class/) \\n[java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html) \\n[java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html)"},{"id":"custom-jdbc-template","metadata":{"permalink":"/custom-jdbc-template","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023-2/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","description":"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.","date":"2023-04-02T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 2\uc77c","tags":[{"label":"JDBC","permalink":"/tags/jdbc"},{"label":"Java","permalink":"/tags/java"}],"readingTime":9.025,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","slug":"custom-jdbc-template","tags":["JDBC","Java"]},"unlisted":false,"prevItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/java-class-file"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/woowacourse-level1-retrospective"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. \\n\\n### \uae30\uc874 \ucf54\ub4dc\\n\\n\\n\\n\\n```java\\npublic class User {\\n private final int id;\\n private final String name;\\n\\n public User(final int id, final String name) {\\n this.id = id;\\n this.name = name;\\n }\\n\\n public int getId() {\\n return id;\\n }\\n\\n public String getName() {\\n return name;\\n }\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\npublic class UserDao {\\n private final ConnectionPool connectionPool;\\n\\n public UserDao(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void insert(final String name) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setString(1, name);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public void delete(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"DELETE FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public User findById(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n if (resultSet.next()) {\\n return new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n );\\n }\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n return null;\\n }\\n\\n public List findAll() {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n final List result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n ));\\n }\\n return result;\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\npublic class ConnectionPool {\\n private static final String SERVER = \\"localhost:13306\\";\\n private static final String DATABASE = \\"chess\\";\\n private static final String OPTION = \\"?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true\\";\\n private static final String URL = \\"jdbc:mysql://\\" + SERVER + \\"/\\" + DATABASE + OPTION;\\n private static final String USERNAME = \\"root\\";\\n private static final String PASSWORD = \\"root\\";\\n\\n private final AtomicInteger index = new AtomicInteger();\\n private final List connections;\\n\\n public ConnectionPool(final int connectionCount) {\\n connections = generateConnections(connectionCount);\\n }\\n\\n private List generateConnections(final int connectionCount) {\\n return Stream.generate(this::generateConnection)\\n .limit(connectionCount)\\n .collect(toList());\\n }\\n\\n private Connection generateConnection() {\\n try {\\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\\n } catch (SQLException e) {\\n throw new IllegalStateException(\\"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\");\\n }\\n }\\n\\n public Connection getConnection() {\\n int currentIndex = index.getAndIncrement();\\n return connections.get(currentIndex % connections.size());\\n }\\n}\\n```\\n\\n\\n\\n\\n### SELECT, DELETE \uc911\ubcf5 \uc81c\uac70\\n\\n\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1 \\n\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 \\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n```java\\npublic void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n executeUpdate(query, name);\\n}\\n\\npublic void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n executeUpdate(query, userId);\\n}\\n\\nprivate void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758\\n\\n\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. \\n\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \ucf5c\ubc31(Callback)\\n\\n\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4. \\n\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n```mermaid\\nflowchart LR\\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31\\n```\\n\\n:::\\n\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\nexecuteQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4. \\n\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper {\\n User mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c\\n\\n\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c? \\n\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java\\npublic User findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return queryForSingleResult(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n }, userId);\\n}\\n\\nprivate User queryForSingleResult(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return rowMapper.mapRow(resultSet);\\n }\\n return null;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c\\n\\n\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4.\\n\\n```java\\npublic List findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return query(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n });\\n}\\n\\nprivate List query(final String query, final RowMapper rowMapper, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30\\n\\n\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper {\\n T mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n\\nprivate List query(final String query, final RowMapper rowMapper, final Object... parameters) {...}\\nprivate T queryForSingleResult(final String query, final RowMapper rowMapper, final Object... parameters) {...}\\n```\\n\\n### \uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30\\n\\n\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4. \\n\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4.\\n\\n\\n\\n\\n```java\\npublic class UserDao {\\n private final RowMapper rowMapper = resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n };\\n private final JdbcTemplate jdbcTemplate;\\n\\n public UserDao(final JdbcTemplate jdbcTemplate) {\\n this.jdbcTemplate = jdbcTemplate;\\n }\\n\\n public void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n jdbcTemplate.executeUpdate(query, name);\\n }\\n\\n public void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n jdbcTemplate.executeUpdate(query, userId);\\n }\\n\\n public Optional findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\\n }\\n\\n public List findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return jdbcTemplate.query(query, rowMapper);\\n }\\n}\\n```\\n\\n\\n\\n\\n```java\\npublic class JdbcTemplate {\\n private final ConnectionPool connectionPool;\\n\\n public JdbcTemplate(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public Optional queryForSingleResult(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return Optional.of(rowMapper.mapRow(resultSet));\\n }\\n return Optional.empty();\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n private ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters\\n ) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n }\\n\\n public List query(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n\\n"},{"id":"woowacourse-level1-retrospective","metadata":{"permalink":"/woowacourse-level1-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","description":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.","date":"2023-04-01T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 1\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.48,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","slug":"woowacourse-level1-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/custom-jdbc-template"},"nextItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/chess-retrospective"}},"content":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4. \\n\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4. \\n\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. \\n\\n### Keep\\n\\n**\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30** \\n\\n\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0 \\n\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0 \\n\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4. \\n\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 \\n\\n\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. \\n\\n**\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30** \\n\\n10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) \\n\\n**\uae00\uc4f0\uae30** \\n\\n\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4. \\n\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4. \\n\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n**\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514** \\n\\n\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4. \\n\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4. \\n\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? \\n\\n**\ub808\ubca8 \uc778\ud130\ubdf0**\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370 \\n\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4. \\n\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n- \ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 \\n- \ub450\uad04\uc2dd \ud45c\ud604\\n- \uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 \\n- \uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30\\n- \uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30\\n- \ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)\\n- \uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30\\n- \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30\\n\\n### Problem\\n\\n**\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4. \\n\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4. \\n\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. \\n\\n**\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871** \\n\\n\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Try\\n\\n**\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?** \\n\\n\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 `\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)` \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4. \\n\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? \\n\\n**\uae30\uc220\uc801\uc778 \ubd80\ubd84** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4. \\n\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70 \\n\\n\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4. \\n\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."},{"id":"chess-retrospective","metadata":{"permalink":"/chess-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","description":"1, 2\ub2e8\uacc4//github.com/woowacourse/java-chess/pull/441","date":"2023-03-31T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 31\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.705,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","slug":"chess-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/woowacourse-level1-retrospective"},"nextItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/grasp"}},"content":":::note PR \ub9c1\ud06c \\n1, 2\ub2e8\uacc4: https://github.com/woowacourse/java-chess/pull/441 \\n3, 4\ub2e8\uacc4: https://github.com/woowacourse/java-chess/pull/529 \\n:::\\n\\n### \uccb4\uc2a4\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4! \\n\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. \\n \\n\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n**\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80** \\nRank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4. \\n\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2) \\n\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n**\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80** \\n\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. \\n\\n**\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80** \\n\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. \\n\\n**\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9** \\n\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4. \\n\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n- \uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 \\n- \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 \\n\\n\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4. \\n\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n- \ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. \\n- \uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. \\n- \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. \\n\\n\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4. \\n\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac) \\n\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)\\n\\n\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d \\n\\n**\ubd80\uac00\uc801\uc778 \ubd80\ubd84**\\n\\n\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. \\n- \ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 \\n- ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac \\n- \uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) \\n\\n\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84** \\nDB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n**\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10** \\n\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4. \\n\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DAO \uc911\ubcf5 \uc81c\uac70**\\n\\n\ud504\ub864\ub85c\uadf8\uc5d0 [\uae00](https://prolog.techcourse.co.kr/studylogs/2947)\uc744 \uc791\uc131\ud588\ub2e4. \\nDAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc0dd\uac01\ud558\uae30** \\n\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! \\n\\n**\ubbf8\uc158 \ubab0\uc785\ud558\uae30** \\n\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4. \\n\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 \\n\\n**\uc194\uc9c1\ud568** \\n\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. \\n\\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"},{"id":"grasp","metadata":{"permalink":"/grasp","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-03-30-GRASP.mdx","source":"@site/blog/2023-1/2023-03-30-GRASP.mdx","title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","description":"GRASP(General Responsibility Assignment Software Pattern)","date":"2023-03-30T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 30\uc77c","tags":[{"label":"GRASP","permalink":"/tags/grasp"},{"label":"OOP","permalink":"/tags/oop"}],"readingTime":8.085,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","slug":"grasp","tags":["GRASP","OOP"]},"unlisted":false,"prevItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/chess-retrospective"},"nextItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/blackjack-retrospective"}},"content":"### GRASP(General Responsibility Assignment Software Pattern)\\n\\n\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134\\n\\n\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4.\\n\\n### \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)\\n\\nQ: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?\\n\\nA: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4.\\n\\n### \ucc3d\uc870\uc790 \ud328\ud134(Creator)\\n\\nQ: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?\\n\\nA: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)\\n\\nQ: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?\\n\\nA: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uacb0\ud569\ub3c4(Coupling)\\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.17\\n> \\n\\n\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4.\\n- \uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4.\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)\\n\\n### \ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)\\n\\nQ. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uc751\uc9d1\ub3c4(Cohesion)\\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.26\\n> \\n\\n\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)\\n- \uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4.\\n- \ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4.\\n- \uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.\\n\\n### \ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)\\n\\nQ. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?\\n\\nA. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n\\n\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c\\n\\n- \uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4.\\n- \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4.\\n- \ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.\\n\\n### \ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)\\n\\nQ. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?\\n\\nA. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)\\n\\n\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.\\n\\n\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\\n\\nQ. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?\\n\\nA. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n### \uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)\\n\\nQ. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4.\\n\\n### \uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)\\n\\nQ. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4.\\n\\n\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815\\n\\n- \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4.\\n- \ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, [\uc870\uc601\ud638](http://aeternum.egloos.com/)\\n\\nApplying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman\\n\\n[GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c](https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397)"},{"id":"blackjack-retrospective","metadata":{"permalink":"/blackjack-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/java-blackjack/pull/427","date":"2023-03-14T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.17,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","slug":"blackjack-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/grasp"},"nextItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/ladder-retrospective"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/java-blackjack/pull/427 \\n2\ub2e8\uacc4: https://github.com/woowacourse/java-blackjack/pull/537 \\n:::\\n\\n### \ube14\ub799\uc7ad\\n\\n\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. \\n\\n\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc \\n\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4. \\n\\"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?\\" \\n\\n\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c? \\n\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4. \\n\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. \\n\\n\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30** \\n\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4. \\n\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?\\n\\n**\uccb4\ub825 \uad00\ub9ac** \\n\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4.\\n\\n**\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30** \\n\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc0c1\ud0dc \ud328\ud134** \\n\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4. \\n\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. \\n\\n**\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654** \\n\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4! \\n\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4. \\n\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc \\n\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4. \\n\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc0dd\uac01 \uc815\ub9ac** \\n\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4. \\n\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84** \\n\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4. \\n\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84** \\n\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. \\n\\n\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"},{"id":"ladder-retrospective","metadata":{"permalink":"/ladder-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/java-ladder/pull/97","date":"2023-02-26T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 26\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":10.285,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","slug":"ladder-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/blackjack-retrospective"},"nextItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/racing-car-retrospective"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/java-ladder/pull/97 \\n2\ub2e8\uacc4: https://github.com/woowacourse/java-ladder/pull/234 \\n:::\\n\\n### \uc0ac\ub2e4\ub9ac \ud0c0\uae30\\n\\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4.\\n\\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4.\\n\\n1. LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n2. Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95\\n\\n### Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\n\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4. \\n\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4. \\n\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n\\n LadderGame --\x3e Position\\n Ladder --\x3e Position\\n Items --\x3e Position\\n Line --\x3e Position\\n Players --\x3e Position\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item\\n Players --\x3e Player\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n final Map result = new LinkedHashMap<>();\\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\\n for (Position position : Position.range(players.count())) {\\n final Position resultPosition = ladder.play(position);\\n result.put(players.get(position), items.get(resultPosition));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\nPosition\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\n\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n Line --\x3e Position\\n\\n Players --\x3e Ladder\\n Player --\x3e Ladder\\n\\n Item --\x3e Position\\n Player --\x3e Position\\n\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item --\x3e ItemName\\n Players --\x3e Player --\x3e PlayerName\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n OutputView --\x3e LadderMessageGenerator\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\\n final Map playResult = players.play(ladder);\\n\\n final Map result = new LinkedHashMap<>();\\n for (Player player : playResult.keySet()) {\\n result.put(player, toItem(playResult.get(player)));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30** \\n\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. \\n\\n**\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30** \\n\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72\\n\\n**README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c** \\n\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4.\\n\\n**\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30** \\n\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. \\n\\n**PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30** \\n\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4. \\nPR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4. \\ngithub pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30** \\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784** \\nPlayers\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\\n\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. \\n\\n\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4.\\n\\n**\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900** \\n\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. \\n\\n**\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30** \\nPosition\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4. \\n\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4. \\n\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! \\n\\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4. \\n\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!\\n\\n\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"},{"id":"racing-car-retrospective","metadata":{"permalink":"/racing-car-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/java-racingcar/pull/510","date":"2023-02-14T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.625,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","slug":"racing-car-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/ladder-retrospective"},"nextItem":{"title":"Parameterized Tests","permalink":"/parameterized-tests"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/java-racingcar/pull/510 \\n2\ub2e8\uacc4: https://github.com/woowacourse/java-racingcar/pull/538 \\n:::\\n\\n### \uc790\ub3d9\ucc28 \uacbd\uc8fc\\n\\n\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. \\n\\n\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. \\n\\n\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4. \\nmermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n- \ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. \\n- github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```mermaid\\n---\\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\\n---\\ngraph TD\\n Cars --\x3e Car\\n Car --\x3e Name\\n Car --\x3e Position\\n RacingGame --\x3e Count\\n RacingGame --\x3e NumberGenerator\\n RacingGame --\x3e Cars\\n RacingCarController --\x3e RacingGame\\n RandomNumberGenerator -.-> NumberGenerator\\n RacingCarController --\x3e InputView\\n InputView --\x3e InputValidator\\n RacingCarController --\x3e OutputView\\n```\\n\\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4.\\n\\n\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4. \\n\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4. \\n\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc \\n\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4.\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**Assertions extracting**\\n\\n\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4. \\n\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4.\\n\\n```java\\n@Test\\nvoid extracting() {\\n final Cars cars = new Cars(List.of(\\"car1\\", \\"car2\\"));\\n\\n assertThat(cars.getCars())\\n .extracting(Car::getName)\\n .containsExactly(\\"car1\\", \\"car2\\");\\n}\\n```\\n\\n---\\n\\n\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4.\\n\\n**\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4. \\n\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n**\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4. \\n\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc \\n\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9**\\n\\n\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4. \\n\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4. \\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4. \\n\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4. \\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4. \\n\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?) \\n\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4.\\n\\n\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4. \\n\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4. \\n\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4. \\n\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00? \\n\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\\n\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc. \\n\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."},{"id":"parameterized-tests","metadata":{"permalink":"/parameterized-tests","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-02-12-Parameterized Tests.mdx","source":"@site/blog/2023-1/2023-02-12-Parameterized Tests.mdx","title":"Parameterized Tests","description":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.","date":"2023-02-12T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 12\uc77c","tags":[{"label":"Java","permalink":"/tags/java"}],"readingTime":3.17,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Parameterized Tests","slug":"parameterized-tests","tags":["Java"]},"unlisted":false,"prevItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/racing-car-retrospective"},"nextItem":{"title":"IntelliJ \uc124\uc815","permalink":"/intellij-settings"}},"content":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4. \\n\uc774 \ub54c `@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4.\\n\\n## Argument Sources\\n\\n`@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4. \\nJUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### Value Source\\n\\n\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. \\n- short, int, long, float, double\\n- byte, char, boolean, String, Class \\n\\n```java\\n@ParameterizedTest\\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\\nvoid valueTest(final int value) {\\n Assertions.assertThat(value).isPositive();\\n}\\n```\\n\\n### Null & Empty Source\\n\\nnull \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nEmpty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n- String\\n- java.util.List, java.util.Set, java.util.Map\\n- primitive arrays \u2014 ex) int[]\\n- object arrays \u2014 ex) String[]\\n\\n```java\\n@ParameterizedTest\\n@NullAndEmptySource\\nvoid nullAndEmptyTest(final String value) {\\n Assertions.assertThat(value).isNullOrEmpty();\\n}\\n```\\n\\n### Enum Source\\n\\nEnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\nenum Day {\\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\\n}\\n\\n@ParameterizedTest\\n@EnumSource(Day.class)\\nvoid enumTest(final Day day) {\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)\\n\\n```java\\n@ParameterizedTest\\n@EnumSource(value = Day.class, names = {\\"SATURDAY\\", \\"SUNDAY\\"}, mode = Mode.EXCLUDE)\\nvoid enumTest(final Day day) {\\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n### CSV Source\\n\\ncsv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@CsvSource({\\"1,1\\", \\"2,4\\", \\"3,9\\", \\"4,16\\"})\\nvoid csvTest(final int number, final int result) {\\n assertThat(number * number).isEqualTo(result);\\n}\\n```\\n\\n### Method Source\\n\\n\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@MethodSource\\nvoid methodTest(final List numbers, final int count) {\\n assertThat(numbers).hasSize(count);\\n}\\n\\nprivate static Stream methodTest() {\\n return Stream.of(\\n Arguments.of(List.of(1), 1),\\n Arguments.of(List.of(1, 2), 2),\\n Arguments.of(List.of(1, 2, 3), 3)\\n );\\n}\\n```\\n\\n### ETC.\\n\\n\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n- CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource\\n- ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5)"},{"id":"intellij-settings","metadata":{"permalink":"/intellij-settings","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","source":"@site/blog/2023-1/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","title":"IntelliJ \uc124\uc815","description":"Import \uc790\ub3d9 \uc801\uc6a9","date":"2023-01-30T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 30\uc77c","tags":[{"label":"IntelliJ","permalink":"/tags/intelli-j"}],"readingTime":0.465,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"IntelliJ \uc124\uc815","slug":"intellij-settings","tags":["IntelliJ"]},"unlisted":false,"prevItem":{"title":"Parameterized Tests","permalink":"/parameterized-tests"},"nextItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/kotlin-null"}},"content":"### Import \uc790\ub3d9 \uc801\uc6a9\\n\\nPrefrences > Editor > General > Auto Import > Add unambiguous imports on the fly\\n\\n![auto-import](./auto-import.png)\\n\\n### \uc800\uc7a5\uc2dc \ub3d9\uc791\\n\\nPrefrences > Tools > Actions on Save\\n\\n![actions-on-save](./actions-on-save.png)\\n\\nReformat Code: Code Reformmating\\n\\nOptimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70\\n\\nRearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c\\n\\n### \uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9\\n\\nPrefrences > Editor > Code Style > Java > Code Generation > Final Modifier\\n\\n![final-modifier](./final-modifier.png)"},{"id":"kotlin-null","metadata":{"permalink":"/kotlin-null","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","source":"@site/blog/2023-1/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","description":"nullable \ud0c0\uc785","date":"2023-01-16T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 16\uc77c","tags":[{"label":"Kotlin","permalink":"/tags/kotlin"}],"readingTime":4.225,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","slug":"kotlin-null","tags":["Kotlin"]},"unlisted":false,"prevItem":{"title":"IntelliJ \uc124\uc815","permalink":"/intellij-settings"},"nextItem":{"title":"JSR-310","permalink":"/jsr-310"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n### nullable \ud0c0\uc785\\n\\n\ucf54\ud2c0\ub9b0\uc740 `NullPointerException` \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4. \\n\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4.\\n\\n```kotlin\\nval number: Int?\\n```\\n\\n\ud0c0\uc785 \ub4a4\uc5d0 `?`\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4. \\n\ub9cc\uc57d `?`\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4.\\n\\n### `?.` Safe Calls \uc5f0\uc0b0\uc790\\n\\n\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 `?.` \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n\\n\\n\\n```java\\npublic String repeat(String word) {\\n if (word == null) {\\n return null;\\n }\\n return word.repeat(2);\\n}\\n```\\n\\n\\n\\n\\n```kotlin\\nfun repeat(word: String?): String? {\\n return word?.repeat(2)\\n}\\n```\\n\\n\\n\\n\\n### `?:` \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\\n\\n\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c? \\n\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.\\n\\n\\n\\n\\n```java\\npublic String stringSafe(String word) {\\n if (word == null) {\\n return \\"\\";\\n }\\n return word;\\n}\\n```\\n\\n\\n\\n\\n```kotlin\\nfun stringSafe(word: String?): String {\\n return word ?: \\"\\"\\n}\\n```\\n\\n\\n\\n\\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```kotlin\\nuserRepository.findByName(name) ?: throw IllegalArgumentException()\\n```\\n\\n### `!!` \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790\\n\\n!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4. \\n\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4. \\n\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n```kotlin\\nval length: Int = word!!.length\\n```\\n\\n### `as?` \uc548\uc804\ud55c \uce90\uc2a4\ud305\\n\\n\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 `ClassCastException`\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. \\n\\n\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n```kotlin\\nval value: Int? = something as? Int\\n```\\n\\n### List\uc5d0\uc11c\uc758 null \ucc98\ub9ac\\n\\nList\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 `filterNotNull` \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4.\\n\\n```kotlin\\nval foodsWithNull: List = listOf(\\"Pizza\\", \\"Cheese\\", null, \\"Potato\\")\\nval foods = foodsWithNull.filterNotNull()\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [Kotlin in Action](https://product.kyobobook.co.kr/detail/S000001804588)\\n- [Effective Kotlin Item 8](https://product.kyobobook.co.kr/detail/S000001033129)\\n- [Comprehensive Guide to Null Safety in Kotlin](https://www.baeldung.com/kotlin/null-safety)\\n- [Kotlin NullSafety](https://kotlinlang.org/docs/null-safety.html)"},{"id":"jsr-310","metadata":{"permalink":"/jsr-310","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-08-JSR-310.mdx","source":"@site/blog/2023-1/2023-01-08-JSR-310.mdx","title":"JSR-310","description":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API","date":"2023-01-08T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 8\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Time","permalink":"/tags/time"}],"readingTime":1.685,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"JSR-310","slug":"jsr-310","tags":["Java","Time"]},"unlisted":false,"prevItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/kotlin-null"},"nextItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/the-essence-of-object-orientation"}},"content":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API \\nISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131 \\n\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131\\n\\n:::note ISO-8601\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900\\n\\n:::\\n\\n### LocalDate, LocalTime, LocalDateTime\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### Instant\\n\\n\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4 \\n\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604\\n\\n### Duration, Period\\n\\n\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### TemporalAdjusters\\n\\n\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9 \\n\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5\\n\\n```java\\n@FunctionalInterface\\npublic interface TemporalAdjuster {\\n Temporal adjustInto(Temporal temporal);\\n}\\n```\\n\\n### DateTimeFormatter\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4 \\n\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5\\n\\n### ZoneId, ZoneOffset\\n\\nZoneId\ub294 \uc9c0\uc5ed ID\ub294 `\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019` \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9 \\nZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9\\n\\n```java\\nInstant instant = Instant.now();\\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158](https://product.kyobobook.co.kr/detail/S000001810171)\\n- [Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API](https://d2.naver.com/helloworld/645609)\\n- [ISO-8601](https://www.w3.org/TR/NOTE-datetime)\\n- [JSR-310 Spec](https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4)\\n- [Temporal Adjuster](https://www.baeldung.com/java-temporal-adjuster)\\n- [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)"},{"id":"the-essence-of-object-orientation","metadata":{"permalink":"/the-essence-of-object-orientation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","source":"@site/blog/2023-1/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","description":"\ucc45 \uc815\ubcf4","date":"2023-01-07T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 7\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.415,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","slug":"the-essence-of-object-orientation","tags":["Book"]},"unlisted":false,"prevItem":{"title":"JSR-310","permalink":"/jsr-310"},"nextItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2022-retrospective"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574 \\n> \uc870\uc601\ud638\\n> \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4. \\n\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4. \\n\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. \\n\\n\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0 \\n\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4.\\n\\n### \ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173\\n\\n\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4.\\n\\n- \uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558\\n- \ucc45\uc784\uc758 \ucd94\uc0c1\ud654\\n\\n\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4.\\n\\n- \uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac\\n\\n\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4.\\n\\n- \ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558\\n\\n\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4.\\n\\n- \uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00\\n\\n\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4.\\n\\n- \uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\np.21\\n> \\n\\n> \uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\\np.33\\n> \\n\\n> **\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8**\\n> \\n> \\n> \uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95\\n> \\n> \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\\n> p.35\\n> \\n\\n> \ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\np.38\\n> \\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\\np.105\\n> \\n\\n> \ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\\np.158\\n>"},{"id":"2022-retrospective","metadata":{"permalink":"/2022-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-02-2022\ub144 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-01-02-2022\ub144 \ud68c\uace0.mdx","title":"2022\ub144 \ud68c\uace0","description":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70","date":"2023-01-02T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 2\uc77c","tags":[{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.705,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"2022\ub144 \ud68c\uace0","slug":"2022-retrospective","tags":["Retrospective"]},"unlisted":false,"prevItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/the-essence-of-object-orientation"},"nextItem":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","permalink":"/book-writer"}},"content":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 \\n\\n### \uc804\uc5ed\\n\\n\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4. \\n\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. \\n\\n\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4. \\n\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4. \\n\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. \\n\\n### \uc790\ubc14\\n\\n\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 [\uc790\ubc14 \uacf5\ud654\uad6d](https://jojoldu.tistory.com/609) \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4.\\n\\n23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4. \\n\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud130\ub514\\n\\n\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0 \\n\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4. \\n\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\\n\\n\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4. \\n\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4. \\n\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. \\n\\n\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### 2023\ub144\uc5d0\ub294\\n\\n\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."},{"id":"book-writer","metadata":{"permalink":"/book-writer","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","source":"@site/blog/2023-1/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","description":"\ucc45 \uc815\ubcf4","date":"2023-01-01T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 1\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":4.425,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","slug":"book-writer","tags":["Book"]},"unlisted":false,"prevItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2022-retrospective"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \\n> \ubc15\uc194\ubbf8 \\n>\\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4. \\n\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. \\n\\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4. \\n\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4. \\n\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.\\n> \\n\\n> \ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.\\n> \\n\\n> \uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.\\n> \\n\\n> \uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.\\n> \\n\\n> \uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c\\n> \\n\\n> \uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.\\n> \\n\\n> \uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.\\n> \\n\\n> \ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.\\n> \\n\\n> \uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.\\n>"}]}')}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.2f9a4877.js b/assets/js/b2b675dd.2f9a4877.js new file mode 100644 index 000000000..3def1db3b --- /dev/null +++ b/assets/js/b2b675dd.2f9a4877.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[533],{28017:n=>{n.exports=JSON.parse('{"blogPosts":[{"id":"2023-retrospective","metadata":{"permalink":"/2023-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx","source":"@site/blog/2024-1/2024-01-04-2023\ub144 \ud68c\uace0.mdx","title":"2023\ub144 \ud68c\uace0","description":"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4.","date":"2024-01-04T00:00:00.000Z","formattedDate":"2024\ub144 1\uc6d4 4\uc77c","tags":[{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.885,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"2023\ub144 \ud68c\uace0","slug":"2023-retrospective","tags":["Retrospective"]},"unlisted":false,"nextItem":{"title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","permalink":"/woowacon-2023"}},"content":"\uc62c \ud55c \ud574\ub97c \ub3cc\uc544\ubcf4\uc790\uba74, \ub108\ubb34 \ube60\ub974\uac8c \uc9c0\ub098\uac14\ub358 \uac83 \uac19\ub2e4. \\n\ud55c \ud574 \ub3d9\uc548 \uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub4e4\uc5c8\ub358 \uc0dd\uac01\ub4e4\uc744 \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### \uad00\uacc4 \ud615\uc131\uacfc \uc0c1\ud638 \uc791\uc6a9\\n\\n\uc5b4\ub5a0\ud55c \ud658\uacbd\uc5d0 \uc18c\uc18d\ud574 \uc788\ub2e4\ub294 \ubd80\ubd84\uc774 \ub9c8\uc74c\uc5d0 \uc548\uc815\uc744 \uac00\uc838\ub2e4\uc8fc\uc5c8\uace0 \ud559\uc2b5\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc558\uace0, \uae30\uc220\uc801\uc778 \uc774\uc57c\uae30\ub098 \uc7a1\ub2f4\uc744 \ub098\ub20c \uc218 \uc788\ub294 \ud658\uacbd\uc774 \uc88b\uc558\ub2e4. \\n\ub0af\uc744 \ub9ce\uc774 \uac00\ub9ac\ub294 \ud3b8\uc774\ub77c \ucd08\ubc18\uc5d0\ub294 \uc774\uc57c\uae30\ub97c \uc120\ub73b \uba3c\uc800 \uaebc\ub0b4\uc9c0 \ubabb\ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4\uc5b4 \uc7a1\ub2f4\uc744 \ub9ce\uc774 \ud558\ub824\uace0 \ubd80\ub2e8\ud788 \ub178\ub825\ud588\ub2e4. \\n\ud2b9\ud788\ub098 \uae30\uc220\uc801\uc778 \uace0\ubbfc\uc744 \ub098\ub204\ub294 \uac83\uc774 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub294\ub370, \ub3c5\ud559\ud560 \ub550 \ud63c\uc790 \uace0\ubbfc\ud588\ub358 \ubd80\ubd84\uc744 \uc774\uc57c\uae30 \ub098\ub20c \uc218 \uc788\ub294 \ud06c\ub8e8\ub4e4\uc774 \uc788\uc5b4\uc11c \uad49\uc7a5\ud788 \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4. \\n\\n\uc8fc\uc704\uc5d0 \uc88b\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc788\uc5b4 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc744 \uc218 \uc788\uc5c8\ub2e4. \\n\ud06c\ub8e8\ub4e4\uc758 \uc7a5\uc810\uc744 \ubc14\ub77c\ubcf4\uba74\uc11c \uc870\uae08\uc774\ub77c\ub3c4 \ud761\uc218\ud574\ubcf4\ub824\uace0 \ud558\uace0, \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \uc788\ub2e4\uba74 \ub3c4\uc6c0\uc744 \ubc1b\uc544\uc11c \uc55e\uc73c\ub85c \ub098\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4. \\n\ub808\ubca8 1, 2\uc5d0\uc11c \ub9ac\ubdf0\ub97c \ub2f4\ub2f9\ud574\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4\ub2d8\ub4e4 \uadf8\ub9ac\uace0 \ucf54\uce58\ub2d8\ub4e4\uc5d0\uac8c \ubc1b\uc740 \uc870\uc5b8\ub4e4\uc774 \uc0b4\uc544\uac10\uc5d0 \uc788\uc5b4\uc11c \ub9ce\uc774 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. \\n\uc5b4\ub5a4 \ubc29\ud5a5\uc73c\ub85c\ub4e0 \ub098\uc5d0\uac8c \uc601\ud5a5\uc744 \uc900 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n### \ud68c\uace0\\n\\n\uae30\uc5b5\ub825\uc774 \uc88b\uc740 \ud3b8\uc774 \uc544\ub2c8\ub77c \uc77c\uc5b4\ub0ac\ub358 \uc77c\ub4e4\uc744 \uc790\uc8fc \uae4c\uba39\ub294\ub2e4. \\n\ubbf8\uc158\uc774 \ub05d\ub0a0 \ub54c\ub9c8\ub2e4 \uafb8\uc900\ud788 \ud68c\uace0\ub97c \uc791\uc131\ud588\ub294\ub370 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4. \\n\ud559\uc2b5\ud588\ub358 \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud560 \uc218 \uc788\uc744 \ubfd0 \uc544\ub2c8\ub77c, \uc8fc\uae30\uc801\uc73c\ub85c \ub3cc\uc544\ubcf4\uba70 \uc2e4\ud589 \uac00\ub2a5\ud55c \uacc4\ud68d\uc744 \uc218\ub9bd\ud560 \uc218 \uc788\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5c8\ub2e4.\\n\\n### \ucf54\ub4dc\ub9ac\ubdf0 \uc2a4\ud130\ub514\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \ud558\uba74\uc11c \uc2a4\ud130\ub514\ub97c \ub531 \ud558\ub098 \uc9c4\ud589\ud588\ub2e4. \\n\ub808\ubca8 1, 2 \ub54c \uc9c4\ud589\ud55c \uc2a4\ud130\ub514\ub85c \ub9e4\uc8fc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uace0 \ub09c \ub4a4 \ucf54\ub4dc\ub97c \uc11c\ub85c \ub9ac\ubdf0\ud574\uc8fc\uace0 \uc9c0\uc2dd\uc744 \uacf5\uc720\ud558\ub294 \uc2a4\ud130\ub514\uc600\ub2e4. \\n\uc774 \uc2dc\uc810\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud558\uba74 \ub354 \uc88b\uc740 \ubc29\ubc95\uc73c\ub85c \ucf54\ub4dc\ub97c \ub9ac\ubdf0\ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\uc5c8\uace0, \ub355\ubd84\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \ub2e4\ub978 \uc0ac\ub78c \ucf54\ub4dc\ub97c \uc77d\uace0, \ub9ac\ubdf0\ud558\ub294 \ud589\uc704 \uc790\uccb4\ub97c \ud559\uc2b5\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n### \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\\n\\n\ub54c\ub294 \ub808\ubca8 2, \ube0c\ub77c\uc6b4\uacfc\uc758 \ucee4\ud53c\ucc57 \uc774\ud6c4\ub85c \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\ub098 \uc9c4\ud589\ud588\ub2e4. \\n\ucd08\uae30 \uae30\ud68d\uc740 \ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc744 \uc8fc\uace0, \uac01 \ub808\ubca8\ubcc4\ub85c \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ud558\ub294\uc9c0 \uc54c\uc544\ubcf4\ub294 \uac83\uc774 \uc6d0\ub798 \ubaa9\ud45c\uc600\ub2e4. \\n\uafb8\uc900\ud788 \uc0ac\uc6a9\ud574\uc8fc\uc5c8\ub358 \ud06c\ub8e8\ub3c4 \uc788\uc5c8\uace0 \uac00\ub054 \uc2ec\uc2ec\ud574\uc11c \ub4e4\uc5b4\uc628 \ud06c\ub8e8\ub4e4\ub3c4 \uc788\uc5c8\ub294\ub370 \uc7a0\uc2dc\ub098\ub9c8 \uc7ac\ubc0c\uac8c \uc0ac\uc6a9\ud574\ubd24\ub358 \uae30\uc5b5\uc73c\ub85c \ub0a8\uae38 \ubc14\ub780\ub2e4. \\n\\n### \ud504\ub85c\uc81d\ud2b8\\n\\n\ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaef4\uc11c \uac1c\uc778\uc801\uc73c\ub85c \ud798\ub4e4\uc5c8\ub358 \uae30\uac04\uc774\uc5c8\ub2e4. \\n\ub2e8\uc21c \uac1c\ubc1c\ubfd0\ub9cc\uc774 \uc544\ub2c8\ub77c \uc77c\uc815 \uc0b0\ucd9c, \uc18c\ud1b5, \ubb38\uc11c\ud654\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ub2a5\ub825\uc774 \ud544\uc694\ud588\uc5c8\uace0, \uc790\uc874\uac10\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4 \uc0c1\ud0dc\uc600\ub2e4. \\n\uadf8\ub798\ub3c4 \ud300\uc6d0\ub4e4\uacfc \ud568\uaed8 \ub9cc\ub4e4\uc5c8\ub358 \uc571\uc774 \ub3d9\uc791\ud558\uace0 \ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \ubc30\ud3ec\ub41c \uac83\uc744 \ubcfc \ub54c \uc2e0\uae30\ud588\uace0 \\n\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \ub54c \uac19\uc774 \ud574\uacb0\ud558\uace0, \ud300 \ubb38\ud654\ub97c \ub9cc\ub4dc\ub294 \uac83 \uadf8\ub9ac\uace0 \ub370\ubaa8\ub370\uc774\uac00 \uae30\uc5b5\uc774 \ub0a8\ub294\ub2e4.\\n\\n### \ub808\ubca8 5\\n\\n\uc774 \uae30\uac04 \ub3d9\uc548 \uac00\uc7a5 \uc798\ud55c \uc77c\uc740 \uc8fc\uc704 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ub3c4\uc6c0\uc744 \uc694\uccad\ud55c \uc77c\uc774\uc5c8\ub2e4. \\n\uc870\uae08 \uc5b5\uc9c0\uc2a4\ub7ec\uc6b4 \ub3c4\uc6c0 \uc694\uccad\ub3c4 \uc8fc\ubcc0 \ud06c\ub8e8\ub4e4\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc8fc\uc5c8\uace0, \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\ucde8\uc5c5\uc5d0 \ub300\ud55c \ub9c9\uc5f0\ud55c \ub450\ub824\uc6c0\uc774 \uc788\uc5c8\uc9c0\ub9cc \uc815\uc2e0\uc801\uc73c\ub85c \uc9c0\uc9c0\ud574\uc8fc\ub294 \uc0ac\ub78c\ub4e4 \ub355\ubd84\uc5d0 \ub450\ub824\uc6c0\uc744 \uc798 \uc774\uaca8\ub0bc \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\\n### \uc55e\uc73c\ub85c \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0 \ub4e4\uc5b4\uc640\uc11c \ub9ce\uc740 \uac83\uc744 \ubc30\uc6e0\uace0, \ubd80\uc871\ud55c \uc810\uc744 \uc54c\uc544\uac08 \uc218 \uc788\uc5c8\ub2e4. \\n\uadf8\ub9ac\uace0 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud589\ub3d9\uc73c\ub85c \uc62e\uae30\uace0 \uac1c\uc120\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc0ac\ub78c\uc73c\ub85c\uc11c \ub9ce\uc740 \uc131\uc7a5\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ucd94\uac00\ub85c \ud604\uc7ac \ub098\uc758 \uac1c\uc778\uc801\uc778 \ubaa9\ud45c\uac00 \ub69c\ub837\ud558\uc9c0 \uc54a\uc740 \uac83 \uac19\ub2e4. \ub2e4\ub978 \uc0ac\ub78c\uacfc \ub300\ud654\ub3c4 \ub9ce\uc774 \ud558\uba74\uc11c \ub098\uc5d0 \ub300\ud574 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \uc54c\uc544\uac00\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4."},{"id":"woowacon-2023","metadata":{"permalink":"/woowacon-2023","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-11-17-\uc6b0\uc544\ucf58 2023 \ud6c4\uae30.mdx","source":"@site/blog/2023-4/2023-11-17-\uc6b0\uc544\ucf58 2023 \ud6c4\uae30.mdx","title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","description":"\uc6b0\uc544\ucf58 2023\uc744 \ub2e4\ub140\uc654\ub2e4.","date":"2023-11-17T00:00:00.000Z","formattedDate":"2023\ub144 11\uc6d4 17\uc77c","tags":[{"label":"Woowacon","permalink":"/tags/woowacon"}],"readingTime":10.11,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","slug":"woowacon-2023","tags":["Woowacon"]},"unlisted":false,"prevItem":{"title":"2023\ub144 \ud68c\uace0","permalink":"/2023-retrospective"},"nextItem":{"title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","permalink":"/refactoring-retrospective"}},"content":"\uc6b0\uc544\ucf58 2023\uc744 \ub2e4\ub140\uc654\ub2e4. \\n\uc774\ud574\uac00 \uc798 \uc548\ub418\ub294 \ub0b4\uc6a9\uc774 \ub300\ub2e4\uc218\uc600\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \uc720\uc775\ud55c \ub0b4\uc6a9\ub4e4\uc774 \ub9ce\uc558\ub2e4. \\n\\n### \ub300\uaddc\ubaa8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ucc98\ub9ac\ud558\ub294 \ubc30\ubbfc \uc8fc\ubb38\uc2dc\uc2a4\ud15c \uaddc\ubaa8\uc5d0 \ub530\ub978 \uc9c4\ud654\\n\\n\ubc30\ub2ec\uc758\ubbfc\uc871 \uc8fc\ubb38\uc2dc\uc2a4\ud15c\uc758 \uacbd\uc6b0 \ud2b9\uc815 \uc2dc\uac04\ub300(\uc810\uc2ec, \uc800\ub141) \ud53c\ud06c\uac00 \ubc1c\uc0dd\ud558\ub294 \ud2b9\uc9d5\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. \\n\uc774\uc804\uc5d0\ub294 \uc77c \ud3c9\uade0 10\ub9cc \uac74 \uc815\ub3c4\uc758 \uc8fc\ubb38\uc774 \ubc1c\uc0dd\ud588\uace0, \ucd5c\uadfc\uc5d0\ub294 \uc77c \ud3c9\uade0 300\ub9cc \uac74\uc758 \uc8fc\ubb38\uc774 \ubc1c\uc0dd\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\uc774\ub807\uac8c \uc131\uc7a5\ud558\ub294 \uc8fc\ubb38 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\uc640 \uadf8 \ud574\uacb0 \ubc29\ubc95\uc5d0 \ub300\ud55c \ub0b4\uc6a9\ub4e4\uc774 \uc18c\uac1c\ub418\uc5c8\ub358 \uc138\uc158\uc774\uc5c8\ub2e4.\\n\\n\ub300\uaddc\ubaa8 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc6a9\uc774 \uc778\uc0c1 \uae4a\uc5c8\ub294\ub370 \ub298\uc5b4\ub098\ub294 \uc8fc\ubb38 \ucc98\ub9ac\ub7c9\uc5d0 \ub530\ub77c \uc4f0\uae30 \ucc98\ub9ac\ub7c9\uc5d0 \ud55c\uacc4\uc5d0 \ub3c4\ub2ec\ud588\uace0, \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uc0e4\ub529\uc744 \ud1b5\ud574 \uc4f0\uae30 \ubd80\ud558\ub97c \ubd84\uc0b0\ud588\ub2e4\uace0 \ud55c\ub2e4. \\nAurora DB\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 DB \ub808\ubca8\uc5d0\uc11c \uc0e4\ub529\uc774 \ubd88\uac00\ub2a5\ud588\uace0, AbstractRoutingDataSource\ub97c \uc774\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub808\ubca8\uc5d0\uc11c \uc0e4\ub529\uc744 \ub3c4\uc785\ud558\uae30\ub85c \ud588\uace0 \\n\uc5ec\ub7ec \uc0e4\ub529 \ubc29\uc2dd \uc911 \uc8fc\ubb38 \ub370\uc774\ud130\uc758 \ud2b9\uc131\uc0c1 Key Based \uc0e4\ub529 \ubc29\uc2dd\uc744 \uc120\ud0dd\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### \ubaa8\ub180\ub9ac\uc2dd\uc5d0\uc11c \uc810\uc9c4\uc801 \uc11c\ube44\uc2a4 \ubd84\ub9ac: \uc0ac\uc5c5\uacfc\uc81c\uc640 \ubcd1\ud589\ud558\uc5ec \uc2dc\uc2a4\ud15c \uac1c\uc120\ud558\uae30\\n\\n\uac70\ub300\ud55c \ubaa8\ub180\ub9ac\uc2dd \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uc810\uc9c4\uc801\uc73c\ub85c \uc0ac\uc5c5\uacfc\uc81c\uc640 \ubcd1\ud589\ud558\uba74\uc11c \uc11c\ube44\uc2a4\ub97c \ubd84\ub9ac\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc138\uc158\uc774\uc5c8\ub2e4. \\n\ubaa8\ub4c8, \ucef4\ud3ec\ub10c\ud2b8 \ubd84\ub9ac\ubd80\ud130 \uc11c\ube44\uc2a4 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub2e4\uc591\ud55c \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc5c8\uace0 \ubc30\ubbfc\uc0c1\ud68c\uc758 \uacbd\uc6b0 \uc7a5\uae30\uc801\uc778 \uad00\uc810\uc5d0\uc11c \uc11c\ube44\uc2a4 \uae30\uc900\uc73c\ub85c \uac1c\ubc1c \uc870\uc9c1\uc758 \ubd84\ub9ac\ub97c \uc704\ud574 \uc11c\ube44\uc2a4 \ubd84\ub9ac \uc9c4\ud589\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\uc11c\ube44\uc2a4 \ubd84\ub9ac\ub97c \ud560 \ub54c \uace0\ub824\ud574\uc57c\ud558\ub294 \uc0ac\uc774\ub4dc \uc774\ud399\ud2b8\uc5d0 \uad00\ud55c \ub0b4\uc6a9\ub3c4 \uc788\uc5c8\uace0, \uc7a5\uc560 \ubc1c\uc0dd \uc2dc \ube60\ub974\uac8c \ub864\ubc31\ud560 \uc218 \uc788\ub3c4\ub85d FeatureFlag\ub97c \ub3c4\uc785\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### \ubc30\ubbfc\uc2a4\ud1a0\uc5b4\uc5d0 \ucd5c\uc2e0 \uae30\uc220 \ud55c\ubc29\uc5d0 \ub54c\ub824\ub123\uae30: Kotlin, Spring WebFlux, EDA\\n\\n\ubc30\ubbfc\uc2a4\ud1a0\uc5b4\uc5d0 \ucd5c\uc2e0 \uae30\uc220\uc744 \ub3c4\uc785\ud558\uace0, \uae30\uc220 \ub3c4\uc785\uc744 \uc704\ud55c \ub17c\uc758 \uacfc\uc815\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc790\uc138\ud558\uac8c \uc124\uba85\ud574\uc8fc\ub294 \uc138\uc158\uc774\uc5c8\ub2e4. \\n\ub610\ud55c \uae30\uc220 \ub3c4\uc785 \ud6c4 \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc544\uc9d0\uc5d0 \ub530\ub77c \uae30\uc220\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\ub3c4 \ub192\uc544\uc9c0\ub294 \ubd80\ubd84\uc774(\ucee4\uba38\uc2a4 \ud2b9\uc131\uc0c1 Batch \ub85c\uc9c1\uc5d0\uc11c \ubc30\uc555\uc758 \ud2b9\uc131\uc774 \uc624\ud788\ub824 \ubc1c\ud718\ub418\uc5c8\ub2e4\uace0 \uc124\uba85\ud558\ub294 \ubd80\ubd84) \uc778\uc0c1\uae4a\uc5c8\ub2e4. \\n\\n:::note \uae30\uc220 \ub3c4\uc785 \ud558\uae30\uc88b\uc740 \ud658\uacbd\uc774\ub780?\\n\\n- \ud300 \ucc28\uc6d0\uc5d0\uc11c \ucc59\uaca8\uc57c \ud558\ub294 \ubd80\ubd84\\n- \uae30\ubcf8\uc801\uc778 \uac1c\ubc1c \ubb38\ud654 \u2192 \uc2a4\ud130\ub514, \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d, \ucf54\ub4dc \ub9ac\ubdf0, \ub178\ud558\uc6b0 \uacf5\uc720\\n- \ud300\uc5d0\uc11c \ucda9\ubd84\ud55c \ub17c\uc758\ub97c \uac70\uccd0 \ub0b4\ub9b0 \uacb0\uc815\uc740 \uc874\uc911\ud574\uc8fc\uace0, \ubbff\uace0 \uc9c0\ucf1c\ubd10\uc918\uc57c\ud55c\ub2e4.\\n- \uac1c\ubc1c\uc790\ub294 \ub3c4\uba54\uc778\uc5d0 \ub300\ud55c \uc804\ubb38\uc131\uc744 \ubc14\ud0d5\uc73c\ub85c \uae30\uc220 \ub3c4\uc785\uc5d0 \ub300\ud55c \uacb0\uc815\uc744 \ub0b4\ub9ac\uace0 \uc99d\uba85\ud55c\ub2e4.\\n- \uc8fc\ubcc0\uc5d0\uc11c\ub294 \uac1c\ubc1c\uc790\ub97c \uc804\ubb38\uac00\ub85c\uc368 \uc2e0\ub8b0\ud55c\ub2e4. \uc131\uacfc\ub97c \ube14\ub85c\uadf8\ub098 \ubc1c\ud45c\ub85c \ub098\ub220\uac00\uc9c4\ub2e4.\\n\\n:::\\n\\n### \ub300\uc6a9\ub7c9 \ud2b8\ub798\ud53d\uc744 \ubc1b\ub294 \ubaa8\ub180\ub9ac\uc2dd \uc11c\ube44\uc2a4\uc5d0 Woowa\ud558\uac8c RPC \uc801\uc6a9\ud558\uae30\\n\\nRPC\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 IDL \ud30c\uc77c\uc774 \ud544\uc694\ud55c\ub370 \uc774\uc5d0 \ub300\ud55c \uc720\uc9c0\ubcf4\uc218\uac00 \uc5b4\ub835\uae30 \ub54c\ubb38\uc5d0, Spring \ucf54\ub4dc \uae30\ubc18\uc73c\ub85c RPC\uc5d0 \ub300\ud55c \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uad00\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 Woowaboot\uc5d0 \ub300\ud55c \uc138\uc158\uc774\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc RPC\ub97c \uc798 \ubab0\ub77c\uc11c \uc774\ud574\ud558\uc9c0\ub294 \ubabb\ud588\ub2e4. \\n\uae30\uc5b5\ub098\ub294 \ubd80\ubd84\uc740 \uae30\uc874\uc758 RestController + RPC\ub97c \ub3d9\uc2dc\uc5d0 \uc791\uc131\ud560 \uc218 \uc788\ub3c4\ub85d \ud588\uace0, \ucf54\ub4dc \ub808\ubca8\uc5d0\uc11c Enum \uac12\uc5d0 \ub530\ub77c\uc11c RPC\uc758 \uad6c\ud604\uccb4\uc778 gRPC, Thrift \ub458 \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud55c\uac8c \uae30\uc5b5\ub09c\ub2e4. \\n\\n### \ub0af\uc120 \uc11c\ub4dc\ud30c\ud2f0\uc640\uc758 \ub3d9\ud589: \ubbff\uc744 \ub9cc\ud55c \ubc30\ubbfc\ucee4\ub125\ud2b8 \uc11c\ubc84 \uad6c\ucd95\ud558\uae30\\n\\n\ubb38\uc81c\uc5d0 \ub300\ud55c \uc778\uc2dd \uc5c6\uc774 \ubc30\ubbfc \ucee4\ub125\uc2a4 \uc571\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc5b4\ub5a0\ud55c \uace0\ubbfc\uc744 \ud558\ub294\uc9c0 \uc54c \uc218 \uc788\uc5c8\ub358 \uc138\uc158\uc774\ub2e4. \\n\uc11c\ub4dc\ud30c\ud2f0\ub97c \ud1b5\ud55c \uc6b4\uc804\uba74\ud5c8 \uac80\uc99d\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \uc124\uba85\ud588\ub294\ub370 \ub2e4\uc74c\uc758 \ud50c\ub85c\uc6b0\ub85c \uc9c4\ud589\ub41c\ub2e4\uace0 \ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n A[\ub77c\uc774\ub354 \uc6b4\ud589 \uc2dc\ub3c4] -- 1. \uba74\ud5c8 \uc0c1\ud0dc \ud655\uc778 --\x3e B[\uc6b4\uc804\uba74\ud5c8 \uc0c1\ud0dc]\\n\\tB -- 2. \ud604\uc7ac \uba74\ud5c8 \uc0c1\ud0dc \uc751\ub2f5 --\x3e A\\n\\tB -- 3. \uac80\uc99d\uc744 \uc704\ud55c \uba54\uc2dc\uc9c0 \ubc1c\ud589 --\x3e D[\uac80\uc99d \uc218\ud589 \ubc0f \uacb0\uacfc \ubc18\uc601]\\n\\t\\n```\\n\\n\ub610\ud55c \uac80\uc99d \ubc29\uc2dd\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc810\uc9c4\uc801\uc73c\ub85c \ubc1c\uc804\uc2dc\ucf1c\ub098\uac14\ub2e4\uace0 \ud55c\ub2e4. \\n\uc218\uae30 \uac80\uc99d \u2192 \uc11c\ub4dc\ud30c\ud2f0\uc5d0 \uc81c\uacf5\ud558\ub294 \ubb38\uc11c\ub97c \uc774\uc6a9\ud558\uc5ec \ucd5c\ub300 1000\uac74 \uc77c\uad04 \uac80\uc99d \u2192 Spring Batch \uc774\uc6a9\ud558\uc5ec \uc8fc\uae30\uc801 \uac80\uc99d\\n\\n\ub610\ud55c \uc11c\ub4dc\ud30c\ud2f0\uc5d0 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c \uacbd\uc6b0 \uc11c\ud0b7\ube0c\ub808\uc774\ucee4\ub97c \uc801\uc6a9\ud558\uc5ec \uc7a5\uc560 \uc804\ud30c\ub97c \ucc28\ub2e8\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\ubc1c\ud45c\ub97c \uc81c\ub300\ub85c \uc774\ud574\ub97c \ubabb\ud574\uc11c \uadf8\ub7f0\uac00 \uc6b4\ud589 \uc2dc\ub3c4\ud560 \ub54c \ud604\uc7ac \uba74\ud5c8 \uc0c1\ud0dc\ub97c \uc751\ub2f5\ud558\uc9c0\ub9cc, \ub9cc\uc57d \uc11c\ub4dc\ud30c\ud2f0\ub97c \ud1b5\ud574 \uac80\uc99d \uc218\ud589\ud55c \uacb0\uacfc\uac00 \uc6b4\ud589 \uc2dc\ub3c4\uc5d0 \ubd80\uc801\ud569\ud560 \ub54c\uc758 \uacbd\uc6b0\uac00 \uad81\uae08\ud588\ub2e4. \\n\\n### Kafka\ub97c \ud65c\uc6a9\ud55c \uc774\ubca4\ud2b8 \uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\\n\\n\uc694\uad6c\uc0ac\ud56d\uc774 \ub9ce\uc544\uc9d0\uc5d0 \ub530\ub77c \ubc30\ub2ec \uc2dc\uc2a4\ud15c\uc758 \ubcf5\uc7a1\ub3c4\uac00 \uc99d\uac00\ud588\ub2e4. \ud558\uc9c0\ub9cc \ub300\ubd80\ubd84\uc758 \uae30\ub2a5\uc740 \ubc30\ub2ec\uacfc \uac15\ud55c \uc77c\uad00\uc131(\uad00\ub828 \uae30\ub2a5\ub4e4\uc774 \ub3d9\uc2dc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud558\ub294\uac83)\uc744 \ud544\uc694\ub85c\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc774\ubca4\ud2b8 \uae30\ubc18\uc73c\ub85c \uad6c\ucd95\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n:::note SNS + SQS\uac00 \uc544\ub2cc Kafka\ub97c \uc120\ud0dd\ud55c \uc774\uc720\\n\\n- \uc21c\uc11c \ubcf4\uc7a5 \u2192 \ud1a0\ud53d\uc758 \ud30c\ud2f0\uc158\uc744 \ud1b5\ud574 key\ubcc4\ub85c \uc21c\uc11c\ub97c \ubcf4\uc7a5\\n- \uace0\uc131\ub2a5 \uace0\uac00\uc6a9\uc131 \u2192 \uc2e4\uc2dc\uac04 \uc774\ubca4\ud2b8\ub97c \ucc98\ub9ac\ud560 \uace0\uc131\ub2a5 \uace0\uac00\uc6a9\uc131 \uc81c\uacf5 + \ube0c\ub85c\ucee4\ub97c \ud074\ub7ec\uc2a4\ud130 \ud615\ud0dc\ub85c \uad00\ub9ac\\n- \ud1b5\ud569 \ub3c4\uad6c \u2192 Kafka Streams, Kafka Connect\ub4f1 \ub2e4\uc591\ud55c \ud1b5\ud569 \ub3c4\uad6c \uc81c\uacf5\\n- \uc804\ub2f4\ud300 \uc9c0\uc6d0 \u2192 \uce74\ud504\uce74 \ud074\ub7ec\uc2a4\ud130 \uad00\ub9ac, \ubaa8\ub2c8\ud130\ub9c1 \ubc0f \uc9c0\uc6d0\ub3c4\uad6c \uc81c\uacf5\\n\\n:::\\n\\n\ub3c4\uba54\uc778\uc758 \uc0c1\ud0dc\uc640 \uc774\ubca4\ud2b8 \ubc1c\ud589 \uacb0\uacfc\uac00 \uac19\ub2e4\ub294 \uac83\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ud2b8\ub79c\uc7ad\uc158 \uc544\uc6c3\ubc15\uc2a4 \ud328\ud134\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud558\ub294\ub370 \uc774\ud6c4\uc5d0\ub294 \ubcf5\uc7a1\ud55c \ub0b4\uc6a9\uc774 \ub098\uc640\uc11c \uc81c\ub300\ub85c \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158 \uc544\uc6c3\ubc15\uc2a4 \ud328\ud134\uc744 \uc801\uc6a9\ud560 \ub54c \uc800\ube44\uc6a9, \uc548\uc815\uc131, \ucc98\ub9ac\ub7c9\uc744 \uace0\ub824\ud558\uc5ec debezium\uc744 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\uc774\ub54c debezium\uc740 Binary Log\ub97c \ud1b5\ud55c \uc21c\uc11c\ub97c \ubcf4\uc7a5\ud558\ub294\ub370 \ucc98\ub9ac\ub7c9\uc744 \uc99d\ub300\uc2dc\ud0a4\uae30 \uc704\ud574 Outbox \ud14c\uc774\ube14\uc744 \ud30c\ud2f0\uc154\ub2dd\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n\uc544\ub798\uc640 \uac19\uc740 \ub290\ub08c\uc778 \uac83 \uac19\uc740\ub370 \uc544\uc9c1 \uc798 \ubaa8\ub974\uaca0\ub2e4. \\n\\n```mermaid\\ngraph LR\\n Database -- binary log --\x3e Debezium --\x3e Kafka\\n```\\n\\n### \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d \uc778 \uc561\uc158: \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d \uc18c\uac1c\uc640 \uc801\uc6a9 \ubc29\ubc95\\n\\n\uadfc\ub85c\ub97c \ud558\ub294 \ud06c\ub8e8\ub4e4\uc740 \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\uc744 \uacbd\ud5d8\ud574\ubcf4\uc558\ub2e4\uace0 \ud558\ub294\ub370, \uad81\uae08\ud574\uc11c \uc81c\uc774\uc2a8\uc758 \uc138\uc158\uc744 \ub4e4\uc73c\ub7ec \uac14\ub2e4. \\n\uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\uc774 \uc5b4\ub5bb\uac8c \uc9c4\ud589\ub418\uc5b4\uc57c \ud558\ub294\uc9c0, \ud37c\uc2e4\ub9ac\ud14c\uc774\ud130(\uc9c4\ud589\uc790)\ub294 \uc5b4\ub5bb\uac8c \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\uc774 \uc798 \uc9c4\ud589\ub420 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc57c\ud558\ub294\uc9c0, \uc548\ud2f0 \ud328\ud134\ub4f1\uc744 \uc18c\uac1c\ud574\uc918\uc11c \uc7ac\ubc0c\uc5c8\ub2e4. \\n\\n:::note \uc774\ubca4\ud2b8 \uc2a4\ud1a0\ubc0d\\n\uc54c\ubca0\ub974\ud1a0 \ube0c\ub780\ub3cc\ub9ac\ub2c8\uac00 \uc81c\uc548\ud55c \ubcf5\uc7a1\ud55c \ube44\uc988\ub2c8\uc2a4 \ub3c4\uba54\uc778\uc744 \ube60\ub974\uac8c \ud0d0\uc0c9\ud558\uace0 \ud559\uc2b5\ud560 \uc218 \uc788\ub294 \uc6cc\ud06c\uc20d \\n\ud504\ub85c\uc81d\ud2b8 \ucc38\uc5ec\ud558\ub294 \ubaa8\ub4e0 \uc774\ud574\uad00\uacc4\uc790\uac00 \ud55c\uc790\ub9ac\uc5d0 \ubaa8\uc5ec \ub3c4\uba54\uc778 \uc9c0\uc2dd\uc744 \uad50\ud658\ud558\uace0 \uc6a9\uc5b4\ub97c \ud1b5\uc77c\ud558\uace0 \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8 \ub0b4 \ud68c\uc0c9 \uc9c0\ub300\ub97c \ud30c\uc545\ud558\uc5ec \ud5a5\ud6c4 \uc758\uc0ac\uc18c\ud1b5 \ube44\uc6a9\uc744 \uc808\uc57d\ud558\ub294 \uc6cc\ud06c\uc20d\uc774\ub2e4. \\n:::\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[DB\ubd84\uc0b0\ucc98\ub9ac\ub97c \uc704\ud55c sharding, \uc6b0\uc544\ud55c\uae30\uc220\ube14\ub85c\uadf8](https://techblog.woowahan.com/2687/) \\n[Feature Toggles, martinfowler](https://martinfowler.com/articles/feature-toggles.html)"},{"id":"refactoring-retrospective","metadata":{"permalink":"/refactoring-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-31-\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-4/2023-10-31-\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-refactoring/pull/465","date":"2023-10-31T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 31\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":8.095,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","slug":"refactoring-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ucf58 2023 \ud6c4\uae30","permalink":"/woowacon-2023"},"nextItem":{"title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/jdbc-retrospective"}},"content":":::note PR \ub9c1\ud06c\\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/465 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/547 \\n3\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/610 \\n4\ub2e8\uacc4: https://github.com/woowacourse/jwp-refactoring/pull/721 \\n:::\\n\\n### \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158\\n\\n\uc694\uad6c\uc0ac\ud56d \uc791\uc131 \u2192 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud55c \ucf54\ub4dc \ubcf4\ud638 \u2192 \ub9ac\ud329\ud130\ub9c1 \u2192 \uc758\uc874\uc131 \ub9ac\ud329\ud130\ub9c1 \u2192 \uba40\ud2f0\ubaa8\ub4c8 \uc21c\uc11c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\ubbf8\uc158\uc5d0 \uc628\uc804\ud788 \uc9d1\uc911\ud558\uace0 \uc2f6\uc5c8\uc9c0\ub9cc, \ud504\ub85c\uc81d\ud2b8\uc640 \ubcd1\ud589\ud558\uba74\uc11c \uc9c4\ud589\ud588\uae30\uc5d0 \uc5b4\ub290\uc815\ub3c4 \ud0c0\ud611\ubcf4\uace0 \uc9c4\ud589\ud55c \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c \uc544\uc26c\uc6e0\ub2e4. \\n\\n### 1, 2\ub2e8\uacc4\\n\\n1\ub2e8\uacc4\ub294 \uc694\uad6c\uc0ac\ud56d\uc744 \uc791\uc131\ud558\uace0, \ud14c\uc2a4\ud2b8 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc5ec \ucd94\ud6c4\uc5d0 \ub9ac\ud329\ud130\ub9c1 \ud560 \ub54c \uc548\uc815\uac10 \uc788\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \uc900\ube44\ud558\ub294 \uacfc\uc815\uc774\uc5c8\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d\uc744 \uc791\uc131\ud560 \ub54c \uc81c\uacf5\ub41c \uc6a9\uc5b4 \uc0ac\uc804\uc744 \ucd5c\ub300\ud55c \ud65c\uc6a9\ud558\uba74\uc11c \uae30\uc874\uc758 \ucf54\ub4dc\ub97c \ubcf4\uba74\uc11c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud588\ub2e4. \\n\ud14c\uc2a4\ud2b8\ub294 \uc2dc\uac04 \uad00\uacc4\uc0c1 API, \uc11c\ube44\uc2a4 \ub458 \uc911 \ud558\ub098\ub9cc \ud1b5\ud569 \ud14c\uc2a4\ud2b8\ub97c \uc9c4\ud589\ud574\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4. \\n\\n\ucd5c\uc885\uc801\uc73c\ub85c \uc11c\ube44\uc2a4 \uae30\uc900\uc73c\ub85c \ud1b5\ud569 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud588\ub294\ub370 \uc57d\uac04 \ud6c4\ud68c\ub418\ub294 \uacb0\uc815\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ub9ac\ud329\ud130\ub9c1 \uacfc\uc815\uc5d0\uc11c API \uba85\uc138\uac00 \ubc14\ub00c\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4\ub294 \uac83\uc744 \uae30\uc900\uc744 \uc7a1\uace0 \uc774\ubc88 \ubbf8\uc158\uc744 \ud55c\ub2e4\uace0 \uac00\uc815\ud588\uc744 \ub54c API \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uace0, \ub9ac\ud329\ud130\ub9c1\uc744 \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ub354 \uc548\uc815\uac10 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n2\ub2e8\uacc4\ub294 \uc791\uc131\ub41c \ud14c\uc2a4\ud2b8 \uae30\ubc18\uc73c\ub85c \ub9ac\ud329\ud130\ub9c1 \ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\uc11c\ube44\uc2a4\uc5d0\uc11c \ub3c4\uba54\uc778\uc744 \uc9c1\uc811 \ubc18\ud658\ud558\ub294 \uad6c\uc870\uc600\ub294\ub370, \ub3c4\uba54\uc778\uc5d0 JPA\ub97c \uc801\uc6a9\ud558\uba74 \uae30\uc874 \uba85\uc138\uc640 \ub2ec\ub77c\uc9c8 \uac83\uc744 \uc6b0\ub824\ud574\uc11c DTO\ub85c \uc218\uc815\ud558\ub294 \uc791\uc5c5\uc744 \uba3c\uc800 \uc9c4\ud589\ud588\ub2e4. \\nDTO \uc774\ud6c4\uc5d0 \uc11c\ube44\uc2a4\uc5d0 \uc788\ub294 \ub85c\uc9c1\uc744 \ub3c4\uba54\uc778\uc73c\ub85c \uc774\ub3d9\uc2dc\ud0a4\uace0, \ucd5c\uc885\uc801\uc73c\ub85c JPA\ub97c \uc801\uc6a9\ud558\ub294 \uc21c\uc11c\ub85c \ub9ac\ud329\ud130\ub9c1\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\uc774 \uacfc\uc815\uc5d0\uc11c \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \uc591\ubc29\ud5a5\uc778 \ubd80\ubd84\ub3c4 \uc0dd\uaca8\ub0ac\ub2e4. \\n\\n### \uc18c\ud504\ud2b8\uc6e8\uc5b4\uc758 \ubcf5\uc7a1\uc131\uc744 \ub2e4\ub8e8\ub294 \uc9c0\ud61c\\n\\n\uc911\uac04\uc5d0 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ubcf5\uc7a1\uc131\uc744 \ub2e4\ub8e8\ub294 \uc9c0\ud61c\uc5d0 \uad00\ud55c \uc81c\uc774\uc2a8\uc758 \uac15\uc758\uac00 \uc788\uc5c8\ub2e4. \\n\uc18c\ud504\ud2b8\uc6e8\uc5b4\uc758 \ubcf5\uc7a1\uc131\uc744 \ub2e4\ub8e8\ub294 \uc9c0\ud61c\ub294 \uc5d0\ub9ad \uc5d0\ubc18\uc2a4\uc758 \uc800\uc11c `\ub3c4\uba54\uc778 \uc8fc\ub3c4 \uc124\uacc4`\uc758 \ubd80\uc81c\uc774\ub2e4. \\n\\n\ub3c4\uba54\uc778 \uc8fc\ub3c4 \uc124\uacc4\ub294 \uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4, \uc804\ub7b5\uc801 \uc124\uacc4, \uc804\uc220\uc801 \uc124\uacc4\uac00 \uc911\uc694\ud558\ub2e4\uace0 \ud55c\ub2e4. \\n\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4, \uc804\ub7b5\uc801 \uc124\uacc4\uac00 \uc804\uccb4\uc758 90%\uc5d0 \ud574\ub2f9\ud560 \uc815\ub3c4\ub85c \uc911\uc694\ud558\ub2e4\uace0 \ud55c\ub2e4. \ub610\ud55c \uc804\uc220\uc801 \uc124\uacc4\ub9cc \ud558\ub294 \uacbd\uc6b0\ub97c DDD Lite \ub77c\uace0 \ud55c\ub2e4. \\n\\n\uac04\ub2e8\ud788 \ub3c4\uba54\uc778 \uc8fc\ub3c4 \uc124\uacc4\uc5d0\uc11c \ub098\uc624\ub294 \ub2e8\uc5b4\ub97c \uc815\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n| \ub2e8\uc5b4 | \uc124\uba85 |\\n| --- | --- |\\n| \ub3c4\uba54\uc778 | \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub85c \ud574\uacb0\ud558\uace0\uc790 \ud558\ub294 \ubb38\uc81c \uc601\uc5ed |\\n| \ubc14\uc6b4\ub514\ub4dc \ucee8\ud14d\uc2a4\ud2b8 | \ud574\uacb0 \uc601\uc5ed, \uad00\uc2ec\uc0ac\ub97c \ubd84\ub9ac\ud558\uace0 \uaca9\ub9ac\ud558\uc5ec \ubb38\uc81c \ud574\uacb0\uc5d0 \uc9d1\uc911\ud560 \ubc94\uc704 |\\n| \uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4 | \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc774\ud574\uad00\uacc4\uc790\ub4e4\uc758 \uacf5\ud1b5\ub41c \uc5b8\uc5b4\ub85c, \uc11c\ub85c\uc758 \uc758\uc0ac\uc18c\ud1b5 \ube44\uc6a9\uc744 \uc904\uc774\uae30 \uc704\ud574 \uc0ac\uc6a9\ud558\ub294 \uc5b8\uc5b4 |\\n| \uc804\ub7b5\uc801 \uc124\uacc4 | \ub3c4\uba54\uc778 \uc804\ubb38\uac00\uc640 \uac1c\ubc1c\uc790\uac00 \ud568\uaed8 \uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \ub3c4\uba54\uc778\uacfc \uad00\ub828\ub41c \uc9c0\uc2dd\uc744 \uc774\ud574\ud558\uace0 \uc774\ub97c \ubc14\ud0d5\uc73c\ub85c \uacbd\uacc4\ub97c \ub098\ub220 \ubc14\uc6b4\ub514\ub4dc \ucee8\ud14d\uc2a4\ud2b8\ub97c \uc815\uc758\ud558\uace0, \ucee8\ud14d\uc2a4\ud2b8 \ub9f5\uc744 \uc0dd\uc131\ud558\ub294 \uac83\uc744 \ud3ec\ud568\ud558\ub294 \uacfc\uc815 |\\n| \uc804\uc220\uc801 \uc124\uacc4 | \uc804\ub7b5\uc801 \uc124\uacc4\uc5d0\uc11c \uc815\uc758\ud55c \ubc14\uc6b4\ub514\ub4dc \ucee8\ud14d\uc2a4\ud2b8\uc640 \ub3c4\uba54\uc778\uc744 \uc774\uc6a9\ud558\uc5ec \uc560\uadf8\ub9ac\uac70\ud2b8, Entity\uc640 VO, Repository \ub4f1\uc744 \uad6c\ud604\ud558\ub294 \uacfc\uc815 |\\n\\n\uc774 \uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ub0b4\uc6a9\ub4e4\uc774 \ub098\uc654\uc9c0\ub9cc, \uc9c0\uc2dd\uc744 \uc81c\ub300\ub85c \ud761\uc218\ud558\uc9c0\ub294 \ubabb\ud588\ub2e4. \\n\\n### 3, 4\ub2e8\uacc4\\n\\n\uc81c\uc774\uc2a8\uc758 \uac15\uc758\ub97c \ub4e3\uace0, \uc870\uc601\ud638\ub2d8\uc758 \uc6b0\uc544\ud55c\uac1d\uccb4\uc9c0\ud5a5 \uc720\ud29c\ube0c \uc601\uc0c1\uc744 \ubcf8 \ub2e4\uc74c 3, 4\ub2e8\uacc4\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\\n3\ub2e8\uacc4\ub294 \uc758\uc874\uc131 \ub9ac\ud329\ud130\ub9c1\uc5d0 \uad00\ud55c \ub0b4\uc6a9\uc774\uc5c8\ub2e4. \ud074\ub798\uc2a4 \uac04 \ubc29\ud5a5, \ud328\ud0a4\uc9c0 \uac04 \ubc29\ud5a5\uc744 \ub2e8\ubc29\ud5a5\uc774 \ub418\ub3c4\ub85d \ub9ac\ud329\ud130\ub9c1\uc744 \uc9c4\ud589\ud574\uc57c \ud588\uc5c8\ub2e4. \\n\ud568\uaed8 \uc0dd\uc131\ub418\uace0 \uc0ad\uc81c\ub418\ub294 \uac1d\uccb4\ub4e4\uc744 \ubb36\uace0, \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uae30 \uc704\ud574 \uc0dd\uba85\uc8fc\uae30\uac00 \ub2e4\ub974\ub2e4\uba74 id\ub97c \uc774\uc6a9\ud558\uc5ec \ucc38\uc870\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4. \\n\\n\uc758\uc874\uc131\uc744 \ubd84\ub9ac\ud558\uae30 \uc704\ud574 \uc774\ubca4\ud2b8\ub3c4 \uc0ac\uc6a9\ud574\ubcf4\uc558\ub2e4. \uc774\ubca4\ud2b8\ub294 \ud604\uc7ac \uae30\uc900\uc73c\ub85c \uacfc\uac70\uc5d0 \ubc8c\uc5b4\uc9c4 \uac83\uc744 \ud45c\ud604\ud558\uae30 \ub54c\ubb38\uc5d0 \uc774\ubca4\ud2b8\uba85\uc740 \uacfc\uac70 \uc2dc\uc81c\uac00 \ub418\uc5b4\uc57c\ud558\ub294 \uac83\uc744 \uc54c\uc558\ub2e4. \\n\ucc98\uc74c\uc5d0\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud588\uc9c0\ub9cc, \uc11c\ube44\uc2a4 \ub85c\uc9c1\uc744 \ucd5c\ub300\ud55c \uac04\ub2e8\ud558\uac8c \ud558\uae30 \uc704\ud574 \ub3c4\uba54\uc778 \uc774\ubca4\ud2b8\ub3c4 \uc0ac\uc6a9\ud574\ubcf4\uc558\ub2e4. \\n\\n4\ub2e8\uacc4\ub294 \uba40\ud2f0\ubaa8\ub4c8\ub85c \ubd84\ub9ac\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub294\ub370 3\ub2e8\uacc4\uc5d0\uc11c \ubd84\ub9ac\ud574\ub454 \ud328\ud0a4\uc9c0 \uadf8\ub300\ub85c \ubd84\ub9ac\ud558\uc9c0\ub294 \uc54a\uc558\ub2e4. \\n3\ub2e8\uacc4\uc5d0\uc11c\ub294 \ud568\uaed8 \uc0dd\uc131\ub418\uace0 \uc0ad\uc81c\ub418\ub294 \uac1d\uccb4 \uae30\uc900\uc73c\ub85c \ubd84\ub9ac\ud588\ub2e4. 4\ub2e8\uacc4\uc5d0\uc11c\ub294 \ub0b4\uac00 \uc778\uc2dd\ud558\uae30 \ud3b8\ud55c \uae30\uc900\uc73c\ub85c \ubd84\ub9ac\ub97c \ud588\ub2e4. \\n\uc544\uc9c1 \ubd84\ub9ac\ud55c \uae30\uc900\uc5d0 \ub300\ud55c \uadfc\uac70\uac00 \ubaa8\ud638\ud588\uace0, \uc774\uc5d0 \ub300\ud55c \uacf5\ubd80\ub97c \uc870\uae08 \ub354 \ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph Table\\n\\t\\tOrderTable --\x3e TableGroup\\n\\tend\\n\\tsubgraph Order\\n\\t\\tO\\n\\tend\\n O[Order] --\x3e OrderTable\\n\\tsubgraph Menu\\n\\t\\tM[Menu] --\x3e MenuGroup\\n\\t\\tM --\x3e Product\\n\\tend\\n\\tO --\x3e M\\n```\\n\\n\ucd94\uac00\ub85c \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\ub97c \uc704\ud55c \uc9c1\uc811 \uc791\uc131\ud55c `@ServiceTest` \ucee4\uc2a4\ud140 \uc560\ub108\ud14c\uc774\uc158\uc774 \uc788\uc5c8\ub294\ub370, \uc0c1\uc704 \ubaa8\ub4c8\uc758 \ud14c\uc2a4\ud2b8\uc5d0\uc11c \ub9cc\ub4e0 \ud074\ub798\uc2a4\ub97c \ud558\uc704 \ubaa8\ub4c8\uc5d0\uc11c\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c TestFixtures\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud574\uacb0\ud588\ub2e4. \\n\\n### \ub9c8\ubb34\ub9ac\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc758 \ub9c8\uc9c0\ub9c9 \ubbf8\uc158\uc774\ub2c8 \ub9cc\ud07c, \uac00\uc7a5 \ud765\ubbf8\ub85c\uc6b4 \ubbf8\uc158\uc774\uc5c8\uace0 \ubc30\uc6b8\uc810\ub3c4 \ub9ce\uc558\ub358 \uac83 \uac19\ub2e4. \\n\ubc14\uc05c \uae30\uac04\uc774\ub77c \ub9ce\uc740 \ub9ac\ubdf0\ub97c \ub0a8\uae30\uc9c0 \ubabb\ud588\ub358 \ub9ac\ubdf0\uc774 \ud638\uc774\uc5d0\uac8c \ubbf8\uc548\ud558\uace0, \ucf54\uba58\ud2b8 \uaf3c\uaf3c\ud558\uac8c \ub2ec\uc544\uc8fc\uace0 \ubbf8\uc158\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub3c4 \uc624\ud504\ub77c\uc778\uc73c\ub85c \ub9ce\uc774 \ub098\ub208 \ub9ac\ubdf0\uc5b4 \ud14c\uc624\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[\ub3c4\uba54\uc778 \uc6d0\uc815\ub300, \uc6b0\uc544\ucf58 2021](https://www.youtube.com/watch?v=kmUneexSxk0) \\n[\uc6b0\uc544\ud55c\uac1d\uccb4\uc9c0\ud5a5, \uc6b0\uc544\ud55c\ud14c\ud06c\uc138\ubbf8\ub098](https://www.youtube.com/watch?v=dJ5C4qRqAgA) \\n[TestFixtures, \uad8c\ub0a8\ub2d8](https://kwonnam.pe.kr/wiki/gradle/testfixtures)"},{"id":"jdbc-retrospective","metadata":{"permalink":"/jdbc-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-10-Jdbc \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-4/2023-10-10-Jdbc \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-dashboard-jdbc/pull/267","date":"2023-10-10T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 10\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.83,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","slug":"jdbc-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ub808\uac70\uc2dc \ucf54\ub4dc \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud68c\uace0","permalink":"/refactoring-retrospective"},"nextItem":{"title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/mvc-retrospective"}},"content":":::note PR \ub9c1\ud06c\\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/267 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/358 \\n3\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/448 \\n4\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-jdbc/pull/515 \\n:::\\n\\n### Jdbc \uad6c\ud604\\n\\n\uc774\ubc88 \ubbf8\uc158\uc740 Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uad6c\ud604\ud558\uace0, Transaction \uacbd\uacc4 \uc124\uc815\uacfc \ub3d9\uae30\ud654\ud558\ub294 \ubd80\ubd84\uc744 \uad6c\ud604\ud574 \ubcf4\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ubbf8\uc158 \ubaa9\ud45c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n- JDBC \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uad6c\ud604\ud558\uba74\uc11c \uc911\ubcf5\uc744 \uc81c\uac70\ud558\ub294 \uc5f0\uc2b5\uc744 \ud55c\ub2e4.\\n- \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\ub97c \ub192\uc778\ub2e4.\\n\\n\ucd5c\ub300\ud55c Java\uac00 \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub9ac\ud329\ud130\ub9c1 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud588\ub2e4. \\n\\n### JdbcTemplate\\n\\nJdbcTemplate\uc740 Connection\uc744 \uc774\uc6a9\ud558\uc5ec PreparedStatement\ub97c \uc0dd\uc131\ud558\ub294 \ubd80\ubd84, \uadf8\ub9ac\uace0 PreparedStatement\uac00 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ubd84\ub9ac\ud588\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc801\uc808\ud558\uac8c \uc801\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \ube44\uad50\uc801 \uac04\ub2e8\ud558\uac8c \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\uc608\uc804\uc5d0\ub3c4 \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c [JdbcTemplate\uc744 \uad6c\ud604](./custom-jdbc-template)\ud55c \uc801\uc774 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \uc790\uc6d0 \ud560\ub2f9\uacfc \ud574\uc81c \ubd80\ubd84\uc5d0 \ub300\ud55c \uc911\ubcf5\ub3c4 \uc81c\uac70\ud588\ub2e4. \\n\\n```java\\npublic class JdbcTemplate {\\n\\n private static final Logger log = LoggerFactory.getLogger(JdbcTemplate.class);\\n\\n private final DataSource dataSource;\\n private final StatementCreator statementCreator;\\n private final StatementExecutor statementExecutor;\\n\\n public JdbcTemplate(final DataSource dataSource) {\\n this(dataSource, new StatementCreator(), new StatementExecutor());\\n }\\n\\n JdbcTemplate(\\n final DataSource dataSource,\\n final StatementCreator statementCreator,\\n final StatementExecutor statementExecutor\\n ) {\\n this.dataSource = dataSource;\\n this.statementCreator = statementCreator;\\n this.statementExecutor = statementExecutor;\\n }\\n\\n private T query(\\n final String sql,\\n final PreparedStatementCallback preparedStatementCallback,\\n final Object... parameters\\n ) {\\n final Connection connection = DataSourceUtils.getConnection(dataSource);\\n try (final PreparedStatement preparedStatement = statementCreator.create(connection, sql, parameters)) {\\n return preparedStatementCallback.execute(preparedStatement);\\n } catch (final SQLException e) {\\n log.error(e.getMessage(), e);\\n throw new DataAccessException(e);\\n } finally {\\n DataSourceUtils.releaseConnection(connection, dataSource);\\n }\\n }\\n\\n public void update(final String sql, final Object... parameters) {\\n query(sql, PreparedStatement::executeUpdate, parameters);\\n }\\n\\n public Optional queryForObject(final String sql, final RowMapper rowMapper, final Object... parameters) {\\n final List results = query(sql, statement -> statementExecutor.execute(statement, rowMapper), parameters);\\n if (results.size() > 1) {\\n throw new DataAccessException(\\"2\uac1c \uc774\uc0c1\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\");\\n }\\n return results.stream().findAny();\\n }\\n\\n public List queryForList(final String sql, final RowMapper rowMapper, final Object... parameters) {\\n return query(sql, statement -> statementExecutor.execute(statement, rowMapper), parameters);\\n }\\n}\\n```\\n\\n### \ud2b8\ub79c\uc7ad\uc158 \uc801\uc6a9\\n\\n3, 4\ub2e8\uacc4\ub294 \uae30\uc874\uc758 \ucf54\ub4dc\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dc\uc791\ud558\uace0 \ub05d\ub098\ub294 \ubd80\ubd84\uc778 \ud2b8\ub79c\uc7ad\uc158 \uacbd\uacc4\ub97c \uc124\uc815\ud558\uace0 ThreadLocal\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \ub3d9\uae30\ud654(Transaction synchronization)\ub97c \uc801\uc6a9\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158 \ub3d9\uae30\ud654\ub780 \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dc\uc791\ud558\uae30 \uc704\ud55c Connection \uac1d\uccb4\ub97c ThreadLocal\uacfc \uac19\uc740 \uacf5\uac04\uc5d0 \ub530\ub85c \uc800\uc7a5 \ud6c4, \ud544\uc694\ud560 \ub54c \uc800\uc7a5\ub41c Connection\uc744 \uac00\uc838\ub2e4 \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. \\n\uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub294\ub370, ThreadLocal\uc5d0 Connection \uac1d\uccb4\uac00 \uc544\ub2cc, Connection \uac1d\uccb4\uc640 Transaction\uc774 \uc9c4\ud589 \uc911\uc778\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 flag\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \uc800\uc7a5\ud574\uc11c \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tTransactionTemplate --\x3e TransactionManager\\n\\tTransactionManager --\x3e TransactionSynchronizationManager\\n\\tDataSourceUtils --\x3e TransactionSynchronizationManager\\n\\tJdbcTemplate --\x3e DataSourceUtils\\n```\\n\\n### \ub9c8\ubb34\ub9ac\\n\\nJdbc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c AOP\ub098 Transactional\uc5d0 \ub300\ud55c \ud559\uc2b5 \ud14c\uc2a4\ud2b8\ub3c4 \uc9c4\ud589\ud558\uace0, \uc57d\uac04 \uc54c\ucc2c \ubbf8\uc158\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\uaf3c\uaf3c\ud788 \ucf54\ub4dc\ub97c \ubd10\uc900 \ub9ac\ubdf0\uc5b4 \ud638\uc774 \uadf8\ub9ac\uace0 \uc5f0\ud734 \ub3d9\uc548 \uacc4\uc18d \ud2f0\ud0a4\ud0c0\uce74 \ud558\uba74\uc11c \uc7ac\ubc0c\uac8c \ub9ac\ubdf0\ud55c \ubbfc\ud2b8\uc5d0\uac8c \uac10\uc0ac\ud558\ub2e4. \\n\ud68c\uace0 \uc774\ub9cc \ub05d\ub0b4\uace0 \ub9ac\ud329\ud130\ub9c1 \ubbf8\uc158 \ud558\ub7ec\uac00\uc57c\uaca0\ub2e4. \ud83d\ude0a"},{"id":"mvc-retrospective","metadata":{"permalink":"/mvc-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-07-MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-4/2023-10-07-MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-dashboard-mvc/pull/404","date":"2023-10-07T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 7\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.175,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","slug":"mvc-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"Jdbc \ub77c\uc774\ube0c\ub7ec\ub9ac \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/jdbc-retrospective"},"nextItem":{"title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","permalink":"/spring-test-isolation"}},"content":":::note PR \ub9c1\ud06c\\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-mvc/pull/404 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-mvc/pull/465 \\n3\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-mvc/pull/580 \\n:::\\n\\n### MVC \uad6c\ud604\\n\\nReflection\uc744 \uc774\uc6a9\ud558\uc5ec Spring MVC\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ubbf8\uc158\uc758 \ubaa9\ud45c\ub294 \ub2e4\uc74c\uacfc \uac19\uc558\ub2e4.\\n\\n- MVC \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uad6c\ud604\ud558\uba74\uc11c \ub0b4\ubd80 \ub3d9\uc791 \uc6d0\ub9ac\ub97c \ud559\uc2b5\ud55c\ub2e4.\\n- \uc810\uc9c4\uc801\uc778 \ub9ac\ud329\ud1a0\ub9c1\uc744 \uacbd\ud5d8\ud55c\ub2e4.\\n\\n\ubbf8\uc158\uc758 \ubaa9\ud45c\uc640 \ub354\ubd88\uc5b4 \uac01 \ud074\ub798\uc2a4\ub4e4\uc774 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \uc801\uc808\ud788 \uac00\uc9c0\ub3c4\ub85d \ud558\uace0, \ud328\ud0a4\uc9c0\uc758 \uc758\uc874 \ubc29\ud5a5\uc744 \uace0\ubbfc\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac83\uc5d0 \uc911\uc810\uc744 \ub450\uc5c8\ub2e4. \\n\\n### \uc560\ub108\ud14c\uc774\uc158 \uae30\ubc18 \ud504\ub808\uc784\uc6cc\ud06c \ub9cc\ub4e4\uae30\\n\\n\uae30\uc874 \ucf54\ub4dc\uc5d0 ManualHandlerMapping\uc774\ub77c\ub294 \uc11c\ube14\ub9bf\uc744 \uc9c1\uc811 \ub4f1\ub85d\ud574\uc11c \uc0ac\uc6a9\ud558\ub294 HandlerMapping \ud074\ub798\uc2a4\uac00 \uc788\uc5c8\uace0, 1\ub2e8\uacc4\uc5d0\uc11c\ub294 \uc560\ub108\ud14c\uc774\uc158 \uae30\ubc18\uc758 AnnotationHandlerMapping\uc744 \uad6c\ud604\ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 @Controller, @RequestMapping\uc744 Reflection\uc744 \uc774\uc6a9\ud558\uc5ec \uc2a4\uce94\ud558\uace0, \ud578\ub4e4\ub7ec \ub9e4\ud551\uc744 \ub4f1\ub85d\ud558\ub294 \ubd80\ubd84\uae4c\uc9c0 \uc9c4\ud589\ud574\uc57c \ud588\ub2e4. \\n\ud14c\uc624\uac00 @GetMapping\uc774\ub098 @PostMapping \ubd80\ubd84\ub3c4 \uc9c4\ud589\ud558\uba74 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4\uace0 \ud574\uc11c \uac19\uc774 \uc9c4\ud589\ud574 \ubcf4\uc558\ub2e4. \\n\ucd94\uac00\ub85c \ubbf8\uc158 \uc694\uad6c\uc0ac\ud56d\uc740 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ud074\ub798\uc2a4 \ub808\ubca8\uc5d0 \uc801\uc6a9\ub41c @RequestMapping\ub3c4 \ub3d9\uc791\ud558\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\uc558\ub2e4. \\n\\n```mermaid\\ngraph LR\\n AHM[AnnotationHandlerMapping] --\x3e AS[AnnotationScanner]\\n\\tAHM --\x3e HKG[HandlerKeyGenerator] --\x3e HMAP[HttpMappingAnnotationParser]\\n```\\n\\n\ub2e4\uc74c\uacfc \uac19\uc740 Flow\ub85c Handler(\uc2e4\uc81c \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uba54\uc11c\ub4dc) \ub4f1\ub85d\uc744 \uc9c4\ud589\ud55c\ub2e4. \\n\\n1. @Controller\uac00 \uc801\uc6a9\ub41c \ud074\ub798\uc2a4\uc758 \uc815\ubcf4\ub97c \uc2a4\uce94\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4. \\n2. @Controller\uac00 \uc801\uc6a9\ub41c \ud074\ub798\uc2a4\uc758 @RequestMapping\uc774 \uc801\uc6a9\ub41c \uba54\uc11c\ub4dc\ub4e4\uc758 \uc815\ubcf4\ub97c \ubc18\ud658\ud55c\ub2e4. \\n3. \uac01 \uba54\uc11c\ub4dc\ub4e4\uc744 \uc21c\ud68c\ud558\uba70 HandlerKey(uri + httpMethod \uc815\ubcf4)\uc640 HandlerExecution(\uc778\uc2a4\ud134\uc2a4 + \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc)\uc744 \uc0dd\uc131\ud558\uc5ec `Map`\uc5d0 \ucd94\uac00\ud55c\ub2e4. \\n\\nAnnotationHandlerMapping\uc758 initialize \uba54\uc11c\ub4dc\uc5d0\uc11c Handler\ub97c \ub4f1\ub85d\ud55c\ub2e4. \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```java title=AnnotationHandlerMapping\\npublic void initialize() {\\n if (!initialized.compareAndSet(false, true)) {\\n return;\\n }\\n\\n final Map, ControllerInstance> controllers = annotationScanner.scanControllers();\\n final Set methods = annotationScanner.scanHttpMappingMethods(controllers.keySet());\\n for (final Method method : methods) {\\n final ControllerInstance controller = controllers.get(method.getDeclaringClass());\\n final HandlerExecution handlerExecution = new HandlerExecution(controller.getInstance(), method);\\n final List handlerKeys = handlerKeyGenerator.generate(controller.getUriPrefix(), method);\\n handlerKeys.forEach(handlerKey -> handlerExecutions.put(handlerKey, handlerExecution));\\n }\\n\\n log.info(\\"Initialized AnnotationHandlerMapping!\\");\\n handlerExecutions.keySet().forEach(key -> log.info(\\"key: {}, Handler: {}\\", key, handlerExecutions.get(key)));\\n}\\n```\\n\\n### Legacy MVC\uc640 @MVC \ud1b5\ud569\\n\\n2\ub2e8\uacc4\ub294 Legacy MVC\uc640 AnnotationHandlerMapping\uc744 \ud1b5\ud569\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. \\n\uae30\uc874\uc758 MVC\uc640 \uc560\ub108\ud14c\uc774\uc158\uc774 \uc801\uc6a9\ub41c MVC \ub450 \uac1c\ub97c \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5b4\uc57c \ud5c0\ub2e4. \\n\ub300\ub7b5\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n1. DispatcherServlet.service(request, response) \ud638\ucd9c\\n2. HandlerMappings\ub97c \ud1b5\ud574 \uc785\ub825\ubc1b\uc740 request\uc5d0 \ud574\ub2f9\ud558\ub294 Handler \uc870\ud68c\\n3. HandlerAdapters\ub97c \ud1b5\ud574 Handler\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\ub294 HandlerAdapter \uc870\ud68c\\n4. HandlerAdapter\uc758.handle \uba54\uc11c\ub4dc \uc2e4\ud589\\n5. View\uc758 render \ud638\ucd9c\\n\\n```mermaid\\ngraph LR\\n D[DispatcherServlet]\\n D --\x3e HMS[HandlerMappings]\\n D --\x3e HAS[HandlerAdapters]\\n\\n\\tHMS --\x3e HandlerMapping\\n\\tsubgraph HandlerMapping\\n\\t\\tdirection BT\\n\\t\\tAHM[AnnotationHandlerMapping] --\x3e HM[HandlerMapping]\\n\\t\\tMHM[ManualHandlerMapping] --\x3e HM\\n\\tend\\n\\n\\tHAS --\x3e HandlerAdapter\\n\\tsubgraph HandlerAdapter\\n\\t\\tdirection BT\\n\\t\\tHEHA[HandlerExecutionHandlerAdapter] --\x3e HA[HandlerAdapter]\\n\\t\\tCHA[ControllerHandlerAdapter] --\x3e HA\\n\\tend\\n```\\n\\n### \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815\\n\\n\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc1c\uc804 \uacfc\uc815 \ub300\ud55c \uad6c\uad6c\uc758 \uac15\uc758\uac00 \uc788\uc5c8\ub2e4. \\n\uac04\ub2e8\ud558\uac8c \uc815\ub9ac\ud558\uc790\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ud750\ub984\uc73c\ub85c \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ubc1c\uc804\ud588\ub2e4.\\n\\n```mermaid\\ngraph LR\\n WWW --\x3e CGI(Common Gateway Interface) --\x3e Servlet --\x3e JSP --\x3e MVC --\x3e Framework --\x3e Non-Blocking\\n```\\n\\n\ub0b4\uc6a9\uc774 \uae38\uc5b4\uc838\uc11c [\ub2e4\uc74c \ubb38\uc11c](./web-application-evolution)\uc5d0 \uc815\ub9ac\ud588\ub2e4.\\n\\n### \ucd94\uc0c1\uc801\uc778 \uac1c\ub150 \ud559\uc2b5 \ubc29\ubc95\\n\\n\uc9c1\uad00\uc801\uc774\uc9c0 \uc54a\uc740 \ucd94\uc0c1\uc801\uc778 \uac1c\ub150\uc744 \ud559\uc2b5\ud560 \ub54c\ub294 \uac1c\ub150\uc758 \uad6c\ud604\uc744 \ucc38\uace0\ud558\uba74 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub41c\ub2e4\uace0 \ud55c\ub2e4.\\n\\n| \uac1c\ub150 | \uad6c\ud604 |\\n| ---- | ------------------------------------------------ |\\n| OOP | Java |\\n| WAS | Tomcat, Jetty |\\n| IoC | Spring BeanFactory, Servlet Container, Framework |\\n| DI | Spring BeanFactory |\\n\\n### \uc815\ub9ac\\n\\n\uc9c0\uae08\uae4c\uc9c0 \uc2a4\ud504\ub9c1\uc758 DispatcherServlet\uc758 \ub3d9\uc791\uc744 \uc774\ub860\uc801\uc73c\ub85c\ub9cc \uc54c\uace0 \uc788\uc5c8\ub294\ub370, \uc2e4\uc81c\ub85c \uad6c\ud604\ud574 \ubcf4\ub2c8 \uc870\uae08 \ub354 \uc774\ud574\uac00 \uc798 \uac00\ub294 \uac83 \uac19\ub2e4. \\n\uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c \ub098\uc758 \ub9ac\ubdf0\uc5b4\ub294 \ub8e8\uce74, \ub9ac\ubdf0\uc774\ub294 \ud5e4\ub098\uc600\ub2e4. \\n\ub9e4 \ub2e8\uacc4\ub9c8\ub2e4 \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0\ud574 \uc900 \ub8e8\uce74\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\uace0, \ud5e4\ub098\uc5d0\uac8c \uc774\uc0c1\ud55c \ub9ac\ubdf0\ub97c \ub9ce\uc774 \ub0a8\uae34 \uac83 \uac19\uc740\ub370 \uaf3c\uaf3c\ud788 \ubc18\uc601\ud574\uc918\uc11c \uac10\uc0ac\ud558\ub2e4. \\n\uc624\ub7ab\ub3d9\uc548 \uae30\ub2e4\ub824\uc654\ub358 \ub808\ubca8 4 \ubbf8\uc158\uc774 \ud558\ub098\uc529 \ub9c8\ubb34\ub9ac \ub420 \ub54c \ub9c8\ub2e4 \uc544\uc26c\uc6c0\uc774 \ub0a8\ub294\ub2e4."},{"id":"spring-test-isolation","metadata":{"permalink":"/spring-test-isolation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-4/2023-10-03-\ud14c\uc2a4\ud2b8 \uaca9\ub9ac.md","source":"@site/blog/2023-4/2023-10-03-\ud14c\uc2a4\ud2b8 \uaca9\ub9ac.md","title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","description":"\ud14c\uc2a4\ud2b8 \uaca9\ub9ac","date":"2023-10-03T00:00:00.000Z","formattedDate":"2023\ub144 10\uc6d4 3\uc77c","tags":[{"label":"test","permalink":"/tags/test"}],"readingTime":4.315,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","slug":"spring-test-isolation","tags":["test"]},"unlisted":false,"prevItem":{"title":"MVC \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/mvc-retrospective"},"nextItem":{"title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","permalink":"/web-application-evolution"}},"content":"### \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\\n\\n\ud14c\uc2a4\ud2b8\uc758 \uc21c\uc11c\uc5d0 \ub530\ub77c \uc131\uacf5 \uc2e4\ud328 \uc5ec\ubd80\uac00 \uacb0\uc815\ub418\ub294 \ube44\uacb0\uc815\uc801\uc778(non-determinism) \ud14c\uc2a4\ud2b8\uac00 \ub418\uc5b4\uc11c\ub294 \uc548\ub418\uace0, \ud14c\uc2a4\ud2b8\ub294 \ud56d\uc0c1 \uc21c\uc11c\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc218\ud589\ub418\ub3c4\ub85d \ubcf4\uc7a5\ub418\uc5b4\uc57c \ud55c\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uc790\uc6d0\uc758 \uacf5\uc720, \uc678\ubd80 API, \uc2dc\uac04 \ub4f1\uc73c\ub85c \ube44\uacb0\uc815\uc801\uc778 \ud14c\uc2a4\ud2b8\uac00 \ub41c\ub2e4. \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \uc0ac\uc6a9\ud558\uac70\ub098, \ucee8\ud14d\uc2a4\ud2b8\ub97c \uc7ac\uc2e4\ud589\ud558\ub294 `@DirtiesContext`, \uc790\uc6d0\uc744 \ucd08\uae30\ud654\ud558\uae30 \uc704\ud574 \ud14c\uc2a4\ud2b8 \uc774\ud6c4\uc5d0 \ud14c\uc774\ube14\uc744 \ub864\ubc31 \ud558\ub294 `@Transactional`\ub4f1 \ub2e4\uc591\ud55c \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\ud574\ub2f9 \uae00\uc5d0\uc11c\ub294 \uc2a4\ud504\ub9c1\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc790\uc6d0\uc758 \uacf5\uc720\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud574 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\ub97c \uc218\ud589\ud558\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc124\uba85\ud55c\ub2e4. \\n\\n:::note Independent - FIRST\\n\\n\ud14c\uc2a4\ud2b8\ub07c\ub9ac \uc11c\ub85c \uc758\uc874\ud558\uba74 \uc548 \ub41c\ub2e4. \\n\uc11c\ub85c \uc758\uc874\ud558\uac8c \ub41c\ub2e4\uba74 \ud558\ub098\uc758 \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud328\ud560 \ub54c, \ub610 \ub2e4\ub978 \ud558\ub098\uc758 \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud328\ud560 \uc218 \uc788\ub2e4. \\n\ub2e4\ub978 \ud14c\uc2a4\ud2b8\uc5d0 \uc758\uc874\ud558\uc9c0 \uc54a\uace0, \ub3c5\ub9bd\uc801\uc73c\ub85c \uc2e4\ud589 \uac00\ub2a5\ud55c \ud14c\uc2a4\ud2b8\uac00 \uc88b\uc740 \ud14c\uc2a4\ud2b8\ub2e4. \\n\\n:::\\n\\n### TestExecutionListener\\n\\n\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 TextExecutionListner\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 \ud14c\uc2a4\ud2b8 \uc2e4\ud589 \ub2e8\uacc4\uc5d0\uc11c \uc774\ubca4\ud2b8\ub97c \uc218\uc2e0\ud560 \uc218 \uc788\ub2e4. \\n\uc774\ub97c \uc774\uc6a9\ud558\uba74 JUnit\uc758 @BeforeEach\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uacfc \uc720\uc0ac\ud558\uac8c, \ud14c\uc2a4\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30 \uc774\uc804 \ub610\ub294 \uc774\ud6c4\uc5d0 \ud544\uc694\ud55c \uc791\uc5c5\uc744 \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\ub2e4. \\n\\n```java title=TextExecutionListner\\npublic interface TestExecutionListener {\\n default void beforeTestClass(TestContext testContext) throws Exception {}\\n default void prepareTestInstance(TestContext testContext) throws Exception {}\\n default void beforeTestMethod(TestContext testContext) throws Exception {}\\n default void beforeTestExecution(TestContext testContext) throws Exception {}\\n default void afterTestExecution(TestContext testContext) throws Exception {}\\n default void afterTestMethod(TestContext testContext) throws Exception {}\\n default void afterTestClass(TestContext testContext) throws Exception {}\\n}\\n```\\n\\n### AbstractTestExecutionListener \uc0c1\uc18d\ud558\uc5ec \uad6c\ud604\\n\\nAbstractTestExecutionListener\ub97c \uc0c1\uc18d\ubc1b\uc544 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac \ud658\uacbd\uc744 \ub9cc\ub4e4\uc5b4\uc8fc\ub294 \ud074\ub798\uc2a4\ub85c, \uc778\ud130\ud398\uc774\uc2a4\uc778 TextExecutionListner\uc640 \ub2ec\ub9ac Ordered\uac00 \uad6c\ud604\ub418\uc5b4 \uc788\uc5b4 \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\uc544 \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uac00 \uc81c\uacf5\ud558\ub294 \ub9ac\uc2a4\ub108 \ub2e4\uc74c\uc5d0 \uc2e4\ud589\uc2dc\ud0a4\ub3c4\ub85d \ud574\uc900\ub2e4. \\n\ub2e4\uc74c\uacfc \uac19\uc774 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac01\uac01\uc758 \ud14c\uc774\ube14\uc5d0 \ud574\ub2f9\ud558\ub294 Truncate \ucffc\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc870\ud68c\ud558\uace0, Test \uba54\uc11c\ub4dc\uac00 \ub05d\ub0a0\ub54c \ub9c8\ub2e4 \ud574\ub2f9 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uc5ec \ud14c\uc774\ube14\uc744 \ucd08\uae30\ud654\uc2dc\ud0a4\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n\\n```java title=DatabaseCleaner\\n\\npublic class DatabaseCleaner extends AbstractTestExecutionListener {\\n\\n private static final String TRUNCATE_TABLE_QUERY = \\"\\"\\"\\n SELECT Concat(\'TRUNCATE TABLE \', TABLE_NAME, \';\') \\n FROM INFORMATION_SCHEMA.TABLES\\n WHERE TABLE_SCHEMA = \'PUBLIC\'\\n \\"\\"\\";\\n\\n @Override\\n public void afterTestMethod(TestContext testContext) {\\n JdbcTemplate jdbcTemplate = getJdbcTemplate(testContext);\\n List truncateTableQueries = getTruncateTableQueries(jdbcTemplate);\\n truncateTables(jdbcTemplate, truncateTableQueries);\\n }\\n\\n private JdbcTemplate getJdbcTemplate(TestContext testContext) {\\n return testContext.getApplicationContext().getBean(JdbcTemplate.class);\\n }\\n\\n private List getTruncateTableQueries(JdbcTemplate jdbcTemplate) {\\n return jdbcTemplate.queryForList(TRUNCATE_TABLE_QUERY, String.class);\\n }\\n\\n private void truncateTables(JdbcTemplate jdbcTemplate, List truncateTableQueries) {\\n jdbcTemplate.execute(\\"SET REFERENTIAL_INTEGRITY FALSE\\");\\n truncateTableQueries.forEach(jdbcTemplate::execute);\\n jdbcTemplate.execute(\\"SET REFERENTIAL_INTEGRITY TRUE\\");\\n }\\n}\\n\\n```\\n\\n### Listener \ub4f1\ub85d\\n\\n@TestExecutionListeners\ub97c \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uc815\uc758 \ub9ac\uc2a4\ub108\ub97c \ub4f1\ub85d\ud560 \uc218 \uc788\ub2e4. \\nmergeMode\uc758 \uae30\ubcf8\uac12\uc740 REPLACE_DEFAULTS\ub85c \ub9ac\uc2a4\ub108\uac00 \uc774\ubbf8 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0 \ub4f1\ub85d\ub41c \ub9ac\uc2a4\ub108\ub85c \ubcc0\uacbd\ub41c\ub2e4. \\nMERGE_WITH_DEFAULTS\ub85c \uc124\uc815\ud55c\ub2e4\uba74 Ordered \uae30\uc900\uc73c\ub85c \uc21c\uc11c\uac00 \uacb0\uc815\ub41c\ub2e4. \\n\uc774\ud6c4 \uaca9\ub9ac\uac00 \ud544\uc694\ud55c \ud14c\uc2a4\ud2b8\ub4e4\uc740 \ub2e4\uc74c\uc758 \ucd94\uc0c1 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ud558\uc5ec \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4. \\n\\n```java title=AcceptanceTest\\n\\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\\n@TestExecutionListeners(\\n value = DatabaseCleaner.class,\\n mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS\\n)\\npublic abstract class AcceptanceTest {\\n\\n @LocalServerPort\\n private int port;\\n\\n @BeforeEach\\n public void setUp() {\\n RestAssured.port = port;\\n }\\n}\\n\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[The Spring TestExecutionListener, Baeldung](https://www.baeldung.com/spring-testexecutionlistener) \\n[\uc778\uc218\ud14c\uc2a4\ud2b8\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\ud558\uae30, \ud14c\ucf54\ube14](https://tecoble.techcourse.co.kr/post/2020-09-15-test-isolation/) \\n[Eradicating Non-Determinism in Tests, martin fowler](https://martinfowler.com/articles/nonDeterminism.html) \\n[@SpringBootTest\uc758 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac\uc2dc\ud0a4\uae30, MangKyu](https://mangkyu.tistory.com/264)"},{"id":"web-application-evolution","metadata":{"permalink":"/web-application-evolution","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-30-\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815.mdx","source":"@site/blog/2023-3/2023-09-30-\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815.mdx","title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","description":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","date":"2023-09-30T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 30\uc77c","tags":[{"label":"web application","permalink":"/tags/web-application"}],"readingTime":7.5,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","slug":"web-application-evolution","tags":["web application"]},"unlisted":false,"prevItem":{"title":"\uc2a4\ud504\ub9c1 \ud14c\uc2a4\ud2b8 \uaca9\ub9ac","permalink":"/spring-test-isolation"},"nextItem":{"title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","permalink":"/log-async-exception"}},"content":"### \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815\\n\\n\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc1c\uc804 \uacfc\uc815 \ub300\ud55c \uad6c\uad6c\uc758 \uac15\uc758\uac00 \uc788\uc5c8\ub2e4. \\n\uac04\ub2e8\ud558\uac8c \uc815\ub9ac\ud558\uc790\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ud750\ub984\uc73c\ub85c \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ubc1c\uc804\ud588\ub2e4. \\n\uc6d0\ub798 \ud68c\uace0\uc5d0 \uc791\uc131\ud558\ub824\uace0 \ud588\uc9c0\ub9cc, \uc815\ub9ac\ud558\ub2e4 \ubcf4\ub2c8 \uc870\uae08 \uae38\uc5b4\uc838\uc11c \ub530\ub85c \ubd84\ub9ac\ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n WWW --\x3e CGI(Common Gateway Interface) --\x3e Servlet --\x3e JSP --\x3e MVC --\x3e Framework --\x3e Non-Blocking\\n```\\n\\n### WWW(1989)\\n\\n\uc815\uc801 \ud398\uc774\uc9c0\ub97c \uc81c\uacf5\ud558\ub294 \uc6f9 \uc11c\ubc84\ub97c \uc2dc\uc791\uc73c\ub85c \ub3d9\uc801 \ud398\uc774\uc9c0\uac00 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 CGI\uac00 \ub4f1\uc7a5\ud588\ub2e4. \\n\\n### CGI(1993) \\n\\nCGI\ub294 \ub3d9\uc801 \ucf58\ud150\uce20\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud55c \uaddc\uc57d\uc73c\ub85c, \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc774\uc6a9\ud574\uc11c \ub9e4 \uc694\uccad\ub9c8\ub2e4 \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\uc2dc\ucf1c \uc815\ubcf4\ub97c \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. \ud558\uc9c0\ub9cc \ub9e4 \uc694\uccad\ub9c8\ub2e4 \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \uc11c\ubc84\uc5d0 \ub9ce\uc740 \ubd80\ud558\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc774\ub7ec\ud55c \ub2e8\uc810\uc744 \uadf9\ubcf5\ud558\uae30 \uc704\ud574 \ub098\uc628 \uac83\uc774 Servlet\uc774\ub2e4. \\n\\n### Servlet(1996)\\n\\nServlet\uc740 \uc6f9 \uc11c\ubc84\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 \uc790\ubc14 \ud504\ub85c\uadf8\ub7a8\uc73c\ub85c HTTP\ub97c \uc774\uc6a9\ud558\uc5ec \uc6f9 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc744 \uc218\uc2e0\ud558\uace0 \uc751\ub2f5\ud55c\ub2e4. CGI\uc640 \ub2e4\ub974\uac8c \ub9e4 \uc694\uccad\ub9c8\ub2e4 \ud504\ub85c\uc138\uc2a4\uac00 \uc544\ub2cc \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc5ec \uc751\ub2f5\ud55c\ub2e4. \\n\ud558\uc9c0\ub9cc View \uc601\uc5ed\uc758 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uae30 \uc704\ud574 Servlet\uc758 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \uc54c\uc544\uc57c \ud558\ub294 \ub4f1 \ubcf5\uc7a1\ub3c4\uac00 \ub108\ubb34 \ub192\uc558\ub2e4. \ub530\ub77c\uc11c \ud574\ub2f9 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 JSP\uac00 \ub4f1\uc7a5\ud588\ub2e4. \\n\\n### JSP(1999)\\n\\nJSP\ub294 HTML\uc5d0 \uc790\ubc14 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc5ec \ub3d9\uc801 \uc6f9 \ud398\uc774\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\uc220\ub85c, \uc720\uc0ac\ud55c \uae30\uc220\ub85c\ub294 ASP, PHP\uac00 \uc788\ub2e4. \\nJSP\ub9cc \uc0ac\uc6a9\ud558\uc5ec \ud504\ub85c\uadf8\ub798\ubc0d\ud55c\ub2e4\uba74 Model 1, \uc544\ub798 \uad6c\uc131\ub3c4\uc640 \uac19\uc774 JSP\uac00 View \uc601\uc5ed\ub9cc \ub2f4\ub2f9\ud55c\ub2e4\uba74 Model 2\ub77c\uace0 \ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: JSP Model 2\\n---\\ngraph LR\\n Client -- Request --\x3e Servlet <-- JDBC --\x3e Database\\n\\tServlet --\x3e Bean\\n\\tServlet --\x3e JSP\\n\\tBean <--\x3e JSP\\n\\tJSP -- Response --\x3e Client\\n```\\n\\n### MVC(2000)\\n\\n\uc704 JSP\uc758 \uad6c\uc131\ub3c4\ub97c \ubcf4\uba74 \ud604\uc7ac MVC\uc640 \ub9e4\uc6b0 \uc720\uc0ac\ud55c\ub370, Govind Seshadri\ub77c\ub294 \uc0ac\ub78c\uc774 JSP Model 2\ub97c MVC \ud328\ud134\uc73c\ub85c \uacf5\uc2dd\ud654\ub97c \uc81c\uc548\ud588\ub2e4. \\n\\n> I provide an in-depth look at how you can gain optimal separation of presentation from content by using the JSP Model 2 architecture. This model can also be seen as a server-side implementation of the popular Model-View-Controller (MVC) design pattern. \\n> Govind Seshadri\\n\\n\uc774\ub54c MVC \ud328\ud134\uc774 \ucc98\uc74c \ud0c4\uc0dd\ud55c \uac83\uc740 \uc544\ub2c8\uace0, \uc11c\ubc84 \uce21 \uad6c\ud604\uc774\ub77c\uace0 \ud558\ub294 \uac83\uc744 \ubcf4\ub2c8 MVC\uac00 \ucc98\uc74c \ub4f1\uc7a5\ud55c \uac74 \uc544\ub2cc \uac83 \uac19\ub2e4. \\n[\ud574\ub2f9 \ubb38\uc11c](https://folk.universitetetioslo.no/trygver/themes/mvc/mvc-index.html)\ub97c \ubcf4\uba74 MVC\ub77c\ub294 \uc6a9\uc5b4\uc758 \ub4f1\uc7a5\uc740 1978\ub144\uc5d0 \ub4f1\uc7a5\ud55c \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. \\n\\n### Spring Framework(2003)\\n\\nSpring\uc740 \ubcf5\uc7a1\ud588\ub358 J2EE\uc744 \ub300\uccb4\ud558\uae30 \uc704\ud574 2003\ub144\uc5d0 \ub4f1\uc7a5\ud588\ub2e4. \\nJ2EE\ub294 \uc6f9 \uae30\ubc18\uc758 \uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\uae30 \uc704\ud55c \ud50c\ub7ab\ud3fc\uc73c\ub85c \uc704\uc5d0\uc11c \uc124\uba85\ud55c Servlet, JSP, EJB \ub4f1\uc758 \uae30\uc220\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \uc774\uc911 EJB\ub77c\ub294 \uae30\uc220\uc774 J2EE\uc758 \ud575\uc2ec \uae30\uc220\uc774\uc5c8\ub294\ub370, \ud574\ub2f9 \uae30\uc220\uc774 \ub9e4\uc6b0 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub9ce\uc558\ub2e4\uace0 \ud55c\ub2e4. \\n2002\ub144\uc5d0 Rod Johnson\uc774 EJB\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 J2EE \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc800\uc220\ud55c `Expert One-to-One J2EE Development`\ub77c\ub294 \ucc45\uc744 \ubc1c\ud589\ud588\uace0, \ucd9c\uac04 \ud6c4 Juergen Hoeller, Yann Caroff\uac00 Rod Johnson\uc5d0\uac8c \uc624\ud508\uc18c\uc2a4 \uc81c\uc548\uc744 \ud558\uc5ec \uc2a4\ud504\ub9c1\uc774 \ud0c4\uc0dd\ud588\ub2e4\uace0 \ud55c\ub2e4. \\n\\n\uc2a4\ud504\ub9c1\uc740 \uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc11c\ube44\uc2a4 \uae30\ub2a5\uc744 POJO\uc5d0 \uc81c\uacf5\ud558\uba70, \uc774 \ub355\ubd84\uc5d0 \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\ub2e4. \\n\\n### WebFlux \uc774\uc804 Servlet 3.0(2009), 3.1(2013)\\n\\nTomcat\uc758 NIO \ub3d9\uc791 \ubc29\uc2dd\uc744 \ubcf4\uba74 Poller\uac00 \uc18c\ucf13 \ucee4\ub125\uc158\uc744 \ub4e4\uace0 \uc788\ub2e4\uac00 \ucc98\ub9ac\uac00 \uac00\ub2a5\ud560 \ub54c \uc2a4\ub808\ub4dc\ub97c \ud560\ub2f9\ud558\ub294 \uc2dd\uc73c\ub85c \ucc98\ub9ac\ub97c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \ud560\ub2f9 \ud6c4 Servlet\uacfc \ud1b5\uc2e0\ud558\ub294 \ubd80\ubd84\uc740 \ube14\ub85c\ud0b9 \ubc29\uc2dd\uc73c\ub85c \uc694\uccad\uc774 \ub05d\ub0a0 \ub54c\uae4c\uc9c0 \uc2a4\ub808\ub4dc\ub97c \uc810\uc720\ud558\uace0 \uc788\uc5c8\uace0, \uc2a4\ub808\ub4dc \uc810\uc720\ub85c \uc778\ud574 \uc694\uccad\uc774 max thread\uc5d0 \ub3c4\ub2ec\ud558\uba74 \uc694\uccad\uc744 \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uadf8\ub798\uc11c \ube44\ub3d9\uae30 \ubc29\uc2dd\uc758 Servlet\uc774 Servlet 3.0\uc5d0 \ub4f1\uc7a5\ud588\ub2e4. \ud558\uc9c0\ub9cc \uc804\ud1b5\uc801\uc778 I/O \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc740 \ube14\ub85c\ud0b9 \ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud588\ub2e4. Servlet 3.1\uc5d0\uc11c \ub17c\ube14\ub85c\ud0b9 I/O\uac00 \ucd94\uac00\ub418\uc5c8\uc9c0\ub9cc, \ub9ce\uc774 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc558\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### Spring WebFlux(2017)\\n\\n\uc801\uc740 \uc218\uc758 \uc2a4\ub808\ub4dc\ub85c \ub3d9\uc2dc\uc131\uc744 \ucc98\ub9ac\ud558\uace0, \uc801\uc740 \ub9ac\uc18c\uc2a4\ub85c \ud655\uc7a5\uc774 \uac00\ub2a5\ud55c \ub17c\ube14\ub85c\ud0b9 \ubc29\uc2dd\uc758 \uc6f9 \uae30\uc220\uc774 \ud544\uc694\ud588\uace0, \uae30\uc874\uc758 Servlet\uc758 \uacbd\uc6b0 \ube44\ub3d9\uae30\ub97c \uc9c0\uc6d0\ud55c\ub2e4 \ud574\ub3c4 \ub3d9\uae30\uc2dd API\ub4e4\uc774 \ub9ce\uc774 \ub0a8\uc544\uc788\uc5c8\uae30 \ub54c\ubb38\uc5d0 \uc774\ub7ec\ud55c Servlet\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294 \uae30\uc220\uc774 \ud544\uc694\ud588\ub2e4. \ub610\ud55c \uae30\uc874\uc5d0 Netty\uc640 \uac19\uc774 \ube44\ub3d9\uae30, \ub17c\ube14\ub85c\ud0b9 \ubc29\uc2dd \uc11c\ubc84\ub85c \uc790\ub9ac\ub97c \uc798 \uc7a1\uc740 \uc11c\ubc84\ub97c \uc704\ud574 Spring WebFlux\uac00 \ub4f1\uc7a5\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub370\uc774\ud130 \uc811\uadfc\uc744 \uc704\ud574 \uc0ac\uc6a9\ud558\ub294 JDBC\uc758 \uacbd\uc6b0 Blocking API\ub77c, Spring Webflux\uc5d0\uc11c\ub294 R2DBC\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\\n### \ub9c8\uce58\uba70\\n\\n\ud574\ub2f9 \uc815\ub9ac \ub0b4\uc6a9\uc758 \uacbd\uc6b0 Async, Non Blocking \uad00\ub828\ub41c \ub0b4\uc6a9\uc744 \uae4a\uac8c \uacf5\ubd80\ud55c \uc801\uc774 \uc5c6\uc5b4\uc11c \uc815\ud655\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\ub2e4. \\n\uadf8\ub798\ub3c4 \uae30\uc220\uc758 \ub4f1\uc7a5 \ubc30\uacbd\uc774\ub098 \uacfc\uc815\uc744 \uc54c\uace0 \uc788\ub2e4\uba74 \uc870\uae08 \ub354 \uae4a\uc774 \uc788\ub294 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0\uc774 \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc1c\uc804 \uacfc\uc815, \uad6c\uad6c \uac15\uc758 \\n[Dynamic Content with CGI, Apache Tutorial](https://httpd.apache.org/docs/trunk/en/howto/cgi.html) \\n[History of Spring and the Spring Framework, Spring](https://docs.spring.io/spring-framework/reference/overview.html#overview-history) \\n[Understanding JavaServer Pages Model 2 architecture, Govind Seshadri](https://www.infoworld.com/article/2076557/understanding-javaserver-pages-model-2-architecture.html) \\n[MVC, XEROX PARC](https://folk.universitetetioslo.no/trygver/themes/mvc/mvc-index.html) \\n[Expert One-to-One J2EE Development, Rod Johnson](https://www.amazon.com/Expert-One-One-Development-without/dp/0764558315) \\n[\ubc30\ub2ec\uc758\ubbfc\uc871 \ucd5c\uc804\ubc29 \uc2dc\uc2a4\ud15c! \u2018\uac00\uac8c\ub178\ucd9c \uc2dc\uc2a4\ud15c\u2019\uc744 \uc18c\uac1c\ud569\ub2c8\ub2e4, \ubc30\ub2ec\uc758\ubbfc\uc871](https://techblog.woowahan.com/2667/) \\n[Asynchronous processing support in Servlet 3.0, Dr. Xinyu Liu](https://www.infoworld.com/article/2077995/java-concurrency-asynchronous-processing-support-in-servlet-3-0.html)\\n[WebFlux Overview, Spring](https://docs.spring.io/spring-framework/reference/web/webflux/new-framework.html)\\n[Spring WebFlux\uc640 Armeria\ub97c \uc774\uc6a9\ud558\uc5ec Microservice\uc5d0 \ud544\uc694\ud55c Reactive + RPC \ub3d9\uc2dc\uc5d0 \uc7a1\uae30, Naver D2](https://d2.naver.com/helloworld/6080222) \\n[Spring WebFlux\ub780 \ubb34\uc5c7\uc77c\uae4c](https://tweety1121.tistory.com/entry/Spring-WebFlux-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C)"},{"id":"log-async-exception","metadata":{"permalink":"/log-async-exception","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac.mdx","source":"@site/blog/2023-3/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac/2023-09-18-\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac.mdx","title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","description":"\ubb38\uc81c \uc0c1\ud669","date":"2023-09-18T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 18\uc77c","tags":[{"label":"async","permalink":"/tags/async"},{"label":"exception","permalink":"/tags/exception"}],"readingTime":3.615,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","slug":"log-async-exception","tags":["async","exception"]},"unlisted":false,"prevItem":{"title":"\uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc1c\uc804 \uacfc\uc815","permalink":"/web-application-evolution"},"nextItem":{"title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/tomcat-retrospective"}},"content":"### \ubb38\uc81c \uc0c1\ud669\\n\\n\ud604\uc7ac \ud2b8\ub9bd\ub4dc\ub85c\uc6b0\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ub418\uace0 \uc788\ub2e4. \ub85c\uadf8\ub97c \ud655\uc778\ud558\ub294 \ub3c4\uc911 `@Async`\uac00 \uc801\uc6a9\ub41c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ub85c\uadf8\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ucd9c\ub825\ub418\uc9c0 \uc54a\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\ud655\uc778\ud574 \ubcf4\ub2c8 Spring\uc758 `@ControllerAdvice` + `@ExceptionHandler`\uc758 \uacbd\uc6b0 \ub3d9\uae30 \uc608\uc678\ub9cc \ucc98\ub9ac\ud558\uace0, \ube44\ub3d9\uae30 \uc608\uc678\ub97c \ucc98\ub9ac\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \ubc1c\uc0dd\ud55c \ubb38\uc81c\uc600\ub2e4. \\n\\n### \ube44\ub3d9\uae30 \uc608\uc678 \ubc1c\uc0dd\uc2dc \ub85c\uae45 \uc124\uc815\\n\\n\uc2a4\ud504\ub9c1 4.1 \ubd80\ud130 \uc81c\uacf5\ub418\ub294 [AsyncUncaughtExceptionHandler](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/interceptor/AsyncUncaughtExceptionHandler.html)\uc758 \uacbd\uc6b0 \ubc18\ud658 \ud0c0\uc785\uc774 void\uc778 \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\ub97c \uc608\uc678 \ucc98\ub9ac\ud558\uae30 \uc27d\ub3c4\ub85d \ub3c4\uc640\uc900\ub2e4. \\n\\n\ub530\ub77c\uc11c AsyncUncaughtExceptionHandler \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud574\uc11c \uc608\uc678\ub97c \ud578\ub4e4\ub9c1\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud588\ub2e4. \\n\uae30\uc874\uc758 \ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac\uc758 \uacbd\uc6b0 \uc608\uc678\uac00 \ubc1c\uc0dd\ud560 \ub54c \uc2e4\ud589 \ud750\ub984\uc744 \ucd94\uc801\ud558\uae30 \uc704\ud574 MDC(Mapped Diagnostic Context)\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4. \\n\ube44\ub3d9\uae30 \uc608\uc678 \ucc98\ub9ac\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\ub85c MDC\uc758 \uc815\ubcf4\ub97c \uac00\uc838\uc640\uc11c \ub85c\uadf8\ub97c \ucd9c\ub825\ud558\ub3c4\ub85d \uc124\uc815\ud588\ub2e4. \\n\\n```java title=AsyncExceptionHandler\\n@Slf4j\\npublic class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {\\n\\n private static final String LOG_FORMAT = \\"[%s] %s\\";\\n\\n @Override\\n public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {\\n log.info(String.format(LOG_FORMAT, MDC.get(REQUEST_ID.key()), throwable.getMessage()), throwable);\\n }\\n}\\n```\\n\\nAsyncExceptionHandler\uc758 \uacbd\uc6b0 AsyncConfigurer\ub97c \uad6c\ud604\ud55c Configuration \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub4f1\ub85d\ud560 \uc218 \uc788\ub2e4. \\ngetAsyncUncaughtExceptionHandler() \uba54\uc11c\ub4dc\ub97c \uc624\ubc84\ub77c\uc774\ub529\ud558\uc5ec AsyncExceptionHandler\ub97c \ubc18\ud658\ud558\ub3c4\ub85d \uc124\uc815\ud558\uba74 \ub41c\ub2e4. \\n\\n```java title=AsyncConfig\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig implements AsyncConfigurer {\\n\\n @Override\\n public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {\\n return new AsyncExceptionHandler();\\n }\\n}\\n```\\n\\n\uc774\uc81c \ube44\ub3d9\uae30 \uc0c1\ud669\uc5d0\uc11c \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 AsyncUncaughtExceptionHandler\uc758 \uad6c\ud604\uccb4\uc778 AsyncExceptionHandler\uac00 \uc608\uc678\ub97c \uc7a1\uc544 \ucc98\ub9ac\ud55c\ub2e4. \\n\\n### MDC \uc815\ubcf4 \uc5f0\ub3d9 \ubb38\uc81c\\n\\n\ube44\ub3d9\uae30 \ucc98\ub9ac\uc758 \uacbd\uc6b0 \ubcc4\ub3c4\uc758 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 ThreadLocal \uae30\ubc18\uc73c\ub85c \ub3d9\uc791\ud558\ub294 MDC\uc758 \uc815\ubcf4\ub97c \uc5bb\uc5b4\uc62c \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\\n![./mdc-null.png](./mdc-null.png)\\n\\n\uc2a4\ud504\ub9c1 4.3 \uc774\uc0c1\ubd80\ud130 \uc81c\uacf5\ub418\ub294 [TaskDecorator](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html)\ub97c \uc774\uc6a9\ud558\uba74 TaskExecutor\ub97c \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ud560 \uc218 \uc788\ub2e4. TaskDecorator\ub97c \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \ud558\ub098 \uc0dd\uc131\ud558\uace0, Task\uac00 \uc2e4\ud589\ub418\uae30 \uc804 MDC\uc758 \uc815\ubcf4\ub97c \ubcf5\uc0ac\ud558\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n\\n```java title=MdcTaskDecorator\\npublic class MdcTaskDecorator implements TaskDecorator {\\n\\n @Override\\n public Runnable decorate(final Runnable runnable) {\\n Map threadContext = MDC.getCopyOfContextMap();\\n return () -> {\\n MDC.setContextMap(threadContext);\\n runnable.run();\\n };\\n }\\n}\\n```\\n\\n\uc0dd\uc131\ud55c Decorator \ud074\ub798\uc2a4\ub97c \uc124\uc815 \ud30c\uc77c\uc5d0 \ub4f1\ub85d\ud574 \uc900\ub2e4.\\n\\n```java title=AsyncConfig\\n@RequiredArgsConstructor\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig implements AsyncConfigurer {\\n\\n private final AsyncConfigurationProperties properties;\\n\\n @Bean\\n public ThreadPoolTaskExecutor taskExecutor() {\\n ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();\\n executor.setCorePoolSize(properties.coreSize());\\n executor.setMaxPoolSize(properties.maxSize());\\n executor.setQueueCapacity(properties.queueCapacity());\\n \\n // highlight-next-line\\n executor.setTaskDecorator(new MdcTaskDecorator());\\n executor.setWaitForTasksToCompleteOnShutdown(true);\\n executor.initialize();\\n return executor;\\n }\\n\\n @Override\\n public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {\\n return new AsyncExceptionHandler();\\n }\\n}\\n```\\n\\n\uc124\uc815 \ud6c4\uc5d0\ub294 \uc815\uc0c1\uc801\uc73c\ub85c MDC\uc5d0 \ub4e4\uc5b4\uac00 \uc788\ub294 UUID\uac00 \ucd9c\ub825\ub418\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4.\\n\\n![./mdc-not-null.png](./mdc-not-null.png)\\n\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[spring async, baeldung](https://www.baeldung.com/spring-async) \\n[@Async will not call by @ControllerAdvice for global exception](https://stackoverflow.com/questions/61885358/async-will-not-call-by-controlleradvice-for-global-exception) \\n[Spring \uc758 \ub3d9\uae30, \ube44\ub3d9\uae30, \ubc30\uce58 \ucc98\ub9ac\uc2dc \ud56d\uc0c1 context \ub97c \uc720\uc9c0\ud558\uace0 \ub85c\uae45\ud558\uae30, \uac15\ub0a8\uc5b8\ub2c8](https://blog.gangnamunni.com/post/mdc-context-task-decorator/) \\n[TaskDecorator, Spring docs](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html) \\n[AsyncUncaughtExceptionHandler](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/interceptor/AsyncUncaughtExceptionHandler.html)"},{"id":"tomcat-retrospective","metadata":{"permalink":"/tomcat-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-11-\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-3/2023-09-11-\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","description":"1, 2\ub2e8\uacc4//github.com/woowacourse/jwp-dashboard-http/pull/302","date":"2023-09-11T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 11\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":12.345,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","slug":"tomcat-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ube44\ub3d9\uae30 \uc608\uc678 \ub85c\uae45","permalink":"/log-async-exception"},"nextItem":{"title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","permalink":"/performance-test-type"}},"content":":::note PR \ub9c1\ud06c \\n1, 2\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-http/pull/302 \\n3, 4\ub2e8\uacc4: https://github.com/woowacourse/jwp-dashboard-http/pull/431\\n:::\\n\\n### \ud1b0\ucea3 \uad6c\ud604\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c0\uc6d0\ud560 \ub54c \uac1d\uccb4\uc9c0\ud5a5\uacfc \uad00\ub828\ub41c \ubbf8\uc158\ub3c4 \uae30\ub300\ub97c \ub9ce\uc774 \ud588\uc9c0\ub9cc \ub808\ubca8 4\uc5d0 \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc774 \uc815\ub9d0 \ud558\uace0 \uc2f6\uc5c8\ub2e4. \\n\uadf8\ub798\uc11c \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc744\uae4c\ub77c\ub294 \uac71\uc815 \ubc18, \ubbf8\uc158\uc5d0 \ub300\ud55c \uae30\ub300 \ubc18\uc73c\ub85c \ubd80\ud47c \ub9c8\uc74c\uc744 \uac00\uc9c0\uace0 \ubbf8\uc158\uc744 \uc2dc\uc791\ud588\ub358 \uac83 \uac19\ub2e4. \\n\\n\uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc801\uc808\ud558\uac8c \ucd94\uc0c1\ud654\ud558\uace0, \ubbf8\uc158\uc758 \ubcf8\uc9c8\uc744 \uc774\ud574\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158\uc740 [RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616/)\uc5d0 \uba85\uc2dc\ub41c \uc2a4\ud399(\uc644\ubcbd\ud558\uc9c0 \uc54a\uc9c0\ub9cc \ubbf8\uc158\uc5d0\uc11c \uc8fc\uc5b4\uc9c4 \uc694\uad6c\uc0ac\ud56d\ub9cc \ub9cc\uc871\ud558\ub3c4\ub85d)\uc73c\ub85c \uc694\uccad\uc744 \ubc1b\uc544 \ucc98\ub9ac \ud6c4 \ubc18\ud658\ud558\ub294\ub370 \uc9d1\uc911\ud588\ub2e4. \\n\\n### \ub2e4\uc774\uc5b4\uadf8\ub7a8\\n\\nCatalina\ub294 Tomcat\uc758 \uc11c\ube14\ub9bf \ucee8\ud14c\uc774\ub108, Coyote\ub294 HTTP 1.1 \uc6f9 \uc11c\ubc84\ub97c \uc9c0\uc6d0\ud558\ub294 \uad6c\uc131 \uc694\uc18c\ub77c\uace0 \uc0dd\uac01\ud558\uace0 \uc544\ub798\uc640 \uac19\uc774 \uad6c\uc131\ud588\ub2e4. \\n\uc0ac\uc2e4 \ub0b4\ubd80 \uad6c\uc870\ub97c \uae4a\uac8c \uacf5\ubd80\ud560 \uc2dc\uac04\uc744 \uac00\uc9c0\uc9c0 \ubabb\ud574\uc11c \uac01 \uad6c\uc131 \uc694\uc18c\uac00 \uc65c \ud574\ub2f9 \uc704\uce58\uc5d0 \uc788\ub294\uc9c0 \uc644\ubcbd\ud558\uac8c \uc124\uba85\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc774\uac74 \uc5ec\uae30\uc5d0 \uc788\uc73c\uba74 \uc88b\uc744 \uac83 \uac19\uc740\ub370? \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e4\uba74 \uc801\uc808\ud55c \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\uc2dc\ud0a4\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\ub2e4. \\n\ub610\ud55c \uc801\uc808\ud558\uac8c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc744 \ub2e8\ubc29\ud5a5\uc73c\ub85c \ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph coyote\\n\\t\\tHP[Http11Processor] --\x3e A\\n\\t\\tHP --\x3e HttpRequestParser\\n\\t\\tHP --\x3e HttpResponseGenerator\\n\\t\\tA[Adapter]\\n end\\n\\n subgraph catalina\\n\\t\\tRA[RequestAdapter] -.-> A\\n\\t\\tAC[AbstractController] -.-> C[Controller]\\n\\t\\tStaticController -.-> AC\\n\\t\\tSM[SessionManger] -.-> Manager\\n\\t\\tTC[Tomcat] --\x3e RA\\n\\t\\tRA --\x3e C\\n\\t\\tRA --\x3e Manager\\n\\t\\tRA --\x3e RM\\n\\t\\tRM[RequestMapper] --\x3e C\\n end\\n\\n subgraph jwp\\n\\t\\tLC[LoginController] -.-> AC\\n\\t\\tApplication --\x3e TC\\n end\\n\\n```\\n\\n### \ucf54\ub4dc \ub9ac\ubdf0 \\n\\n\ud06c\ub8e8 \uc911 \ud55c \uba85\uc774 \ub098\uc758 \ub9ac\ubdf0\uc5b4\uac00 \ub418\uace0, \ub0b4\uac00 \ub2e4\ub978 \ud06c\ub8e8\uc758 \ub9ac\ubdf0\uc5b4\uac00 \ub418\ub294 \ud615\ud0dc\ub85c \uc9c4\ud589\uc774 \ub418\uc5c8\ub2e4. \\n\ub098\uc758 \ub9ac\ubdf0\uc5b4\ub294 \ub514\ub178, \ub9ac\ubdf0\uc774\ub294 \ud544\ub9bd\uc774\uc5c8\ub2e4. \\n\\n\ub514\ub178(\ub9e4\uc758 \ub208\uc774 \uc544\ub2cc \uacf5\ub8e1\uc758 \ub208?)\uac00 \ub9e4\uc6b0 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud574\uc8fc\uc5b4\uc11c \uc870\uae08 \ub354 \ub098\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc5c8\uace0, \ud544\ub9bd\uc758 \ucf54\ub4dc\uc5d0\uc11c\ub294 \uaf3c\uaf3c\ud558\uac8c \uc608\uc678\ucc98\ub9ac \ud558\ub294 \ubd80\ubd84\uc744 \ubc30\uc6b8 \uc218 \uc788\uc5c8\ub2e4. \\n\ud55c \uac00\uc9c0 \uc544\uc26c\uc6b4 \uc810\uc740 \ud544\ub9bd\uc5d0\uac8c \uc791\uc131\ud55c \ub098\uc758 \ucf54\uba58\ud2b8\ub4e4\uc774 \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uacbd\ud5d8 \uae30\ubc18\uc73c\ub85c \uc791\uc131\ud55c \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uadfc\uac70\uac00 \uc870\uae08 \ubd80\uc871\ud588\uace0, \uc815\ub9ac\ub418\uc9c0 \uc54a\uc740 \ubd80\ubd84\uc774 \ub9ce\uc558\ub358 \uac83 \uac19\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130 \ub9ac\ubdf0\ud560 \ub54c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ud22c\uc790\ud574\uc11c \ub354 \uc88b\uc740 \ub0b4\uc6a9\uc744 \ud06c\ub8e8\ub4e4\uacfc \uacf5\uc720\ud560 \uc218 \uc788\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### SessionConfig\\n\\n\ubbf8\uc158\uc744 \uc9c4\ud589 \uc911 catalina \ud328\ud0a4\uc9c0\uc758 Session \uad00\ub828 \ubd80\ubd84\uc744 \ubcf4\uba74\uc11c \uc911\ubcf5 \ub85c\uc9c1\uc744 \uac1c\uc120\ud574 \ubcfc \uc218 \uc788\uc744 \uac83 \uac19\uc544 [\ucee8\ud2b8\ub9ac\ubdf0\ud2b8](https://github.com/apache/tomcat/pull/660)\ub97c \uc2dc\ub3c4\ud588\ub2e4. \\n\uc138\uc158 \ucfe0\ud0a4\uc758 \uc774\ub984\uc744 \uac00\uc838\uc624\ub294 Util \ud074\ub798\uc2a4\uc758 \ucf54\ub4dc\ub97c \uc218\uc815\ud588\ub294\ub370 \uae30\ubcf8 \uac12\uc740 JSESSIONID \uc9c0\ub9cc \uc124\uc815\uc5d0 \ub530\ub77c\uc11c \uc138\uc158 \ucfe0\ud0a4\uba85\uc744 \ub2e4\ub974\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \ud574\ub2f9 \ub85c\uc9c1\uc774 \uc788\ub294 \uac83\uc73c\ub85c \uc0dd\uac01\ud588\ub2e4. \\n\uae30\uc874\uc758 \ucf54\ub4dc\ub294 \uba85\uc2dc\ub41c \uc8fc\uc11d\uc758 \ub0b4\uc6a9\uacfc \ucf54\ub4dc\uc758 \ud750\ub984\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc544\uc11c \uc57d\uac04 \uc774\ud574\ud558\uae30 \uc5b4\ub824\uc6e0\ub2e4. \\n\\n\ucd08\uae30\uc5d0 \uc694\uccad\ud588\ub358 PR\uc740 \uae30\uc874\uc758 \ucf54\ub4dc\ubcf4\ub2e4 \uc804\uccb4\uc801\uc73c\ub85c \ube44\uad50 \uc5f0\uc0b0\uc744 \ud55c \ubc88 \uc904\uc77c \uc218 \uc788\uc5c8\uace0, context\uac00 null\uc778 \uacbd\uc6b0 \ubc14\ub85c \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud568\uc73c\ub85c\uc368 \uc131\ub2a5 \uac1c\uc120\uc758 \ud6a8\uacfc\uac00 \uc788\uc744 \uac70\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uba54\uc778\ud14c\uc774\ub108\uc778 Mark Thomas \ud615\uc774 \ud574\ub2f9 \ub85c\uc9c1\uc758 \uacbd\uc6b0 \ucef4\ud30c\uc77c\ub7ec\uac00 \ud574\ub2f9 \ubd80\ubd84\uc744 \ucd5c\uc801\ud654 \ud560 \uc218 \uc788\uc744 \uac70\ub77c\uace0 \uae30\ub300\ud55c\ub2e4\uace0 \ud588\uace0, \uac00\ub3c5\uc131\uc744 \uac1c\uc120\uc2dc\ucf1c\ubcf4\ub77c\uace0 \uc870\uc5b8\ud574\uc8fc\uc168\ub2e4. \\n\ucef4\ud30c\uc77c\ub7ec \ucd5c\uc801\ud654\ub294 \uace0\ub824\ud574\ubcf4\uc9c0 \ubabb\ud55c \ubd80\ubd84\uc778\ub370, \uc55e\uc73c\ub85c \ud559\uc2b5\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc0b0\ub354\ubbf8\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n\ub0a8\uaca8\uc900 \ucf54\uba58\ud2b8\uc5d0 \ub530\ub77c \ucd5c\uc885\uc801\uc73c\ub85c\ub294 \uc911\ubcf5\ub41c \ucf54\ub4dc\ub97c \uc904\uc774\ub294 \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc218\uc815\ud588\ub2e4. \\n\uacb0\uacfc\uc801\uc73c\ub85c \uae30\uc874 \ub85c\uc9c1 \ub300\ube44 \ube44\uad50 \uc5f0\uc0b0\uc744 \ud55c \ubc88 \uc904\uc77c \uc218 \uc788\uc5c8\uace0, \uba85\uc2dc\ub41c \uc8fc\uc11d\uc758 \ub0b4\uc6a9\uacfc \uc720\uc0ac\ud55c \ud750\ub984\uc758 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc5ec \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub9ac\ud329\ud130\ub9c1\uc744 \ud588\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\\n\\n\\n```java\\npublic static String getSessionCookieName(Context context) {\\n\\n String result = getConfiguredSessionCookieName(context);\\n\\n if (result == null) {\\n result = DEFAULT_SESSION_COOKIE_NAME;\\n }\\n\\n return result;\\n}\\n\\npublic static String getSessionUriParamName(Context context) {\\n\\n String result = getConfiguredSessionCookieName(context);\\n\\n if (result == null) {\\n result = DEFAULT_SESSION_PARAMETER_NAME;\\n }\\n\\n return result;\\n}\\n\\nprivate static String getConfiguredSessionCookieName(Context context) {\\n\\n // Priority is:\\n // 1. Cookie name defined in context\\n // 2. Cookie name configured for app\\n // 3. Default defined by spec\\n if (context != null) {\\n String cookieName = context.getSessionCookieName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n SessionCookieConfig scc =\\n context.getServletContext().getSessionCookieConfig();\\n cookieName = scc.getName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n }\\n\\n return null;\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\npublic static String getSessionCookieName(Context context) {\\n if (context == null) {\\n return DEFAULT_SESSION_COOKIE_NAME;\\n }\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_COOKIE_NAME);\\n}\\n\\npublic static String getSessionUriParamName(Context context) {\\n if (context == null) {\\n return DEFAULT_SESSION_PARAMETER_NAME;\\n }\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_PARAMETER_NAME);\\n}\\n\\nprivate static String getConfiguredSessionCookieName(Context context, String defaultName) {\\n // Priority is:\\n // 1. Cookie name defined in context\\n // 2. Cookie name configured for app\\n // 3. Default defined by spec\\n String cookieName = context.getSessionCookieName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n SessionCookieConfig scc = context.getServletContext().getSessionCookieConfig();\\n cookieName = scc.getName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n return defaultName;\\n}\\n```\\n\\n\\n\\n\\n```java\\npublic static String getSessionCookieName(Context context) {\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_COOKIE_NAME);\\n}\\n\\npublic static String getSessionUriParamName(Context context) {\\n return getConfiguredSessionCookieName(context, DEFAULT_SESSION_PARAMETER_NAME);\\n}\\n\\nprivate static String getConfiguredSessionCookieName(Context context, String defaultName) {\\n // Priority is:\\n // 1. Cookie name defined in context\\n // 2. Cookie name configured for app\\n // 3. Default defined by spec\\n if (context != null) {\\n String cookieName = context.getSessionCookieName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n\\n SessionCookieConfig scc = context.getServletContext().getSessionCookieConfig();\\n cookieName = scc.getName();\\n if (cookieName != null && cookieName.length() > 0) {\\n return cookieName;\\n }\\n }\\n return defaultName;\\n}\\n```\\n\\n\\n\\n\\n### HTTP \uc218\uc5c5\\n\\n\ubbf8\uc158 \uc911\uac04\uc5d0 \uc9c4\ud589\ub418\uc5c8\ub358 HTTP \uc218\uc5c5\uc5d0\ub294 HTTP\ub97c \uc801\uc808\ud558\uac8c \ud65c\uc6a9\ud558\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574 \ud559\uc2b5\ud588\ub2e4. \\n\ud56d\uc0c1 \uc131\ub2a5 \uac1c\uc120\uc744 \uc704\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub2e8\uc5d0\uc11c \ucd5c\uc801\ud654\ud574\ubcf4\ub824\uace0 \ub178\ub825\uc744 \ud588\uc9c0\ub9cc, \ub354 \uc801\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574\uc11c \ud6a8\uc728\uc801\uc73c\ub85c \uc131\ub2a5\uc744 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c \uc218 \uc788\uc5c8\ub358 \uc218\uc5c5\uc774\uc5c8\ub2e4. \\nHTTP \uc555\ucd95, HTTP \uce90\uc2f1, \ub9ac\uc18c\uc2a4 \ucd5c\uc801\ud654 \uae30\ubc95\uc5d0 \ub300\ud574 \ud559\uc2b5\ud588\ub2e4. \\n\\n\uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c\ub294 \ub2e4\uc74c \uc635\uc158\uc744 \uc124\uc815\ud558\uc5ec http\uc758 \uc1a1\uc218\uc2e0\uc758 \uc555\ucd95\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\ub2e4. \\n\\n```yml\\nserver:\\n compression:\\n enabled: true\\n```\\n\\n\uc218\uc5c5 \uc911 \ud574\ub2f9 \uc555\ucd95 \uc131\ub2a5\uc774 \uc88b\ub2e4\uba74 \uc65c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\uc11c\ub294 \uae30\ubcf8 \uac12\uc73c\ub85c \uc124\uc815\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\uc9c0 \uad81\uae08\ud574\uc84c\ub2e4. \\n\uad81\uae08\uc99d\uc744 \ud574\uc18c\ud558\uc9c0 \ubabb\ud588\ub294\ub370 \ub9d0\ub791\uc774 \uc7a1\ub2f4 \ucc44\ub110\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc740 [issue](https://github.com/spring-projects/spring-boot/issues/21369)\ub97c \ucc3e\uc544\uc8fc\uc5c8\ub2e4. \\n\ub0b4\uc6a9\uc744 \uc694\uc57d\ud574 \ubcf4\uc790\uba74 WAS \ubcc4\ub85c \uc555\ucd95\uc744 \ud558\uae30 \uc704\ud574 \uc124\uc815\ud574\uc57c \ud558\ub294 \uac83\uc774 \ub2e4\ub974\uace0, \ubb34\uc870\uac74 \uc555\ucd95\uc744 \ud558\ub294 \uac83\uc774 \ucd5c\uc801\uc758 \uacbd\uc6b0\uac00 \uc544\ub2d0 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uae30\ubcf8\uac12\uc73c\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 \uac19\ub2e4. \\n\\n> If you\'re developing a public-facing application then it\'s probably likely gzip compression would be worthwhile. If, however, you\'re a microservice application and you\'re in a dataceter, you may well prefer to reduce CPU load because you know you\'ll only be talking to other microservices and you have a reliable gigabit network.\\n\\nPhil Webb \ud615\ub2d8\uc758 \ub9d0\uc5d0 \ub530\ub974\uba74 \uc77c\ubc18\uc801\uc778 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\ub294 \uacbd\uc6b0 gzip \uc555\ucd95\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc9c0\ub9cc, MSA \ud658\uacbd + \ub370\uc774\ud130 \uc13c\ud130\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uc624\uc9c1 \ub2e4\ub978 MSA \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \ud1b5\uc2e0\ud558\uace0, \uace0\uc131\ub2a5 \ub124\ud2b8\uc6cc\ud06c\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0 CPU \ubd80\ud558\ub97c \uc904\uc774\ub294 \uac83\uc774 \uc6b0\uc120\uc2dc \ub420 \uc218\ub3c4 \uc788\ub2e4\ub294 \uac83\uc774\uc5c8\ub2e4. \\n\\n\uc774\uc678\uc5d0\ub3c4 \uc758\ub3c4\ud558\uc9c0 \uc54a\uc740 \uce90\uc2f1\uc744 \ub9c9\uae30 \uc704\ud574 \ud734\ub9ac\uc2a4\ud2f1 \uce90\uc2f1\uc744 \uc81c\uac70\ud558\uac70\ub098, \uac1c\uc778 \uc815\ubcf4 \uc720\ucd9c\uc744 \ub9c9\uae30 \uc704\ud574 \uc751\ub2f5 \ud5e4\ub354\uc5d0 private\uc744 \uc124\uc815, ETag\ub3c4 \ud559\uc2b5\ud588\ub2e4. \\n\\n:::note ETag\\nETag HTTP \uc751\ub2f5 \ud5e4\ub354\ub294 \ud2b9\uc815 \ubc84\uc804\uc758 \ub9ac\uc18c\uc2a4\ub97c \uc2dd\ubcc4\ud558\ub294 \uc2dd\ubcc4\uc790\ub2e4. \\n\uc6f9 \uc11c\ubc84\uac00 \ub0b4\uc6a9\uc744 \ud655\uc778\ud558\uace0 \ubcc0\ud558\uc9c0 \uc54a\uc558\uc73c\uba74, \uc6f9 \uc11c\ubc84\ub85c full \uc694\uccad\uc744 \ubcf4\ub0b4\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0, \uce90\uc2dc\uac00 \ub354 \ud6a8\uc728\uc801\uc774\uac8c \ub41c\ub2e4. \\nMDN\\n:::\\n\\n### Thread \uc218\uc5c5\\n\\n\uc2a4\ub808\ub4dc\uc5d0 \ub300\ud55c \uc218\uc5c5\uc744 \ub4e4\uc5c8\uc9c0\ub9cc, \ubcf5\uc7a1\ud55c \ub0b4\uc6a9\ub3c4 \uc6cc\ub099 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0 \uc124\uba85\ud558\ub77c\uace0 \ud558\uba74 \uc798 \ubabb\ud560 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e0\ub2e4. \\n\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8, \ubbf8\uc158, \ud14c\ucf54\ud1a1 \uc900\ube44\ub97c \ubcd1\ud589\ud574\uc57c \ud574\uc11c \uc138\ubd80\uc801\uc778 \ub0b4\uc6a9\uc740 \uc2dc\uac04 \ub0a0 \ub54c \ubcf5\uc2b5\ud558\ub824\uace0 \ud55c\ub2e4. \\n\\n\uc2a4\ub808\ub4dc\ub97c \uc774\ud574\ud558\uace0, WAS\uc5d0 \uc2a4\ub808\ub4dc \uc124\uc815 \uad00\ub828\ud55c \uc2e4\uc2b5\uc774 \uc788\uc5c8\ub294\ub370 \ud14c\uc624\uc640 \uac19\uc774 1\uc2dc\uac04 \uc815\ub3c4 \ud398\uc5b4\ub85c Thread \uc2e4\uc2b5\uc744 \uc9c4\ud589\ud574 \ubcf4\uc558\ub2e4. \\n\ud559\uc2b5\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n`threads.max`: Tomcat\uc758 \ucd5c\ub300 \uc2a4\ub808\ub4dc \uac1c\uc218 \\n`max-connections`: Tomcat\uc774 \uc720\uc9c0\ud560 \uc218 \uc788\ub294 \ucd5c\ub300 \ucee4\ub125\uc158 \uac1c\uc218 \\n`accept-count`: \ucd5c\ub300 \uc5f0\uacb0 \uc218\uc5d0 \ub3c4\ub2ec\ud588\uc744 \ub54c \uc5f0\uacb0 \uc694\uccad\uc5d0 \ub300\ud574 \uc6b4\uc601 \uccb4\uc81c\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub300\uae30\uc5f4\uc758 \ucd5c\ub300 \uae38\uc774. \ud574\ub2f9 Queue\uc5d0 \uc694\uccad\uc774 \uc313\uc774\ub294 \uac83\uc740 Tomcat\uc774 \ub354 \uc774\uc0c1 \uc694\uccad\uc744 \ubc1b\uc744 \uc218 \uc5c6\ub2e4\ub294 \ub73b\uc774\ub2e4. accpet-count queue\uc5d0\ub3c4 \uc694\uccad\uc774 \uac00\ub4dd\ucc28\uba74 \uadf8 \uc774\ud6c4\uc5d0 \uc624\ub294 \uc694\uccad\uc740 \uac70\ubd80\ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n C(\\"Client\\") -- request --\x3e ACQ(\\"\uc6b4\uc601\uccb4\uc81c\uc5d0 \uc758\ud574 \uad00\ub9ac\ub418\ub294 Queue \\n size = accept-count\\") --\x3e TCQ(\\"Tomcat Connector\uc5d0 \uc758\ud574 \uad00\ub9ac\ub418\ub294 Queue\\n size = max-connections\\") --\x3e TP(\\"Thread Pool\\n size = threads.max\\")\\n```\\n\\n### \ub9c8\uce58\uba70\\n\\n\uc2dc\uac04\uc740 \ub108\ubb34 \ube60\ub974\uac8c \uac00\uace0 \ud560 \uc77c\uc740 \ub9ce\uc740 \uac83 \uac19\ub2e4. \\n\uc6b0\uc120\uc21c\uc704\ub97c \uc798 \uc815\ud558\uace0 \ud559\uc2b5\uc744 \uc9c4\ud589\ud574\uc57c\uaca0\ub2e4. \\n\ud604\uc7ac \ub370\uc774\ud130 \ub2e4\ub8e8\ub294 \ubd80\ubd84(DB)\uc5d0 \ub300\ud55c \ud559\uc2b5\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\ub2e4. \ud574\ub2f9 \ubd80\ubd84\uc740 \ud14c\ucf54\ud1a1\uc774 \ub05d\ub098\ub294\ub300\ub85c \ucc44\uc6cc\uc57c\uaca0\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616/) \\n[ETag, mdn](https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/ETag) \\n[Apache Tomcat 8 Configuration Reference](https://tomcat.apache.org/tomcat-8.5-doc/config/http.html) \\n[Apache Tomcat Tuning, Terry Cho](https://bcho.tistory.com/788) \\n[maxThreads, maxConnections, acceptCount\ub85c Tomcat \ud29c\ub2dd\ud558\uae30](https://dev-ws.tistory.com/96)"},{"id":"performance-test-type","metadata":{"permalink":"/performance-test-type","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8.mdx","source":"@site/blog/2023-3/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8/2023-09-10-\uc131\ub2a5 \ud14c\uc2a4\ud2b8.mdx","title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","description":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8","date":"2023-09-10T00:00:00.000Z","formattedDate":"2023\ub144 9\uc6d4 10\uc77c","tags":[{"label":"performance test","permalink":"/tags/performance-test"}],"readingTime":5.8,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","slug":"performance-test-type","tags":["performance test"]},"unlisted":false,"prevItem":{"title":"\ud1b0\ucea3 \uad6c\ud604 \ubbf8\uc158 \ud68c\uace0","permalink":"/tomcat-retrospective"},"nextItem":{"title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","permalink":"/db-replication"}},"content":"## \uc131\ub2a5 \ud14c\uc2a4\ud2b8\\n\\nAPI\uc758 \uc694\uccad\uc774 \ub9ce\uc740 \uc0c1\ud669\uc5d0\uc11c \uc11c\ubc84\uac00 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8\\n\\n\uc2dc\uc2a4\ud15c\uc5d0 \ubd80\ud558\uac00 \uac78\ub9ac\uba74 \ubb38\uc81c \uc0c1\ud669\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \\n\ub2e4\uc591\ud55c \uc0c1\ud669\uc5d0 \ub300\ube44\ud574\uc11c \uc131\ub2a5 \ud14c\uc2a4\ud2b8\ub97c \ud574\uc57c\ud55c\ub2e4. \\n\\n![./test.png](./test.png)\\n\\n### \uc2a4\ubaa8\ud06c \ud14c\uc2a4\ud2b8(Smoke Test)\\n\\n\ucd5c\uc18c\ud55c\uc758 \ubd80\ud558\ub97c \uc8fc\uc5b4 \uc2dc\uc2a4\ud15c\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\nVU\ub97c \ucd5c\uc18c\ud55c\uc73c\ub85c \ub450\uace0, \uc9e7\uc740 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \ud14c\uc2a4\ud2b8\ud55c\ub2e4. \\n\ub2e4\ub978 \ud14c\uc2a4\ud2b8\ub97c \uc2dc\uc791\ud558\uae30 \uc804\uc5d0 \uc2a4\ubaa8\ud06c \ud14c\uc2a4\ud2b8\ub97c \ud568\uc73c\ub85c\uc368 \ud14c\uc2a4\ud2b8 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc624\ub958\uac00 \uc5c6\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uace0, \uc131\ub2a5 \uc9c0\ud45c\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \uc218\uc9d1, \ubaa8\ub2c8\ud130\ub9c1 \ub418\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \uac00\uc0c1 \uc0ac\uc6a9\uc790(VU)\\n\uac00\uc0c1 \uc0ac\uc6a9\uc790\ub294 \uc11c\ubc84 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud574 \ud2b9\uc815 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud55c\ub2e4. \\n\uc774\ub294 \ub2e4\ub978 \uac00\uc0c1 \uc0ac\uc6a9\uc790\uc640 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc2e4\ud589\ub418\uba70, \uc5ec\ub7ec \uac00\uc0c1 \uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub3d9\uc2dc \uc5f0\uacb0\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\uc2a4\ub808\ub4dc\ub77c\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. \\n:::\\n\\n### \uc2a4\ud30c\uc774\ud06c \ud14c\uc2a4\ud2b8(Spike Test)\\n\\n\uc0ac\uc6a9\ub7c9\uc774 \uae09\uc99d\ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uc2dc\uc2a4\ud15c\uc774 \uacac\ub514\uace0 \uc131\ub2a5\uc5d0 \ubb38\uc81c\uac00 \uc5c6\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\ud2f0\ucf13 \ubc1c\uae09, \ud560\uc778 \ucfe0\ud3f0 \ubc1c\uae09\uacfc \uac19\uc740 \uc774\ubca4\ud2b8\ub97c \ud558\ub294 \uacbd\uc6b0 \ub300\uaddc\ubaa8 \ud2b8\ub798\ud53d\uc774 \ub4e4\uc5b4\uc628\ub2e4. \\n\uc2a4\ud30c\uc774\ud06c \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \uae09\uc99d\ud558\ub294 \ubd80\ud558 \uc0c1\ud669\uc5d0\uc11c \uc2dc\uc2a4\ud15c\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\uace0, \ubd80\ud558\ub97c \uc798 \ubc84\ud2f0\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n### \ubd80\ud558 \ud14c\uc2a4\ud2b8(Load Test)\\n\\n\ubaa9\ud46f\uac12\uc5d0 \ud574\ub2f9\ub418\ub294 \ubd80\ud558\ub97c \uacac\ub51c \uc218 \uc788\uc744\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\uc77c\ubc18\uc801\uc778 \ubd80\ud558 \uc0c1\ud669\uc5d0\uc11c \uc2dc\uc2a4\ud15c\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8\ub2e4. \\n\ub7a8\ud504\uc5c5 \ub610\ub294 \ubb19\ud46f\uac12\uc5d0 \ud574\ub2f9\ud558\ub294 \ubd80\ud558 \uae30\uac04\ub3d9\uc548 \uc131\ub2a5\uc774 \ubb38\uc81c\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uace0, \uc2dc\uc2a4\ud15c \ubcc0\uacbd \ud6c4\uc5d0\ub3c4 \ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \ub3cc\ub824 \ub3d9\uc77c\ud558\uac8c \ubaa9\ud46f\uac12\uc744 \ucc98\ub9ac\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \ub7a8\ud504 \uc5c5(Ramp-up)\\n\ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574 \uc124\uc815\ud55c \uac00\uc0c1 \uc0ac\uc6a9\uc790 \uc218\uc5d0 \ub3c4\ub2ec\ud558\ub294 \ub370 \uac78\ub9ac\ub294 \uc2dc\uac04\\n:::\\n\\n### \uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8(Stress Test) \\n\\n\uc2dc\uc2a4\ud15c\uc758 \ucd5c\ub300\uce58\uc5d0 \ud574\ub2f9\ub418\ub294 \ubd80\ud558\ub97c \ubc1b\uc558\uc744 \ub54c \uc2dc\uc2a4\ud15c\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\uadf8\ub798\ud504\ub97c \ubd24\uc744 \ub54c \ubd80\ud558 \ud14c\uc2a4\ud2b8\uc640 \uc720\uc0ac\ud55c \ud615\ud0dc\ub85c \ubcf4\uc774\uc9c0\ub9cc, \ubd80\ud558\ub7c9\uc774 \ub2e4\ub974\ub2e4. \\n\uc77c\ubc18\uc801\uc73c\ub85c \ud3c9\uade0\uc801\uc778 \ubaa9\ud46f\uac12 \ub300\ube44 \uc791\uac8c\ub294 50% \uc774\uc0c1, \ud544\uc694\uc758 \uacbd\uc6b0 \uadf8 \uc774\uc0c1\uc73c\ub85c \ubd80\ud558\ub97c \uc900\ub2e4. \\n\uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8\ub294 \ubd80\ud558 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud55c \ud6c4\uc5d0\ub9cc \uc2e4\ud589\ud574\uc57c \ud55c\ub2e4. \ubd80\ud558 \ud14c\uc2a4\ud2b8\uac00 \uc774\ub8e8\uc5b4\uc9c0\uc9c0 \uc54a\uc740 \uc0c1\ud669\uc5d0\uc11c \uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \ubcd1\ubaa9 \uc9c0\uc810\uc774\ub098 \ubb38\uc81c \uc0c1\ud669\uc744 \ucc3e\uae30 \uc5b4\ub824\uc6cc\uc9c4\ub2e4. \\n\ub610\ud55c \ubd80\ud558 \ud14c\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud55c \uc2a4\ud06c\ub9bd\ud2b8\ub97c VU\uac12(\uc2a4\ub808\ub4dc \uc218)\ub9cc \uc218\uc815\ud558\uc5ec \uc7ac\uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\\n### \ub0b4\uad6c \ud14c\uc2a4\ud2b8(Endurance Test) \\n\\n\ud3c9\uade0 \uc0ac\uc6a9\ub960\ub85c \uc77c\uc815 \ubd80\ud558\ub97c \uc9c0\uc18d\uc801\uc73c\ub85c \uc8fc\uba70 \uc2dc\uc2a4\ud15c\uc774 \ubb38\uc81c\ub418\ub294 \uc9c0\uc810\uc744 \ud655\uc778\ud558\ub294 \ud14c\uc2a4\ud2b8 \\n\\n\ud761\uc218 \ud14c\uc2a4\ud2b8(Soak Test)\ub77c\uace0\ub3c4 \ud558\uba70, \uae30\ubcf8\uc801\uc778 \ubd80\ud558 \ud14c\uc2a4\ud2b8\uc758 \ubcc0\ud615\uc774\ub77c\uace0 \ubcfc \uc218 \uc788\ub2e4. \\n\ub2e4\ub978 \ud14c\uc2a4\ud2b8\uc640 \ub2ec\ub9ac \uae34 \uc2dc\uac04\ub3d9\uc548 \ud14c\uc2a4\ud2b8\ub97c \ud558\ub294 \uac83\uc774 \ud2b9\uc9d5\uc774\uba70, \uba54\ubaa8\ub9ac \ub204\uc218 \ubb38\uc81c\uc640 \uac19\uc774 \uc7a5\uc2dc\uac04 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2e4\ud589\ud560 \ub54c \uc2dc\uc2a4\ud15c\uc758 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \ubd80\ubd84\uc744 \ud655\uc778\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4. \\n\\n### \uc911\ub2e8\uc810 \ud14c\uc2a4\ud2b8(Breakpoint Test)\\n\\n\uc784\uacc4 \uc9c0\uc810\uc744 \ucc3e\uae30 \uc704\ud574 \ubd80\ud558\ub97c \uc810\uc9c4\uc801\uc73c\ub85c \uc99d\uac00\uc2dc\ud0a4\uba70 \uc9c4\ud589\ud558\ub294 \ud14c\uc2a4\ud2b8\\n\\n\ubb38\uc81c\ub418\ub294 \ubd80\ubd84\uc744 \ub354 \ube68\ub9ac \ucc3e\uae30 \uc704\ud574 \ub2e4\ub978 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\ud55c \ub2e4\uc74c\uc5d0 \uc911\ub2e8\uc810 \ud14c\uc2a4\ud2b8\ub97c \uc9c4\ud589\ud558\uace0, \uc774 \ub54c \uc810\uc9c4\uc801\uc73c\ub85c \ubd80\ud558\ub97c \ub298\ub824\ub098\uac00\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8\ub97c \uc131\ub2a5 \ud29c\ub2dd\uacfc \ubc18\ubcf5\ud574\uc11c \uc9c4\ud589\ud55c\ub2e4\uba74, \uc2dc\uc2a4\ud15c\uc744 \ub354\uc6b1 \ubc1c\uc804\uc2dc\ud0ac \uc218 \uc788\ub2e4. \\n\ub2e4\ub9cc Auto Scaling\uc774 \uc801\uc6a9\ub41c \ud074\ub77c\uc6b0\ub4dc \ud658\uacbd\uc5d0\uc11c\ub294 \uc9c4\ud589\ud558\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Load test types, k6](https://k6.io/docs/test-types/load-test-types/) \\n\uc790\ubc14 \ucd5c\uc801\ud654 - \ubca4\uc800\ubbfc J. \uc5d0\ubc88\uc2a4, \uc81c\uc784\uc2a4 \uace0\ud504, \ud06c\ub9ac\uc2a4 \ub274\ub79c\ub4dc \\n\uc544\ub9c8\uc874 \uc6f9 \uc11c\ube44\uc2a4 \ubd80\ud558 \ud14c\uc2a4\ud2b8 \uc785\ubb38 - \ub098\uce74\uac00\uc640 \ud0c0\ub8e8\ud558\uce58, \ubaa8\ub9ac\uc2dc\ud0c0 \ucf04"},{"id":"db-replication","metadata":{"permalink":"/db-replication","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-22-DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30.mdx","source":"@site/blog/2023-3/2023-08-22-DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30.mdx","title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","description":"\ubcf5\uc81c(Replication)","date":"2023-08-22T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 22\uc77c","tags":[{"label":"mysql","permalink":"/tags/mysql"},{"label":"replication","permalink":"/tags/replication"}],"readingTime":21,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","slug":"db-replication","tags":["mysql","replication"]},"unlisted":false,"prevItem":{"title":"\uc131\ub2a5 \ud14c\uc2a4\ud2b8 \uc885\ub958","permalink":"/performance-test-type"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","permalink":"/woowacourse-level3-retrospective"}},"content":"## \ubcf5\uc81c(Replication)\\n\\n\ud55c \uc11c\ubc84\uc5d0\uc11c \ub2e4\ub978 \uc11c\ubc84\ub85c \ub370\uc774\ud130\ub97c \ub3d9\uae30\ud654\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4. \\n\uc6d0\ubcf8 \ub370\uc774\ud130\ub97c \uac00\uc9c0\ub294 \uc11c\ubc84\ub97c Primary \ub610\ub294 Source \ub77c\uace0 \ubd80\ub974\uace0, \ubcf5\uc81c\ub41c \ub370\uc774\ud130\ub97c \uac00\uc9c0\ub294 \uc11c\ubc84\ub97c Secondary \ub610\ub294 Replica \ub77c\uace0 \ubd80\ub978\ub2e4. \\n\\n### \ubcf5\uc81c\ub97c \ud558\ub294 \uc774\uc720\\n\\n**1. \uc2a4\ucf00\uc77c \uc544\uc6c3**\\n\\n\uc0ac\uc6a9\uc790\uc758 \ud2b8\ub798\ud53d\uc774 \uc99d\uac00\ud558\ub294 \uacbd\uc6b0, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uac00\ud574\uc9c0\ub294 \ubd80\ud558\ub3c4 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc99d\uac00\ud55c\ub2e4. \\n\uc774\ub97c \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \ubcf5\uc81c\ub97c \ud1b5\ud55c \uc2a4\ucf00\uc77c \uc544\uc6c3\uc744 \uc801\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucffc\ub9ac\ub4e4\uc744 \uac01\uac01\uc758 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c \ubd84\uc0b0 \uc2dc\ud0ac \uc218 \uc788\ub2e4. \\n\\n**2. \ub370\uc774\ud130 \ubc31\uc5c5**\\n\\n\uc2e4\uc81c \uc6b4\uc601\ub418\ub294 \uc11c\ube44\uc2a4\uac00 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 DB\uc5d0\uc11c \ubc31\uc5c5\uc744 \uc9c4\ud589\ud558\ub294 \uacbd\uc6b0, \uc11c\ube44\uc2a4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0 \uc601\ud5a5\uc774 \uac00\uc9c0 \uc54a\ub3c4\ub85d \ubcf5\uc81c\ub97c \ud1b5\ud574 Replica \uc11c\ubc84\ub97c \uad6c\ucd95\ud558\uc5ec, Replica \uc11c\ubc84\uc5d0\uc11c \ubcf5\uc81c\ub97c \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \uc601\ud5a5\uc744 \ucd5c\uc18c\ud654 \ud560 \uc218 \uc788\ub2e4. \\n\\n**3. \ub370\uc774\ud130 \ubd84\uc11d**\\n\\n\ubc31\uc5c5\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \ubcf5\uc7a1\ud558\uace0 \ubb34\uac70\uc6b4 \ubd84\uc11d\uc6a9 \ucffc\ub9ac\uc758 \uc11c\ube44\uc2a4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4. \\n\ub9c8\ucc2c\uac00\uc9c0\ub85c \ubcf5\uc81c\ub97c \uc0ac\uc6a9\ud574 \ubd84\uc11d\uc6a9 \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc744 \ub9cc\ub4e4 \uc218 \uc788\ub2e4. \\n\\n**4. \ub370\uc774\ud130\uc758 \uc9c0\ub9ac\uc801 \ubd84\uc0b0**\\n\\n\ube60\ub978 \uc751\ub2f5\uc744 \uc704\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ubc84\uc5d0 \uac00\uae5d\uac8c \uc11c\ubc84\ub97c \uad6c\uc131\ud558\uac70\ub098, \uace0\uac00\uc6a9\uc131(High Availability)\uc744 \uc704\ud574\uc11c\ub3c4 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ud30c\uc77c \uc704\uce58 \uae30\ubc18 \ubcf5\uc81c\\n\\nMySQL \uc11c\ubc84\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ubcc0\uacbd\uc0ac\ud56d\uc5d0 \ub300\ud55c \ub85c\uadf8 \ud30c\uc77c\uc744 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub77c\uace0 \ud55c\ub2e4. \\n\ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub97c \ud1b5\ud574 \ub370\uc774\ud130 \ubcc0\uacbd, \ud14c\uc774\ube14 \uad6c\uc870 \ubcc0\uacbd, \uacc4\uc815\uc774\ub098 \uad8c\ud55c \ubcc0\uacbd\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc800\uc7a5\ub41c\ub2e4. \\nMySQL\uc758 \ubcf5\uc81c\ub294 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \uae30\ubc18\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 \uc788\ub2e4. \uc774\ub97c Replica \uc11c\ubc84\ub85c \uc804\ub2ec\ud558\uace0 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\ub97c \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud55c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph Replica\\n\\t\\tdirection TB\\n\\t\\tIO[Replication I/O thread] -- save --\x3e RL[Relay Log]\\n\\t\\tSQL[Replication SQL Thread] -- read --\x3e RL\\n\\tend\\n\\n\\tsubgraph Source\\n\\t\\tdirection TB\\n\\t\\tBLD[Binary Log Dump Thread] -- Send Binary Log Dump--\x3e IO\\n\\tend\\n\\n```\\n\\n:::note \uc2a4\ub808\ub4dc\ubcc4 \uc5ed\ud560\\n\\nBinary Log Dump Thread: \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\uc758 \ub0b4\uc6a9\uc744 Replica \uc11c\ubc84\ub85c \uc804\ub2ec \\nReplication I/O Thread: Binary \ub85c\uadf8 \uc774\ubca4\ud2b8\ub97c \uac00\uc838\uc640 \ub85c\uceec \uc11c\ubc84\uc758 \ud30c\uc77c(Relay Log)\ub85c \uc800\uc7a5 \\nReplication SQL Thread: \ub9b4\ub808\uc774 \ub85c\uadf8 \ud30c\uc77c\uc758 \uc774\ubca4\ud2b8\ub97c \uc77d\uace0 \uc2e4\ud589\\n\\n:::\\n\\n### \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ubc29\uc2dd\uc758 \ubb38\uc81c\uc810\\n\\n\ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ubc29\uc2dd\uc740 \uc11c\ubc84\uc5d0 \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \ubcf5\uc81c \ud1a0\ud3f4\ub85c\uc9c0 \ubcc0\uacbd\uc774 \uae4c\ub2e4\ub86d\ub2e4. \\n\ud1a0\ud3f4\ub85c\uc9c0\ub780 \ub124\ud2b8\uc6cc\ud06c\uc758 \uc694\uc18c\ub4e4\uc744 \ubb3c\ub9ac\uc801\uc73c\ub85c \uc5f0\uacb0\ud574 \ub193\uc740 \uac83, \ub610\ub294 \uadf8 \uc5f0\uacb0 \ubc29\uc2dd\uc744 \ub9d0\ud55c\ub2e4.\\n\\n```mermaid\\ngraph TD\\n\\tA[A binary-log:300] --\x3e B[B Binary-log:300]\\n\\tA[A binary-log:300] --\x3e C[C Binary-log:200]\\n```\\n\\n\uc704\uc640 \uac19\uc774 Source \uc11c\ubc84, Replica 2\ub300\uac00 \uc874\uc7ac\ud558\uace0, C \uc11c\ubc84\uc5d0 \ubcf5\uc81c \uc9c0\uc5f0\uc774 \ub418\uc5c8\uc744 \ub54c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\tA[A binary-log:300]\\n\\tB[B Binary-log:300] --\x3e C[C Binary-log:200 \ubb38\uc81c \ubc1c\uc0dd]\\n```\\n\\nA \uc11c\ubc84\uc5d0\uc11c \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 B \uc11c\ubc84\ub97c Source \uc11c\ubc84\ub85c \uc2b9\uaca9\ud558\uace0, C\uc5d0\uac8c \uc870\ud68c \ucffc\ub9ac\ub97c \ubd84\uc0b0\uc2dc\ud0a8\ub2e4. \\n\ud558\uc9c0\ub9cc \uc5ec\uae30\uc11c C \uc11c\ubc84\uc5d0\ub294 A \uc11c\ubc84\uc640 \ub3d9\uae30\ud654\uac00 \uc548\ub418\uc5c8\uc73c\ub2c8 \uc870\ud68c \uc2dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\ub4a4\ub2a6\uac8c B \uc11c\ubc84\uc640 \ub3d9\uae30\ud654\ub97c \ud558\ub824\uace0 \ud574\ub3c4, \uc5b4\ub5a4 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8, \uc5b4\ub5a4 \uc704\uce58\uc640 \ub3d9\uae30\ud654\ud574\uc57c\ud558\ub294\uc9c0 \uc54c\uae30 \uc5b4\ub835\ub2e4. \\n\\n### \uae00\ub85c\ubc8c \ud2b8\ub79c\uc7ad\uc158 \uc544\uc774\ub514(GTID) \uae30\ubc18 \ubcf5\uc81c\\n\\nGTID \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucc38\uc5ec\ud55c \ubaa8\ub4e0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ubc1c\uc0dd\ud55c \uc774\ubca4\ud2b8\uc5d0 \uace0\uc720\ud55c \uc2dd\ubcc4\uac12\uc744 \ubd80\uc5ec\ud55c\ub2e4\uba74, \ub3d9\uae30\ud654\uc5d0 \ub300\ud55c \ubb38\uc81c\ub97c \uac04\ub2e8\ud558\uac8c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4. \\n\uc704\uc758 \uc608\uc2dc\uc640 \uac19\uc774 \ubcf5\uc81c \uc9c0\uc5f0\uacfc \ud568\uaed8 \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud55c\ub2e4\ud574\ub3c4 \ud2b9\uc815 GTID \ubd80\ud130 \ubcf5\uc81c\ub97c \uc7ac\uac1c\ud558\uba74 \ub41c\ub2e4. \\n\\n:::note GTID\\n\ubcf5\uc81c \ud1a0\ud3f4\ub85c\uc9c0\uc5d0 \ucc38\uc5ec\ud55c \ubaa8\ub4e0 \uc11c\ubc84\uc5d0\uc11c \uace0\uc720\ud558\ub3c4\ub85d \uac01 \uc774\ubca4\ud2b8\uc5d0 \ubd80\uc5ec\ub41c \uc2dd\ubcc4\uac12 \\n[source_id]:[transaction_id]\ub85c \uad6c\uc131\ub418\uba70, source_id\ub294 \uc11c\ubc84\ub97c \uc2dd\ubcc4\ud558\uae30 \uc704\ud55c \uac12\uc774\uace0 transaction_id\ub294 \ucee4\ubc0b\ub41c \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dd\ubcc4\ud558\uae30 \uc704\ud55c \uac12\uc73c\ub85c 1\uc529 \uc99d\uac00\ud558\ub294 \ud615\ud0dc\ub85c \ubc1c\uae09\ub41c\ub2e4. \\n:::\\n\\n### \ubcf5\uc81c \ud1a0\ud3f4\ub85c\uc9c0\\n\\n**\uc2f1\uae00 \ub808\ud50c\ub9ac\uce74 \ubcf5\uc81c \uad6c\uc131**\\n\\n\uac00\uc7a5 \uac04\ub2e8\ud55c \uad6c\uc131\uc73c\ub85c \uc81c\uc77c \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294 \ud615\ud0dc\ub2e4. \\nreplica \uc11c\ubc84\ub97c \uc77d\uae30 \uc804\uc6a9, \uc608\ube44 \uc11c\ubc84, \ubc31\uc5c5 \uc6a9\ub3c4\ub85c \ub9ce\uc774 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e S\\n W -- \uc77d\uae30 --\x3e R\\n S[Source] --\x3e R[Replica]\\n```\\n\\n**\uba40\ud2f0 \ub808\ud50c\ub9ac\uce74 \ubcf5\uc81c \uad6c\uc131**\\n\\n2\uac1c\uc758 replica \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\ub294 \ud615\ud0dc\ub2e4. \\n\ud558\ub098\uc758 replica\ub294 \uc608\ube44 \uc6a9\ub3c4\ub85c \ub0a8\uaca8\ub450\ub294 \ud615\ud0dc\ub2e4. \\n\ucd94\ud6c4\uc5d0 \ud2b8\ub798\ud53d\uc774 \uc99d\uac00\ud558\ub294 \uacbd\uc6b0 \uc608\ube44 \uc6a9\ub3c4\uc758 replica\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c \uc77d\uae30 \uc694\uccad\uc758 \ubd80\ud558 \ubd84\uc0b0\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e S\\n W -- \uc77d\uae30 --\x3e R1\\n S[Source] --\x3e R1[Replica1]\\n S --\x3e R2[Replica2]\\n```\\n\\n**\uccb4\uc778 \ubcf5\uc81c \uad6c\uc131**\\n\\nreplica \uc11c\ubc84\uac00 \ub9ce\uc740 \uacbd\uc6b0 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub97c \uc804\ub2ec\ud558\ub294 \uc791\uc5c5 \uc790\uccb4\uac00 \ubd80\ud558\uac00 \ub420 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c 1:M:M \uad6c\uc870\ub85c \uccb4\uc778 \ubcf5\uc81c \uad6c\uc131\uc744 \uace0\ub824\ud560 \uc218 \uc788\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e S\\n W -- \uc77d\uae30 --\x3e R1\\n S[Source] --\x3e R1[Replica1]\\n S --\x3e R2[Replica2]\\n S --\x3e R3[Replica3]\\n\\n R3 --\x3e R3-1[Replica 3-1]\\n R3 --\x3e R3-2[Replica 3-2]\\n\\n B[Batch Server] --\x3e R3-2\\n```\\n\\n**\ub4c0\uc5bc \uc18c\uc2a4 \ubcf5\uc81c \uad6c\uc131**\\n\\n2\uac1c\uc758 MySQL \uc11c\ubc84 \ubaa8\ub450 \uc77d\uae30\uc640 \uc4f0\uae30\uac00 \uac00\ub2a5\ud558\ub3c4\ub85d \ud558\ub294 \uad6c\uc131\uc774\ub2e4. \\n\uac01 \uc11c\ubc84\uc5d0\uc11c \ubcc0\uacbd\ub41c \ub370\uc774\ud130\ub294 \ub2e4\ub978 \uc11c\ubc84\uc5d0 \ubc18\uc601\ub41c\ub2e4. \\n\ubaa9\uc801\uc5d0 \ub530\ub77c ACTIVE-ACTIVE \ud615\ud0dc \ub610\ub294 ACTIVE-PASSIVE \ud615\ud0dc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\nACTIVE-PASSIVE \ud615\ud0dc\uc778 \uacbd\uc6b0 \uc2f1\uae00 \ub808\ud50c\ub9ac\uce74 \ubcf5\uc81c \uad6c\uc131\uacfc \ub3d9\uc77c\ud574\ubcf4\uc774\uc9c0\ub9cc, ACTIVE \uc11c\ubc84\uc5d0\uc11c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uba74 \uc124\uc815\uc758 \ubcc0\uacbd\uc5c6\uc774 PASSIVE \uc11c\ubc84\ub85c \uc4f0\uae30 \uc791\uc5c5\uc744 \uc804\ud658\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc774 \uc7a5\uc810\uc774\ub2e4. \\n\\n```mermaid\\ngraph LR\\n W[Web Server] -- \uc77d\uae30 + \uc4f0\uae30 --\x3e SR1\\n W -- \uc77d\uae30 + \uc4f0\uae30 --\x3e SR2\\n SR1[Source/Replica 1] --\x3e SR2[Source/Replica 2]\\n```\\n\\n:::note ACTIVE-ACTIVE, ACTIVE-PASSIVE\\nACTIVE-ACTIVE: 2\uac1c\uc758 \uc11c\ubc84 \ubaa8\ub450 \uc4f0\uae30 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ud615\ud0dc \\nACTIVE-PASSIVE: \ud558\ub098\uc758 \uc11c\ubc84\uc5d0\uc11c\ub9cc \uc4f0\uae30 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ud615\ud0dc\\n:::\\n\\n**\uba40\ud2f0 \uc18c\uc2a4 \ubcf5\uc81c \uad6c\uc131**\\n\\n\uc5ec\ub7ec\uac1c\uc758 source \uc11c\ubc84\uc640 \ud558\ub098\uc758 replica \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\ub294 \uad6c\uc131\uc774\ub2e4. \\n\uc774\ub294 source \uc11c\ubc84\uc758 \ub370\uc774\ud130\ub97c \ud55c \uacf3\uc5d0 \ubc31\uc5c5\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9, \uc5ec\ub7ec \uc11c\ubc84\uc5d0 \uc874\uc7ac\ud558\ub294 \ub370\uc774\ud130\ub97c \ud1b5\ud569, \uc0e4\ub529\ub418\uc5b4\uc788\ub294 \ud14c\uc774\ube14 \ub370\uc774\ud130\ub97c \ud1b5\ud569\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n S1[Source 1] --\x3e R[Replica]\\n S2[Source 2] --\x3e R\\n```\\n\\n## \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ubc29\uc2dd Replication \uad6c\uc131\ud558\uae30\\n\\nmysql 2\ub300\ub97c \uc774\uc6a9\ud558\uc5ec replication\uc744 \uad6c\uc131\ud558\uace0, spring boot application\uc73c\ub85c source, replica \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc811\uadfc\ud574\ubcf4\ub294 \uc608\uc81c\uc774\ub2e4. \\n[https://github.com/bbiac/db-replication](https://github.com/bbiac/db-replication) \\n\\n### MySQL \ud658\uacbd \uad6c\uc131\\n\\nMySQL \ubc84\uc804\uc740 8.1\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n13306, 13307 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud574\uc11c MySQL \uc11c\ubc84 2\ub300\ub97c \ub744\uc6e0\ub2e4. \\n\ub610\ud55c \uc0ac\uc2e4 IP \ub300\uc5ed\uc73c\ub85c \ud1b5\uc2e0\ud560 \uc218 \uc788\ub3c4\ub85d \ucee4\uc2a4\ud140 \ub124\ud2b8\uc6cc\ud06c\ub97c \ucd94\uac00\ud588\ub2e4. \\n\\n```yml\\nversion: \'3.8\'\\n\\nservices:\\n source:\\n platform: linux/x86_64\\n image: mysql:latest\\n restart: always\\n container_name: mysql-source\\n environment:\\n TZ: \'Asia/Seoul\'\\n MYSQL_DATABASE: \'db\'\\n MYSQL_USER: \'user\'\\n MYSQL_PASSWORD: \'password\'\\n MYSQL_ROOT_PASSWORD: \'password\'\\n ports:\\n - \\"13306:3306\\"\\n volumes:\\n - db-source:/var/lib/mysql\\n - db-source:/var/lib/mysql-files\\n - ./docker/source.cnf:/etc/mysql/my.cnf\\n networks:\\n - mysql_network\\n\\n replica:\\n platform: linux/x86_64\\n image: mysql:latest\\n restart: always\\n container_name: mysql-replica\\n environment:\\n TZ: \'Asia/Seoul\'\\n MYSQL_DATABASE: \'db\'\\n MYSQL_USER: \'user\'\\n MYSQL_PASSWORD: \'password\'\\n MYSQL_ROOT_PASSWORD: \'password\'\\n ports:\\n - \\"13307:3306\\"\\n volumes:\\n - db-replica:/var/lib/mysql\\n - db-replica:/var/lib/mysql-files\\n - ./docker/replica.cnf:/etc/mysql/my.cnf\\n networks:\\n - mysql_network\\n\\nvolumes:\\n db-source:\\n db-replica:\\n\\nnetworks:\\n mysql_network:\\n driver: bridge\\n```\\n\\n\ub610\ud55c source, replica \uac01\uac01 \ub2e4\uc74c\uacfc \uac19\uc774 db \uc124\uc815\uc744 \ud588\ub2e4. \\n\\n| \uc124\uc815 | \uc124\uba85 |\\n| --- | --- |\\n| server_id | \uac01\uac01\uc758 mysql \ub9c8\ub2e4 \uace0\uc720\ud55c \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. |\\n| log_bin | \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ud30c\uc77c \uacbd\ub85c \uc124\uc815\uc73c\ub85c \uc808\ub300\uacbd\ub85c\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 /var/lib/mysql \uc544\ub798 \ud574\ub2f9 log_bin\uc5d0 \uc124\uc815\ub41c \uac12\uc73c\ub85c \ub85c\uadf8\uac00 \uc0dd\uc131\ub41c\ub2e4. |\\n| sync_binlog | N\uac1c\uc758 \ud2b8\ub79c\uc7ad\uc158 \ub2f9 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\ub97c \ub514\uc2a4\ud06c\uc640 \ub3d9\uae30\ud654 \uc791\uc5c5\uc744 \ud558\ub3c4\ub85d \ud55c\ub2e4.\xa01\uc740 \uae30\ubcf8\uac12\uc73c\ub85c \uc548\uc815\uc801\uc774\uc9c0\ub9cc, \uac00\uc7a5 \ub290\ub9ac\ub2e4. |\\n| relay_log | \ub9b4\ub808\uc774 \ub85c\uadf8 \ud30c\uc77c \uacbd\ub85c \uc124\uc815 |\\n| relay_log_purge | \ud544\uc694 \uc5c6\ub294 \ub9b4\ub808\uc774 \ub85c\uadf8 \ud30c\uc77c\uc744 \uc790\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud558\ub294 \uc635\uc158 |\\n| read_only | \uc77d\uae30 \uc804\uc6a9 \uc124\uc815 |\\n| log_replica_updates | Replication SQL Thread\ub85c \uc778\ud574 \uc2e4\ud589\ub418\ub294 \uc815\ubcf4\ub97c \ubc14\uc774\ub108\ub9ac \ub85c\uadf8\uc5d0 \uae30\ub85d \ucd94\ud6c4\uc5d0 \uc18c\uc2a4 \uc11c\ubc84\ub85c \uc2b9\uaca9\ub418\ub294 \uacbd\uc6b0\ub97c \uace0\ub824\ud558\uba74 \uc124\uc815\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. |\\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\\n\\n\\n```cnf title=\\"/docker/source.cnf\\"\\n[mysqld]\\nserver_id=1\\nlog_bin=mysql-bin\\nsync_binlog=1\\n```\\n\\n\\n\\n\\n\\n```cnf title=\\"/docker/replica.cnf\\"\\n[mysqld]\\nserver_id=2\\nrelay_log=mysql-relay-bin\\nrelay_log_purge=ON\\nread_only\\nlog_replica_updates\\n```\\n\\n\\n\\n\\n### \ub3c4\ucee4 \uc2e4\ud589\\n\\ndocker-compose up \uba85\ub839\uc5b4\ub85c docker-compose \uc124\uc815\uc73c\ub85c docker\ub97c \ub744\uc6b4\ub2e4. \\n-d \uc635\uc158\uc744 \ubd99\uc774\uba74 \ubc31\uadf8\ub77c\uc6b4\ub4dc \ubaa8\ub4dc\ub85c \uc2e4\ud589\ub41c\ub2e4. \\n\\n```\\ndocker-compose up -d\\n```\\n\\n### replication slave \uad8c\ud55c \uc124\uc815\\n\\nREPLICATION SLAVE \uad8c\ud55c\uc774 \uc124\uc815\ub418\uc5b4 \uc788\uc5b4\uc57c replica \uc11c\ubc84\uc5d0\uc11c source \uc11c\ubc84\uc5d0 \uc811\uadfc\ud558\uc5ec \ub85c\uadf8\ub97c \uc77d\uc5b4\uc62c \uc218 \uc788\ub2e4. \\nsource \uc11c\ubc84\uc5d0 \uc811\uadfc\ud558\uc5ec user \uacc4\uc815\uc5d0 \ud574\ub2f9 \uad8c\ud55c\uc744 \uc124\uc815\ud574\uc900\ub2e4. \\n\\nSOURCE \uc811\uc18d\\n\\n```bash\\ndocker exec -it mysql-source mysql -u root -p\\n```\\n\\nuser \uacc4\uc815\uc5d0 REPLICATION SLAVE \uad8c\ud55c \ucd94\uac00\\n\\n```mysql\\nGRANT REPLICATION SLAVE ON *.* TO \'user\'@\'%\';\\nFLUSH PRIVILEGES;\\n```\\n\\n### SOURCE DB \uc815\ubcf4 \ud655\uc778\\n\\nreplica \uc124\uc815\uc5d0 \ud544\uc694\ud55c source db\uc758 \ubc14\uc774\ub108\ub9ac \ub85c\uadf8 \ud30c\uc77c\uba85\uacfc Position\uc744 \ud655\uc778\ud55c\ub2e4. \\nPosition \uac12\uc740 \uc2e4\uc81c \ud30c\uc77c\uc758 \ubc14\uc774\ud2b8 \uc218\ub97c \uc758\ubbf8\ud55c\ub2e4. \\n\ud655\uc778\ud55c File(SOURCE_LOG_FILE)\uacfc Position(SOURCE_LOG_POS) \uac12\uc740 replica \uc124\uc815\uc5d0\uc11c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n```mysql\\nSHOW MASTER STATUS;\\n\\n+------------------+----------+--------------+------------------+-------------------+\\n| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |\\n+------------------+----------+--------------+------------------+-------------------+\\n| mysql-bin.000003 | 1082 | | | |\\n+------------------+----------+--------------+------------------+-------------------+\\n```\\n\\n### SOURCE ip \uc8fc\uc18c \ud655\uc778\\n\\ndocker inspect -f \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 \ud574\ub2f9 \ucee8\ud14c\uc774\ub108\uc758 \uc138\ubd80 \uc815\ubcf4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud574 docker-compose \ud30c\uc77c\uc5d0 \uc124\uc815\ud574\ub454 mysql_network\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc0ac\uc124 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \ud655\uc778\ud55c\ub2e4. \\n\\n```bash\\ndocker inspect -f \\"{{with index .NetworkSettings.Networks \\\\\\"db-replication_mysql_network\\\\\\"}}{{.IPAddress}}{{end}}\\" mysql-source\\n```\\n\\nip \uc8fc\uc18c\uac00 \ub098\uc624\uc9c0 \uc54a\ub294 \uacbd\uc6b0 docker inspect mysql-source\ub85c \ud655\uc778\ud55c\ub2e4. \\n\ud655\uc778\ud55c IP\uc8fc\uc18c(SOURCE_HOST) \uac12\uc740 replica \uc124\uc815\uc5d0\uc11c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n### replica mysql \uc811\uc18d\\n\\nsource db\uc5d0 \uc811\uc18d\ud588\ub358 \ubc29\ubc95\uacfc \ub3d9\uc77c\ud558\uac8c replica db\uc5d0 \uc811\uc18d\ud55c\ub2e4. \\n\\n```bash\\ndocker exec -it mysql-replica mysql -u root -p\\n```\\n\\n### replica \uc124\uc815\\n\\n\uc774\uc804\uc5d0 source db\uc5d0\uc11c \uc5bb\uc5c8\ub358 \uc815\ubcf4\ub4e4\uc744 \uc0ac\uc6a9\ud558\uc5ec replica \uc124\uc815\uc744 \uc9c4\ud589\ud55c\ub2e4. \\n\uc2e4\uc81c DB \uc11c\ubc84\uc5d0\uc11c \ubcf5\uc81c\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc73c\ub85c source DB\uc758 \ud30c\uc77c\uc744 \ubcf5\uc81c\ud574\uc57c\ud558\uc9c0\ub9cc \ud604\uc7ac \ubcf5\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ud574\ub2f9 \ubd80\ubd84\uc740 \uc0dd\ub7b5\ud588\ub2e4. \\nSOURCE_HOST, SOURCE_LOG_FILE, SOURCE_LOG_POS \ub97c \uc801\uc808\ud788 \ubcc0\uacbd\ud55c\ub2e4.\\n\\n```mysql\\nSTOP REPLICA;\\n\\nCHANGE REPLICATION SOURCE TO \\nSOURCE_HOST=\'172.29.0.2\', \\nSOURCE_USER=\'user\', \\nSOURCE_PASSWORD=\'password\', \\nSOURCE_LOG_FILE=\'mysql-bin.000001\', \\nSOURCE_LOG_POS=0, \\nGET_SOURCE_PUBLIC_KEY=1;\\n\\nSTART REPLICA;\\n```\\n\\n### \uc124\uc815 \ud655\uc778\\n\\n```mysql\\nSHOW REPLICA STATUS;\\n\\n+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+\\n| Replica_IO_State | Source_Host | Source_User | Source_Port | Connect_Retry | Source_Log_File | Read_Source_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Source_Log_File | Replica_IO_Running | Replica_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Source_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Source_SSL_Allowed | Source_SSL_CA_File | Source_SSL_CA_Path | Source_SSL_Cert | Source_SSL_Cipher | Source_SSL_Key | Seconds_Behind_Source | Source_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Source_Server_Id | Source_UUID | Source_Info_File | SQL_Delay | SQL_Remaining_Delay | Replica_SQL_Running_State | Source_Retry_Count | Source_Bind | Last_IO_Error_Timestamp | Last_SQL_Error_Timestamp | Source_SSL_Crl | Source_SSL_Crlpath | Retrieved_Gtid_Set | Executed_Gtid_Set | Auto_Position | Replicate_Rewrite_DB | Channel_Name | Source_TLS_Version | Source_public_key_path | Get_Source_public_key | Network_Namespace |\\n+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+\\n| Waiting for source to send event | 172.25.0.3 | user | 3306 | 60 | mysql-bin.000003 | 1082 | mysql-relay-bin.000002 | 868 | mysql-bin.000003 | Yes | Yes | | | | | | | 0 | | 0 | 1082 | 1078 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 1 | 5a396b02-41c6-11ee-a56d-0242ac190003 | mysql.slave_master_info | 0 | NULL | Replica has read all relay log; waiting for more updates | 86400 | | | | | | | | 0 | | | | | 1 | |\\n+----------------------------------+-------------+-------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+\\n```\\n\\nReplica_IO_Running, Replica_SQL_Running \uac12\uc774 YES\ub77c\uba74 \uc815\uc0c1\uc801\uc73c\ub85c replication \uad6c\uc131\uc774 \uc644\ub8cc\ub41c \uac83\uc774\ub2e4. \\n\\n\uc124\uc815\uc744 \ub9c8\uce5c \ud6c4 source db\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 create table \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud55c\ub2e4. \\nreplica db\uc5d0 \ub3d9\uc77c\ud55c member table\uc774 \uc0dd\uc131\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\nCREATE TABLE member\\n(\\n id BIGINT PRIMARY KEY AUTO_INCREMENT,\\n name VARCHAR(255)\\n);\\n```\\n\\n## \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub85c DB \uc811\uadfc\ud558\uae30\\n\\n\uc77c\ubc18\uc801\uc778 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 source, \uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158\uc778 \uacbd\uc6b0 replica\ub85c \uc694\uccad\uc774 \uac00\ub3c4\ub85d \uad6c\uc131\ud574\ubcf4\uc790. \\n\\n### Environment \uc124\uc815\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 source, replica\ub85c \uad6c\ubd84\ud558\uc5ec \uc124\uc815\ud55c\ub2e4. \\n\\n```yml title=\\"application.yml\\"\\nspring:\\n datasource:\\n source:\\n username: user\\n password: password\\n driver-class-name: com.mysql.cj.jdbc.Driver\\n jdbc-url: jdbc:mysql://localhost:13306/db\\n replica:\\n username: user\\n password: password\\n driver-class-name: com.mysql.cj.jdbc.Driver\\n jdbc-url: jdbc:mysql://localhost:13307/db\\n```\\n\\n### DataSourceType \uc124\uc815\\n\\n\ub2e8\uc21c \ubb38\uc790\uc5f4\ub85c\ub3c4 \uad6c\ubd84\ud560 \uc218 \uc788\uc9c0\ub9cc, enum\uc744 \uc774\uc6a9\ud574\uc11c \ud2b8\ub79c\uc7ad\uc158\uc744 \uad6c\ubd84\ud558\ub3c4\ub85d \uc0dd\uc131\ud55c\ub2e4. \\nKey\ub294 \ucd94\ud6c4\uc5d0 \ube48 \uc124\uc815\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n```java title=\\"DataSourceType\\"\\npublic enum DataSourceType {\\n SOURCE(SOURCE_NAME),\\n REPLICA(REPLICA_NAME),\\n ;\\n\\n private final String key;\\n\\n DataSourceType(String key) {\\n this.key = key;\\n }\\n\\n public static class Key {\\n public static final String ROUTING_NAME = \\"ROUTING\\";\\n public static final String SOURCE_NAME = \\"SOURCE\\";\\n public static final String REPLICA_NAME = \\"REPLICA\\";\\n }\\n}\\n```\\n\\n### AbstractRoutingDataSource \uc124\uc815\\n\\n\uc2a4\ud504\ub9c1\uc774 \uc9c0\uc6d0\ud574\uc8fc\ub294 AbstractRoutingDataSource\ub97c \uc0c1\uc18d\ubc1b\uc544 \ud2b8\ub79c\uc7ad\uc158\uc758 \uc77d\uae30 \uc5ec\ubd80\uc5d0 \ub530\ub77c \ub2e4\ub978 DataSource\ub97c \ud5a5\ud558\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n\\n\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub294 `Map`\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\uc744 \ubc1b\uc544 \ub370\uc774\ud130 \uc18c\uc2a4\ub97c \uc124\uc815\ud55c\ub2e4. \\n- setDefaultTargetDataSource: \uae30\ubcf8 \ub370\uc774\ud130 \uc18c\uc2a4\ub97c \uc124\uc815\ud55c\ub2e4. \\n- setTargetDataSources: \ub9f5 \ud615\ud0dc\ub85c \ubc1b\uc740 \ub370\uc774\ud130 \uc18c\uc2a4 \uac12\ub4e4\uc744 \uc124\uc815\ud55c\ub2e4. \\n\\ndetermineCurrentLookupKey\ub97c \uc624\ubc84\ub77c\uc774\ub529\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158\uc758 \uc77d\uae30 \uc5ec\ubd80\uc5d0 \ub530\ub77c \ub2e4\ub978 DataSourceType\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \\n- isCurrentTransactionReadOnly() \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \ud2b8\ub79c\uc7ad\uc158\uc774 \uc77d\uae30 \uc804\uc6a9\uc778\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n- DataSourceType\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \uc124\uc815\ud558\uace0, \ubc18\ud658\ud55c \uac12\uc5d0 \ud574\ub2f9\ud558\ub294 \ub370\uc774\ud130 \uc18c\uc2a4\uac00 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n```java title=\\"RoutingDataSource\\"\\npublic class RoutingDataSource extends AbstractRoutingDataSource {\\n\\n private final Logger log = LoggerFactory.getLogger(getClass());\\n\\n public static RoutingDataSource from(Map dataSources) {\\n RoutingDataSource routingDataSource = new RoutingDataSource();\\n routingDataSource.setDefaultTargetDataSource(dataSources.get(DataSourceType.SOURCE));\\n routingDataSource.setTargetDataSources(dataSources);\\n return routingDataSource;\\n }\\n\\n @Override\\n protected Object determineCurrentLookupKey() {\\n boolean readOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();\\n\\n if (readOnly) {\\n log.info(\\"readOnly = true, request to replica\\");\\n return DataSourceType.REPLICA;\\n }\\n log.info(\\"readOnly = false, request to source\\");\\n return DataSourceType.SOURCE;\\n }\\n}\\n```\\n\\n### DataSource \uc124\uc815\\n\\n\uc704\uc5d0\uc11c\ubd80\ud130 \uc21c\uc11c\ub300\ub85c Source, Replica, RoutingDataSource, LazyConnectionDataSourceProxy \uc124\uc815\uc774\ub2e4. \\n\uc2a4\ud504\ub9c1\uc740 \ud2b8\ub79c\uc7ad\uc158 \uc2dc\uc791\uc2dc\uc5d0 \ucee4\ub125\uc158\uc758 \uc0ac\uc6a9\uc5ec\ubd80\uc640 \uc0c1\uad00\uc5c6\uc774 \ucee4\ub125\uc158\uc744 \ud655\ubcf4\ud55c\ub2e4. \\n\ub530\ub77c\uc11c readOnly \ud2b8\ub79c\uc7ad\uc158\uc774 \uc124\uc815\ub41c \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ubbf8\ub9ac \ud655\ubcf4\ub41c \ucee4\ub125\uc158\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 replica db\ub85c \uc694\uccad\uc744 \ud558\uc9c0 \uc54a\uace0 source db\ub85c \uc694\uccad\uc744 \ud55c\ub2e4. \\n\\nTransactionSynchronizationManager.isCurrentTransactionReadOnly() \uba54\uc11c\ub4dc \ud638\ucd9c \uc2dc currentTransactionReadOnly\ub77c\ub294 `ThreadLocal`\uc5d0 \uc124\uc815\ub41c \uac12\uc744 \ubc18\ud658\ud558\ub294\ub370 readOnly \uc124\uc815\uc774 \ub418\uba74 \uc774 \uac12\uc744 true\ub85c \uc124\uc815\ud55c\ub2e4. \ud558\uc9c0\ub9cc determineCurrentLookupKey\ub97c \ud638\ucd9c\ud558\uc5ec key \uac12\uc744 \uac00\uc838\uc624\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc774\ud6c4\uc5d0 \uc124\uc815\ub418\uae30 \ub54c\ubb38\uc5d0 determineCurrentLookupKey \uba54\uc11c\ub4dc\uc5d0\uc11c \ud56d\uc0c1 DataSourceType.SOURCE\uac00 \ubc18\ud658\ub418\uc5b4 source db\ub85c \uc694\uccad\uc744 \ud55c\ub2e4. \\n\\nLazyConnectionDataSourceProxy\ub97c \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc2e4\uc81c DataSource\ub97c \uc0ac\uc6a9\ud558\ub294 \uc2dc\uc810\uc5d0 \ucee4\ub125\uc158\uc744 \ud68d\ub4dd\ud574\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc124\uc815\ud55c\ub300\ub85c replica db\ub85c \uc870\ud68c \uc694\uccad\uc744 \ud55c\ub2e4. \\n\\n```java title=\\"DataSourceConfiguration\\"\\n@Configuration\\npublic class DataSourceConfiguration {\\n\\n @Bean\\n @Qualifier(SOURCE_NAME)\\n @ConfigurationProperties(prefix = \\"spring.datasource.source\\")\\n public DataSource sourceDataSource() {\\n return DataSourceBuilder.create().build();\\n }\\n\\n @Bean\\n @Qualifier(REPLICA_NAME)\\n @ConfigurationProperties(prefix = \\"spring.datasource.replica\\")\\n public DataSource replicaDataSource() {\\n return DataSourceBuilder.create().build();\\n }\\n\\n @Bean\\n @Qualifier(ROUTING_NAME)\\n public DataSource routingDataSource(\\n @Qualifier(SOURCE_NAME) DataSource sourceDataSource,\\n @Qualifier(REPLICA_NAME) DataSource replicaDataSource\\n ) {\\n return RoutingDataSource.from(Map.of(\\n DataSourceType.SOURCE, sourceDataSource,\\n DataSourceType.REPLICA, replicaDataSource\\n ));\\n }\\n\\n @Bean\\n @Primary\\n public DataSource dataSource(\\n @Qualifier(ROUTING_NAME) DataSource routingDataSource\\n ) {\\n return new LazyConnectionDataSourceProxy(routingDataSource);\\n }\\n}\\n```\\n\\n\ucd5c\uc885\uc801\uc73c\ub85c DataSource \ube48\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\uac00 \ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n DSP[LazyConnectionDataSourceProxy] --\x3e RDS[RoutingDataSource]\\n\\tRDS --\x3e S[SourceDataSource]\\n\\tRDS --\x3e R[ReplicaDataSource]\\n```\\n\\n### \ub3d9\uc791 \ud655\uc778\\n\\n\uac04\ub2e8\ud558\uac8c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud574\uc11c \uc124\uc815\ud55c\ub300\ub85c \ub3d9\uc791\uc774 \ub418\ub294\uc9c0 \ud655\uc778\ud574\ubcf4\uc558\ub2e4. \\nsave \uba54\uc11c\ub4dc\uc758 \uacbd\uc6b0 `@Transactional`, findById \uba54\uc11c\ub4dc\uc758 \uacbd\uc6b0 `@Transactional(readOnly = true)`\uac00 \uc124\uc815\ub418\uc5b4\uc788\ub2e4. \\n\ub85c\uadf8\ub97c \ud1b5\ud574 save\uc758 \uacbd\uc6b0 source db\ub85c findById\uc758 \uacbd\uc6b0 replica db\ub85c \uc694\uccad\uc744 \ud558\ub294 \uac83\uc744 \uc54c \uc218 \uc788\ub2e4. \\n\\n```java title=\\"MemberServiceTest\\"\\n@SpringBootTest\\nclass MemberServiceTest {\\n\\n @Autowired\\n private MemberService memberService;\\n\\n @Test\\n void \uc0ac\uc6a9\uc790\ub97c_\uc800\uc7a5\ud55c\ub2e4() {\\n // RoutingDataSource log: readOnly = false\\n memberService.save(\\"bbiac\\");\\n }\\n\\n @Test\\n void \uc0ac\uc6a9\uc790\ub97c_\uc870\ud68c\ud55c\ub2e4() {\\n // RoutingDataSource log: readOnly = true\\n assertThatThrownBy(() -> memberService.findById(MAX_VALUE))\\n .isInstanceOf(NoSuchElementException.class);\\n }\\n}\\n```\\n\\nDB\uc5d0\uc11c\ub294 \ud655\uc778\ud558\ub824\uba74 root \uacc4\uc815\uc73c\ub85c \uc811\uc18d\ud55c \ud6c4 general log\ub97c \ud65c\uc131\ud654 \uc2dc\ud0a8\ub2e4. \\n\\n```sql\\nSET GLOBAL log_output = \'table\';\\nSET GLOBAL general_log = 1;\\n```\\n\\ngeneral log\ub97c \ud65c\uc131\ud654 \ud55c \ud6c4 \uc77d\uae30 \uc804\uc6a9 \uba54\uc11c\ub4dc\ub97c \uc2e4\ud589\ud55c\ub2e4. \\nserver_id, \uc2e4\ud589\ud55c \ucffc\ub9ac\ubb38\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\nSELECT user_host, thread_id, server_id, convert(argument using utf8) FROM mysql.general_log where argument like \'%select%\';\\n\\n+----------------------------+-----------+-----------+-----------------------------------------------------------------------------+\\n| user_host | thread_id | server_id | convert(argument using utf8) |\\n+----------------------------+-----------+-----------+-----------------------------------------------------------------------------+\\n| user[user] @ [172.25.0.1] | 277 | 2 | select m1_0.id,m1_0.name from member m1_0 where m1_0.id=9223372036854775807 |\\n+----------------------------+-----------+-----------+-----------------------------------------------------------------------------+\\n```\\n\\n\ud655\uc778 \ud6c4 general log\ub97c \ube44\ud65c\uc131\ud654 \ud55c \ud6c4 \ube44\ud65c\uc131\ud654 \ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n```sql\\nSET GLOBAL general_log = 0;\\nSHOW VARIABLES LIKE \'%general%\';\\n\\n+------------------+---------------------------------+\\n| Variable_name | Value |\\n+------------------+---------------------------------+\\n| general_log | OFF |\\n| general_log_file | /var/lib/mysql/4b6b9db98290.log |\\n+------------------+---------------------------------+\\n```\\n\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n16\uc7a5 \ubcf5\uc81c, Real MySQL 8.0 - \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Replication, MySQL Docs](https://dev.mysql.com/doc/refman/8.1/en/replication.html) \\n[MySql - Master Slave Replication \uad6c\uc870 \ub9cc\ub4e4\uc5b4\ubcf4\uae30](https://huisam.tistory.com/entry/mysql-replication) \\n[Spring \ub808\ud50c\ub9ac\ucf00\uc774\uc158 \ud2b8\ub79c\uc7ad\uc158 \ucc98\ub9ac \ubc29\uc2dd](https://cheese10yun.github.io/spring-transaction/) \\n[replication-datasource](https://github.com/kwon37xi/replication-datasource) \\n[Simplified Guide to MySQL Replication with Docker Compose](https://www.linkedin.com/pulse/simplified-guide-mysql-replication-docker-compose-rakesh-shekhawat/) \\n[Dockerfile\uc5d0\uc11c \uc790\uc8fc \uc4f0\uc774\ub294 \uba85\ub839\uc5b4](https://www.daleseo.com/dockerfile/) \\n[CHANGE REPLICATION SOURCE TO Statement](https://dev.mysql.com/doc/refman/8.1/en/change-replication-source-to.html) \\n[LazyConnectionDataSourceProxy](https://kwonnam.pe.kr/wiki/springframework/lazyconnectiondatasourceproxy) \\n[\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub808\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud1b5\ud55c \ucffc\ub9ac \uc131\ub2a5 \uac1c\uc120 (feat. Mysql, SpringBoot)](https://hudi.blog/database-replication-with-springboot-and-mysql/) \\n[\ubd80\ud558 \ubd84\uc0b0\uc744 \uc704\ud55c MySQL Replication \uad6c\uc131 \ubc0f \ucffc\ub9ac \uc694\uccad \ubd84\uae30](https://chagokx2.tistory.com/100) \\n[Use Docker Compose, Docker](https://docs.docker.com/get-started/08_using_compose/)"},{"id":"woowacourse-level3-retrospective","metadata":{"permalink":"/woowacourse-level3-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-19-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca83 \ud68c\uace0/2023-08-19-\ub808\ubca8 3 \ud68c\uace0.mdx","source":"@site/blog/2023-3/2023-08-19-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca83 \ud68c\uace0/2023-08-19-\ub808\ubca8 3 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","description":"\ud68c\uace0","date":"2023-08-19T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 19\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.945,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","slug":"woowacourse-level3-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"DB \ubcf5\uc81c, @Transactional\uc5d0 \ub530\ub77c \uc694\uccad \ubd84\ub9ac\ud574\ubcf4\uae30","permalink":"/db-replication"},"nextItem":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","permalink":"/cloudwatch"}},"content":"import logo from \'./logo.png\';\\n\\n### \ud68c\uace0\\n\\n\uc9c0\ub09c 8\uc8fc\ub294 \ub808\ubca8 1, 2 \ub54c\ubcf4\ub2e4 5\ubc30 \uc815\ub3c4 \ube60\ub974\uac8c \uc9c0\ub098\uac04 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub808\ubca8 3\uc5d0\ub294 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc5d0\uc11c\ub3c4, \uae30\uc220 \uc678\uc801\uc778 \ubd80\ubd84\uc5d0\uc11c\ub3c4 \ubd80\uc871\ud568\uc774 \ub9ce\uc774 \ubcf4\uc600\ub358 \uac83 \uac19\ub2e4. \\n\ubd80\uc871\ud55c \ubd80\ubd84\uc744 \uc54c\uc558\uae30\uc5d0, \uc55e\uc73c\ub85c \ub354\uc6b1 \uc131\uc7a5\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ub0b4\uac00 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \ud300\uc6d0\ub4e4\uc774 \uc798 \ubcf4\ucda9\ud574 \uc918\uc11c \ub4e0\ub4e0\ud588\ub2e4. \\n\\n### \uc544\uc26c\uc6b4 \uc810\\n\\n**\ubb38\uc11c\ud654**\\n\\n\uac1c\uc778\uc801\uc73c\ub85c\ub294 \uae30\uc220 \uc678\uc801\uc73c\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ub0b4\uac00 \ud55c \ubd80\ubd84\uc744 \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c, \uc774\ud574\ud558\uae30 \uc27d\uac8c \ubb38\uc11c\ud654\ub97c \ud588\ub354\ub77c\uba74 \ud300\uc6d0\ub4e4\uc5d0\uac8c \ub354\uc6b1 \ub3c4\uc6c0\uc774 \ub418\uc5c8\uc744 \ud150\ub370 \uc774 \ubd80\ubd84\uc5d0 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ud22c\uc790\ud558\uc9c0 \ubabb\ud588\ub358 \ubd80\ubd84\uc5d0\uc11c \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\ubc29\ud559 \uae30\uac04 \ub3d9\uc548 \ubb38\uc11c\ud654\ub97c \ud558\uc9c0 \ubabb\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc778 \ube14\ub85c\uadf8 \uc62c\ub9ac\uba74\uc11c \uc870\uae08 \ub354 \ucc44\uc6cc\ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n**\ub0b4\uac00 \ubabb\ud558\ub294 \ubd80\ubd84\uc774\ub77c\uba74 \uc2dc\uac04\uc744 \ub4e4\uc774\uc790**\\n\\n\uc798 \ubabb\ud558\ub294 \ubd80\ubd84\uc774\ub77c\uba74 \uc2dc\uac04\uc744 \ub4e4\uc5ec\uc11c\ub77c\ub3c4 \uc911\uac04\uc740 \uac00\ub3c4\ub85d \ud574\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub9d0\uc744 \ud558\uae30 \uc804\uc5d0 \uc815\ub9ac\ud574\uc11c \uc758\uacac\uc744 \ub0b4\ub294 \uac83, \ubc1c\ud45c \uc900\ube44, \uac10\uc815 \uc870\uc808 \ub4f1\ub4f1\\n\ubabb\ud558\ub294 \ubd80\ubd84\uc744 \uc778\uc9c0\ud558\uace0, \uac1c\uc120\ud558\uc790. \\n\\n**\ucef4\ud3ec\ud2b8 \uc874 \ubc97\uc5b4\ub098\uae30**\\n\\n\uc870\uae08 \ub354 \ub3c4\uc804\uc801\uc73c\ub85c \ubaa9\ud45c\ub97c \uc7a1\uc558\uc73c\uba74 \uc88b\uc558\uc744 \uac83 \uac19\ub2e4. \\n\ub9e4\ubc88 \uadfc\uac70\ub97c \uac00\uc9c0\uace0 \uae30\uc220\uc744 \ub3c4\uc785\ud558\uace0, \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \uc9c0\uc18d\uc801\uc73c\ub85c \uac1c\uc120\ud558\ub824\uace0 \ud558\ub294 \ubd80\ubd84\uc774 \ub2e4\uc18c \ubd80\uc871\ud588\ub2e4. \\n\\n### \uc88b\uc558\ub358 \uc810\\n\\n**\uc88b\uc558\ub358 \uc810\ub3c4 \ubb38\uc11c\ud654**\\n\\n[\ud300 \ube14\ub85c\uadf8](https://tripdraw.blog)\ub3c4 \uba3c\uc800 \ub3c4\uc785\ud558\uc790\uace0 \uc81c\uc548\ud558\uace0, \ub0b4\uac00 \ud588\ub358 \ubd80\ubd84\uc740 \ubb38\uc11c\ud654\ub97c \uaf64 \ub9ce\uc774 \ud574\uc11c \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubc31\uc5d4\ub4dc \ud06c\ub8e8 4\uba85\uc774\uc11c \uac19\uc774 \ud55c \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c\ub294 \uae30\ub2a5 \uad6c\ud604\ud55c\ub2e4\uace0 \ubb38\uc11c\ud654\uac00 \uc870\uae08 \ubbf8\ud761\ud574\uc11c \ubcf4\ucda9\uc744 \ud574\uc57c\uaca0\ub2e4. \\n\\n**\ub0b4\uac00 \ub514\uc790\uc778\ud55c \ud2b8\ub9bd\ub4dc\ub85c\uc6b0 \ub85c\uace0**\\n\\n\\n\\n\ud2b8\ub9bd\ub4dc\ub85c\uc6b0 \ub85c\uace0\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \\n\ud300\uc6d0\ub4e4\uc774 \ub300\ud45c \uc0c9\uc0c1(\ud30c\ub780\uc0c9)\uc744 \uc815\ud574\uc92c\uace0, \uc8fc\ub9d0 \ub3d9\uc548 \uc2e0\ub098\uac8c \ub85c\uace0 \ub514\uc790\uc778\uc744 \ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc544\ub798\uc758 D \ubd80\ubd84\uc740 \uc720\ud29c\ube0c \uac15\uc758 \ub4e4\uc73c\uba74\uc11c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\uc11c \ubfcc\ub4ef\ud558\ub2e4. \\n\\n**\uae30\uc220 \uc120\ud0dd\uc758 \uc774\uc720**\\n\\n\uae30\uc220\uc758 \ud559\uc2b5 \ube44\uc6a9, \ud604\uc7ac \uad6c\uc870\uc5d0 \uc801\ud569\ud55c\uc9c0, \uc2e4\uc81c \uac00\uc9c0\uace0 \uc788\ub294 \ub9ac\uc18c\uc2a4\ub97c \uace0\ub824\ud574\uc11c \uae30\uc220 \uc120\ud0dd\uc744 \ud558\uace0, \ub3c4\uc785\ud588\ub358 \ubd80\ubd84\uc774 \uc88b\uc558\ub2e4. \\n100% \uc88b\uc740 \uc120\ud0dd\uc77c \uc21c \uc5c6\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \uc120\ud0dd\uc5d0 \ub300\ud55c \uadfc\uac70\uac00 \uc874\uc7ac\ud55c\ub2e4\uba74 \ud655\ub960\uc744 \ub192\ud600\uc8fc\ub294 \uac83 \uac19\ub2e4. \\n\\n### \ub9c8\uce58\uba70\\n\\n\ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0 \uc571\uc774 \uc62c\ub77c\uac00 \uc788\ub294 \uac70 \ub108\ubb34 \uc2e0\uae30\ud558\ub2e4. \\n\uc548\ub4dc\ub85c\uc774\ub4dc \ube0c\ub808\uba58 \uc74c\uc545\ub300(\uba67\ub3fc\uc9c0, \uc218\ub2ec, \ud551\uad6c), \uadf8\ub9ac\uace0 \ubc31\uc5d4\ub4dc \ud300\uc6d0\ub4e4(\uccb4\uc778\uc800, \ud6c4\ucd94, \ub9ac\uc624) \ub108\ubb34 \uace0\uc0dd\uc774 \ub9ce\uc558\ub2e4."},{"id":"cloudwatch","metadata":{"permalink":"/cloudwatch","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md","source":"@site/blog/2023-3/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md","title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","description":"CloudWatch","date":"2023-08-17T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 17\uc77c","tags":[{"label":"cloudwatch","permalink":"/tags/cloudwatch"},{"label":"log","permalink":"/tags/log"},{"label":"monitoring","permalink":"/tags/monitoring"}],"readingTime":5.35,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","slug":"cloudwatch","tags":["cloudwatch","log","monitoring"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 3 \ud68c\uace0","permalink":"/woowacourse-level3-retrospective"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/route-image-async-with-event"}},"content":"## CloudWatch\\n\\nAWS \ub9ac\uc18c\uc2a4\uc640 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc9c0\ud45c\uc640 \ub85c\uadf8\uc5d0 \ub300\ud55c \ubaa8\ub2c8\ud130\ub9c1\uc744 \uc81c\uacf5\ud558\ub294 \uc11c\ube44\uc2a4\ub2e4. \\n\uc9c0\ud45c\ub97c \uac10\uc2dc\ud558\uc5ec \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \uae30\ub2a5\ub3c4 \uc81c\uacf5\ud55c\ub2e4. \\n\ud504\ub9ac\ud2f0\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \ub300\uc2dc\ubcf4\ub4dc\ub2f9 3$/M \uc758 \ube44\uc6a9\uc774 \uccad\uad6c\ub418\uace0, \uc9c0\ud45c\ub098 \ub85c\uadf8\uc758 \uc591\uc5d0 \ub530\ub77c \ube44\uc6a9\uc774 \ucd94\uac00\uc801\uc73c\ub85c \uccad\uad6c\ub41c\ub2e4. \\n\uc694\uae08 \uc815\ubcf4\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub294 [\ub2e4\uc74c \ub9c1\ud06c](https://aws.amazon.com/ko/cloudwatch/pricing/)\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n## CloudWatch Metrics\\n\\n\uae30\ubcf8\uc801\uc73c\ub85c 5\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc218\uc9d1\ub41c\ub2e4. \\n\uc138\ubd80 \ubaa8\ub2c8\ud130\ub9c1(Detailed Monitoring)\uc744 \ud65c\uc131\ud654\ud558\uba74 1\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\ub97c \uc218\uc9d1\ud55c\ub2e4. \\n\ub300\uc2dc\ubcf4\ub4dc\uc5d0\uc11c InstanceId\ub85c \uac80\uc0c9\ud558\uc5ec \uc218\uc9d1\ub41c \uc9c0\ud45c\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.\\n\\n![./cloudwatch1.png](./cloudwatch1.png)\\n\\nCPUUtilization, NetworkIn, NetworkOut\uacfc \uac19\uc740 \uae30\ubcf8\uc801\uc778 \uc9c0\ud45c\ub97c \uc81c\uacf5\ud558\uace0, \uba54\ubaa8\ub9ac, \ub514\uc2a4\ud06c \uacf5\uac04\uacfc \uac19\uc740 \uc9c0\ud45c\ub97c \ud655\uc778\ud558\ub824\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\ub97c \uc124\uc815\ud574\uc57c \ud55c\ub2e4.\\n\\n## CloudWatch Agent \uc124\uce58\\n\\nCloudWatch Agent \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\uc640 \ub85c\uadf8\ub97c \uc218\uc9d1\ud560 \uc218 \uc788\ub2e4. \\n\\n### IAM \uc5ed\ud560 \uc124\uc815\\n\\n\uae30\ubcf8\uc801\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4\uac00 CloudWatchAgentServerPolicy\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4. \\nIAM \u2192 \uc5ed\ud560\uc5d0\uc11c \uc5ed\ud560 \uc0dd\uc131\uc744 \ud074\ub9ad\ud55c\ub2e4.\\n\\n![./cloudwatch2.png](./cloudwatch2.png)\\n\\nCloudWatchAgentServerPolicy \uad8c\ud55c \uc815\ucc45\uc744 \uc120\ud0dd\ud558\uace0, \uc801\ub2f9\ud55c \uc5ed\ud560 \uc774\ub984\uc744 \uc785\ub825\ud574\uc11c \uc5ed\ud560\uc744 \uc0dd\uc131\ud55c\ub2e4.\\n\\n![./cloudwatch3.png](./cloudwatch3.png)\\n\\nEC2 \uc778\uc2a4\ud134\uc2a4 \ubaa9\ub85d\uc73c\ub85c \ub4e4\uc5b4\uac00\uc11c, CloudWatch Agent\ub97c \uc124\uce58\ud560 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud074\ub9ad\ud55c\ub2e4. \\n\uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc5d0\uc11c \uc774\uc804\uc5d0 \uc0dd\uc131\ud55c \uc5ed\ud560\uc744 \uc9c0\uc815\ud55c\ub2e4.\\n\\n![./cloudwatch4.png](./cloudwatch4.png)\\n\\n### \uc124\uce58\\n\\n\ud658\uacbd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\nOS: ubuntu 22.04 \\n\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small (ARM64) \\n\\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uce58\ud55c\ub2e4.\\n\\n```bash\\nwget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb\\nsudo dpkg -i -E ./amazon-cloudwatch-agent.deb\\n```\\n\\n[\uc0ac\uc6a9 \uc124\uba85\uc11c](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)\uc5d0 \uac01 \uc778\uc2a4\ud134\uc2a4 \uc720\ud615\ub9c8\ub2e4 \ub2e4\uc6b4\ub85c\ub4dc \ub9c1\ud06c\uac00 \uc790\uc138\ud558\uac8c \uc548\ub0b4\ub418\uc5b4 \uc788\ub2e4.\\n\\n### Wizard\\n\\nCloudWatch Wizard\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uc124\uc815 \ud30c\uc77c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4. \\n\ub85c\uadf8\ub97c \uc218\uc9d1\ud558\ub3c4\ub85d \uc124\uc815\ud558\ub294 \uacbd\uc6b0 Wizard \uc2e4\ud589 \uba85\ub839\uc5b4 \uc785\ub825 \uc804 log \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \ubcf5\uc0ac\ud574\ub450\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec Wizard\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nsudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard\\n```\\n\\n\uc124\uc815\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74 \uc124\uc815 \ud30c\uc77c\uc774 \uc5b4\ub5bb\uac8c \uad6c\uc131\ub420\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\ub85c\uadf8\ub97c \ucd94\uac00\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \uc785\ub825\ucc3d\uc774 \ub098\uc624\uba74 \uc900\ube44\ud574\ub480\ub358 \ub85c\uadf8 \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \uc785\ub825\ud55c\ub2e4. \\n\\n![./cloudwatch5.png](./cloudwatch5.png)\\n\\n\uc911\uac04\uc5d0 SSM parameter store\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4. \\n\\n```bash\\nDo you want to store the config in the SSM parameter store?\\n1. yes\\n2. no\\n```\\n\\n\ucd94\uac00\uc801\uc73c\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 2\ubc88\uc744 \uc120\ud0dd\ud55c\ub2e4. \\nParameter Store \uad00\ub9ac\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc758 [\ubb38\uc11c](https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/)\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac70 \uac19\ub2e4. \\n\uc124\uc815\uc774 \uc644\ub8cc\ub418\uba74 `/opt/aws/amazon-cloudwatch-agent/bin/config.json` \uc5d0 \uc124\uc815\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc774 \uc800\uc7a5\ub41c\ub2e4. \\n\\n### \uc124\uc815 \ud30c\uc77c \uc801\uc6a9\\n\\n\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uc815\ud30c\uc77c\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4. \\nfile \ub4a4\uc5d0\ub294 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub300\ud55c \uc808\ub300\uacbd\ub85c(\uc544\ub798 \uba85\ub839\uc5b4 \uae30\uc900 \uae30\ubcf8 \uc0dd\uc131 \uc704\uce58)\ub97c \uc785\ub825\ud558\uba74 \ub41c\ub2e4. \\n\\n```bash\\nsudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json\\n```\\n\\n### types.db: no such file or directory \uc5d0\ub7ec\\n\\n\ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 types.db \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4.\\n\\n```bash\\nError running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory\\n```\\n\\ntypes.db \ud30c\uc77c \uc0dd\uc131\\n\\n```bash\\nsudo mkdir /usr/share/collectd\\nsudo touch /usr/share/collectd/types.db\\n```\\n\\n### \uc9c0\ud45c \ud655\uc778\\n\\nCloudWatch Metrics\uc5d0 \uac00\ubcf4\uba74 CWAgent\ub77c\ub294 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\uac00 \ucd94\uac00\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \\n\\n![./cloudwatch6.png](./cloudwatch6.png)\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \ucd94\uac00\ud558\uc5ec \uc9c0\ud45c\uc5d0 \ub300\ud55c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. \\n\\n```json\\n{\\n \\"metrics\\": {\\n \\"namespace\\": \\"2023-hello-world\\",\\n ......\\n },\\n} \\n```\\n\\n### \ub85c\uadf8\\n\\nCloudWatch \u2192 \ub85c\uadf8 \uadf8\ub8f9\uc73c\ub85c \uac00\uba74 Wizard\ub85c \ucd94\uac00\ud55c \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.\\n\\n![./cloudwatch7.png](./cloudwatch7.png)\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[CloudWatch\ub780 \ubb34\uc5c7\uc785\ub2c8\uae4c?](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) \\n[Amazon CloudWatch \uc694\uae08](https://aws.amazon.com/ko/cloudwatch/pricing/) \\n[Linux \uc778\uc2a4\ud134\uc2a4 \uc9c0\ud45c](https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html) \\n[\uc11c\ubc84\uc5d0 CloudWatch \uc5d0\uc774\uc804\ud2b8 \uc124\uce58 \ubc0f \uc2e4\ud589](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html) \\n[CloudWatch Agent\ub97c Parameter Store\uc5d0\uc11c \uad00\ub9ac\ud574 \ubcf4\uae30](https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/) \\n[CloudWatch\uc5d0\uc774\uc804\ud2b8 \uad6c\uc131 \ud30c\uc77c](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html)"},{"id":"route-image-async-with-event","metadata":{"permalink":"/route-image-async-with-event","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","source":"@site/blog/2023-3/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","description":"\uc774\uc804 \uae00","date":"2023-08-13T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 13\uc77c","tags":[{"label":"async","permalink":"/tags/async"},{"label":"event","permalink":"/tags/event"}],"readingTime":11.2,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","slug":"route-image-async-with-event","tags":["async","event"]},"unlisted":false,"prevItem":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","permalink":"/cloudwatch"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/route-image-implementation"}},"content":"## \uc774\uc804 \uae00\\n\\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd](./route-image-intro) \\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604](./route-image-implementation)\\n\\n## \uac1c\uc694\\n\\n\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120\\n\\n\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4. \\n\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. \\n\\n### \ud655\uc7a5\uc131 \ub300\ube44\\n\\n\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4. \\n\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. \\n\\n## \ube44\ub3d9\uae30 \ucc98\ub9ac\\n\\n@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. \\n\\n### \ube44\ub3d9\uae30 \uc124\uc815\\n\\n\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4. \\n\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. \\n\\n```java title=\\"AsyncConfig\\"\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig {\\n}\\n```\\n\\n\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. \\n\\n> In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\\n> 7.7. Task Execution and Scheduling, Spring Boot Docs\\n\\n### @Async \uc801\uc6a9\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java title=\\"RouteImageGenerator\\"\\n@Async\\npublic void generate(\\n List latitudes,\\n List longitudes,\\n List pointedLatitudes,\\n List pointedLongitudes,\\n Long tripId\\n) {\\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\\n\\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\\n\\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\\n routeImageDrawer.dispose();\\n\\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\\n Trip trip = tripRepository.findById(tripId)\\n .orElseThrow();\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n}\\n```\\n\\n### \ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810\\n\\n\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. \\n\\n```mermaid\\ngraph LR\\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\\n draw --\x3e trip\\n```\\n\\n\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph draw\\n\\t\\tdirection LR\\n\\t\\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\\n\\tend\\n subgraph trip\\n\\t\\tdirection LR\\n\\t\\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\\n\\t\\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\\n\\tend\\n\\n\\ttrip --\x3e draw\\n```\\n\\n\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n## \uc774\ubca4\ud2b8 \uc0ac\uc6a9\\n\\n\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.\\n\\n### \uc774\ubca4\ud2b8 \ubc1c\ud589\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4. \\n\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. \\n\\n```java title=\\"TripService & TripUpdateEvent\\"\\npublic void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\\n ...\\n\\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\\n}\\n\\npublic record TripUpdateEvent(Long tripId) {\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4. \\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4. \\n\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. \\n\\n### \uc774\ubca4\ud2b8 \uad6c\ub3c5\\n\\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec `@Async` \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4. \\n\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 `@TransactionalEventListener`\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n:::note TransactionPhase \uc124\uc815\\nTransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\nAFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nBEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\n:::\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```java title=\\"TripUpdateEventHandler\\"\\n@Component\\npublic class TripUpdateEventHandler {\\n\\n private final RouteImageGenerator routeImageGenerator;\\n private final TripRepository tripRepository;\\n\\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\\n this.routeImageGenerator = routeImageGenerator;\\n this.tripRepository = tripRepository;\\n }\\n\\n @Async\\n @TransactionalEventListener(phase = AFTER_COMMIT)\\n public void handle(TripUpdateEvent tripUpdateEvent) {\\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\\n\\n String imageUrl = routeImageGenerator.generate(\\n trip.getLatitudes(),\\n trip.getLongitudes(),\\n trip.getPointedLatitudes(),\\n trip.getPointedLongitudes()\\n );\\n\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n }\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4. \\n\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4.\\n\\n```mermaid\\ngraph LR\\n subgraph trip\\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\\n TripRepository\\n end\\n\\n subgraph draw\\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\\n end\\n```\\n\\n### \ud14c\uc2a4\ud2b8\\n\\n\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\\n\\n\\n```java\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(Mockito.timeout(5000).times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\n@ContextConfiguration(classes = TestSyncConfig.class)\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n\\n\\n\\n\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4. \\n\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 `\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0` \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c `Mockito.timeout` \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. \\n\\n## \uacb0\uacfc\\n\\n![./time.png](./time.png)\\n\\n\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4. \\n\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[7.7. Task Execution and Scheduling, Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling) \\n[Spring Events, Baeldung](https://www.baeldung.com/spring-events) \\n[\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30](https://techblog.woowahan.com/7835/)"},{"id":"route-image-implementation","metadata":{"permalink":"/route-image-implementation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","source":"@site/blog/2023-3/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","description":"\uac1c\uc694","date":"2023-08-02T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 2\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":11.665,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","slug":"route-image-implementation","tags":["image","awt"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/route-image-async-with-event"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/route-image-python"}},"content":"## \uac1c\uc694\\n\\n\uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 [\ub9c1\ud06c](./route-image-intro)\uc5d0 \uc788\ub2e4.\\n\\n### \uad6c\ud604 \uacb0\uacfc\\n\\n![./result.png](./result.png)\\n\\n\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n**\uc11c\uc6b8\uc5ed(\uc810)** \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 **\uad6c\ub85c\uc5ed(\uc810)** \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed\\n\\n```java title=\\"\uc608\uc2dc \ub370\uc774\ud130\\"\\nList x = List.of(\\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\\n);\\nList y = List.of(\\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\\n);\\nList xPoints = List.of(126.97094933811682, 126.88474839801178);\\nList yPoints = List.of(37.55302829553499, 37.50129417536773);\\n```\\n\\n### IMAGE_SIZE & ROUTE_SIZE\\n\\n```java title=\\"RouteImageGenerator.java\\"\\nprivate static final int IMAGE_SIZE = 800;\\nprivate static final int ROUTE_SIZE = 600;\\n```\\n\\n\ucf54\ub4dc\ub97c \ubcf4\uba74 IMAGE_SIZE\uc640 ROUTE_SIZE\uac00 \uc788\ub2e4. \\nIMAGE_SIZE\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4. \\nROUTE_SIZE\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. \\n\\n![./600.png](./600.png)\\n\\n**\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720**\\n\\n255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370, \uc774\ubbf8\uc9c0\uc758 \uc120\uba85\ub3c4\uac00 \uc88b\uc9c0 \uc54a\uc544 800 * 800 \uc0ac\uc774\uc988\ub85c \ubcc0\uacbd\ud588\ub2e4.\\n\\n## \uc8fc\uc694 \ud074\ub798\uc2a4\\n\\n### \uc694\uc57d\\n\\n| \ud074\ub798\uc2a4\uba85 | \uc124\uba85 | \ud2b9\uc774\uc0ac\ud56d |\\n| --- | --- | --- |\\n| Coordinate | \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12 | \uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc \uc5ec\ud589 \ub3c4\uba54\uc778\uc5d0 \ud3ec\ud568\ub41c Point \ud074\ub798\uc2a4\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9 |\\n| Coordinates | Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| Position | \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12 | Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9 |\\n| Positions | Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| RouteImageDrawer | \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c | \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c |\\n| RouteImageUploader | BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4 | \ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131 |\\n| RouteImageGenerator | \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4 | \uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad |\\n| BufferedImage(AWT) | \uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9 | \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0) |\\n| Graphics2D(AWT) | \uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc | JDK 1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131 |\\n\\n### \uc758\uc874\uad00\uacc4\\n\\n```mermaid\\ngraph TD\\n C1[Coordinates] --\x3e C[Coordinate]\\n P1[Positions] --\x3e P[Position]\\n\\n\\tRID[RouteImageDrawer] -- \\"\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131\\" --\x3e P1\\n\\tRID --\x3e B[BufferedImage]\\n\\tRID --\x3e G[Graphics2D]\\n\\n\\tC1 -- \\"calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0\\" --\x3e P1\\n\\n\\tRIU[RouteImageUploader] --\x3e B\\n\\tRIG[RouteImageGenerator] --\x3e RID\\n\\tRIG --\x3e RIU\\n\\tRIG --\x3e C1\\n\\tRIG --\x3e P1\\n```\\n\\n### Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)\\n\\n`List` 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4. \\nCoordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658\\n- indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 \\n\\nPositions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n```java title=\\"Coordinates.java\\"\\n// \ud638\ucd9c\\n// List xPositions = toPositions(xValues, maxDifference, routeImageSize);\\n// List yPositions = toPositions(yValues, maxDifference, routeImageSize);\\n\\nprivate List toPositions(List values, Double maxDifference, Integer routeImageSize) {\\n Double minValue = Collections.min(values);\\n return values.stream()\\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\\n .map(value -> mapToPosition(value, routeImageSize))\\n .toList();\\n}\\n\\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\\n return (coordinate - minValue) / maxDifference;\\n}\\n\\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\\n return (int) (coordinate * routeImageSize);\\n}\\n```\\n\\n\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4.\\n\\n1. Collections.min(values) \u2192 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4.\\n2. normalizeCoordinate \u2192 \uac01\uac01\uc758 \uc704\ub3c4 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 **\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774**\ub85c \ub098\ub208\ub2e4.\\n3. mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n### Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)\\n\\nPositions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4.\\n- getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4.\\n- xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```java title=\\"Positions.java\\"\\npublic Positions align(int imageSize, int routeSize) {\\n int xOffset = calculateOffset(Position::x, imageSize);\\n int yOffset = calculateOffset(Position::y, imageSize);\\n\\n return items.stream()\\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\\n .collect(collectingAndThen(toList(), Positions::new));\\n}\\n\\nprivate int calculateOffset(ToIntFunction positionToInteger, int imageSize) {\\n List positions = items.stream()\\n .mapToInt(positionToInteger)\\n .boxed()\\n .toList();\\n\\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\\n return imageSize / 2 - midValue;\\n}\\n```\\n\\n\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4. \\nBufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. \\n\\n![./800.png](./800.png)\\n\\n\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4.\\n\\nx \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4. \\ny \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. \\n\\n### RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)\\n\\nBufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4. \\n\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.\\n\\n```java title=\\"RouteImageDrawer.java\\"\\n// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\\n// \ubc30\uacbd \ud22c\uba85\uc0c9\\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\\nprivate static final int LINE_STROKE_WIDTH = 7;\\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\\nprivate static final int POINT_STROKE_WIDTH = 20;\\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8 \uac1c\uc120\uc744 \uc704\ud55c \uc124\uc815\\nprivate static final Map renderingHints = Map.of(\\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\\n);\\n```\\n\\nRouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4.\\n- drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4.\\n- dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. \\n\\ndispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4.\\n\\n## \uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow\\n\\n### 1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n\\n```\\n\\n### 2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 4. \uc5c5\ub85c\ub4dc \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n \\tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n \\tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n \\tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n```\\n\\n### \uc804\uccb4 Flow\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n\\t\\n```"},{"id":"route-image-python","metadata":{"permalink":"/route-image-python","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","source":"@site/blog/2023-3/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","description":"\uac1c\uc694","date":"2023-07-31T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 31\uc77c","tags":[{"label":"Image","permalink":"/tags/image"},{"label":"Python","permalink":"/tags/python"}],"readingTime":6.185,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","slug":"route-image-python","tags":["Image","Python"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/route-image-implementation"},"nextItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/mock-static-method"}},"content":"### \uac1c\uc694\\n\\n\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. \\n\\n### \uc0ac\uc6a9 \uae30\uc220\\n\\n\uc5b8\uc5b4: Python 3.10 \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib \\n\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront \\n\\n\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```mermaid\\ngraph LR\\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\\n Client --\x3e CloudFront --\x3e S3\\n```\\n\\n### \uc694\uad6c\uc0ac\ud56d\\n\\n![./route.png](./route.png)\\n\\n\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. \\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n- \uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\\n\\n1. \uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n2. \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n\\n\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4. \\n\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604\\n\\n```python\\nimport time\\n\\nimport matplotlib.pyplot as plt\\n\\n\\ndef draw(point):\\n start = time.time()\\n x, y = zip(*point)\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n draw_lines(pixel_x, pixel_y)\\n end = time.time()\\n print(end - start)\\n \\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n return scaled_coordinates\\n\\n\\ndef draw_lines(x, y):\\n figure = plt.gcf()\\n figure.set_size_inches(5, 5)\\n plt.plot(x, y, c = \'w\',linewidth=5)\\n plt.scatter(x[3],y[3], c = \'w\', s = 125)\\n plt.axis(\'off\')\\n plt.savefig(\'name.png\', transparent=True, format=\'png\')\\n\\npoint = [\\n [126.96352960597338, 37.590841000217125],\\n [126.96987292787792, 37.58435564234159],\\n [126.98128481452298, 37.58594375113966],\\n [126.99360339342958, 37.58248524741927],\\n [126.99867565340067, 37.56778118088622],\\n [127.001935378366117, 37.55985240444085],\\n [126.9831048919687, 37.548030119488665],\\n [126.97189273528845, 37.5119879225856],\\n [127.02689859997221, 37.48488593333883]\\n]\\n\\ndraw(point)\\n```\\n\\n\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)\\n\\n![./routeImage.png](./routeImage.png)\\n\\n### AWS Lambda\\n\\n\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4. \\n\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131\\n\\nAmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc\\n\\n\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```python\\n\\nimport io\\nimport uuid\\n\\nimport boto3\\nimport matplotlib.pyplot as plt\\n\\nPIXEL = 255\\nBUCKET_NAME = \'image-plot\'\\nS3 = \'s3\'\\n\\ndef lambda_handler(event, context):\\n x = event[\'x\']\\n y = event[\'y\']\\n image_name = str(uuid.uuid4())\\n\\n img_data = draw(x, y)\\n s3 = boto3.client(S3)\\n s3.put_object(Body=img_data.getvalue(), ContentType=\'image/png\', Bucket=BUCKET_NAME, Key=image_name)\\n url = f\'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}\'\\n\\n return {\\n \'statusCode\': 200,\\n \'body\': url\\n }\\n\\ndef draw(x, y):\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n img_data = draw_lines(pixel_x, pixel_y)\\n plt.close()\\n return img_data\\n\\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\\n return pixel_values\\n\\ndef draw_lines(x, y):\\n plt.plot(x, y, \'k-\', linewidth=10)\\n plt.axis(\'off\')\\n img_data = io.BytesIO()\\n plt.savefig(img_data, transparent=True, format=\'png\')\\n img_data.seek(0)\\n return img_data\\n\\n```\\n\\n### Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131\\n\\nmatplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4. \\nzip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4. \\n\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4. \\n\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```\\npillow.zip\\n\u2502 python/PIL\\n\u2514 python/Pillow-5.3.0.dist-info\\n```\\n\\nUbuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\\n```\\nsudo apt update\\nsudo apt install zip\\nsudo apt install python3-pip\\n\\nmkdir python\\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\\n```\\n\\n### `No module named \'numpy.core._multiarray_umath\'` \uc5d0\ub7ec\\n\\nLayer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4. \\n\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4. \\n\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### \uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01\\n\\n\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4. \\nAWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. \\n\\n**\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.**\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[AWS Lambda](https://aws.amazon.com/ko/lambda/) \\n[Lambda Layer](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html) \\n[Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html) \\n[No module named \'numpy.core._multiarray_umath\'](https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b) \\n[\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc](https://techblog.woowahan.com/6217/)"},{"id":"mock-static-method","metadata":{"permalink":"/mock-static-method","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","source":"@site/blog/2023-3/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","description":"\uac1c\uc694","date":"2023-07-30T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 30\uc77c","tags":[{"label":"Mockito","permalink":"/tags/mockito"},{"label":"static","permalink":"/tags/static"}],"readingTime":2.635,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","slug":"mock-static-method","tags":["Mockito","static"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/route-image-python"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/route-image-intro"}},"content":"### \uac1c\uc694\\n\\n\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \\n\\n\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4. \\n\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4. \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. \\n\\n```java\\npublic void upload(BufferedImage bufferedImage) {\\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\\n try {\\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\\n } catch (IOException e) {\\n throw new DrawException(IMAGE_SAVE_FAIL);\\n }\\n}\\n```\\n\\n### Mocking static methods\\n\\nMockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\nmockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 `MockedStatic`\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. \\n\\nJUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc `MockedStatic`\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. \\n\\n```java\\n// given\\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\\nRouteImageUploader routeImageUploader = new RouteImageUploader();\\n\\n// expect\\ntry (MockedStatic imageIO = Mockito.mockStatic(ImageIO.class)) {\\n routeImageUploader.upload(bufferedImage);\\n imageIO.verify(\\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\\n times(1)\\n );\\n}\\n```\\n\\n### \ub9c8\uce58\uba70\\n\\n\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uc73c\ub85c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790. \\n\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4. \\n\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Mocking static methods](https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks) \\n[Mockito mock static methods](https://www.baeldung.com/mockito-mock-static-methods) \\n[Enable mocking static methods in Mockito](https://github.com/mockito/mockito/issues/1013)"},{"id":"route-image-intro","metadata":{"permalink":"/route-image-intro","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","source":"@site/blog/2023-3/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","description":"./route.png","date":"2023-07-27T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 27\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":5.865,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","slug":"route-image-intro","tags":["image","awt"]},"unlisted":false,"prevItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/mock-static-method"},"nextItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/java-spring-springboot"}},"content":"![./route.png](./route.png)\\n\\n### \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784\\n\\n\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c `\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac`\uc640 `\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0`\uc758 \uacbd\uc6b0 \ub124\uc774\ubc84 \uc9c0\ub3c4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud574\ub2f9 \uae30\ub2a5\uc744 \uad6c\ud604\ud560 \uc218 \uc5c6\uc73c\ub2c8 \ub2f9\uc5f0\ud788 \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4.\\n\\n\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.\\n\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n\\n\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uc5ec \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4.\\n\\n### \uace0\ub824\ud55c \uae30\uc220\\n\\n\ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uae30 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. \\n\\n- Python\uc758 Matplotlib\\n- **AWT(Abstract Window Toolkit) [\ucd5c\uc885 \uc120\ud0dd]**\\n- \uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)\\n- Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)\\n\\n## Python & Matplotlib\\n\\n\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 \\n\\n- \ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. \\n- AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.\\n- Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.\\n\\n### Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\\n\\nPython\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4.\\n\\n\ub77c\uc774\ube0c\ub7ec\ub9ac | \uc124\uba85 | \uc81c\uc678 \uc774\uc720\\n-- | -- | --\\nSwing | AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\nJavaFX | Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\n[simple-java-plot](https://github.com/yuriy-g/simple-java-plot) | AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac | AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c\\n[matplotlib4j](https://github.com/sh0nk/matplotlib4j) | Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac | \ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c\\n\\n### Java & AWT(Abstract Window Toolkit)\\n\\n\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 \\n\\n- \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4.\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.\\n- \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n\\n### \uae30\uc220 \uc120\ud0dd\\n\\nAWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.\\n\\n### \uc720\uc9c0 \ubcf4\uc218\\n\\nAWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n1. \ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. \\n2. AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4.\\n\\n### \ub808\ubca8 3\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70 \ub0b4\uc6a9 \ucd94\uac00\\n\\n\uae30\uc220 \uc120\ud0dd\uc744 \ud558\uae30 \uc704\ud55c \uc2e4\ud589 \uc2dc\uac04 \uce21\uc815\uc5d0 \uc624\ub958\uac00 \uc788\uc5c8\ub2e4. \\nAWT\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc2e4\ud589 \uc2dc\uac04\uc744 \uc81c\uc678\ud558\uba74 \ud30c\uc774\uc36c\uacfc \ube44\uc2b7\ud55c \uc2dc\uac04\uc548\uc5d0 \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc5c8\ub2e4."},{"id":"java-spring-springboot","metadata":{"permalink":"/java-spring-springboot","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-3/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","source":"@site/blog/2023-3/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","description":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","date":"2023-07-24T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 24\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Spring Boot","permalink":"/tags/spring-boot"},{"label":"Spring","permalink":"/tags/spring"}],"readingTime":4.725,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","slug":"java-spring-springboot","tags":["Java","Spring Boot","Spring"]},"unlisted":false,"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/route-image-intro"},"nextItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/websocket"}},"content":"## \uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\\n\\n\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4. \\n2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4.\\n\\n## \uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### Switch Expressions(Java 14)\\n\\nJava 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n```java\\nenum RESULT {\\n WIN, LOSE, DRAW\\n}\\n\\nRESULT result = RESULT.WIN;\\n\\nint prize = switch (result) {\\n case WIN -> 10_000_000;\\n case LOSE, DRAW -> 5_000_000;\\n\\tdefault -> 0;\\n};\\n```\\n\\n\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- `->` \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.\\n- case\ub97c \ucf64\ub9c8(`,`)\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n- break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4.\\n- default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\n### Text Block(Java 15)\\n\\nJava 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@Repository\\npublic interface PostRepository extends JpaRepository {\\n @Query(\\"\\"\\"\\n SELECT p FROM Post p\\n WHERE p.title LIKE %:keyword%\\n OR p.content LIKE %:keyword%\\n \\"\\"\\")\\n List findPostsByTitleOrContentContainingKeyword(String keyword);\\n}\\n```\\n\\n### NPE \uba54\uc2dc\uc9c0(Java 15)\\n\\n```java\\nString name = null;\\nname.chars();\\n\\n/** \\n# before\\njava.lang.NullPointerException\\n\\tat com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\\n\\n# after\\nCannot invoke \\"String.chars()\\" because \\"name\\" is null\\njava.lang.NullPointerException: Cannot invoke \\"String.chars()\\" because \\"name\\" is null\\n*/\\n```\\n\\n### Record(Java 16)\\n\\nLombok\uc758 `@Data`, kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nRecord\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4. \\n\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. \\n\\n```java\\npublic record PostDto(String title, String content) {\\n}\\n```\\n\\n### \ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d\\n\\n\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n## \uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. \\n\\n### \uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d\\n\\nJava 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n### \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd\\n\\nJakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. \\n\\n### PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c\\n\\n6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c `@GetMapping(\\"/hello\\")`\uc640 `@GetMapping(\\"/hello/\\")`\uac00 \ub3d9\uc77c\ud588\ub2e4. \\n6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, `/hello`\uc640 `/hello/`\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. \\n\\n> PathPatternParser used by default (with the ability to opt into PathMatcher). \\n\\n### HTTP interface client\\n\\n\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [\ud1a0\ube44\ub2d8\uc758 \uac15\uc758](https://www.youtube.com/watch?v=Kb37Q5GCyZs)\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d\\n\\nGradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6 \\n\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30](https://www.youtube.com/watch?v=1WT6oxchM9M) \\n[\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30](https://www.youtube.com/watch?v=7SlDdzVk6GE) \\n[Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658](https://www.samsungsds.com/kr/insights/java_jakarta.html) \\n[Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529](https://www.youtube.com/watch?v=Kb37Q5GCyZs) \\n[What\'s New in Spring Framework 6.x](https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x) \\n[Spring Boot 3.0 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes) \\n[Spring Boot 3.1 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes)"},{"id":"websocket","metadata":{"permalink":"/websocket","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-26-WebSocket.mdx","source":"@site/blog/2023-2/2023-06-26-WebSocket.mdx","title":"\uc6f9\uc18c\ucf13","description":"\uc6f9\uc18c\ucf13","date":"2023-06-26T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 26\uc77c","tags":[{"label":"WebSocket","permalink":"/tags/web-socket"}],"readingTime":4.165,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9\uc18c\ucf13","slug":"websocket","tags":["WebSocket"]},"unlisted":false,"prevItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/java-spring-springboot"},"nextItem":{"title":"Docusaurus","permalink":"/docusaurus"}},"content":"### \uc6f9\uc18c\ucf13\\n\\n\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c \\n\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\\n\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. \\n\\n### \uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd\\n\\n\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Long polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4. \\n\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\\n:::note polling, long polling, streaming\\n\\nPolling: \uc8fc\uae30\uc801\uc73c\ub85c \uc11c\ubc84\uc5d0 \uc694\uccad\uc744 \ubcf4\ub0b4 \uc218\uc2e0\ud560 \uc815\ubcf4\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubc29\ubc95\\n- \uc11c\ubc84\uc5d0\uc11c \ubcf4\ub0bc \ub0b4\uc6a9\uc774 \uc5c6\uc5b4\ub3c4 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc54c \uc218 \uc5c6\ub2e4. \\n- \uacc4\uc18d\ud574\uc11c \uc694\uccad\uc744 \ubcf4\ub0b4 \ud655\uc778\uc744 \ud574\uc57c\ud558\uae30 \ub54c\ubb38\uc5d0 \uc11c\ubc84\uc5d0 \ubd88\ud544\uc694\ud55c \ubd80\ud558\ub97c \uc8fc\uc5b4\uc57c \ud55c\ub2e4. \\n\\nLong Polling: \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc5d0 \ub300\ud574 \uc751\ub2f5\uc744 \ubcf4\ub0b4\uc9c0 \uc54a\uace0 \uc788\ub2e4\uac00 \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud588\uc744\ub54c \uc751\ub2f5\ud558\ub294 \ubc29\ubc95\\n- \ud3f4\ub9c1 \ubc29\uc2dd\ubcf4\ub2e4 \uc11c\ubc84\uc5d0 \uc801\uc740 \ubd80\ud558\ub97c \uc904 \uc218 \uc788\uc9c0\ub9cc, \uc694\uccad\uc758 \uc8fc\uae30\uac00 \uc9e7\uc73c\uba74 \ud3f4\ub9c1\uacfc \ucc28\uc774\uac00 \uc5c6\uc5b4\uc9c4\ub2e4.\\n\\nStreaming: \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 request\ub97c \ubcf4\ub0b4\uba74 \ucee4\ub125\uc158\uc744 \ub9fa\uace0, \uc774 \ucee4\ub125\uc158\uc744 \uc720\uc9c0\ud558\uba74\uc11c \uc11c\ubc84\uac00 \uacc4\uc18d \ub370\uc774\ud130\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95\\n- \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ubc84\uc5d0 \uc694\uccad\uc744 \ud558\uace0 \uc2f6\ub2e4\uba74 \uc0c8\ub85c\uc6b4 \ucee4\ub125\uc158\uc744 \ub9fa\uc5b4\uc57c \ud55c\ub2e4. \\n:::\\n\\n### \uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791\\n\\n```mermaid\\nsequenceDiagram\\n participant Client\\n participant Server\\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\\n\\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\\n Server->>Client: \\n\\n Client->>Server: \uc885\ub8cc\\n Server->>Client: \\n```\\n\\n### 1. Upgrade \uc694\uccad\\n\\nWebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4. \\n\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4. \\nSec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4. \\nSec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. \\n\\n```\\nGET /chats HTTP/1.1\\nHost: localhost:8080\\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\\nSec-WebSocket-Version: 13\\nOrigin: http://localhost:8080\\n```\\n\\n### 2. Switching Protocols\\n\\n\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4. \\nSec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 `258EAFA5-E914-47DA-95CA-C5AB0DC85B11`\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\\n```\\nHTTP/1.1 101 Switching Protocols \\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\\nSec-WebSocket-Protocol: v10.stomp\\n```\\n\\n### 3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc\\n\\n\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4. \\n\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\nhttps://datatracker.ietf.org/doc/html/rfc6455 \\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications \\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers \\nhttps://docs.spring.io/spring-framework/reference/web/websocket.html"},{"id":"docusaurus","metadata":{"permalink":"/docusaurus","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","source":"@site/blog/2023-2/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","title":"Docusaurus","description":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.","date":"2023-06-18T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 18\uc77c","tags":[{"label":"Documentation","permalink":"/tags/documentation"}],"readingTime":10.095,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Docusaurus","slug":"docusaurus","tags":["Documentation"]},"unlisted":false,"prevItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/websocket"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/woowacourse-level2-retrospective"}},"content":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. \\n\\n## \uc124\uce58\\n\\n[\uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://docusaurus.io/docs/installation)\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. \\n\\n```bash\\nyarn create docusaurus\\n````\\n\\n## \ubc30\ud3ec\\n\\n[\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c](https://docusaurus.io/docs/next/deployment#deploying-to-github-pages) \\nnetlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4.\\n\\n### \ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131\\n\\ngithub pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 [\uc608\uc2dc](https://github.com/greeng00se/greeng00se.github.io)\uc640 \uac19\uc774 `username.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\n\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 `organization.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n### \uc124\uc815 \ud30c\uc77c \uc218\uc815\\n\\n```js title=\\"docusaurus.config\\"\\nmodule.exports = {\\n // ...\\n url: \'https://greeng00se.github.io\',\\n baseUrl: \'/\',\\n projectName: \'greeng00se.github.io\',\\n organizationName: \'greeng00se\',\\n trailingSlash: false,\\n // ...\\n};\\n```\\n\\n### \ud1a0\ud070 \uc124\uc815\\n\\ngithub action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 [repo, user, workflow] \uc744 \uc124\uc815\ud588\ub2e4. \\n\\n![github](./github.png)\\n\\n### \ube0c\ub79c\uce58 \uc0dd\uc131\\n\\ngithub\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4. \\nrepository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4. \\n\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\\n### \uc6cc\ud06c\ud50c\ub85c \uc791\uc131\\n\\nDocusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. \\n\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. \\n\\n```yml title=\\".github/workflows/deploy.yml\\"\\nname: blog\\n\\non:\\n push:\\n branches: [main]\\n\\njobs:\\n deploy:\\n name: Deploy to GitHub Pages\\n runs-on: ubuntu-latest\\n steps:\\n - uses: actions/checkout@v2\\n - uses: actions/setup-node@v3\\n with:\\n node-version: 18\\n cache: yarn\\n\\n - name: Install dependencies\\n run: yarn install --frozen-lockfile\\n - name: Build website\\n run: yarn build\\n\\n - name: Deploy to GitHub Pages\\n uses: peaceiris/actions-gh-pages@v3\\n with:\\n github_token: ${{ secrets.DEPLOY_TOKEN }}\\n publish_dir: ./build\\n user_name: github-actions[bot]\\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\\n```\\n\\n## \ub313\uae00 \uae30\ub2a5\\n\\ngiscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. \\n\\n### giscus \uc124\uc815\\n\\n1. \uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4.\\n2. giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n3. Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n\\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [giscus](https://giscus.app/ko)\ub97c \ud655\uc778\ud558\uc790.\\n\\n### docusaurus \uc124\uc815\\n\\n[swizzling](https://docusaurus.io/ko/docs/next/swizzling)\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4. \\n\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nyarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\\n```\\n\\n\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 `/src/theme/BlogPostItem/index.js` \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4. \\n\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. \\n\\n```js title=\\"/src/theme/BlogPostItem/index.js\\"\\nimport OriginalBlogPostItem from \\"@theme-original/BlogPostItem\\";\\nimport React, { useEffect, useRef } from \\"react\\";\\n// @ts-expect-error internal code\\nimport { useColorMode } from \\"@docusaurus/theme-common\\";\\nimport { useBlogPost } from \\"@docusaurus/theme-common/internal\\";\\n\\nconst giscusSelector = \\"iframe.giscus-frame\\";\\n\\nfunction BlogPostItem(props) {\\n const { colorMode } = useColorMode();\\n const { isBlogPostPage } = useBlogPost();\\n const giscusTheme = colorMode === \\"dark\\" ? \\"dark\\" : \\"light\\";\\n const containerRef = useRef(null);\\n\\n useEffect(() => {\\n if (!isBlogPostPage) return;\\n\\n const giscusEl = containerRef.current.querySelector(giscusSelector);\\n\\n const createGiscusEl = () => {\\n const script = document.createElement(\\"script\\");\\n\\n script.src = \\"https://giscus.app/client.js\\";\\n script.setAttribute(\\"data-repo\\", \\"teco-chat/teco-chat.github.io\\");\\n script.setAttribute(\\"data-repo-id\\", \\"R_kgDOJZ5j0Q\\");\\n script.setAttribute(\\"data-category\\", \\"Announcements\\");\\n script.setAttribute(\\"data-category-id\\", \\"DIC_kwDOJZ5j0c4CXS_Q\\");\\n script.setAttribute(\\"data-mapping\\", \\"pathname\\");\\n script.setAttribute(\\"data-strict\\", \\"0\\");\\n script.setAttribute(\\"data-reactions-enabled\\", \\"1\\");\\n script.setAttribute(\\"data-emit-metadata\\", \\"0\\");\\n script.setAttribute(\\"data-input-position\\", \\"bottom\\");\\n script.setAttribute(\\"data-theme\\", giscusTheme);\\n script.setAttribute(\\"data-lang\\", \\"ko\\");\\n script.crossOrigin = \\"anonymous\\";\\n script.async = true;\\n \\n containerRef.current.appendChild(script);\\n };\\n\\n const postThemeMessage = () => {\\n const message = {\\n setConfig: {\\n theme: giscusTheme,\\n }\\n };\\n\\n giscusEl.contentWindow.postMessage({ giscus: message }, \\"https://giscus.app\\");\\n };\\n\\n giscusEl ? postThemeMessage() : createGiscusEl();\\n }, [giscusTheme]);\\n\\n return (\\n <>\\n \\n {isBlogPostPage &&
}\\n \\n );\\n}\\n\\nexport default BlogPostItem;\\n```\\n\\n## \uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30\\n\\n\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4. \\n\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. \\n\\n\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, [docsearch](https://docsearch.algolia.com/)\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\ndocsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n- [\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1](https://docsearch.algolia.com/docs/legacy/run-your-own/) \\n- [\uc124\uc815 \ud30c\uc77c](https://docsearch.algolia.com/docs/legacy/config-file)\\n\\n### \uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778\\n\\n\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4. \\n\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n![algolia](./algolia.png)\\n\\n### \ud0a4 \uc0dd\uc131\\n\\n\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4. \\naddObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. \\n\\n![key](./key.png)\\n\\n### .env \ud30c\uc77c \uc0dd\uc131\\n\\n\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\\n```bash title=\\".env\\"\\nAPPLICATION_ID=MVIU5UEMOM\\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\\n```\\n\\n### config \ud30c\uc77c \uc0dd\uc131\\n\\n\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 [\ub9c1\ud06c](https://docsearch.algolia.com/docs/legacy/config-file)\ub97c \ucc38\uace0\ud55c\ub2e4. \\n\ub610\ub294 Docusaurus\uc758 [\uc124\uc815 \ud30c\uc77c](https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json)\uc744 \ucc38\uace0\ud55c\ub2e4.\\n\\n```json title=\\"config.json\\"\\n{\\n \\"index_name\\": \\"teco\\",\\n \\"start_urls\\": [\\n \\"https://teco-chat.github.io/\\"\\n ],\\n \\"sitemap_urls\\": [\\n \\"https://teco-chat.github.io/sitemap.xml\\"\\n ],\\n \\"sitemap_alternate_links\\": true,\\n \\"stop_urls\\": [\\n \\"/tests\\"\\n ],\\n \\"selectors\\": {\\n \\"lvl0\\": {\\n \\"selector\\": \\"(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]\\",\\n \\"type\\": \\"xpath\\",\\n \\"global\\": true,\\n \\"default_value\\": \\"Documentation\\"\\n },\\n \\"lvl1\\": \\"header h1\\",\\n \\"lvl2\\": \\"article h2\\",\\n \\"lvl3\\": \\"article h3\\",\\n \\"lvl4\\": \\"article h4\\",\\n \\"lvl5\\": \\"article h5, article td:first-child\\",\\n \\"lvl6\\": \\"article h6\\",\\n \\"text\\": \\"article p, article li, article td:last-child\\"\\n },\\n \\"strip_chars\\": \\" .,;:#\\",\\n \\"custom_settings\\": {\\n \\"separatorsToIndex\\": \\"_\\",\\n \\"attributesForFaceting\\": [\\n \\"language\\",\\n \\"version\\",\\n \\"type\\",\\n \\"docusaurus_tag\\"\\n ],\\n \\"attributesToRetrieve\\": [\\n \\"hierarchy\\",\\n \\"content\\",\\n \\"anchor\\",\\n \\"url\\",\\n \\"url_without_anchor\\",\\n \\"type\\"\\n ]\\n },\\n \\"conversation_id\\": [\\n \\"833762294\\"\\n ],\\n \\"nb_hits\\": 46250\\n}\\n```\\n\\n### docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\\n\\ndocker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4. \\njq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nbrew install jq\\n```\\n\\n\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. \\n\\n```bash\\ndocker run -it --env-file=.env -e \\"CONFIG=$(cat ./config.json | jq -r tostring)\\" algolia/docsearch-scraper\\n```\\n\\n### docusaurus \uc124\uc815\\n\\n\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n algolia: {\\n appId: \'MVIU5UEMOM\', // Application ID\\n apiKey: \'b68f378013817d9a190df88cdde226a0\', // Search-Only API Key\\n indexName: \'teco\', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\\n contextualSearch: true,\\n },\\n })\\n```\\n\\n## \ubd80\uac00 \uc124\uc815\\n\\n### \ud654\uba74 \uc0c1\ub2e8 Github Icon\\n\\n\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```css title=\\"/src/css/custom.css\\"\\n.header-github-link:hover {\\n opacity: 0.6;\\n}\\n\\n.header-github-link:before {\\n content: \'\';\\n width: 24px;\\n height: 24px;\\n display: flex;\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n\\nhtml[data-theme=\'dark\'] .header-github-link:before {\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath fill=\'white\' d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n```\\n\\nthemeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nnavbar: {\\n title: \'HELLO\',\\n items: [\\n {\\n href: \'https://github.com/greeng00se\',\\n position: \'right\',\\n className: \'header-github-link\',\\n \'aria-label\': \'GitHub repository\',\\n },\\n ],\\n},\\n```\\n\\n### \ucf54\ub4dc\ube14\ub7ed\\n\\njava\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4. \\nprism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nprism: {\\n theme: lightCodeTheme,\\n darkTheme: darkCodeTheme,\\n additionalLanguages: [\'java\', \'kotlin\'],\\n}\\n```\\n\\n### mermaid\\n\\nmermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 `@docusaurus/theme-mermaid` \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4.\\n\\n```bash\\nyarn add @docusaurus/theme-mermaid\\n```\\n\\n\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```js title=\\"docusaurus.config\\"\\nconst config = {\\n ...\\n markdown: {\\n mermaid: true,\\n },\\n themes: [\\n \'@docusaurus/theme-mermaid\'\\n ],\\n};\\n```\\n\\nthemeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n mermaid: {\\n theme: {\\n light: \'neutral\', \\n dark: \'dark\'\\n },\\n },\\n }),\\n```\\n\\n### \uad6d\uc81c\ud654 \uc124\uc815\\n\\n\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 `Older Entries` \ud615\ud0dc\uc758 \uc124\uba85\uc774 `\ub2e4\uc74c \ud398\uc774\uc9c0` \ub85c \ubcc0\uacbd\ub41c\ub2e4. \\n\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\ni18n: {\\n defaultLocale: \\"ko\\",\\n locales: [\\"ko\\"],\\n},\\n```\\n\\n### \ube14\ub85c\uadf8 \uae00 author\\n\\n\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. \\n\\n![author](./author.png)\\n\\n`authors.yml` \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n```yml title=\\"/blog/authors.yml\\"\\nherb:\\n name: \ud5c8\ube0c\\n title: Backend\\n url: https://github.com/greeng00se\\n image_url: https://github.com/greeng00se.png\\n\\nmallang:\\n name: \ub9d0\ub791\\n title: Backend\\n url: https://github.com/shin-mallang\\n image_url: https://github.com/shin-mallang.png\\n```\\n\\n\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. \\n\\n```mdx\\n---\\nslug: 1\\ntitle: Hello World\\nauthors: [herb, mallang]\\ntags: [hello, docusaurus]\\n---\\n\\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\\n```"},{"id":"woowacourse-level2-retrospective","metadata":{"permalink":"/woowacourse-level2-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","description":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.","date":"2023-06-11T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 11\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":2.545,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","slug":"woowacourse-level2-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"Docusaurus","permalink":"/docusaurus"},"nextItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/level2-interview-retrospective"}},"content":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4. \\n\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. \\n\\n### \ud559\uc2b5\\n\\n\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4. \\n\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. \\n\\n\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4. \\n\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. \\n\\n\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4. \\n\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc218\uba74\\n\\n\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### \ud611\uc5c5\\n\\n\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4. \\n\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. \\n\\n\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4. \\n\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70\\n\\n\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."},{"id":"level2-interview-retrospective","metadata":{"permalink":"/level2-interview-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","description":"\ub808\ubca8 \uc778\ud130\ubdf0","date":"2023-06-08T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 8\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.435,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","slug":"level2-interview-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/woowacourse-level2-retrospective"},"nextItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/order-retrospective"}},"content":"### \ub808\ubca8 \uc778\ud130\ubdf0\\n\\n\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4. \\n\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd\\n\\n\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4. \\n\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4.\\n\\n\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4.\\n\\n> \ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c. \\n> \uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d\\n>\\n\\n### PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158\\n\\nPUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4. \\n\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. \\n\\n\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. \\n\\n### \uadf8 \uc678 \uac1c\uc120\ud560 \uc810\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30 \\n\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c \\"\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?\\"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30 \\n\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30 \\n\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"},{"id":"order-retrospective","metadata":{"permalink":"/order-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4: AWS \ubc30\ud3ec","date":"2023-06-04T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 4\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.67,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","slug":"order-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/level2-interview-retrospective"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/tecochat-retrospective-3"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: AWS \ubc30\ud3ec \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-shopping-order/pull/7 \\n:::\\n\\n### \uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158\\n\\n\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. \\n\\n### \ubc30\ud3ec\\n\\n\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4. \\n\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4.\\n\\n```bash\\necho \\"Start Deploy Script\\"\\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\\nPROJECT_NAME=jwp-shopping-order\\n\\necho \\"Change Directory\\"\\ncd $REPOSITORY_NAME\\n\\necho \\"Git Pull\\"\\ngit pull origin step2\\n\\necho \\"Build\\"\\n./gradlew bootJar\\n\\necho \\"Copy, Start Server\\"\\nmv ./build/libs/$PROJECT_NAME.jar .\\n\\nPID=$(pgrep -f $PROJECT_NAME)\\n\\nif [ -n $PID ]; then\\n kill -9 $PID\\n\\tsleep 5\\nfi\\n\\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\\n```\\n\\n### \ud611\uc5c5\\n\\n\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4. \\n\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30**\\n\\n\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c? \\n\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84\\n\\n**expose headers**\\n\\n\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c [\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354](https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header)\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nnginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. \\n\\n```bash\\nadd_header \'Access-Control-Expose-Headers\' \'Location\'\\n```\\n\\n**\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158** \\n\\n\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4. \\nTransactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4.\\n\\nsetReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4.\\n- h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. \\n- MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.\\n\\nORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. \\n\\n**DAO\uc5d0 `@Transactional` \uc801\uc6a9** \\n\\nDAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nService \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\nDAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) `@Transactional`\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."},{"id":"tecochat-retrospective-3","metadata":{"permalink":"/tecochat-retrospective-3","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","source":"@site/blog/2023-2/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","description":"\uac1c\uc694","date":"2023-06-01T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.005,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","slug":"tecochat-retrospective-3","tags":["TecoChat","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/order-retrospective"},"nextItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/composite"}},"content":"### \uac1c\uc694\\n\\n\uc6d0\ub798 \ubaa9\uc801\uc778 `\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0`\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### \ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\nGPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. \\n\\n![chat1](./chat1.png)\\n\\n### \uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5\\n\\n\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4. \\n\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.\\n\\n### \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\\n\\n\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4. \\n\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\nCSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. \\n\\n![chat2](./chat2.png)\\n\\n### \ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\n\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. \\n\\n### \uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30\\n\\n![chat3](./chat3.png)\\n\\n\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4. \\n\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4. \\n\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ud5a5\ud6c4 \uacc4\ud68d\\n\\n\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4. \\n\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4. \\n\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."},{"id":"composite","metadata":{"permalink":"/composite","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","source":"@site/blog/2023-2/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","description":"\uc694\uad6c\uc0ac\ud56d","date":"2023-05-26T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 26\uc77c","tags":[{"label":"Pattern","permalink":"/tags/pattern"},{"label":"Composite","permalink":"/tags/composite"}],"readingTime":4.74,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","slug":"composite","tags":["Pattern","Composite"]},"unlisted":false,"prevItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/tecochat-retrospective-3"},"nextItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/subway-retrospective"}},"content":"### \uc694\uad6c\uc0ac\ud56d\\n\\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.\\n\\n- \uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4. \\n\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4.\\n\\n```java\\npublic interface FarePolicy {\\n int calculate(Path path, Passenger passenger, int fare);\\n}\\n\\npublic class BaseFarePolicy implements FarePolicy { ... }\\npublic class DistanceFarePolicy implements FarePolicy { ... }\\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\\n```\\n\\n![composite1](./composite1.png)\\n\\n### \ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30\\n\\n\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \\n\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n```java\\npublic class SubwayFarePolicy implements FarePolicy {\\n\\n private final List farePolicies;\\n\\n public SubwayFarePolicy(final List farePolicies) {\\n this.farePolicies = farePolicies;\\n }\\n\\n @Override\\n public int calculate(final Path path, final Passenger passenger, final int fare) {\\n int calculatedFare = fare;\\n for (FarePolicy farePolicy : farePolicies) {\\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\\n }\\n return calculatedFare;\\n }\\n}\\n```\\n\\n\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4.\\n\\n![composite2](./composite2.png)\\n\\n### \uc815\ucc45\uc758 \uc21c\uc11c\\n\\n\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4. \\n\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4. \\nConfiguration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. \\n\\n```java\\n@Configuration\\npublic class FareConfiguration {\\n\\n @Bean\\n public FarePolicy farePolicy() {\\n return new SubwayFarePolicy(List.of(\\n new BaseFarePolicy(),\\n new DistanceFarePolicy(),\\n new AgeDiscountFarePolicy()\\n ));\\n }\\n}\\n```\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?\\n\\n![composite3](./composite3.png)\\n\\nGOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n> \ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4. \\n\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.\\n> \\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c\\n\\nComponent\\n\\n- \uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 \\n- ex) \uc694\uae08 \uc815\ucc45(FarePolicy) \\n\\nLeaf\\n\\n- \uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 \\n- ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) \\n\\nComposite\\n\\n- \uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 \\n- ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) \\n\\nClient\\n\\n- \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c\\n\\n\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c \\nClient \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c\\n\\n### \ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84\\n\\n\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4. \\n\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4. \\n\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134 \\n\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"},{"id":"subway-retrospective","metadata":{"permalink":"/subway-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-subway-path/pull/16","date":"2023-05-25T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 25\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.98,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","slug":"subway-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/composite"},"nextItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/accidental-duplication"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-subway-path/pull/16 \\n2, 3\ub2e8\uacc4: https://github.com/woowacourse/jwp-subway-path/pull/126 \\n:::\\n\\n### \uc9c0\ud558\ucca0 \ubbf8\uc158\\n\\n\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4. \\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nAPI\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4.\\n\\n**\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c**\\n\\n\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4.\\n\\n1. \uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95\\n2. \ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4. \\n\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654**\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4.\\n\\n**\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac**\\n\\n\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4. \\n\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4. \\n\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n:::note \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n:::\\n\\n**\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131**\\n\\n\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4. \\n\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4. \\n\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4. \\n\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4.\\n\\n\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4.\\n\\n```java\\n@Nested\\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\\n\\n @Test\\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\\n // given\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", 5);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \uc624\ub978\ucabd, 5);\\n\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", 3);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\", \uc624\ub978\ucabd, 7);\\n\\n // when\\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\\n\\n // then\\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\\n \uc870\ud68c_\uacb0\uacfc,\\n \ub178\uc120_\uc815\ubcf4(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0, \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\"),\\n \ub178\uc120_\uc815\ubcf4(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0, \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\")\\n );\\n }\\n}\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc758\uacac \uc870\uc728\ud558\uae30**\\n\\n\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4. \\n\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30**\\n\\n\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4. \\n\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! \\n\\n**\ud3b8\ud55c \ubd84\uc704\uae30**\\n\\n\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"},{"id":"accidental-duplication","metadata":{"permalink":"/accidental-duplication","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","source":"@site/blog/2023-2/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","description":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.","date":"2023-05-24T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 24\uc77c","tags":[{"label":"DTO","permalink":"/tags/dto"}],"readingTime":7.525,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","slug":"accidental-duplication","tags":["DTO"]},"unlisted":false,"prevItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/subway-retrospective"},"nextItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/shopping-cart-retrospective"}},"content":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4.\\n\\n### \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815\\n\\n![\uc911\ubcf51](./\uc911\ubcf51.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?\\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4.\\n\\n> `ProductSaveRequest`\uc640 `ProductUpdateRequest`\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e\\n> \\n\\n\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4.\\n\\n> \uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!\\n> \\n\\n### \uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5\\n\\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n### \ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\\n\\n\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c? \\n\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c? \\n\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! \\n\\n### \uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc\\n\\n\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4. \\nController\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\\n\u251c\u2500\u2500 dto\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n![\uc911\ubcf52](./\uc911\ubcf52.png)\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf53](./\uc911\ubcf53.png)\\n\\n\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic interface ProductSaveRequest {\\n\\n String getName();\\n\\n String getImage();\\n\\n Long getPrice();\\n}\\n\\n// ProductService\\npublic Long save(final ProductSaveRequest request) {\\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\\n return productDao.saveAndGetId(product);\\n}\\n```\\n\\n### \uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf54](./\uc911\ubcf54.png)\\n\\n\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4. \\n\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\\n\\n @NotBlank(message = \\"\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n @Size(min = 1, max = 100, message = \\"\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final String name;\\n\\n @NotBlank(message = \\"\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n private final String image;\\n\\n @Range(message = \\"\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final long price;\\n\\n public ProductRequest(final String name, final String image, final long price) {\\n this.name = name;\\n this.image = image;\\n this.price = price;\\n }\\n\\n @Override\\n public String getName() {\\n return name;\\n }\\n\\n @Override\\n public String getImage() {\\n return image;\\n }\\n\\n @Override\\n public long getPrice() {\\n return price;\\n }\\n}\\n\\n// ProductController\\n@PostMapping(\\"/products\\")\\npublic ResponseEntity save(@Valid @RequestBody final ProductRequest request) {\\n final Long id = productService.save(request);\\n return ResponseEntity.created(URI.create(\\"/products/\\" + id)).build();\\n}\\n```\\n\\n### \uc815\ub9ac\\n\\n\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\\n1. Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n2. \uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4.\\n3. \uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n[https://techblog.woowahan.com/2647/](https://techblog.woowahan.com/2647/) \\n[https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/](https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/)"},{"id":"shopping-cart-retrospective","metadata":{"permalink":"/shopping-cart-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-shopping-cart/pull/244","date":"2023-05-12T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 12\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.845,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","slug":"shopping-cart-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/accidental-duplication"},"nextItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/web-racing-car-retrospective"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-shopping-cart/pull/244 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-shopping-cart/pull/300 \\n:::\\n\\n### \uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\nInterceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4. \\n\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5**\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\\n![dto1](./dto1.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. \\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4. \\n\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. \\n\\n![dto2](./dto2.png)\\n\\n**Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9**\\n\\n\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. \\n\\n\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4. \\n\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4. \\n\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uae30\ub85d**\\n\\n\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4. \\n\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4. \\n\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!\\n\\n**\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30**\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"},{"id":"web-racing-car-retrospective","metadata":{"permalink":"/web-racing-car-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/jwp-racingcar/pull/24","date":"2023-05-02T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 2\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.6,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","slug":"web-racing-car-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/shopping-cart-retrospective"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/tecochat-retrospective-2"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/jwp-racingcar/pull/24 \\n2\ub2e8\uacc4: https://github.com/woowacourse/jwp-racingcar/pull/128 \\n:::\\n\\n### \uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\\n\\n\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4. \\n\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4. \\n\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4. \\n\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. \\n\\n\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4. \\n\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4. \\n\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. \\n\\n\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 `\ub09c\uc774\ub3c4 \ub192\uc774\uae30`\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30**\\n\\n```java\\n@SuppressWarnings(\\"NonAsciiCharacters\\")\\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\\n@Transactional\\n@AutoConfigureMockMvc\\n@SpringBootTest\\npublic class RacingGameIntegrationTest {\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ube44\ubc84\uc758 \uc131\uaca9** \\n\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84** \\n\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4. \\n\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00? \\n\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n**\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815** \\n\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."},{"id":"tecochat-retrospective-2","metadata":{"permalink":"/tecochat-retrospective-2","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","source":"@site/blog/2023-2/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","description":"\ud504\ub860\ud2b8\uc5d4\ud2b8","date":"2023-05-01T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.67,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","slug":"tecochat-retrospective-2","tags":["TecoChat","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/web-racing-car-retrospective"},"nextItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/jenkins"}},"content":"### \ud504\ub860\ud2b8\uc5d4\ud2b8\\n\\n\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4. \\n\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4. \\n\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. \\n\\n### \ubc31\uc5d4\ub4dc\\n\\n\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4. \\n\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Http Request Header\\n\\n\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n```ts\\nconst encodedName = () => {\\n const uriComponent = unescape(encodeURIComponent(name.value));\\n return btoa(uriComponent);\\n};\\n```\\n\\n### Elastic Beanstalk\\n\\n\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\nElastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\n\\n### Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac\\n\\n\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4. \\nRDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4. \\n\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. \\n\\n### Elastic Beanstalk nginx \uc124\uc815\\n\\n\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 `.platform/nginx/conf.d/` \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### Jenkins\\n\\n\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nt4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4. \\n\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. \\n\\n```groovy\\ntest {\\n maxHeapSize = \\"1024m\\"\\n}\\n```\\n\\n### Jenkins Blue Ocean\\n\\nBlue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4. \\n\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4. \\n\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 \\"Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?\\" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Elastic Beanstalk, AWS](https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html) \\n[EC2 AWS Graviton, AWS](https://aws.amazon.com/ko/ec2/graviton/) \\n[Default Memory Settings, AWS](https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings)"},{"id":"jenkins","metadata":{"permalink":"/jenkins","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","source":"@site/blog/2023-2/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","title":"Jenkins\ub85c CI/CD \uc124\uc815","description":"\uc124\uc815 \ud658\uacbd","date":"2023-04-30T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 30\uc77c","tags":[{"label":"Jenkins","permalink":"/tags/jenkins"},{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk"}],"readingTime":7.495,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","slug":"jenkins","tags":["Jenkins","Elastic Beanstalk"]},"unlisted":false,"prevItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/tecochat-retrospective-2"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/tecochat-retrospective-1"}},"content":"### \uc124\uc815 \ud658\uacbd\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI \\n\uc544\ud0a4\ud14d\uccd0: ARM \\n\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small \\n\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk \\n\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository\\n\\n### \\\\[EC2 CLI\\\\] Swap \uba54\ubaa8\ub9ac \uc124\uc815\\n\\nt4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n``` bash\\n# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\\nsudo fallocate -l 2G /swapfile\\n\\n# \uad8c\ud55c \uc124\uc815\\nsudo chmod 600 /swapfile\\n\\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\\nsudo mkswap /swapfile\\nsudo swapon /swapfile\\n\\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\\nsudo vim /etc/fstab\\n```\\n\\n\\n### \\\\[EC2 CLI\\\\] jenkins \uc124\uce58\\n\\n```bash\\nsudo wget -O /etc/yum.repos.d/jenkins.repo \\\\\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\\nsudo yum upgrade\\nsudo yum install java-17-amazon-corretto-devel\\nsudo yum install jenkins\\nsudo systemctl daemon-reload\\n```\\n\\n[Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] Jenkins \uc2dc\uc791\\n\\n```bash\\nsudo systemctl enable jenkins\\nsudo systemctl start jenkins\\n```\\n\\nenable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx & git \uc124\uce58\\n\\n```bash\\nsudo yum install nginx\\nsudo systemctl enable nginx\\nsudo systemctl start nginx\\n\\nsudo yum install git\\n```\\n\\nnginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815\\n\\n\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4.\\n\\n```bash\\nupstream jenkins {\\n keepalive 32; # keepalive connections\\n server 127.0.0.1:8080; # jenkins ip and port\\n}\\n\\n# Required for Jenkins websocket agents\\nmap $http_upgrade $connection_upgrade {\\n default upgrade;\\n \'\' close;\\n}\\n\\nserver {\\n listen 80; # Listen on port 80 for IPv4 requests\\n\\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\\n\\n # this is the jenkins web root directory\\n # (mentioned in the output of \\"systemctl cat jenkins\\")\\n root /var/run/jenkins/war/;\\n\\n access_log /var/log/nginx/jenkins.access.log;\\n error_log /var/log/nginx/jenkins.error.log;\\n\\n # pass through headers from Jenkins that Nginx considers invalid\\n ignore_invalid_headers off;\\n\\n location ~ \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)$\\" {\\n # rewrite all static files into requests to the root\\n # E.g /static/12345678/css/something.css will become /css/something.css\\n rewrite \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)\\" /$1 last;\\n }\\n\\n location /userContent {\\n # have nginx handle all the static requests to userContent folder\\n # note : This is the $JENKINS_HOME dir\\n root /var/lib/jenkins/;\\n if (!-f $request_filename){\\n # this file does not exist, might be a directory or a /**view** url\\n rewrite (.*) /$1 last;\\n break;\\n }\\n sendfile on;\\n }\\n\\n location / {\\n sendfile off;\\n proxy_pass http://jenkins;\\n proxy_redirect default;\\n proxy_http_version 1.1;\\n\\n # Required for Jenkins websocket agents\\n proxy_set_header Connection $connection_upgrade;\\n proxy_set_header Upgrade $http_upgrade;\\n\\n proxy_set_header Host $host;\\n proxy_set_header X-Real-IP $remote_addr;\\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\\n proxy_set_header X-Forwarded-Proto $scheme;\\n proxy_max_temp_file_size 0;\\n\\n #this is the maximum upload size\\n client_max_body_size 10m;\\n client_body_buffer_size 128k;\\n\\n proxy_connect_timeout 90;\\n proxy_send_timeout 90;\\n proxy_read_timeout 90;\\n proxy_buffering off;\\n proxy_request_buffering off; # Required for HTTP CLI commands\\n proxy_set_header Connection \\"\\"; # Clear for keepalive\\n }\\n\\n}\\n```\\n\\nJenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4. \\n`/etc/nginx/conf.d`\xa0\uc544\ub798\xa0`default.conf`\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4. \\nnginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0`include /etc/nginx/conf.d/*.conf;`\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0`.conf`\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4. \\n\uc124\uc815 \ud6c4\xa0`sudo nginx -t`\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0`sudo systemctl restart nginx`\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins \uc811\uc18d\\n\\nJenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\nEC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4.\\n\\n![jenkins-start](./jenkins-start.png)\\n\\n\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 `sudo cat /var/lib/jenkins/secrets/initialAdminPasswor` \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 `install suggested plugins`\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4. \\n\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins Blue Ocean \uc124\uce58\\n\\nJenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[AWS IAM & EC2\\\\] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30\\n\\nS3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\nIAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4.\\n\\n1. \uc5d4\ud130\ud2f0 \uc120\ud0dd\\n\\n![aws-iam1](./aws-iam1.png)\\n\\n2. \uad8c\ud55c \ucd94\uac00\\n\\n![aws-iam2](./aws-iam2.png)\\n\\n3. \uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131\\n\\n![aws-iam3](./aws-iam3.png)\\n\\n4. \uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815\\n\\n![aws-iam4](./aws-iam4.png)\\n\\n### \\\\[AWS S3\\\\] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131\\n\\n\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4.\\n\\n- `\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8`\\n\\n![aws-s3](./aws-s3.png)\\n\\n### \\\\[Github\\\\] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131\\n\\nrepo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. \\n\\n### \\\\[Jenkins\\\\] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\\n\\n![jenkins-blue-ocean1](./jenkins-blue-ocean1.png)\\n\\n\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4. \\nJenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. \\n\\n![jenkins-blue-ocean2](./jenkins-blue-ocean2.png)\\n\\n\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4.\\n\\n![jenkins-blue-ocean3](./jenkins-blue-ocean3.png)\\n\\n### \\\\[Github Repsoitory\\\\] Jenkinsfile \uc124\uc815\\n\\n\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n```bash\\npipeline {\\n agent any\\n stages {\\n stage(\'build and test\') {\\n steps {\\n sh \'/gradlew clean build\'\\n }\\n }\\n stage(\'zip\') {\\n steps {\\n sh \'mv ./build/libs/woowachat.jar .\'\\n sh \'zip -r woowachat.zip .platform delivery.jar Procfile\'\\n }\\n }\\n stage(\'upload\') {\\n steps {\\n sh \'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2\'\\n }\\n }\\n stage(\'deploy\') {\\n steps {\\n sh \'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\\"woowa-chat\\",S3Key=\\"woowachat.zip\\"\'\\n sh \'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}\'\\n }\\n }\\n }\\n}\\n```\\n\\n### \\\\[Github\\\\] Webhooks \uc124\uc815\\n\\n![github-hook](./github-hook.png)\\n\\npush \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c `http://Jenkins\uc8fc\uc18c/github-webhook/` \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Install Jenkins - CentOS, Jenkins](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \\n[Nginx Reverse Proxy Configuration, Jenkins](https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/) \\n[Amazon Corretto 17 JDK Install, AWS](https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html) \\n[Amazon Linux 2023 packages, AWS](https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html)"},{"id":"tecochat-retrospective-1","metadata":{"permalink":"/tecochat-retrospective-1","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023-2/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","description":"4\uc6d4 21\uc77c \uae08\uc694\uc77c","date":"2023-04-22T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 22\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.68,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","slug":"tecochat-retrospective-1","tags":["TecoChat","Retrospective"]},"unlisted":false,"prevItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/jenkins"},"nextItem":{"title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","permalink":"/healthful-growth"}},"content":"### 4\uc6d4 21\uc77c \uae08\uc694\uc77c\\n\\n\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. \\n\\n\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4. \\n`Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?` \\n\\n\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4. \\n\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. \\n\\n\uc774\uac74 \ubabb\ucc38\uc9c0\\n\\n### \ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?\\n\\n\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4. \\n\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4. \\ndev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4.\\n\\n### \ub9d0\ub791\uc758 DM\\n\\n\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4. \\n\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\\n\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4. \\n\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!\\n\\n### \ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec\\n\\n\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4. \\n\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. \\n\\n### GPT\\n\\n\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. \\n\\n### Sonarcloud\\n\\n\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4. \\nSonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4. \\n\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4. \\nSonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4. \\n\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124\\n\\n### Tiptap\\n\\n\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\nTiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4. \\n\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4. \\napi \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c `
`\ub85c \ubcc0\ud658\ud588\ub2e4.  \\n\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c `\\\\n`\ub97c `
`\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4. \\n\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. \\n\\n```ts\\nconst replaceCodeFences = (input: String) => {\\n const codeFencesRegex = /```([\\\\w-]*)\\\\n([\\\\s\\\\S]*?)\\\\n```/g;\\n return input\\n .replace(codeFencesRegex, (match, p1, p2) => {\\n const languageClass = p1 ? ` class=\\"language-${p1}\\"` : \\"\\";\\n return `
${p2}
`;\\n })\\n .replace(/\\\\n/g, \\"
\\");\\n};\\n```\\n\\nTiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\\n![tecochat](./teco-chat.png)\\n\\n### \ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9\\n\\n\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."},{"id":"healthful-growth","metadata":{"permalink":"/healthful-growth","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-19-\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30.mdx","source":"@site/blog/2023-2/2023-04-19-\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30.mdx","title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","description":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c","date":"2023-04-19T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 19\uc77c","tags":[{"label":"etc","permalink":"/tags/etc"}],"readingTime":4.025,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","slug":"healthful-growth","tags":["etc"]},"unlisted":false,"prevItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/tecochat-retrospective-1"},"nextItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/book-leadership-and-self-deception"}},"content":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c \\n\uc774\ub3d9\uc6b1\ub2d8 \ud2b9\uac15\\n\\n### \uc790\uc874\uac10 \uae30\ub465 \ub9cc\ub4e4\uae30\\n\\n\ub6f0\uc5b4\ub09c \ub3d9\ub8cc, \uc0c8\ub85c\uc6b4 \ud658\uacbd \uadf8\ub9ac\uace0 \ud504\ub85c\uc81d\ud2b8\ub97c \uc2e4\ud328\ud558\uba74\uc11c \uc790\uc874\uac10\uc774 \ub5a8\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \\n\uc790\uc874\uac10\uc774 \ubb34\ub108\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \ub098\ub97c \uc9c0\ud0f1\ud560 \uc218 \uc788\ub294 \uae30\ub465\uc774 \ud544\uc694\ud558\ub2e4. (\ud55c \uac1c\uac00 \uc544\ub2cc \uc5ec\ub7ec \uac1c) \\n\\n### \ub098\ub9cc\uc758 \ud559\uc2b5 \ubc29\ubc95 \ucc3e\uae30\\n\\n\ud68c\uc0ac \uc77c\uc744 \uc9c0\uc18d\uc801\uc73c\ub85c \ud55c\ub2e4\uba74 \ud68c\uc0ac \uc77c\uc758 \uc219\ub828\uc790\uac00 \ub418\uc9c0\ub9cc, \uac1c\ubc1c \uc804\ubb38\uac00\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4. \\n\uc8fc\ub2c8\uc5b4 \uc77c\ub54c\ub294 \uc131\uacfc\uac00 \uc544\ub2cc \ud559\uc2b5\uc73c\ub85c! \\n\uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uc0ac\ub78c\uc778\uc9c0? \uace0\ubbfc\ud558\uae30\\n\\n**\ub3d9\uc6b1\ub2d8\uc774 \uadf8\ub3d9\uc548 \uc2dc\ub3c4\ud55c \ubc29\ubc95**\\n\\n\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8 \uc9c4\ud589\ud558\uae30 \u2192 A-Z \uad6c\ud604 \uacbd\ud5d8 \\n\ucc45 \uc2a4\ud130\ub514 \u2192 \ub192\uc740 \uc644\uc8fc\uc728, \ud558\uc9c0\ub9cc \ub0b4\uac00 \ubc1c\ud45c\ud55c \uc8fc\uc81c\ub9cc \uae30\uc5b5\uc5d0 \ub0a8\ub294\ub2e4. \\n\uac15\uc758 \uc900\ube44 \u2192 100% \ub0b4\uc6a9 \uc2b5\ub4dd, \ub0ae\uc740 \uc2dc\uac04 \uac00\uc131\ube44, \uac15\uc758 \uc678\uc801\uc778 \ubd80\uac00\uc791\uc5c5 \\n\ube14\ub85c\uadf8 \u2192 \uc628\ub77c\uc778 \ubaa8\ub450\uac00 \ub9ac\ubdf0\uc5b4, \ub3d9\ub8cc\uc640 \uacf5\uc720 \uac00\ub2a5, \ud53c\ub4dc\ubc31\uc758 \ubd80\ub044\ub7ec\uc6c0 \ud83d\ude33 \\n\\n\uc2e4\ud328\ud558\uac70\ub098, \uc798\ubabb \uc801\uc5b4\ub3c4 \ub0a8\ub4e4\uc758 \uc2dc\uc120\ubcf4\ub2e8 \ub098 \uc790\uc2e0\uc758 \uc131\uc7a5\uc774 \uc911\uc694\ud558\ub2e4. \\n\uac00\ub2a5\ud558\uba74 \uc778\uc99d\ub418\uace0, \uc815\uc81c\ub41c \uc790\ub8cc\ub85c \uc2b5\ub4dd\ud55c\ub2e4. \\n\ub098\uc5d0\uac8c \ub9de\ub294 \uac00\uc7a5 \ud6a8\uc728\uc774 \uc88b\uc740 \ud559\uc2b5 \ubc29\ubc95\uc73c\ub85c \ucc3e\uace0, \uc218\uc2dc\ub85c \uc810\uac80\ud558\uc5ec \ub354 \uc88b\uc740 \ubc29\ubc95\uc744 \ucc3e\uace0 \uc2dc\ub3c4\ud55c\ub2e4. \\n\\n### \uc0c8\ub85c\uc6b4 \ud658\uacbd\uc744 \uc798 \ubc30\uc6b0\ub294 \ubc29\ubc95\\n\\n\uc2dc\uac04 > \ub3c8\uc774\uae30 \ub54c\ubb38\uc5d0 \uc2dc\uac04\uc744 \ub3c8\uc73c\ub85c \uad6c\ub9e4\ud558\uc790. \\n\uc2e0\ub8b0\ud560\ub9cc\ud55c \ubd84\uaed8 \uc9c8\ubb38 \ub610\ub294 \ucf54\ub4dc \ub9ac\ubdf0\uac00 \uac00\ub2a5\ud55c \uac15\uc758\ub97c \uad6c\ub9e4\ud55c\ub2e4. \\n\uc5b4\ub5a4 \ud559\uc2b5 \ubc29\uc2dd, \uc5b8\uc81c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0, \uc5b4\ub5a4 \ud658\uacbd\uc5d0\uc11c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n\\n### \ud559\uc2b5 \uc8fc\uc81c\\n\\n\ud68c\uc0ac \uc5c5\ubb34\uc5d0\uc11c \ub9cc\ub09c \ubb38\uc81c\ub97c \uc5f0\uad6c, \uc815\ub9ac, \ud574\uacb0\ud574\uc11c \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uacf5\uc720\ud558\uace0 \ud53c\ub4dc\ubc31\uc744 \ubc1b\ub294\ub2e4. \\n\uc8fc\ubcc0 \ub3d9\ub8cc\ub4e4\uc5d0\uac8c \uc778\uc815\ubc1b\ub294\uac8c \uc6b0\uc120\uc774\ub2e4. \\n\\n### \uc0b0\ub9cc\ud568 \uad00\ub9ac\ud558\uae30\\n\\n\ucee8\ud14d\uc2a4\ud2b8 \uc2a4\uc704\uce6d\uc774 \uc790\uc8fc \uc77c\uc5b4\ub098\uba74 \uc0b0\ub9cc\ud574\uc9c0\uae30 \ub54c\ubb38\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. \\nex) \uc9d1\uc911\uc774 \uc798 \ub418\ub294 \ud658\uacbd \uad6c\uc131\ud558\uae30, \ucd9c\uadfc \uc804 1~2\uc2dc\uac04 \uc9d1\uc911\ud558\uace0 \ucd9c\uadfc\ud558\uae30, \uc810\uc2ec \uc800\ub141 \uc0b0\ucc45\ud558\uae30, \uc8fc 2~3\ud68c \uc6b4\ub3d9\ud558\uae30\\n\\n### \uac70\uc778\uc5d0 \uc5b4\uae68\uc704\uc5d0 \uc62c\ub77c\ud0c0\uae30\\n\\n\ub6f0\uc5b4\ub09c \uc0ac\ub78c \uc606\uc5d0\uc11c \ubc30\uc6cc\uc57c \ud55c\ub2e4. \\nC\ub808\ubca8, \ud14c\ud06c \ub9ac\ub4dc\uc640 \uac19\uc774 \uc77c\ud560 \uc218 \uc788\ub294 \uac83\uc740 \ud070 \uae30\ud68c\ub2e4. \\n\ucee4\ubba4\ub2c8\ucf00\uc774\uc158 \ubc29\ubc95, \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud558\ub294 \ubc29\ubc95, \ubb38\ud654\ub97c \ub9cc\ub4e4\uc5b4\uac00\ub294 \ubc29\ubc95, \uacb0\uc815\uc758 \uae30\uc900\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \ud559\uc2b5\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ubcf4\uc0c1\\n\\n\uc2dc\ub828 \ub4a4\uc5d0\ub294 \ud56d\uc0c1 \ubcf4\ubb3c\uc774 \uae30\ub2e4\ub9ac\uace0 \uc788\ub2e4. \\n\ubcf4\uc0c1\uc744 \ud1b5\ud574 \uafb8\uc900\ud568\uc744 \uc720\uc9c0\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\ub77c. \\n\\n### \ub0a8\uc744 \uc124\ub4dd\ud558\ub294 \ubc29\ubc95 \ubc30\uc6b0\uae30\\n\\n\ud300\uc6d0\ub4e4\uc774 \ub9e4\ubc88 \ub0b4 \uc758\uacac\uc744 \ubc18\ub300\ud55c\ub2e4\uba74 \uc644\ubcbd\ud55c \ub17c\ub9ac\uac00 \uc911\uc694\ud55c\uac8c \uc544\ub2c8\ub2e4. \\n\uc5b4\ub5bb\uac8c \ud558\uba74 \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\ub294\uac00? \\n\ucee4\ubba4\ub2c8\ucf00\uc774\uc158, \ud611\uc5c5, \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0\uc11c \ubd80\uc871\ud568\uc774 \uc788\uc73c\uba74 \uc548\ub41c\ub2e4."},{"id":"book-leadership-and-self-deception","metadata":{"permalink":"/book-leadership-and-self-deception","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","source":"@site/blog/2023-2/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","description":"\ucc45 \uc815\ubcf4","date":"2023-04-08T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 8\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.16,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","slug":"book-leadership-and-self-deception","tags":["Book"]},"unlisted":false,"prevItem":{"title":"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30","permalink":"/healthful-growth"},"nextItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/innodb-lock"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c \\n> \uc544\ube48\uc800\uc5f0\uad6c\uc18c\\n> \\n\\n### \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\\n\\n\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. \\n- \uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 \\n- \uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704\\n\\n\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4. \\n\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. \\n\\n\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098 \\n\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4. \\n\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\\n\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4. \\n\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. \\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4. \\nR. D. \ub7ad \\np.19\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4. \\np.66\\n>\\n\\n> \ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4. \\n\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4. \\n\uc54c\ub7ad, \ud0c1\ub2db\ud55c \\np.103\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. \\n\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. \\n\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\np.175\\n> \\n\\n> \uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0. \\np.188\\n> \\n\\n> \ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4. \\np.214\\n> \\n\\n> \ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. \\n\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4. \\np.224\\n>\\n\\n> \uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. \\np.280\\n>"},{"id":"innodb-lock","metadata":{"permalink":"/innodb-lock","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023-2/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-07T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 7\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"InnoDB","permalink":"/tags/inno-db"}],"readingTime":5.805,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"innodb-lock","tags":["DataBase","Lock","InnoDB"]},"unlisted":false,"prevItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/book-leadership-and-self-deception"},"nextItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/mysql-lock"}},"content":"## InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4. \\nInnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n:::note \ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd \\n\\n:::\\n\\n:::note \ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd \\n\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.\\n\\n:::\\n\\n### Shared & Exclusive Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n**\uacf5\uc720 \uc7a0\uae08(S, shared lock)**\\n\\n\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;`\\n\\n**\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)** \\n\\n\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 FOR UPDATE;`\\n\\n### Intention Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4. \\n\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n**\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)**\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n**\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)** \\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n** \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 **\\n\\n| | X | IX | S | IS |\\n| --- | --- | --- | --- | --- |\\n| X | Conflict | Conflict | Conflict | Conflict |\\n| IX | Conflict | Compatible | Conflict | Compatible |\\n| S | Conflict | Conflict | Compatible | Compatible |\\n| IS | Conflict | Compatible | Compatible | Compatible |\\n\\n### Record Locks\\n\\n\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. \\n\\n### Gap Locks\\n\\n\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### Next-Key Locks\\n\\n\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4. \\n`REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. \\n\\n### AUTO-INC Locks\\n\\n`AUTO_INCREMENT` \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 `INSERT`\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. \\nInnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 `INSERT`\ub098 `REPLACE` \ubb38\uc7a5\uc5d0\uc11c `AUTO_INCREMENT` \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4.\\n\\n### \uc7a0\uae08 \uc608\uc2dc\\n\\n```sql\\n-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id = 10 for update;\\n\\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id > 100 for update;\\n\\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Optimistic and Pessimistic record locking, IBM](https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking) \\n[MySQL Innodb Locks, cecil1018](https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/) \\n[MySQL 8.0 InnoDB Locks, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html) \\n[Locks Set by Different SQL Statements in InnoDB, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html)"},{"id":"mysql-lock","metadata":{"permalink":"/mysql-lock","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023-2/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-06T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 6\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"MySQL","permalink":"/tags/my-sql"}],"readingTime":4.405,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"mysql-lock","tags":["DataBase","Lock","MySQL"]},"unlisted":false,"prevItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/innodb-lock"},"nextItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/transaction-and-isolation"}},"content":"## MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4. \\nMySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. \\n\\n### \uae00\ub85c\ubc8c \ub77d(Global lock)\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. \\n - \uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4.\\n - \uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.\\n\\n\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- GLOBAL LOCK\\nFLUSH TABLES WITH READ LOCK;\\n-- UNLOCK\\nUNLOCK TABLES;\\n\\n-- BACKUP LOCK\\nLOCK INSTANCE FOR BACKUP;\\n-- UNLOCK\\nUNLOCK INSTANCE;\\n```\\n\\n:::note MyISAM\\n\\nMySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.\\n\\n:::\\n\\n### \ud14c\uc774\ube14 \ub77d(Table lock)\\n\\n\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4. \\n\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4. \\nInnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4.\\n\\n```sql\\n-- TABLE LOCK\\nLOCK TABLES table_name [ READ | WRITE ]\\n\\n-- UNLOCK\\nUNLOCK TABLES;\\n```\\n\\n### \ub124\uc784\ub4dc \ub77d(Named lock)\\n\\n\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\\nSELECT GET_LOCK(\'aGVyYg==\', 1);\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\\nSELECT IS_FREE_LOCK(\'aGVyYg==\');\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\\nSELECT RELEASE_LOCK(\'aGVyYg==\');\\n\\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\\nSELECT RELEASE_ALL_LOCKS();\\n```\\n\\n### \uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4.\\n\\n```sql\\n-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi](https://gywn.net/2013/12/mysql-user-level-lock/) \\n[Locking Functions, MySQL 5.7 Reference](https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks) \\n[Locking Functions, MySQL 8.0 Reference](https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks)"},{"id":"transaction-and-isolation","metadata":{"permalink":"/transaction-and-isolation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","source":"@site/blog/2023-2/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","description":"\ud2b8\ub79c\uc7ad\uc158(Transaction)","date":"2023-04-05T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 5\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Transaction","permalink":"/tags/transaction"},{"label":"Isolation","permalink":"/tags/isolation"}],"readingTime":9.57,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","slug":"transaction-and-isolation","tags":["DataBase","Transaction","Isolation"]},"unlisted":false,"prevItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/mysql-lock"},"nextItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/test-double"}},"content":"## \ud2b8\ub79c\uc7ad\uc158(Transaction)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4. \\n\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)\\n\\n\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4. \\n\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4. \\n\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4. \\n\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c) \\n\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\\n:::info \uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14\\n\\n\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \\n- \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)\\n- \ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)\\n\\n:::\\n\\n## \uaca9\ub9ac \uc218\uc900(Isolation level)\\n\\n\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4. \\n\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, `SERIALIZABLE`\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### READ UNCOMMITTED\\n\\n\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 `COMMIT`\uc774\ub098 `ROLLBACK` \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4. \\n\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c `READ COMMITTED` \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ UNCOMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: INSERT(Alice)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: COMMIT(Alice)\\n```\\n\\n### READ COMMITTED\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\n\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\n`REPEATABLE READ`\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 `NON-REPEATABLE READ` \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ COMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n Alice->>Database: COMMIT\\n```\\n\\n### REPEATABLE READ\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\nMySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4. \\n\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n - \ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4.\\n - Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4.\\n - Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4.\\n - `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\nInnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n```\\n\\n:::note \uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)\\n\\n\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.\\n\\n:::\\n\\n:::note MVCC(Multi Version Concurrency Control)\\n\\n\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4.\\n - PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4.\\n - Oracle, InnoDB\ub294 `Undo log`\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)\\n\\n\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.\\n\\n:::\\n\\n### SERIALIZABLE\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4. \\nInnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. \\n\\n## \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c\\n\\n\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n| \uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c | \ub354\ud2f0 \ub9ac\ub4dc | \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c | \ud32c\ud140 \ub9ac\ub4dc |\\n| --- | --- | --- | --- |\\n| READ UNCOMMITTED | O | O | O |\\n| READ COMMITTED | X | O | O |\\n| REPEATABLE READ | X | X | O(InnoDB\ub294 X) |\\n| SERIALIZABLE | X | X | X |\\n\\n### \ub354\ud2f0 \ub9ac\ub4dc(Dirty read)\\n\\n\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1 \\n\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4. \\n\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0\\n\\n### \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: NON REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Bob\\n```\\n\\n### \ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: PHANTOM READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 1\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: INSERT(Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 2\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Isolation Level, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html)"},{"id":"test-double","metadata":{"permalink":"/test-double","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","source":"@site/blog/2023-2/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","description":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?","date":"2023-04-04T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 4\uc77c","tags":[{"label":"Test","permalink":"/tags/test"},{"label":"Mock","permalink":"/tags/mock"}],"readingTime":4.81,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","slug":"test-double","tags":["Test","Mock"]},"unlisted":false,"prevItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/transaction-and-isolation"},"nextItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/java-class-file"}},"content":"### \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?\\n\\n\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4. \\nGerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4.\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. \\n\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870**\\n\\n```mermaid\\nflowchart LR\\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\\n Fake --\x3e TestDouble\\n```\\n\\n### \ub354\ubbf8(Dummy)\\n\\n\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n### \uc2a4\ud141(Stub)\\n\\n\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n### \uc2a4\ud30c\uc774(Spy)\\n\\n\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4. \\n\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. \\n\\n### \ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)\\n\\n\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4. \\n\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### \uac00\uc9dc(Fake)\\n\\nDOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4. \\n\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note DOC(depended-on component)\\n\\n\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4. \\n\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. \\n\\n:::\\n\\n### \uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84\\n\\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4. \\n\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. \\n\uac04\ub2e8\ud788 \uc124\uba85\ud558\uc790\uba74 \ubaa9\uc758 \uacbd\uc6b0 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc5d0 \ub300\ud55c \uac80\uc99d(e.g. verify)\uc774 \ub4e4\uc5b4\uac00\uace0, \uc2a4\ud141\uc758 \uacbd\uc6b0 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \uac80\uc99d\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n| TestDouble | Mock | Stub |\\n| --- | --- | --- |\\n| \ud3ec\ud568 \uc720\ud615 | \ubaa9, \uc2a4\ud30c\uc774 | \uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c |\\n| \uc6a9\ub3c4 | \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9 | \ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9 |\\n| \uc124\uba85 | SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9 | SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9\\n| \uc608\uc2dc | \uc774\uba54\uc77c \ubc1c\uc1a1 | \ub370\uc774\ud130 \uac80\uc0c9 |\\n\\n:::note SUT(system under test)\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c \\n\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1\\n\\n:::\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504 \\n\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0 \\n[\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler](https://www.martinfowler.com/bliki/TestDouble.html) \\n[\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib](https://johngrib.github.io/wiki/test-terms/) \\n[Test Double, Gerard Meszaros](http://xunitpatterns.com/Test%20Double.html) \\n[\ub2e8\uc704 \ud14c\uc2a4\ud2b8 \ubaa8\ubc94 \uc0ac\ub840, Microsoft](https://learn.microsoft.com/ko-kr/dotnet/core/testing/unit-testing-best-practices)"},{"id":"java-class-file","metadata":{"permalink":"/java-class-file","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","source":"@site/blog/2023-2/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","description":"\ud074\ub798\uc2a4 \ud30c\uc77c","date":"2023-04-03T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 3\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Class","permalink":"/tags/class"}],"readingTime":5.63,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","slug":"java-class-file","tags":["Java","Class"]},"unlisted":false,"prevItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/test-double"},"nextItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/custom-jdbc-template"}},"content":"### \ud074\ub798\uc2a4 \ud30c\uc77c\\n\\n\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?\\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd\\n\\n8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4. \\n16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4. \\n\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. \\n\\nu1 \u2192 unsigned 1byte \\nu2 \u2192 unsigned 2byte \\nu4 \u2192 unsigned 4byte \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870\\n\\n```\\nClassFile {\\n u4 magic;\\n u2 minor_version;\\n u2 major_version;\\n u2 constant_pool_count;\\n cp_info constant_pool[constant_pool_count-1];\\n u2 access_flags;\\n u2 this_class;\\n u2 super_class;\\n u2 interfaces_count;\\n u2 interfaces[interfaces_count];\\n u2 fields_count;\\n field_info fields[fields_count];\\n u2 methods_count;\\n method_info methods[methods_count];\\n u2 attributes_count;\\n attribute_info attributes[attributes_count];\\n}\\n```\\n\\n### \ub9e4\uc9c1\ub118\ubc84\\n\\n\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804\\n\\n\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. \\n- Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D\\n\\n\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 `UnsupportedClassVersionError` \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n**class\xa0file format major versions**\\n\\n| Java SE | Released | Major | Supported majors |\\n| --- | --- | --- | --- |\\n| 8 | March 2014 | 52 | 45 .. 52 |\\n| 9 | September 2017 | 53 | 45 .. 53 |\\n| 10 | March 2018 | 54 | 45 .. 54 |\\n| 11 | September 2018 | 55 | 45 .. 55 |\\n| 12 | March 2019 | 56 | 45 .. 56 |\\n| 13 | September 2019 | 57 | 45 .. 57 |\\n| 14 | March 2020 | 58 | 45 .. 58 |\\n| 15 | September 2020 | 59 | 45 .. 59 |\\n| 16 | March 2021 | 60 | 45 .. 60 |\\n| 17 | September 2021 | 61 | 45 .. 61 |\\n\\n### \uc0c1\uc218 \ud480\\n\\n2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4. \\n\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4. \\nJVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4.\\n\\n### \uc561\uc138\uc2a4 \ud50c\ub798\uadf8\\n\\n\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. \\n- \uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. `ACC_PUBLIC` xor `ACC_INTERFACE` xor `ACC_ABSTRACT`\\n\\n\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4.\\n\\n**Class access and property modifiers**\\n\\n| Flag Name | Value | Interpretation |\\n| --- | --- | --- |\\n| ACC_PUBLIC | 0x0001 | Declared\xa0public; may be accessed from outside its package. |\\n| ACC_FINAL | 0x0010 | Declared\xa0final; no subclasses allowed. |\\n| ACC_SUPER | 0x0020 | Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction. |\\n| ACC_INTERFACE | 0x0200 | Is an interface, not a class. |\\n| ACC_ABSTRACT | 0x0400 | Declared\xa0abstract; must not be instantiated. |\\n| ACC_SYNTHETIC | 0x1000 | Declared synthetic; not present in the source code. |\\n| ACC_ANNOTATION | 0x2000 | Declared as an annotation type. |\\n| ACC_ENUM | 0x4000 | Declared as an\xa0enum\xa0type. |\\n| ACC_MODULE | 0x8000 | Is a module, not a class or interface. |\\n\\n### this_class\\n\\n\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 `CONSTANT_Class_infoclass` \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### super_class\\n\\n\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 `java.lang.Object`\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.\\n\\n### interface, field, method\\n\\n\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4. \\ninterface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4.\\n\\n### attributes\\n\\n\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85 \\n\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234\\n\\nIntelliJ plugin - BinEd \\nIntelliJ plugin - jclasslib Bytecode Viewer\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654 \\n[Class file in Java, File Format](https://docs.fileformat.com/ko/programming/class/) \\n[java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html) \\n[java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html)"},{"id":"custom-jdbc-template","metadata":{"permalink":"/custom-jdbc-template","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023-2/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","description":"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.","date":"2023-04-02T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 2\uc77c","tags":[{"label":"JDBC","permalink":"/tags/jdbc"},{"label":"Java","permalink":"/tags/java"}],"readingTime":9.025,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","slug":"custom-jdbc-template","tags":["JDBC","Java"]},"unlisted":false,"prevItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/java-class-file"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/woowacourse-level1-retrospective"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. \\n\\n### \uae30\uc874 \ucf54\ub4dc\\n\\n\\n\\n\\n```java\\npublic class User {\\n private final int id;\\n private final String name;\\n\\n public User(final int id, final String name) {\\n this.id = id;\\n this.name = name;\\n }\\n\\n public int getId() {\\n return id;\\n }\\n\\n public String getName() {\\n return name;\\n }\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\npublic class UserDao {\\n private final ConnectionPool connectionPool;\\n\\n public UserDao(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void insert(final String name) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setString(1, name);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public void delete(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"DELETE FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public User findById(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n if (resultSet.next()) {\\n return new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n );\\n }\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n return null;\\n }\\n\\n public List findAll() {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n final List result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n ));\\n }\\n return result;\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n\\n\\n\\n\\n```java\\npublic class ConnectionPool {\\n private static final String SERVER = \\"localhost:13306\\";\\n private static final String DATABASE = \\"chess\\";\\n private static final String OPTION = \\"?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true\\";\\n private static final String URL = \\"jdbc:mysql://\\" + SERVER + \\"/\\" + DATABASE + OPTION;\\n private static final String USERNAME = \\"root\\";\\n private static final String PASSWORD = \\"root\\";\\n\\n private final AtomicInteger index = new AtomicInteger();\\n private final List connections;\\n\\n public ConnectionPool(final int connectionCount) {\\n connections = generateConnections(connectionCount);\\n }\\n\\n private List generateConnections(final int connectionCount) {\\n return Stream.generate(this::generateConnection)\\n .limit(connectionCount)\\n .collect(toList());\\n }\\n\\n private Connection generateConnection() {\\n try {\\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\\n } catch (SQLException e) {\\n throw new IllegalStateException(\\"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\");\\n }\\n }\\n\\n public Connection getConnection() {\\n int currentIndex = index.getAndIncrement();\\n return connections.get(currentIndex % connections.size());\\n }\\n}\\n```\\n\\n\\n\\n\\n### SELECT, DELETE \uc911\ubcf5 \uc81c\uac70\\n\\n\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1 \\n\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 \\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n```java\\npublic void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n executeUpdate(query, name);\\n}\\n\\npublic void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n executeUpdate(query, userId);\\n}\\n\\nprivate void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758\\n\\n\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. \\n\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \ucf5c\ubc31(Callback)\\n\\n\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4. \\n\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n```mermaid\\nflowchart LR\\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31\\n```\\n\\n:::\\n\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\nexecuteQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4. \\n\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper {\\n User mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c\\n\\n\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c? \\n\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java\\npublic User findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return queryForSingleResult(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n }, userId);\\n}\\n\\nprivate User queryForSingleResult(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return rowMapper.mapRow(resultSet);\\n }\\n return null;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c\\n\\n\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4.\\n\\n```java\\npublic List findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return query(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n });\\n}\\n\\nprivate List query(final String query, final RowMapper rowMapper, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30\\n\\n\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper {\\n T mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n\\nprivate List query(final String query, final RowMapper rowMapper, final Object... parameters) {...}\\nprivate T queryForSingleResult(final String query, final RowMapper rowMapper, final Object... parameters) {...}\\n```\\n\\n### \uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30\\n\\n\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4. \\n\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4.\\n\\n\\n\\n\\n```java\\npublic class UserDao {\\n private final RowMapper rowMapper = resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n };\\n private final JdbcTemplate jdbcTemplate;\\n\\n public UserDao(final JdbcTemplate jdbcTemplate) {\\n this.jdbcTemplate = jdbcTemplate;\\n }\\n\\n public void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n jdbcTemplate.executeUpdate(query, name);\\n }\\n\\n public void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n jdbcTemplate.executeUpdate(query, userId);\\n }\\n\\n public Optional findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\\n }\\n\\n public List findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return jdbcTemplate.query(query, rowMapper);\\n }\\n}\\n```\\n\\n\\n\\n\\n```java\\npublic class JdbcTemplate {\\n private final ConnectionPool connectionPool;\\n\\n public JdbcTemplate(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public Optional queryForSingleResult(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return Optional.of(rowMapper.mapRow(resultSet));\\n }\\n return Optional.empty();\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n private ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters\\n ) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n }\\n\\n public List query(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n\\n"},{"id":"woowacourse-level1-retrospective","metadata":{"permalink":"/woowacourse-level1-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-2/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","source":"@site/blog/2023-2/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","description":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.","date":"2023-04-01T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 1\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.48,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","slug":"woowacourse-level1-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/custom-jdbc-template"},"nextItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/chess-retrospective"}},"content":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4. \\n\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4. \\n\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. \\n\\n### Keep\\n\\n**\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30** \\n\\n\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0 \\n\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0 \\n\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4. \\n\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 \\n\\n\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. \\n\\n**\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30** \\n\\n10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) \\n\\n**\uae00\uc4f0\uae30** \\n\\n\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4. \\n\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4. \\n\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n**\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514** \\n\\n\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4. \\n\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4. \\n\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? \\n\\n**\ub808\ubca8 \uc778\ud130\ubdf0**\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370 \\n\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4. \\n\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n- \ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 \\n- \ub450\uad04\uc2dd \ud45c\ud604\\n- \uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 \\n- \uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30\\n- \uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30\\n- \ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)\\n- \uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30\\n- \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30\\n\\n### Problem\\n\\n**\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4. \\n\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4. \\n\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. \\n\\n**\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871** \\n\\n\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Try\\n\\n**\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?** \\n\\n\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 `\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)` \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4. \\n\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? \\n\\n**\uae30\uc220\uc801\uc778 \ubd80\ubd84** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4. \\n\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70 \\n\\n\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4. \\n\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."},{"id":"chess-retrospective","metadata":{"permalink":"/chess-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","description":"1, 2\ub2e8\uacc4//github.com/woowacourse/java-chess/pull/441","date":"2023-03-31T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 31\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.705,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","slug":"chess-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/woowacourse-level1-retrospective"},"nextItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/grasp"}},"content":":::note PR \ub9c1\ud06c \\n1, 2\ub2e8\uacc4: https://github.com/woowacourse/java-chess/pull/441 \\n3, 4\ub2e8\uacc4: https://github.com/woowacourse/java-chess/pull/529 \\n:::\\n\\n### \uccb4\uc2a4\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4! \\n\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. \\n \\n\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n**\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80** \\nRank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4. \\n\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2) \\n\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n**\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80** \\n\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. \\n\\n**\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80** \\n\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. \\n\\n**\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9** \\n\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4. \\n\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n- \uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 \\n- \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 \\n\\n\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4. \\n\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n- \ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. \\n- \uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. \\n- \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. \\n\\n\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4. \\n\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac) \\n\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)\\n\\n\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d \\n\\n**\ubd80\uac00\uc801\uc778 \ubd80\ubd84**\\n\\n\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. \\n- \ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 \\n- ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac \\n- \uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) \\n\\n\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84** \\nDB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n**\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10** \\n\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4. \\n\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DAO \uc911\ubcf5 \uc81c\uac70**\\n\\n\ud504\ub864\ub85c\uadf8\uc5d0 [\uae00](https://prolog.techcourse.co.kr/studylogs/2947)\uc744 \uc791\uc131\ud588\ub2e4. \\nDAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc0dd\uac01\ud558\uae30** \\n\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! \\n\\n**\ubbf8\uc158 \ubab0\uc785\ud558\uae30** \\n\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4. \\n\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 \\n\\n**\uc194\uc9c1\ud568** \\n\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. \\n\\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"},{"id":"grasp","metadata":{"permalink":"/grasp","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-03-30-GRASP.mdx","source":"@site/blog/2023-1/2023-03-30-GRASP.mdx","title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","description":"GRASP(General Responsibility Assignment Software Pattern)","date":"2023-03-30T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 30\uc77c","tags":[{"label":"GRASP","permalink":"/tags/grasp"},{"label":"OOP","permalink":"/tags/oop"}],"readingTime":8.085,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","slug":"grasp","tags":["GRASP","OOP"]},"unlisted":false,"prevItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/chess-retrospective"},"nextItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/blackjack-retrospective"}},"content":"### GRASP(General Responsibility Assignment Software Pattern)\\n\\n\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134\\n\\n\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4.\\n\\n### \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)\\n\\nQ: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?\\n\\nA: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4.\\n\\n### \ucc3d\uc870\uc790 \ud328\ud134(Creator)\\n\\nQ: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?\\n\\nA: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)\\n\\nQ: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?\\n\\nA: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uacb0\ud569\ub3c4(Coupling)\\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.17\\n> \\n\\n\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4.\\n- \uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4.\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)\\n\\n### \ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)\\n\\nQ. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uc751\uc9d1\ub3c4(Cohesion)\\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.26\\n> \\n\\n\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)\\n- \uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4.\\n- \ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4.\\n- \uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.\\n\\n### \ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)\\n\\nQ. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?\\n\\nA. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n\\n\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c\\n\\n- \uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4.\\n- \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4.\\n- \ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.\\n\\n### \ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)\\n\\nQ. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?\\n\\nA. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)\\n\\n\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.\\n\\n\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\\n\\nQ. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?\\n\\nA. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n### \uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)\\n\\nQ. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4.\\n\\n### \uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)\\n\\nQ. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4.\\n\\n\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815\\n\\n- \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4.\\n- \ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, [\uc870\uc601\ud638](http://aeternum.egloos.com/)\\n\\nApplying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman\\n\\n[GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c](https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397)"},{"id":"blackjack-retrospective","metadata":{"permalink":"/blackjack-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/java-blackjack/pull/427","date":"2023-03-14T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.17,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","slug":"blackjack-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/grasp"},"nextItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/ladder-retrospective"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/java-blackjack/pull/427 \\n2\ub2e8\uacc4: https://github.com/woowacourse/java-blackjack/pull/537 \\n:::\\n\\n### \ube14\ub799\uc7ad\\n\\n\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. \\n\\n\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc \\n\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4. \\n\\"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?\\" \\n\\n\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c? \\n\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4. \\n\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. \\n\\n\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30** \\n\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4. \\n\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?\\n\\n**\uccb4\ub825 \uad00\ub9ac** \\n\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4.\\n\\n**\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30** \\n\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc0c1\ud0dc \ud328\ud134** \\n\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4. \\n\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. \\n\\n**\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654** \\n\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4! \\n\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4. \\n\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc \\n\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4. \\n\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc0dd\uac01 \uc815\ub9ac** \\n\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4. \\n\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84** \\n\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4. \\n\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84** \\n\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. \\n\\n\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"},{"id":"ladder-retrospective","metadata":{"permalink":"/ladder-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/java-ladder/pull/97","date":"2023-02-26T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 26\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":10.285,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","slug":"ladder-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/blackjack-retrospective"},"nextItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/racing-car-retrospective"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/java-ladder/pull/97 \\n2\ub2e8\uacc4: https://github.com/woowacourse/java-ladder/pull/234 \\n:::\\n\\n### \uc0ac\ub2e4\ub9ac \ud0c0\uae30\\n\\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4.\\n\\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4.\\n\\n1. LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n2. Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95\\n\\n### Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\n\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4. \\n\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4. \\n\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n\\n LadderGame --\x3e Position\\n Ladder --\x3e Position\\n Items --\x3e Position\\n Line --\x3e Position\\n Players --\x3e Position\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item\\n Players --\x3e Player\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n final Map result = new LinkedHashMap<>();\\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\\n for (Position position : Position.range(players.count())) {\\n final Position resultPosition = ladder.play(position);\\n result.put(players.get(position), items.get(resultPosition));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\nPosition\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\n\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n Line --\x3e Position\\n\\n Players --\x3e Ladder\\n Player --\x3e Ladder\\n\\n Item --\x3e Position\\n Player --\x3e Position\\n\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item --\x3e ItemName\\n Players --\x3e Player --\x3e PlayerName\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n OutputView --\x3e LadderMessageGenerator\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\\n final Map playResult = players.play(ladder);\\n\\n final Map result = new LinkedHashMap<>();\\n for (Player player : playResult.keySet()) {\\n result.put(player, toItem(playResult.get(player)));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30** \\n\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. \\n\\n**\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30** \\n\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72\\n\\n**README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c** \\n\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4.\\n\\n**\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30** \\n\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. \\n\\n**PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30** \\n\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4. \\nPR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4. \\ngithub pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30** \\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784** \\nPlayers\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\\n\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. \\n\\n\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4.\\n\\n**\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900** \\n\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. \\n\\n**\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30** \\nPosition\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4. \\n\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4. \\n\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! \\n\\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4. \\n\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!\\n\\n\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"},{"id":"racing-car-retrospective","metadata":{"permalink":"/racing-car-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","description":"1\ub2e8\uacc4//github.com/woowacourse/java-racingcar/pull/510","date":"2023-02-14T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.625,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","slug":"racing-car-retrospective","tags":["Woowahan Techcourse","Retrospective"]},"unlisted":false,"prevItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/ladder-retrospective"},"nextItem":{"title":"Parameterized Tests","permalink":"/parameterized-tests"}},"content":":::note PR \ub9c1\ud06c \\n1\ub2e8\uacc4: https://github.com/woowacourse/java-racingcar/pull/510 \\n2\ub2e8\uacc4: https://github.com/woowacourse/java-racingcar/pull/538 \\n:::\\n\\n### \uc790\ub3d9\ucc28 \uacbd\uc8fc\\n\\n\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. \\n\\n\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. \\n\\n\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4. \\nmermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n- \ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. \\n- github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```mermaid\\n---\\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\\n---\\ngraph TD\\n Cars --\x3e Car\\n Car --\x3e Name\\n Car --\x3e Position\\n RacingGame --\x3e Count\\n RacingGame --\x3e NumberGenerator\\n RacingGame --\x3e Cars\\n RacingCarController --\x3e RacingGame\\n RandomNumberGenerator -.-> NumberGenerator\\n RacingCarController --\x3e InputView\\n InputView --\x3e InputValidator\\n RacingCarController --\x3e OutputView\\n```\\n\\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4.\\n\\n\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4. \\n\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4. \\n\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc \\n\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4.\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**Assertions extracting**\\n\\n\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4. \\n\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4.\\n\\n```java\\n@Test\\nvoid extracting() {\\n final Cars cars = new Cars(List.of(\\"car1\\", \\"car2\\"));\\n\\n assertThat(cars.getCars())\\n .extracting(Car::getName)\\n .containsExactly(\\"car1\\", \\"car2\\");\\n}\\n```\\n\\n---\\n\\n\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4.\\n\\n**\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4. \\n\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n**\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4. \\n\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc \\n\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9**\\n\\n\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4. \\n\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4. \\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4. \\n\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4. \\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4. \\n\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?) \\n\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4.\\n\\n\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4. \\n\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4. \\n\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4. \\n\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00? \\n\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\\n\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc. \\n\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."},{"id":"parameterized-tests","metadata":{"permalink":"/parameterized-tests","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-02-12-Parameterized Tests.mdx","source":"@site/blog/2023-1/2023-02-12-Parameterized Tests.mdx","title":"Parameterized Tests","description":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.","date":"2023-02-12T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 12\uc77c","tags":[{"label":"Java","permalink":"/tags/java"}],"readingTime":3.17,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Parameterized Tests","slug":"parameterized-tests","tags":["Java"]},"unlisted":false,"prevItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/racing-car-retrospective"},"nextItem":{"title":"IntelliJ \uc124\uc815","permalink":"/intellij-settings"}},"content":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4. \\n\uc774 \ub54c `@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4.\\n\\n## Argument Sources\\n\\n`@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4. \\nJUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### Value Source\\n\\n\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. \\n- short, int, long, float, double\\n- byte, char, boolean, String, Class \\n\\n```java\\n@ParameterizedTest\\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\\nvoid valueTest(final int value) {\\n Assertions.assertThat(value).isPositive();\\n}\\n```\\n\\n### Null & Empty Source\\n\\nnull \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nEmpty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n- String\\n- java.util.List, java.util.Set, java.util.Map\\n- primitive arrays \u2014 ex) int[]\\n- object arrays \u2014 ex) String[]\\n\\n```java\\n@ParameterizedTest\\n@NullAndEmptySource\\nvoid nullAndEmptyTest(final String value) {\\n Assertions.assertThat(value).isNullOrEmpty();\\n}\\n```\\n\\n### Enum Source\\n\\nEnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\nenum Day {\\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\\n}\\n\\n@ParameterizedTest\\n@EnumSource(Day.class)\\nvoid enumTest(final Day day) {\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)\\n\\n```java\\n@ParameterizedTest\\n@EnumSource(value = Day.class, names = {\\"SATURDAY\\", \\"SUNDAY\\"}, mode = Mode.EXCLUDE)\\nvoid enumTest(final Day day) {\\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n### CSV Source\\n\\ncsv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@CsvSource({\\"1,1\\", \\"2,4\\", \\"3,9\\", \\"4,16\\"})\\nvoid csvTest(final int number, final int result) {\\n assertThat(number * number).isEqualTo(result);\\n}\\n```\\n\\n### Method Source\\n\\n\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@MethodSource\\nvoid methodTest(final List numbers, final int count) {\\n assertThat(numbers).hasSize(count);\\n}\\n\\nprivate static Stream methodTest() {\\n return Stream.of(\\n Arguments.of(List.of(1), 1),\\n Arguments.of(List.of(1, 2), 2),\\n Arguments.of(List.of(1, 2, 3), 3)\\n );\\n}\\n```\\n\\n### ETC.\\n\\n\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n- CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource\\n- ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5)"},{"id":"intellij-settings","metadata":{"permalink":"/intellij-settings","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","source":"@site/blog/2023-1/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","title":"IntelliJ \uc124\uc815","description":"Import \uc790\ub3d9 \uc801\uc6a9","date":"2023-01-30T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 30\uc77c","tags":[{"label":"IntelliJ","permalink":"/tags/intelli-j"}],"readingTime":0.465,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"IntelliJ \uc124\uc815","slug":"intellij-settings","tags":["IntelliJ"]},"unlisted":false,"prevItem":{"title":"Parameterized Tests","permalink":"/parameterized-tests"},"nextItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/kotlin-null"}},"content":"### Import \uc790\ub3d9 \uc801\uc6a9\\n\\nPrefrences > Editor > General > Auto Import > Add unambiguous imports on the fly\\n\\n![auto-import](./auto-import.png)\\n\\n### \uc800\uc7a5\uc2dc \ub3d9\uc791\\n\\nPrefrences > Tools > Actions on Save\\n\\n![actions-on-save](./actions-on-save.png)\\n\\nReformat Code: Code Reformmating\\n\\nOptimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70\\n\\nRearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c\\n\\n### \uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9\\n\\nPrefrences > Editor > Code Style > Java > Code Generation > Final Modifier\\n\\n![final-modifier](./final-modifier.png)"},{"id":"kotlin-null","metadata":{"permalink":"/kotlin-null","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","source":"@site/blog/2023-1/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","description":"nullable \ud0c0\uc785","date":"2023-01-16T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 16\uc77c","tags":[{"label":"Kotlin","permalink":"/tags/kotlin"}],"readingTime":4.225,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","slug":"kotlin-null","tags":["Kotlin"]},"unlisted":false,"prevItem":{"title":"IntelliJ \uc124\uc815","permalink":"/intellij-settings"},"nextItem":{"title":"JSR-310","permalink":"/jsr-310"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n### nullable \ud0c0\uc785\\n\\n\ucf54\ud2c0\ub9b0\uc740 `NullPointerException` \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4. \\n\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4.\\n\\n```kotlin\\nval number: Int?\\n```\\n\\n\ud0c0\uc785 \ub4a4\uc5d0 `?`\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4. \\n\ub9cc\uc57d `?`\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4.\\n\\n### `?.` Safe Calls \uc5f0\uc0b0\uc790\\n\\n\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 `?.` \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n\\n\\n\\n```java\\npublic String repeat(String word) {\\n if (word == null) {\\n return null;\\n }\\n return word.repeat(2);\\n}\\n```\\n\\n\\n\\n\\n```kotlin\\nfun repeat(word: String?): String? {\\n return word?.repeat(2)\\n}\\n```\\n\\n\\n\\n\\n### `?:` \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\\n\\n\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c? \\n\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.\\n\\n\\n\\n\\n```java\\npublic String stringSafe(String word) {\\n if (word == null) {\\n return \\"\\";\\n }\\n return word;\\n}\\n```\\n\\n\\n\\n\\n```kotlin\\nfun stringSafe(word: String?): String {\\n return word ?: \\"\\"\\n}\\n```\\n\\n\\n\\n\\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```kotlin\\nuserRepository.findByName(name) ?: throw IllegalArgumentException()\\n```\\n\\n### `!!` \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790\\n\\n!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4. \\n\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4. \\n\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n```kotlin\\nval length: Int = word!!.length\\n```\\n\\n### `as?` \uc548\uc804\ud55c \uce90\uc2a4\ud305\\n\\n\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 `ClassCastException`\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. \\n\\n\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n```kotlin\\nval value: Int? = something as? Int\\n```\\n\\n### List\uc5d0\uc11c\uc758 null \ucc98\ub9ac\\n\\nList\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 `filterNotNull` \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4.\\n\\n```kotlin\\nval foodsWithNull: List = listOf(\\"Pizza\\", \\"Cheese\\", null, \\"Potato\\")\\nval foods = foodsWithNull.filterNotNull()\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [Kotlin in Action](https://product.kyobobook.co.kr/detail/S000001804588)\\n- [Effective Kotlin Item 8](https://product.kyobobook.co.kr/detail/S000001033129)\\n- [Comprehensive Guide to Null Safety in Kotlin](https://www.baeldung.com/kotlin/null-safety)\\n- [Kotlin NullSafety](https://kotlinlang.org/docs/null-safety.html)"},{"id":"jsr-310","metadata":{"permalink":"/jsr-310","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-08-JSR-310.mdx","source":"@site/blog/2023-1/2023-01-08-JSR-310.mdx","title":"JSR-310","description":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API","date":"2023-01-08T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 8\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Time","permalink":"/tags/time"}],"readingTime":1.685,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"JSR-310","slug":"jsr-310","tags":["Java","Time"]},"unlisted":false,"prevItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/kotlin-null"},"nextItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/the-essence-of-object-orientation"}},"content":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API \\nISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131 \\n\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131\\n\\n:::note ISO-8601\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900\\n\\n:::\\n\\n### LocalDate, LocalTime, LocalDateTime\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### Instant\\n\\n\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4 \\n\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604\\n\\n### Duration, Period\\n\\n\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### TemporalAdjusters\\n\\n\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9 \\n\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5\\n\\n```java\\n@FunctionalInterface\\npublic interface TemporalAdjuster {\\n Temporal adjustInto(Temporal temporal);\\n}\\n```\\n\\n### DateTimeFormatter\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4 \\n\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5\\n\\n### ZoneId, ZoneOffset\\n\\nZoneId\ub294 \uc9c0\uc5ed ID\ub294 `\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019` \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9 \\nZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9\\n\\n```java\\nInstant instant = Instant.now();\\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158](https://product.kyobobook.co.kr/detail/S000001810171)\\n- [Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API](https://d2.naver.com/helloworld/645609)\\n- [ISO-8601](https://www.w3.org/TR/NOTE-datetime)\\n- [JSR-310 Spec](https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4)\\n- [Temporal Adjuster](https://www.baeldung.com/java-temporal-adjuster)\\n- [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)"},{"id":"the-essence-of-object-orientation","metadata":{"permalink":"/the-essence-of-object-orientation","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","source":"@site/blog/2023-1/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","description":"\ucc45 \uc815\ubcf4","date":"2023-01-07T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 7\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.415,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","slug":"the-essence-of-object-orientation","tags":["Book"]},"unlisted":false,"prevItem":{"title":"JSR-310","permalink":"/jsr-310"},"nextItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2022-retrospective"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574 \\n> \uc870\uc601\ud638\\n> \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4. \\n\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4. \\n\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. \\n\\n\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0 \\n\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4.\\n\\n### \ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173\\n\\n\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4.\\n\\n- \uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558\\n- \ucc45\uc784\uc758 \ucd94\uc0c1\ud654\\n\\n\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4.\\n\\n- \uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac\\n\\n\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4.\\n\\n- \ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558\\n\\n\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4.\\n\\n- \uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00\\n\\n\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4.\\n\\n- \uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\np.21\\n> \\n\\n> \uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\\np.33\\n> \\n\\n> **\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8**\\n> \\n> \\n> \uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95\\n> \\n> \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\\n> p.35\\n> \\n\\n> \ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\np.38\\n> \\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\\np.105\\n> \\n\\n> \ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\\np.158\\n>"},{"id":"2022-retrospective","metadata":{"permalink":"/2022-retrospective","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-02-2022\ub144 \ud68c\uace0.mdx","source":"@site/blog/2023-1/2023-01-02-2022\ub144 \ud68c\uace0.mdx","title":"2022\ub144 \ud68c\uace0","description":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70","date":"2023-01-02T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 2\uc77c","tags":[{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.705,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"2022\ub144 \ud68c\uace0","slug":"2022-retrospective","tags":["Retrospective"]},"unlisted":false,"prevItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/the-essence-of-object-orientation"},"nextItem":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","permalink":"/book-writer"}},"content":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 \\n\\n### \uc804\uc5ed\\n\\n\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4. \\n\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. \\n\\n\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4. \\n\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4. \\n\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. \\n\\n### \uc790\ubc14\\n\\n\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 [\uc790\ubc14 \uacf5\ud654\uad6d](https://jojoldu.tistory.com/609) \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4.\\n\\n23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4. \\n\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud130\ub514\\n\\n\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0 \\n\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4. \\n\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\\n\\n\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4. \\n\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4. \\n\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. \\n\\n\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### 2023\ub144\uc5d0\ub294\\n\\n\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."},{"id":"book-writer","metadata":{"permalink":"/book-writer","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-1/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","source":"@site/blog/2023-1/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","description":"\ucc45 \uc815\ubcf4","date":"2023-01-01T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 1\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":4.425,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","slug":"book-writer","tags":["Book"]},"unlisted":false,"prevItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2022-retrospective"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \\n> \ubc15\uc194\ubbf8 \\n>\\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4. \\n\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. \\n\\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4. \\n\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4. \\n\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.\\n> \\n\\n> \ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.\\n> \\n\\n> \uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.\\n> \\n\\n> \uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.\\n> \\n\\n> \uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c\\n> \\n\\n> \uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.\\n> \\n\\n> \uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.\\n> \\n\\n> \ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.\\n> \\n\\n> \uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.\\n>"}]}')}}]); \ No newline at end of file diff --git a/assets/js/f8409a7e.45d26143.js b/assets/js/f8409a7e.c9918afa.js similarity index 92% rename from assets/js/f8409a7e.45d26143.js rename to assets/js/f8409a7e.c9918afa.js index 19d1e35f8..72c2734ea 100644 --- a/assets/js/f8409a7e.45d26143.js +++ b/assets/js/f8409a7e.c9918afa.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3206],{29325:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(85893),r=n(11151);const i={id:"intro",title:"\ubb38\uc11c",slug:"/"},s=void 0,c={id:"intro",title:"\ubb38\uc11c",description:"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac",source:"@site/docs/intro.mdx",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,unlisted:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/intro.mdx",tags:[],version:"current",lastUpdatedAt:1704377534,formattedLastUpdatedAt:"2024\ub144 1\uc6d4 4\uc77c",frontMatter:{id:"intro",title:"\ubb38\uc11c",slug:"/"},sidebar:"tutorialSidebar",previous:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",permalink:"/docs/nginx/static-file"},next:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",permalink:"/docs/etc/healthful-growth"}},a={},u=[];function d(t){const e={p:"p",...(0,r.a)(),...t.components};return(0,o.jsx)(e.p,{children:"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac"})}function l(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>c,a:()=>s});var o=n(67294);const r={},i=o.createContext(r);function s(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3206],{29325:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(85893),r=n(11151);const i={id:"intro",title:"\ubb38\uc11c",slug:"/"},s=void 0,c={id:"intro",title:"\ubb38\uc11c",description:"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac",source:"@site/docs/intro.mdx",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,unlisted:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/intro.mdx",tags:[],version:"current",lastUpdatedAt:1704509465,formattedLastUpdatedAt:"2024\ub144 1\uc6d4 6\uc77c",frontMatter:{id:"intro",title:"\ubb38\uc11c",slug:"/"},sidebar:"tutorialSidebar",previous:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",permalink:"/docs/nginx/static-file"},next:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",permalink:"/docs/etc/healthful-growth"}},a={},u=[];function d(t){const e={p:"p",...(0,r.a)(),...t.components};return(0,o.jsx)(e.p,{children:"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac"})}function l(t={}){const{wrapper:e}={...(0,r.a)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d(t)}},11151:(t,e,n)=>{n.d(e,{Z:()=>c,a:()=>s});var o=n(67294);const r={},i=o.createContext(r);function s(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.1465a156.js b/assets/js/runtime~main.e806e01d.js similarity index 98% rename from assets/js/runtime~main.1465a156.js rename to assets/js/runtime~main.e806e01d.js index 46f751312..d84a069ea 100644 --- a/assets/js/runtime~main.1465a156.js +++ b/assets/js/runtime~main.e806e01d.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,d,b,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return c[e].call(f.exports,f,f.exports,r),f.exports}r.m=c,e=[],r.O=(a,f,d,b)=>{if(!f){var c=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,d,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(b,c),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({26:"ad3b7b62",31:"f4c6e7e6",53:"935f2afb",71:"8a27aeff",80:"5088fe06",96:"087c46fa",100:"d50fd269",116:"0cb009d1",172:"96adae60",240:"4959fc42",286:"1893cb59",297:"9fae68e2",300:"92fef07b",321:"0c071de2",324:"280572f1",326:"6f03d3d2",328:"4b2fba3e",372:"35b2eb5a",422:"0281109c",425:"16cc6f3a",448:"28a1570f",454:"1a665c6f",470:"8720c147",471:"38d8699e",475:"a3dddb77",498:"6ba49b42",533:"b2b675dd",548:"32397cb2",573:"b474adfe",588:"d7955594",628:"e0d68441",638:"0d3421d0",653:"bbceb8f1",656:"1f05d14a",687:"33ac99d3",693:"6a19354d",711:"bb221eab",724:"f01ceada",732:"64f377d6",734:"05b907fc",741:"8a24850b",743:"509d519c",820:"ff4c6c5e",838:"6b4e1191",843:"d2770bf7",846:"d0277431",916:"fa3d3942",917:"6552f31f",952:"86b4da3d",955:"fe8cce0a",960:"fa61c459",964:"c573638f",970:"32b2299c",988:"754fb852",1065:"69c28c32",1079:"15f27552",1103:"49b8d9dd",1112:"e9eabc5d",1113:"0746167d",1196:"2d3b202f",1213:"b2c8756c",1252:"5d4cff52",1253:"e5e44a85",1255:"6675e9ab",1257:"b36d2d1d",1285:"38bf29ad",1328:"08e37dbc",1358:"cec43d6a",1391:"b41adc00",1434:"dfa84138",1436:"8e498bb6",1475:"451db21d",1499:"eb43be84",1501:"64868a43",1611:"e1735da7",1653:"7e4c1ed7",1659:"daff1d93",1675:"d126aabd",1677:"d5dfecc2",1711:"a710d533",1761:"dcf70953",1762:"2bfe7c0b",1772:"92ade856",1793:"309173fa",1853:"21d253a0",1883:"302370be",1906:"4485017c",1926:"f078e301",1994:"269a2f75",2012:"a59d28a9",2087:"7c660760",2098:"d350f5d9",2100:"5ffd2c10",2145:"9c6e5a12",2153:"9bad5ae7",2156:"b6ffb0cb",2181:"ae1d6508",2215:"abc83b7f",2233:"1f61820a",2245:"f25de701",2247:"d361ad2d",2261:"a8cba70f",2266:"a9c2b81a",2293:"b88cb85b",2334:"7af1d52f",2345:"7405ea58",2362:"bace0b37",2448:"633582b9",2476:"2832e534",2526:"a896be03",2530:"e9ff60ad",2535:"814f3328",2542:"ddf9e0bd",2579:"672a376b",2620:"f06cb3e2",2625:"04644f5f",2656:"303c1e60",2717:"f332d221",2742:"33736670",2753:"7762a24e",2773:"3b18521e",2793:"489347ff",2816:"8c6c0796",2889:"7fd9a574",2890:"d6a3d698",2939:"905ecccc",2947:"981f7647",2958:"f7b9d2f4",2965:"ae3384b2",2967:"5feaaaeb",3009:"bbc01ba0",3015:"a6a1bc61",3085:"c60ea0ff",3089:"a6aa9e1f",3092:"0e33a907",3095:"bf933b37",3098:"d09f7e4b",3109:"211d6170",3122:"6d4355d3",3137:"c6b037a5",3206:"f8409a7e",3213:"ac23d7ee",3239:"dca6a1e3",3259:"d2935d14",3287:"7159c7ff",3324:"4a1c8300",3333:"1e8ecffe",3365:"4d43abad",3392:"d86f7a37",3396:"bbdd7e52",3407:"327fa616",3438:"c55d205b",3457:"537817cb",3476:"d20e0728",3483:"2d9296e4",3490:"9ca52986",3519:"a7e0d18f",3530:"20e99c2a",3553:"3b0f99e8",3608:"9e4087bc",3614:"fd5d2408",3625:"77f5fc5d",3637:"b301b20b",3651:"d5bb232a",3671:"a4a1e915",3673:"9f586ca3",3691:"366ddb85",3751:"3720c009",3771:"e6e259a5",3833:"a14ec7b5",3912:"e8d6e7ce",4013:"01a85c17",4091:"b2ebb6fd",4104:"454a6d0d",4121:"55960ee5",4137:"eff1d58f",4149:"8d05b77c",4174:"abb0816f",4185:"c7015929",4195:"c4f5d8e4",4209:"15eddcef",4212:"290b0a56",4275:"04c55e47",4311:"7bbc420e",4368:"a94703ab",4393:"c92f81ac",4433:"49f0f498",4457:"39da970a",4471:"494882d1",4483:"d3e1df19",4558:"6b54f6a4",4564:"e9624b4f",4665:"e0e4666e",4722:"53e4509a",4788:"f6807fb4",4794:"e32990cc",4801:"8d7288fe",4815:"43a97218",4818:"530ffa4f",4889:"5f81b25c",4934:"02ede3c9",4953:"eec33099",4962:"c189d18f",5035:"1a3abee6",5046:"db7928b3",5088:"54150be7",5100:"533bfc57",5103:"df147deb",5131:"f63a747b",5173:"3680bd07",5186:"3f6ea930",5210:"bd28dff2",5237:"26dc40bf",5294:"f90d0c52",5300:"e6a6ed43",5319:"6cfe3a99",5323:"cc519f63",5335:"75121fd5",5371:"aa73a035",5406:"9e4ad429",5419:"d6638f30",5421:"6412e40a",5435:"ee1dd2ad",5436:"c6d04683",5463:"bd64a762",5465:"d0e4cdf1",5467:"6425a984",5485:"da14f319",5487:"08726fcf",5507:"a9221bd5",5521:"5c38e66e",5553:"4430ab79",5602:"f156dfb9",5629:"424a3476",5635:"546ec22f",5649:"564337ec",5652:"1398b403",5669:"00931cc3",5682:"70a12cc4",5717:"39ee6679",5753:"051528db",5758:"a539c018",5785:"1781b1c4",5797:"7fbacf84",5798:"24b9bc70",5819:"e073eb07",5838:"4b79a3c9",5857:"dfc7013c",5870:"cf8e491a",5873:"8fbd512b",5892:"c6004f62",5900:"3c9c1743",5919:"d8cdf5ef",5953:"5a6c6934",5962:"9d8ee3a8",5964:"09fbb6bd",5966:"871c1e5a",5990:"6b69808d",5991:"a5557bb9",6017:"6093f82b",6035:"226700de",6049:"e21c8cc4",6058:"dab4c683",6084:"101b58de",6103:"ccc49370",6123:"f3e308ad",6124:"87070fc3",6161:"562496aa",6172:"be497a8d",6180:"eae2a611",6199:"c60995f6",6204:"0571a526",6250:"3c5aea38",6276:"1251d98b",6300:"5c07bdab",6346:"02689328",6387:"d8775059",6412:"79a97f4e",6420:"ae82353f",6468:"43fcf0e9",6490:"9dc4119a",6493:"130df38c",6508:"12cbeba7",6515:"1236fad7",6526:"1c93669b",6550:"0c390f0d",6587:"c037d168",6608:"6f385a52",6629:"3972c49f",6671:"d28e30d7",6698:"c3ea66fe",6710:"e2de2dbb",6743:"2f43e44a",6750:"f87bdf62",6837:"fbd57548",6857:"214206b9",6883:"bd4db8ee",6887:"f4f49e13",6908:"73688d5c",6984:"274c9143",7009:"54cb095e",7064:"6dd1c948",7108:"7881a85f",7153:"b7d33121",7157:"3ed04b60",7175:"d202e2c5",7181:"69a75ff2",7204:"cb6229c3",7210:"9bbc65ac",7230:"caf1b628",7247:"6c38e270",7268:"14164549",7281:"7e59392d",7328:"48faf148",7344:"70834889",7400:"ffb0fa11",7403:"14dc1923",7404:"c08e7a0d",7412:"70275fcd",7474:"df862072",7476:"66d1c769",7511:"75f50328",7563:"fb861301",7581:"2e10a69c",7599:"80960b4b",7600:"6c674d03",7617:"9e2e3982",7648:"a1877440",7652:"2b22d492",7680:"448c20a0",7681:"1d81daa1",7688:"b9bcab37",7697:"35293ec4",7709:"8e9dc6b3",7723:"b5f3dcc5",7725:"9cfe8fd1",7727:"3dd4d232",7740:"f0978ee1",7775:"2c9f5501",7776:"d65e25b7",7787:"af81a133",7797:"2c446262",7805:"4e394c08",7843:"a0410ab5",7857:"5a29fbab",7891:"635a92d5",7901:"2a8faff0",7918:"17896441",7920:"1a4e3797",7945:"d1e1bea4",7954:"d368e73e",7966:"c0cb7215",7972:"9d1fd2b0",7975:"270346fa",8036:"1664646a",8037:"d0840b01",8106:"41c44b28",8107:"3b12d42b",8110:"fed8bc04",8142:"5eed1665",8151:"255134d9",8161:"19f4ae8e",8174:"d60e2b0c",8243:"1fbde614",8262:"56e576e5",8288:"21e890b0",8338:"8dc09bac",8355:"fe273484",8360:"8ad2f007",8474:"a3614f73",8476:"f3493919",8509:"3d6c40c1",8516:"bf02a661",8518:"a7bd4aaa",8524:"9dec6b67",8548:"ac3fdf5d",8561:"d2611248",8606:"2a984615",8610:"6875c492",8628:"41b4728f",8644:"cef46b76",8652:"e7d2a655",8683:"cd68cda1",8716:"ee92877e",8817:"cc3bdf2f",8882:"f75a8651",8894:"bbc3f62a",8909:"aacfeabc",8919:"f042b56c",8927:"c1b17b3f",8942:"0a2eaa84",9055:"b421ebb7",9059:"198f8d8a",9092:"a85e626a",9111:"372ccfe9",9171:"18c69d70",9239:"101cf32b",9242:"c29bedb9",9286:"9b43eac8",9287:"8b79a48d",9304:"4515250b",9310:"d1cef389",9312:"42957a8d",9391:"829fa7b9",9393:"6bc709ad",9396:"52106a5f",9412:"21294bbb",9427:"8da65e83",9458:"db86613e",9467:"e2326195",9534:"fb48356a",9538:"9b56b618",9581:"72657f57",9591:"2b479afe",9606:"ef5b2427",9623:"a4349a81",9633:"d40f51e1",9661:"5e95c892",9686:"5a473bed",9702:"492a6565",9713:"1bb997fc",9763:"bd2d06b5",9788:"d88bdb28",9874:"1a6b9123",9875:"16f719ab",9887:"f580a9d0",9910:"e1a06456",9924:"df203c0f",9940:"e4ebfe18"}[e]||e)+"."+{26:"396e25f8",31:"fdbb534a",53:"71c551f2",71:"a92922df",80:"2cc977cf",96:"8ecf33d3",100:"20d6e003",109:"16b28578",116:"553227fe",130:"6f496591",132:"2314fae3",172:"db667c7f",240:"0ba42e66",286:"7a0eb710",297:"72dfd56d",300:"22b66ce6",321:"84e86023",324:"4d349f70",326:"cde41e4b",328:"ee7b0442",372:"9ac55f69",422:"094422e8",425:"b08f53b9",448:"97a380e8",454:"ad3c5a8e",470:"0866f74e",471:"f74807b0",475:"0be524dd",498:"12fc56b7",533:"16539ccd",548:"79ba529e",573:"859d75dc",588:"aae54d66",628:"809ce47c",638:"5faa68cc",653:"45b4a5d1",656:"f8a47feb",687:"c2dc0274",693:"67483436",711:"e6e0ddcc",724:"2fc7a62a",732:"77b06a2e",734:"879585f3",741:"c2db56cb",743:"caf52cd9",820:"798245bb",838:"d4286554",843:"b1baa87f",846:"0c6e8615",916:"0d5d146a",917:"b8d40213",952:"ecad1fac",955:"08ba84b5",960:"ff5f7662",964:"9343ce40",970:"65d9bdd3",988:"bc8e9087",1065:"54c45c44",1079:"6686d66e",1103:"3c966f04",1112:"6fea3dcd",1113:"afac0769",1196:"7ed7c756",1213:"91c7273b",1252:"6cb7854b",1253:"f463dc37",1255:"071239af",1257:"df006be2",1285:"bf7f6732",1325:"96f02940",1328:"1a6f6d94",1358:"da9494dc",1391:"18de1b4a",1426:"172b3ab7",1434:"4493a1cc",1436:"ad307809",1475:"bfc2cec9",1499:"22586c32",1501:"7ad801ec",1504:"673c6d1d",1611:"c24d1f44",1644:"29f069a4",1653:"3a8a4e55",1659:"05c3894f",1675:"77014965",1677:"ea44f851",1711:"89d1ac83",1761:"d0be48ac",1762:"2258198c",1763:"498dab2c",1772:"976d3fdf",1793:"f6e5e77a",1853:"c36050f0",1883:"1fbec87b",1906:"c2d7ef54",1926:"5f6afbe2",1994:"3f56a8b3",2012:"8b50a5d4",2087:"e38d4441",2090:"4df4088d",2098:"668ec20f",2100:"6cc0bd94",2145:"b4cadf2e",2153:"57e2d83c",2156:"f0221a42",2181:"f635198e",2183:"709e4efa",2215:"58cc5405",2233:"88aff807",2245:"56fe7f2e",2247:"6d13094d",2261:"cee833fc",2266:"560a866f",2293:"1a8848b9",2334:"1e2619be",2345:"2e86a2c7",2362:"f7548902",2448:"6d800cdf",2476:"c0d55bb0",2526:"8424c86d",2530:"6425d7c1",2535:"2013f288",2542:"b3d7aff1",2579:"38ceaf22",2620:"dc5ae1e1",2625:"66ea41a4",2656:"a53c4908",2661:"53590ac1",2693:"4c3b29a9",2696:"60f62e8e",2700:"e5ff6008",2717:"71dd83a5",2742:"729098c7",2753:"8bd5f9d3",2773:"28bc0b58",2793:"8a3de8e4",2816:"3d5f97d2",2889:"b6a2428d",2890:"a57e5d29",2939:"d9497818",2947:"4c1ae69c",2958:"b710b8ae",2965:"95cb14ea",2967:"d28b71e6",3009:"8c10fd15",3015:"559bd506",3076:"8917a93f",3085:"f14cacef",3089:"c05861ce",3092:"ac59862e",3095:"56ca3009",3098:"eacc75cd",3109:"ccc60dec",3122:"bb82b9e2",3137:"3ee85e02",3206:"45d26143",3213:"9149127e",3239:"1921109b",3259:"fe55055e",3287:"ef3cd4c1",3324:"ff290a16",3333:"45c08382",3343:"9c6e58b9",3365:"c332c4e5",3392:"b7635827",3396:"708eb846",3407:"aeeca246",3438:"0c6df2ba",3457:"ba8b6e85",3476:"7cfdad18",3483:"d46cb8ea",3490:"3fac83b3",3519:"ae8780eb",3530:"90a43ac9",3553:"a35b4fd0",3608:"4df9d21b",3614:"f64b5f70",3619:"90967934",3625:"21e983b6",3637:"b1bb1de7",3651:"a57b340e",3671:"4e685de1",3673:"0edad504",3691:"bc758731",3751:"ff67d5b0",3771:"12dca990",3833:"1626e81e",3912:"2cedce96",4013:"ac5e273d",4091:"73f1f165",4104:"552672c1",4121:"ac98a179",4137:"7cfa83fd",4149:"11b879c5",4174:"b0d0aba5",4185:"2bf7c111",4195:"325cecb9",4209:"9f1acbf7",4212:"f8bb3f04",4238:"4e22d6ed",4275:"8e07c804",4311:"de2e8ae6",4368:"a518cb82",4393:"e9e6baff",4433:"20ae1bcb",4457:"07ba51b6",4471:"e3de805a",4483:"7fe0da56",4558:"d56518cb",4564:"0abc2788",4665:"cc580050",4706:"396fafd5",4722:"4c516822",4788:"f409010b",4794:"5229ddfb",4801:"5f0bac2d",4815:"9ee201c3",4818:"7202e3e6",4889:"f9e417ff",4934:"2f927120",4953:"7b770d0a",4962:"a6c386a8",5035:"6fe9c1e5",5046:"2a9c0fe1",5088:"a4cc9618",5100:"31b3cba3",5103:"cbd660a5",5131:"276c7afe",5173:"43261a11",5186:"667b0c9a",5210:"fc36de16",5237:"1eef62c6",5269:"c0ef4f6e",5294:"0d5afa4f",5300:"3155fd1b",5319:"f51506e7",5323:"93a6ec6e",5326:"854b4bbd",5335:"ed266578",5371:"9f9e0b0f",5406:"a307a08a",5419:"f1c475a1",5421:"1ab52c78",5435:"8c78f348",5436:"e8f93c5d",5463:"e11ec088",5465:"52749e73",5467:"576248f5",5485:"8e1fdf68",5487:"b0eaf3bf",5507:"3bfa9f2c",5521:"a18cbc60",5553:"91bf9599",5602:"ffae126d",5629:"e8d54669",5635:"826c8fef",5649:"e532af5a",5652:"a2dde0c3",5669:"9397bc8e",5682:"2db653db",5717:"b0b1231d",5753:"3c8de023",5758:"11f0a959",5785:"32b65230",5790:"c21bcf3c",5797:"c4fc60f8",5798:"e850b275",5819:"81787244",5838:"7dbbc94e",5857:"b8b0baa4",5870:"464ac15a",5873:"4d36cc4b",5892:"8257704e",5900:"139a7956",5919:"70d99349",5943:"a728978f",5953:"7bd0504f",5962:"22bab478",5964:"d5da5c4e",5966:"d89a25ad",5990:"7f9dc5ba",5991:"706f72e5",6017:"4cb4daad",6035:"f225e3c4",6049:"241472c2",6058:"29c4f1c4",6084:"50b75864",6103:"cd8a1e9f",6123:"01ef8b08",6124:"11fb059b",6161:"6fbd6e7b",6172:"2f31778a",6180:"cd0ab448",6199:"6ea62df7",6204:"a702a510",6250:"ff4be1ec",6255:"1019335d",6276:"83acfa67",6300:"e8412b53",6346:"7a7f957d",6387:"dbd907a8",6412:"b4a66bd8",6420:"d47cda5f",6468:"37211ee7",6490:"f5fda87d",6493:"5e3c05b0",6508:"606332b2",6515:"b2dae1b2",6526:"857fc62a",6550:"d53242e6",6587:"96f06126",6591:"9ffc30a1",6608:"82857361",6629:"411ee9ac",6648:"b66fcf80",6671:"e9d9a701",6698:"4afcd78f",6710:"441ed42b",6743:"31f6617e",6750:"6d07506d",6837:"01f72cd5",6857:"22526c71",6883:"3432cdf1",6887:"f11d5c78",6908:"712f7871",6945:"52e6a492",6984:"5b1f6476",6985:"432fb51c",7009:"e840b478",7064:"d7e4f8e7",7108:"7455ce4c",7153:"74e8d043",7157:"6fb6f83d",7175:"1343f229",7181:"d0efe32e",7204:"69eb5143",7210:"c162c71c",7230:"829e32b7",7247:"5142239c",7268:"7a0bdef8",7281:"9dcd9203",7328:"ab2c08fd",7344:"62468df3",7400:"e327857d",7403:"9fdbd075",7404:"9cff8a1c",7412:"139f4443",7474:"8d335144",7476:"0554fad1",7511:"0959afe8",7563:"4cca033a",7581:"91808ad6",7599:"ac0be7bf",7600:"32ba75ec",7617:"2572da73",7648:"88e9cb51",7652:"7e5eb591",7680:"0fc36b55",7681:"3c02c51a",7688:"341c6751",7697:"6c65870c",7709:"cb50d73f",7723:"b4794607",7725:"b5a952f6",7727:"28032cae",7740:"a0902758",7775:"90cddc88",7776:"fc9e57e0",7787:"cb0b4019",7797:"5e6afa9d",7805:"ace82320",7843:"49cf84e1",7856:"eee4957e",7857:"24f29dd6",7891:"da14a0d3",7901:"bab1919e",7918:"100c49c3",7920:"3c56de14",7936:"1d703c73",7945:"59b0c254",7954:"9d264eba",7966:"c03bc365",7972:"21d408a6",7975:"d2428cf5",8016:"4dd5a4f5",8036:"a9255e28",8037:"30f98a8b",8106:"7caafbcc",8107:"95f13260",8110:"4f833fe3",8142:"92b60a91",8151:"820e0db5",8161:"54b6b5f0",8174:"b8855a4d",8243:"de74c976",8262:"c2861079",8288:"8356b613",8338:"44e33d7b",8355:"6eaec45f",8360:"1f65f274",8474:"41561765",8476:"34209051",8509:"145654ac",8516:"eea26b3e",8518:"d10943b8",8524:"ce191000",8548:"4d2ffc83",8561:"acc252e0",8606:"dca5eb21",8610:"4b55fe57",8628:"0a266023",8644:"2417af73",8652:"c38576aa",8683:"4b0125e7",8716:"fca72275",8817:"b73cfef6",8882:"5ec8e77e",8894:"db081e7b",8909:"f4746b20",8919:"2fd3c78c",8927:"a56397ee",8942:"93ab101b",8955:"c7e72aec",9055:"6f04fcbd",9059:"246f1a7e",9092:"4cd274c5",9111:"7554fc85",9138:"49be4c15",9171:"7e0e9cbb",9239:"3d4b37a9",9242:"df34f78e",9286:"13dd4d49",9287:"05441ccf",9304:"7c65c757",9310:"1ee0e564",9312:"694f2815",9391:"814a5b58",9393:"9b49bc75",9396:"0e08c528",9412:"d72906f2",9427:"b9934882",9458:"32692315",9467:"fc5c7ff0",9534:"500f036d",9538:"5822f5e9",9581:"d7e291a7",9591:"31ea2b46",9606:"db67f9c6",9623:"dc01ce87",9633:"14bda7cc",9661:"339017aa",9686:"f77dcd66",9702:"1392e115",9713:"f3048ec2",9763:"0d8a7465",9788:"771689c2",9874:"f05b7812",9875:"f99292c8",9887:"ff66fa3d",9893:"6a5afb1e",9910:"0b256ea7",9924:"667cb6dd",9940:"2efe1799"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},b="my-website:",r.l=(e,a,f,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={14164549:"7268",17896441:"7918",33736670:"2742",70834889:"7344",ad3b7b62:"26",f4c6e7e6:"31","935f2afb":"53","8a27aeff":"71","5088fe06":"80","087c46fa":"96",d50fd269:"100","0cb009d1":"116","96adae60":"172","4959fc42":"240","1893cb59":"286","9fae68e2":"297","92fef07b":"300","0c071de2":"321","280572f1":"324","6f03d3d2":"326","4b2fba3e":"328","35b2eb5a":"372","0281109c":"422","16cc6f3a":"425","28a1570f":"448","1a665c6f":"454","8720c147":"470","38d8699e":"471",a3dddb77:"475","6ba49b42":"498",b2b675dd:"533","32397cb2":"548",b474adfe:"573",d7955594:"588",e0d68441:"628","0d3421d0":"638",bbceb8f1:"653","1f05d14a":"656","33ac99d3":"687","6a19354d":"693",bb221eab:"711",f01ceada:"724","64f377d6":"732","05b907fc":"734","8a24850b":"741","509d519c":"743",ff4c6c5e:"820","6b4e1191":"838",d2770bf7:"843",d0277431:"846",fa3d3942:"916","6552f31f":"917","86b4da3d":"952",fe8cce0a:"955",fa61c459:"960",c573638f:"964","32b2299c":"970","754fb852":"988","69c28c32":"1065","15f27552":"1079","49b8d9dd":"1103",e9eabc5d:"1112","0746167d":"1113","2d3b202f":"1196",b2c8756c:"1213","5d4cff52":"1252",e5e44a85:"1253","6675e9ab":"1255",b36d2d1d:"1257","38bf29ad":"1285","08e37dbc":"1328",cec43d6a:"1358",b41adc00:"1391",dfa84138:"1434","8e498bb6":"1436","451db21d":"1475",eb43be84:"1499","64868a43":"1501",e1735da7:"1611","7e4c1ed7":"1653",daff1d93:"1659",d126aabd:"1675",d5dfecc2:"1677",a710d533:"1711",dcf70953:"1761","2bfe7c0b":"1762","92ade856":"1772","309173fa":"1793","21d253a0":"1853","302370be":"1883","4485017c":"1906",f078e301:"1926","269a2f75":"1994",a59d28a9:"2012","7c660760":"2087",d350f5d9:"2098","5ffd2c10":"2100","9c6e5a12":"2145","9bad5ae7":"2153",b6ffb0cb:"2156",ae1d6508:"2181",abc83b7f:"2215","1f61820a":"2233",f25de701:"2245",d361ad2d:"2247",a8cba70f:"2261",a9c2b81a:"2266",b88cb85b:"2293","7af1d52f":"2334","7405ea58":"2345",bace0b37:"2362","633582b9":"2448","2832e534":"2476",a896be03:"2526",e9ff60ad:"2530","814f3328":"2535",ddf9e0bd:"2542","672a376b":"2579",f06cb3e2:"2620","04644f5f":"2625","303c1e60":"2656",f332d221:"2717","7762a24e":"2753","3b18521e":"2773","489347ff":"2793","8c6c0796":"2816","7fd9a574":"2889",d6a3d698:"2890","905ecccc":"2939","981f7647":"2947",f7b9d2f4:"2958",ae3384b2:"2965","5feaaaeb":"2967",bbc01ba0:"3009",a6a1bc61:"3015",c60ea0ff:"3085",a6aa9e1f:"3089","0e33a907":"3092",bf933b37:"3095",d09f7e4b:"3098","211d6170":"3109","6d4355d3":"3122",c6b037a5:"3137",f8409a7e:"3206",ac23d7ee:"3213",dca6a1e3:"3239",d2935d14:"3259","7159c7ff":"3287","4a1c8300":"3324","1e8ecffe":"3333","4d43abad":"3365",d86f7a37:"3392",bbdd7e52:"3396","327fa616":"3407",c55d205b:"3438","537817cb":"3457",d20e0728:"3476","2d9296e4":"3483","9ca52986":"3490",a7e0d18f:"3519","20e99c2a":"3530","3b0f99e8":"3553","9e4087bc":"3608",fd5d2408:"3614","77f5fc5d":"3625",b301b20b:"3637",d5bb232a:"3651",a4a1e915:"3671","9f586ca3":"3673","366ddb85":"3691","3720c009":"3751",e6e259a5:"3771",a14ec7b5:"3833",e8d6e7ce:"3912","01a85c17":"4013",b2ebb6fd:"4091","454a6d0d":"4104","55960ee5":"4121",eff1d58f:"4137","8d05b77c":"4149",abb0816f:"4174",c7015929:"4185",c4f5d8e4:"4195","15eddcef":"4209","290b0a56":"4212","04c55e47":"4275","7bbc420e":"4311",a94703ab:"4368",c92f81ac:"4393","49f0f498":"4433","39da970a":"4457","494882d1":"4471",d3e1df19:"4483","6b54f6a4":"4558",e9624b4f:"4564",e0e4666e:"4665","53e4509a":"4722",f6807fb4:"4788",e32990cc:"4794","8d7288fe":"4801","43a97218":"4815","530ffa4f":"4818","5f81b25c":"4889","02ede3c9":"4934",eec33099:"4953",c189d18f:"4962","1a3abee6":"5035",db7928b3:"5046","54150be7":"5088","533bfc57":"5100",df147deb:"5103",f63a747b:"5131","3680bd07":"5173","3f6ea930":"5186",bd28dff2:"5210","26dc40bf":"5237",f90d0c52:"5294",e6a6ed43:"5300","6cfe3a99":"5319",cc519f63:"5323","75121fd5":"5335",aa73a035:"5371","9e4ad429":"5406",d6638f30:"5419","6412e40a":"5421",ee1dd2ad:"5435",c6d04683:"5436",bd64a762:"5463",d0e4cdf1:"5465","6425a984":"5467",da14f319:"5485","08726fcf":"5487",a9221bd5:"5507","5c38e66e":"5521","4430ab79":"5553",f156dfb9:"5602","424a3476":"5629","546ec22f":"5635","564337ec":"5649","1398b403":"5652","00931cc3":"5669","70a12cc4":"5682","39ee6679":"5717","051528db":"5753",a539c018:"5758","1781b1c4":"5785","7fbacf84":"5797","24b9bc70":"5798",e073eb07:"5819","4b79a3c9":"5838",dfc7013c:"5857",cf8e491a:"5870","8fbd512b":"5873",c6004f62:"5892","3c9c1743":"5900",d8cdf5ef:"5919","5a6c6934":"5953","9d8ee3a8":"5962","09fbb6bd":"5964","871c1e5a":"5966","6b69808d":"5990",a5557bb9:"5991","6093f82b":"6017","226700de":"6035",e21c8cc4:"6049",dab4c683:"6058","101b58de":"6084",ccc49370:"6103",f3e308ad:"6123","87070fc3":"6124","562496aa":"6161",be497a8d:"6172",eae2a611:"6180",c60995f6:"6199","0571a526":"6204","3c5aea38":"6250","1251d98b":"6276","5c07bdab":"6300","02689328":"6346",d8775059:"6387","79a97f4e":"6412",ae82353f:"6420","43fcf0e9":"6468","9dc4119a":"6490","130df38c":"6493","12cbeba7":"6508","1236fad7":"6515","1c93669b":"6526","0c390f0d":"6550",c037d168:"6587","6f385a52":"6608","3972c49f":"6629",d28e30d7:"6671",c3ea66fe:"6698",e2de2dbb:"6710","2f43e44a":"6743",f87bdf62:"6750",fbd57548:"6837","214206b9":"6857",bd4db8ee:"6883",f4f49e13:"6887","73688d5c":"6908","274c9143":"6984","54cb095e":"7009","6dd1c948":"7064","7881a85f":"7108",b7d33121:"7153","3ed04b60":"7157",d202e2c5:"7175","69a75ff2":"7181",cb6229c3:"7204","9bbc65ac":"7210",caf1b628:"7230","6c38e270":"7247","7e59392d":"7281","48faf148":"7328",ffb0fa11:"7400","14dc1923":"7403",c08e7a0d:"7404","70275fcd":"7412",df862072:"7474","66d1c769":"7476","75f50328":"7511",fb861301:"7563","2e10a69c":"7581","80960b4b":"7599","6c674d03":"7600","9e2e3982":"7617",a1877440:"7648","2b22d492":"7652","448c20a0":"7680","1d81daa1":"7681",b9bcab37:"7688","35293ec4":"7697","8e9dc6b3":"7709",b5f3dcc5:"7723","9cfe8fd1":"7725","3dd4d232":"7727",f0978ee1:"7740","2c9f5501":"7775",d65e25b7:"7776",af81a133:"7787","2c446262":"7797","4e394c08":"7805",a0410ab5:"7843","5a29fbab":"7857","635a92d5":"7891","2a8faff0":"7901","1a4e3797":"7920",d1e1bea4:"7945",d368e73e:"7954",c0cb7215:"7966","9d1fd2b0":"7972","270346fa":"7975","1664646a":"8036",d0840b01:"8037","41c44b28":"8106","3b12d42b":"8107",fed8bc04:"8110","5eed1665":"8142","255134d9":"8151","19f4ae8e":"8161",d60e2b0c:"8174","1fbde614":"8243","56e576e5":"8262","21e890b0":"8288","8dc09bac":"8338",fe273484:"8355","8ad2f007":"8360",a3614f73:"8474",f3493919:"8476","3d6c40c1":"8509",bf02a661:"8516",a7bd4aaa:"8518","9dec6b67":"8524",ac3fdf5d:"8548",d2611248:"8561","2a984615":"8606","6875c492":"8610","41b4728f":"8628",cef46b76:"8644",e7d2a655:"8652",cd68cda1:"8683",ee92877e:"8716",cc3bdf2f:"8817",f75a8651:"8882",bbc3f62a:"8894",aacfeabc:"8909",f042b56c:"8919",c1b17b3f:"8927","0a2eaa84":"8942",b421ebb7:"9055","198f8d8a":"9059",a85e626a:"9092","372ccfe9":"9111","18c69d70":"9171","101cf32b":"9239",c29bedb9:"9242","9b43eac8":"9286","8b79a48d":"9287","4515250b":"9304",d1cef389:"9310","42957a8d":"9312","829fa7b9":"9391","6bc709ad":"9393","52106a5f":"9396","21294bbb":"9412","8da65e83":"9427",db86613e:"9458",e2326195:"9467",fb48356a:"9534","9b56b618":"9538","72657f57":"9581","2b479afe":"9591",ef5b2427:"9606",a4349a81:"9623",d40f51e1:"9633","5e95c892":"9661","5a473bed":"9686","492a6565":"9702","1bb997fc":"9713",bd2d06b5:"9763",d88bdb28:"9788","1a6b9123":"9874","16f719ab":"9875",f580a9d0:"9887",e1a06456:"9910",df203c0f:"9924",e4ebfe18:"9940"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>d=e[a]=[f,b]));f.push(d[2]=b);var c=r.p+r.u(a),t=new Error;r.l(c,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var b=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,b,c=f[0],t=f[1],o=f[2],n=0;if(c.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,d,b,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return c[e].call(f.exports,f,f.exports,r),f.exports}r.m=c,e=[],r.O=(a,f,d,b)=>{if(!f){var c=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,d,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(b,c),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({26:"ad3b7b62",31:"f4c6e7e6",53:"935f2afb",71:"8a27aeff",80:"5088fe06",96:"087c46fa",100:"d50fd269",116:"0cb009d1",172:"96adae60",240:"4959fc42",286:"1893cb59",297:"9fae68e2",300:"92fef07b",321:"0c071de2",324:"280572f1",326:"6f03d3d2",328:"4b2fba3e",372:"35b2eb5a",422:"0281109c",425:"16cc6f3a",448:"28a1570f",454:"1a665c6f",470:"8720c147",471:"38d8699e",475:"a3dddb77",498:"6ba49b42",533:"b2b675dd",548:"32397cb2",573:"b474adfe",588:"d7955594",628:"e0d68441",638:"0d3421d0",653:"bbceb8f1",656:"1f05d14a",687:"33ac99d3",693:"6a19354d",711:"bb221eab",724:"f01ceada",732:"64f377d6",734:"05b907fc",741:"8a24850b",743:"509d519c",820:"ff4c6c5e",838:"6b4e1191",843:"d2770bf7",846:"d0277431",916:"fa3d3942",917:"6552f31f",952:"86b4da3d",955:"fe8cce0a",960:"fa61c459",964:"c573638f",970:"32b2299c",988:"754fb852",1065:"69c28c32",1079:"15f27552",1103:"49b8d9dd",1112:"e9eabc5d",1113:"0746167d",1196:"2d3b202f",1213:"b2c8756c",1252:"5d4cff52",1253:"e5e44a85",1255:"6675e9ab",1257:"b36d2d1d",1285:"38bf29ad",1328:"08e37dbc",1358:"cec43d6a",1391:"b41adc00",1434:"dfa84138",1436:"8e498bb6",1475:"451db21d",1499:"eb43be84",1501:"64868a43",1611:"e1735da7",1653:"7e4c1ed7",1659:"daff1d93",1675:"d126aabd",1677:"d5dfecc2",1711:"a710d533",1761:"dcf70953",1762:"2bfe7c0b",1772:"92ade856",1793:"309173fa",1853:"21d253a0",1883:"302370be",1906:"4485017c",1926:"f078e301",1994:"269a2f75",2012:"a59d28a9",2087:"7c660760",2098:"d350f5d9",2100:"5ffd2c10",2145:"9c6e5a12",2153:"9bad5ae7",2156:"b6ffb0cb",2181:"ae1d6508",2215:"abc83b7f",2233:"1f61820a",2245:"f25de701",2247:"d361ad2d",2261:"a8cba70f",2266:"a9c2b81a",2293:"b88cb85b",2334:"7af1d52f",2345:"7405ea58",2362:"bace0b37",2448:"633582b9",2476:"2832e534",2526:"a896be03",2530:"e9ff60ad",2535:"814f3328",2542:"ddf9e0bd",2579:"672a376b",2620:"f06cb3e2",2625:"04644f5f",2656:"303c1e60",2717:"f332d221",2742:"33736670",2753:"7762a24e",2773:"3b18521e",2793:"489347ff",2816:"8c6c0796",2889:"7fd9a574",2890:"d6a3d698",2939:"905ecccc",2947:"981f7647",2958:"f7b9d2f4",2965:"ae3384b2",2967:"5feaaaeb",3009:"bbc01ba0",3015:"a6a1bc61",3085:"c60ea0ff",3089:"a6aa9e1f",3092:"0e33a907",3095:"bf933b37",3098:"d09f7e4b",3109:"211d6170",3122:"6d4355d3",3137:"c6b037a5",3206:"f8409a7e",3213:"ac23d7ee",3239:"dca6a1e3",3259:"d2935d14",3287:"7159c7ff",3324:"4a1c8300",3333:"1e8ecffe",3365:"4d43abad",3392:"d86f7a37",3396:"bbdd7e52",3407:"327fa616",3438:"c55d205b",3457:"537817cb",3476:"d20e0728",3483:"2d9296e4",3490:"9ca52986",3519:"a7e0d18f",3530:"20e99c2a",3553:"3b0f99e8",3608:"9e4087bc",3614:"fd5d2408",3625:"77f5fc5d",3637:"b301b20b",3651:"d5bb232a",3671:"a4a1e915",3673:"9f586ca3",3691:"366ddb85",3751:"3720c009",3771:"e6e259a5",3833:"a14ec7b5",3912:"e8d6e7ce",4013:"01a85c17",4091:"b2ebb6fd",4104:"454a6d0d",4121:"55960ee5",4137:"eff1d58f",4149:"8d05b77c",4174:"abb0816f",4185:"c7015929",4195:"c4f5d8e4",4209:"15eddcef",4212:"290b0a56",4275:"04c55e47",4311:"7bbc420e",4368:"a94703ab",4393:"c92f81ac",4433:"49f0f498",4457:"39da970a",4471:"494882d1",4483:"d3e1df19",4558:"6b54f6a4",4564:"e9624b4f",4665:"e0e4666e",4722:"53e4509a",4788:"f6807fb4",4794:"e32990cc",4801:"8d7288fe",4815:"43a97218",4818:"530ffa4f",4889:"5f81b25c",4934:"02ede3c9",4953:"eec33099",4962:"c189d18f",5035:"1a3abee6",5046:"db7928b3",5088:"54150be7",5100:"533bfc57",5103:"df147deb",5131:"f63a747b",5173:"3680bd07",5186:"3f6ea930",5210:"bd28dff2",5237:"26dc40bf",5294:"f90d0c52",5300:"e6a6ed43",5319:"6cfe3a99",5323:"cc519f63",5335:"75121fd5",5371:"aa73a035",5406:"9e4ad429",5419:"d6638f30",5421:"6412e40a",5435:"ee1dd2ad",5436:"c6d04683",5463:"bd64a762",5465:"d0e4cdf1",5467:"6425a984",5485:"da14f319",5487:"08726fcf",5507:"a9221bd5",5521:"5c38e66e",5553:"4430ab79",5602:"f156dfb9",5629:"424a3476",5635:"546ec22f",5649:"564337ec",5652:"1398b403",5669:"00931cc3",5682:"70a12cc4",5717:"39ee6679",5753:"051528db",5758:"a539c018",5785:"1781b1c4",5797:"7fbacf84",5798:"24b9bc70",5819:"e073eb07",5838:"4b79a3c9",5857:"dfc7013c",5870:"cf8e491a",5873:"8fbd512b",5892:"c6004f62",5900:"3c9c1743",5919:"d8cdf5ef",5953:"5a6c6934",5962:"9d8ee3a8",5964:"09fbb6bd",5966:"871c1e5a",5990:"6b69808d",5991:"a5557bb9",6017:"6093f82b",6035:"226700de",6049:"e21c8cc4",6058:"dab4c683",6084:"101b58de",6103:"ccc49370",6123:"f3e308ad",6124:"87070fc3",6161:"562496aa",6172:"be497a8d",6180:"eae2a611",6199:"c60995f6",6204:"0571a526",6250:"3c5aea38",6276:"1251d98b",6300:"5c07bdab",6346:"02689328",6387:"d8775059",6412:"79a97f4e",6420:"ae82353f",6468:"43fcf0e9",6490:"9dc4119a",6493:"130df38c",6508:"12cbeba7",6515:"1236fad7",6526:"1c93669b",6550:"0c390f0d",6587:"c037d168",6608:"6f385a52",6629:"3972c49f",6671:"d28e30d7",6698:"c3ea66fe",6710:"e2de2dbb",6743:"2f43e44a",6750:"f87bdf62",6837:"fbd57548",6857:"214206b9",6883:"bd4db8ee",6887:"f4f49e13",6908:"73688d5c",6984:"274c9143",7009:"54cb095e",7064:"6dd1c948",7108:"7881a85f",7153:"b7d33121",7157:"3ed04b60",7175:"d202e2c5",7181:"69a75ff2",7204:"cb6229c3",7210:"9bbc65ac",7230:"caf1b628",7247:"6c38e270",7268:"14164549",7281:"7e59392d",7328:"48faf148",7344:"70834889",7400:"ffb0fa11",7403:"14dc1923",7404:"c08e7a0d",7412:"70275fcd",7474:"df862072",7476:"66d1c769",7511:"75f50328",7563:"fb861301",7581:"2e10a69c",7599:"80960b4b",7600:"6c674d03",7617:"9e2e3982",7648:"a1877440",7652:"2b22d492",7680:"448c20a0",7681:"1d81daa1",7688:"b9bcab37",7697:"35293ec4",7709:"8e9dc6b3",7723:"b5f3dcc5",7725:"9cfe8fd1",7727:"3dd4d232",7740:"f0978ee1",7775:"2c9f5501",7776:"d65e25b7",7787:"af81a133",7797:"2c446262",7805:"4e394c08",7843:"a0410ab5",7857:"5a29fbab",7891:"635a92d5",7901:"2a8faff0",7918:"17896441",7920:"1a4e3797",7945:"d1e1bea4",7954:"d368e73e",7966:"c0cb7215",7972:"9d1fd2b0",7975:"270346fa",8036:"1664646a",8037:"d0840b01",8106:"41c44b28",8107:"3b12d42b",8110:"fed8bc04",8142:"5eed1665",8151:"255134d9",8161:"19f4ae8e",8174:"d60e2b0c",8243:"1fbde614",8262:"56e576e5",8288:"21e890b0",8338:"8dc09bac",8355:"fe273484",8360:"8ad2f007",8474:"a3614f73",8476:"f3493919",8509:"3d6c40c1",8516:"bf02a661",8518:"a7bd4aaa",8524:"9dec6b67",8548:"ac3fdf5d",8561:"d2611248",8606:"2a984615",8610:"6875c492",8628:"41b4728f",8644:"cef46b76",8652:"e7d2a655",8683:"cd68cda1",8716:"ee92877e",8817:"cc3bdf2f",8882:"f75a8651",8894:"bbc3f62a",8909:"aacfeabc",8919:"f042b56c",8927:"c1b17b3f",8942:"0a2eaa84",9055:"b421ebb7",9059:"198f8d8a",9092:"a85e626a",9111:"372ccfe9",9171:"18c69d70",9239:"101cf32b",9242:"c29bedb9",9286:"9b43eac8",9287:"8b79a48d",9304:"4515250b",9310:"d1cef389",9312:"42957a8d",9391:"829fa7b9",9393:"6bc709ad",9396:"52106a5f",9412:"21294bbb",9427:"8da65e83",9458:"db86613e",9467:"e2326195",9534:"fb48356a",9538:"9b56b618",9581:"72657f57",9591:"2b479afe",9606:"ef5b2427",9623:"a4349a81",9633:"d40f51e1",9661:"5e95c892",9686:"5a473bed",9702:"492a6565",9713:"1bb997fc",9763:"bd2d06b5",9788:"d88bdb28",9874:"1a6b9123",9875:"16f719ab",9887:"f580a9d0",9910:"e1a06456",9924:"df203c0f",9940:"e4ebfe18"}[e]||e)+"."+{26:"396e25f8",31:"fdbb534a",53:"71c551f2",71:"a92922df",80:"2cc977cf",96:"8ecf33d3",100:"20d6e003",109:"16b28578",116:"553227fe",130:"6f496591",132:"2314fae3",172:"db667c7f",240:"0ba42e66",286:"7a0eb710",297:"72dfd56d",300:"22b66ce6",321:"84e86023",324:"4d349f70",326:"6aad02cc",328:"ee7b0442",372:"9ac55f69",422:"094422e8",425:"b08f53b9",448:"97a380e8",454:"ad3c5a8e",470:"0866f74e",471:"f74807b0",475:"0be524dd",498:"12fc56b7",533:"2f9a4877",548:"79ba529e",573:"859d75dc",588:"aae54d66",628:"809ce47c",638:"5faa68cc",653:"45b4a5d1",656:"f8a47feb",687:"c2dc0274",693:"67483436",711:"e6e0ddcc",724:"2fc7a62a",732:"77b06a2e",734:"879585f3",741:"c2db56cb",743:"caf52cd9",820:"798245bb",838:"d4286554",843:"b1baa87f",846:"0c6e8615",916:"0d5d146a",917:"b8d40213",952:"ecad1fac",955:"08ba84b5",960:"ff5f7662",964:"9343ce40",970:"65d9bdd3",988:"bc8e9087",1065:"54c45c44",1079:"6686d66e",1103:"3c966f04",1112:"6fea3dcd",1113:"afac0769",1196:"7ed7c756",1213:"91c7273b",1252:"6cb7854b",1253:"f463dc37",1255:"071239af",1257:"df006be2",1285:"bf7f6732",1325:"96f02940",1328:"1a6f6d94",1358:"da9494dc",1391:"18de1b4a",1426:"172b3ab7",1434:"4493a1cc",1436:"ad307809",1475:"bfc2cec9",1499:"22586c32",1501:"7ad801ec",1504:"673c6d1d",1611:"c24d1f44",1644:"29f069a4",1653:"3a8a4e55",1659:"05c3894f",1675:"77014965",1677:"ea44f851",1711:"89d1ac83",1761:"d0be48ac",1762:"2258198c",1763:"498dab2c",1772:"976d3fdf",1793:"f6e5e77a",1853:"c36050f0",1883:"1fbec87b",1906:"c2d7ef54",1926:"5f6afbe2",1994:"3f56a8b3",2012:"8b50a5d4",2087:"e38d4441",2090:"4df4088d",2098:"668ec20f",2100:"6cc0bd94",2145:"b4cadf2e",2153:"57e2d83c",2156:"f0221a42",2181:"f635198e",2183:"709e4efa",2215:"58cc5405",2233:"88aff807",2245:"56fe7f2e",2247:"6d13094d",2261:"cee833fc",2266:"560a866f",2293:"1a8848b9",2334:"1e2619be",2345:"2e86a2c7",2362:"f7548902",2448:"6d800cdf",2476:"c0d55bb0",2526:"8424c86d",2530:"6425d7c1",2535:"2013f288",2542:"b3d7aff1",2579:"38ceaf22",2620:"dc5ae1e1",2625:"66ea41a4",2656:"a53c4908",2661:"53590ac1",2693:"4c3b29a9",2696:"60f62e8e",2700:"e5ff6008",2717:"71dd83a5",2742:"729098c7",2753:"8bd5f9d3",2773:"28bc0b58",2793:"8a3de8e4",2816:"3d5f97d2",2889:"b6a2428d",2890:"a57e5d29",2939:"d9497818",2947:"4c1ae69c",2958:"b710b8ae",2965:"95cb14ea",2967:"d28b71e6",3009:"8c10fd15",3015:"559bd506",3076:"8917a93f",3085:"f14cacef",3089:"c05861ce",3092:"ac59862e",3095:"56ca3009",3098:"eacc75cd",3109:"ccc60dec",3122:"bb82b9e2",3137:"3ee85e02",3206:"c9918afa",3213:"9149127e",3239:"1921109b",3259:"fe55055e",3287:"ef3cd4c1",3324:"ff290a16",3333:"45c08382",3343:"9c6e58b9",3365:"c332c4e5",3392:"b7635827",3396:"708eb846",3407:"aeeca246",3438:"0c6df2ba",3457:"ba8b6e85",3476:"7cfdad18",3483:"d46cb8ea",3490:"3fac83b3",3519:"ae8780eb",3530:"90a43ac9",3553:"a35b4fd0",3608:"4df9d21b",3614:"f64b5f70",3619:"90967934",3625:"21e983b6",3637:"b1bb1de7",3651:"a57b340e",3671:"4e685de1",3673:"0edad504",3691:"bc758731",3751:"ff67d5b0",3771:"12dca990",3833:"1626e81e",3912:"2cedce96",4013:"ac5e273d",4091:"73f1f165",4104:"552672c1",4121:"ac98a179",4137:"7cfa83fd",4149:"11b879c5",4174:"b0d0aba5",4185:"2bf7c111",4195:"325cecb9",4209:"9f1acbf7",4212:"f8bb3f04",4238:"4e22d6ed",4275:"8e07c804",4311:"de2e8ae6",4368:"a518cb82",4393:"e9e6baff",4433:"20ae1bcb",4457:"07ba51b6",4471:"e3de805a",4483:"7fe0da56",4558:"d56518cb",4564:"0abc2788",4665:"cc580050",4706:"396fafd5",4722:"4c516822",4788:"f409010b",4794:"5229ddfb",4801:"5f0bac2d",4815:"9ee201c3",4818:"7202e3e6",4889:"f9e417ff",4934:"2f927120",4953:"7b770d0a",4962:"a6c386a8",5035:"6fe9c1e5",5046:"2a9c0fe1",5088:"a4cc9618",5100:"31b3cba3",5103:"cbd660a5",5131:"276c7afe",5173:"43261a11",5186:"667b0c9a",5210:"fc36de16",5237:"1eef62c6",5269:"c0ef4f6e",5294:"0d5afa4f",5300:"3155fd1b",5319:"f51506e7",5323:"93a6ec6e",5326:"854b4bbd",5335:"ed266578",5371:"9f9e0b0f",5406:"a307a08a",5419:"f1c475a1",5421:"1ab52c78",5435:"8c78f348",5436:"e8f93c5d",5463:"e11ec088",5465:"52749e73",5467:"576248f5",5485:"8e1fdf68",5487:"b0eaf3bf",5507:"3bfa9f2c",5521:"a18cbc60",5553:"91bf9599",5602:"ffae126d",5629:"e8d54669",5635:"826c8fef",5649:"e532af5a",5652:"a2dde0c3",5669:"9397bc8e",5682:"2db653db",5717:"b0b1231d",5753:"3c8de023",5758:"11f0a959",5785:"32b65230",5790:"c21bcf3c",5797:"c4fc60f8",5798:"e850b275",5819:"81787244",5838:"7dbbc94e",5857:"b8b0baa4",5870:"464ac15a",5873:"4d36cc4b",5892:"8257704e",5900:"139a7956",5919:"70d99349",5943:"a728978f",5953:"7bd0504f",5962:"22bab478",5964:"d5da5c4e",5966:"d89a25ad",5990:"7f9dc5ba",5991:"706f72e5",6017:"4cb4daad",6035:"f225e3c4",6049:"241472c2",6058:"29c4f1c4",6084:"50b75864",6103:"cd8a1e9f",6123:"01ef8b08",6124:"11fb059b",6161:"6fbd6e7b",6172:"2f31778a",6180:"cd0ab448",6199:"6ea62df7",6204:"a702a510",6250:"ff4be1ec",6255:"1019335d",6276:"83acfa67",6300:"e8412b53",6346:"7a7f957d",6387:"dbd907a8",6412:"b4a66bd8",6420:"d47cda5f",6468:"37211ee7",6490:"f5fda87d",6493:"5e3c05b0",6508:"606332b2",6515:"b2dae1b2",6526:"857fc62a",6550:"d53242e6",6587:"96f06126",6591:"9ffc30a1",6608:"82857361",6629:"411ee9ac",6648:"b66fcf80",6671:"e9d9a701",6698:"4afcd78f",6710:"441ed42b",6743:"31f6617e",6750:"6d07506d",6837:"01f72cd5",6857:"22526c71",6883:"3432cdf1",6887:"f11d5c78",6908:"712f7871",6945:"52e6a492",6984:"5b1f6476",6985:"432fb51c",7009:"e840b478",7064:"d7e4f8e7",7108:"7455ce4c",7153:"74e8d043",7157:"6fb6f83d",7175:"1343f229",7181:"d0efe32e",7204:"69eb5143",7210:"c162c71c",7230:"829e32b7",7247:"5142239c",7268:"7a0bdef8",7281:"9dcd9203",7328:"ab2c08fd",7344:"62468df3",7400:"e327857d",7403:"9fdbd075",7404:"9cff8a1c",7412:"139f4443",7474:"8d335144",7476:"0554fad1",7511:"0959afe8",7563:"4cca033a",7581:"91808ad6",7599:"ac0be7bf",7600:"32ba75ec",7617:"2572da73",7648:"88e9cb51",7652:"7e5eb591",7680:"0fc36b55",7681:"3c02c51a",7688:"341c6751",7697:"6c65870c",7709:"cb50d73f",7723:"b4794607",7725:"b5a952f6",7727:"28032cae",7740:"a0902758",7775:"90cddc88",7776:"fc9e57e0",7787:"cb0b4019",7797:"5e6afa9d",7805:"14a3ca53",7843:"49cf84e1",7856:"eee4957e",7857:"24f29dd6",7891:"da14a0d3",7901:"bab1919e",7918:"100c49c3",7920:"3c56de14",7936:"1d703c73",7945:"59b0c254",7954:"9d264eba",7966:"c03bc365",7972:"21d408a6",7975:"d2428cf5",8016:"4dd5a4f5",8036:"a9255e28",8037:"30f98a8b",8106:"7caafbcc",8107:"95f13260",8110:"4f833fe3",8142:"92b60a91",8151:"820e0db5",8161:"54b6b5f0",8174:"b8855a4d",8243:"de74c976",8262:"c2861079",8288:"8356b613",8338:"44e33d7b",8355:"6eaec45f",8360:"1f65f274",8474:"41561765",8476:"34209051",8509:"145654ac",8516:"eea26b3e",8518:"d10943b8",8524:"ce191000",8548:"4d2ffc83",8561:"acc252e0",8606:"dca5eb21",8610:"4b55fe57",8628:"0a266023",8644:"2417af73",8652:"c38576aa",8683:"4b0125e7",8716:"fca72275",8817:"b73cfef6",8882:"5ec8e77e",8894:"db081e7b",8909:"f4746b20",8919:"2fd3c78c",8927:"a56397ee",8942:"93ab101b",8955:"c7e72aec",9055:"6f04fcbd",9059:"246f1a7e",9092:"4cd274c5",9111:"7554fc85",9138:"49be4c15",9171:"7e0e9cbb",9239:"3d4b37a9",9242:"df34f78e",9286:"13dd4d49",9287:"05441ccf",9304:"7c65c757",9310:"1ee0e564",9312:"694f2815",9391:"814a5b58",9393:"9b49bc75",9396:"0e08c528",9412:"d72906f2",9427:"b9934882",9458:"32692315",9467:"fc5c7ff0",9534:"500f036d",9538:"5822f5e9",9581:"d7e291a7",9591:"31ea2b46",9606:"db67f9c6",9623:"dc01ce87",9633:"14bda7cc",9661:"339017aa",9686:"f77dcd66",9702:"1392e115",9713:"f3048ec2",9763:"0d8a7465",9788:"771689c2",9874:"f05b7812",9875:"f99292c8",9887:"ff66fa3d",9893:"6a5afb1e",9910:"0b256ea7",9924:"667cb6dd",9940:"2efe1799"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},b="my-website:",r.l=(e,a,f,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={14164549:"7268",17896441:"7918",33736670:"2742",70834889:"7344",ad3b7b62:"26",f4c6e7e6:"31","935f2afb":"53","8a27aeff":"71","5088fe06":"80","087c46fa":"96",d50fd269:"100","0cb009d1":"116","96adae60":"172","4959fc42":"240","1893cb59":"286","9fae68e2":"297","92fef07b":"300","0c071de2":"321","280572f1":"324","6f03d3d2":"326","4b2fba3e":"328","35b2eb5a":"372","0281109c":"422","16cc6f3a":"425","28a1570f":"448","1a665c6f":"454","8720c147":"470","38d8699e":"471",a3dddb77:"475","6ba49b42":"498",b2b675dd:"533","32397cb2":"548",b474adfe:"573",d7955594:"588",e0d68441:"628","0d3421d0":"638",bbceb8f1:"653","1f05d14a":"656","33ac99d3":"687","6a19354d":"693",bb221eab:"711",f01ceada:"724","64f377d6":"732","05b907fc":"734","8a24850b":"741","509d519c":"743",ff4c6c5e:"820","6b4e1191":"838",d2770bf7:"843",d0277431:"846",fa3d3942:"916","6552f31f":"917","86b4da3d":"952",fe8cce0a:"955",fa61c459:"960",c573638f:"964","32b2299c":"970","754fb852":"988","69c28c32":"1065","15f27552":"1079","49b8d9dd":"1103",e9eabc5d:"1112","0746167d":"1113","2d3b202f":"1196",b2c8756c:"1213","5d4cff52":"1252",e5e44a85:"1253","6675e9ab":"1255",b36d2d1d:"1257","38bf29ad":"1285","08e37dbc":"1328",cec43d6a:"1358",b41adc00:"1391",dfa84138:"1434","8e498bb6":"1436","451db21d":"1475",eb43be84:"1499","64868a43":"1501",e1735da7:"1611","7e4c1ed7":"1653",daff1d93:"1659",d126aabd:"1675",d5dfecc2:"1677",a710d533:"1711",dcf70953:"1761","2bfe7c0b":"1762","92ade856":"1772","309173fa":"1793","21d253a0":"1853","302370be":"1883","4485017c":"1906",f078e301:"1926","269a2f75":"1994",a59d28a9:"2012","7c660760":"2087",d350f5d9:"2098","5ffd2c10":"2100","9c6e5a12":"2145","9bad5ae7":"2153",b6ffb0cb:"2156",ae1d6508:"2181",abc83b7f:"2215","1f61820a":"2233",f25de701:"2245",d361ad2d:"2247",a8cba70f:"2261",a9c2b81a:"2266",b88cb85b:"2293","7af1d52f":"2334","7405ea58":"2345",bace0b37:"2362","633582b9":"2448","2832e534":"2476",a896be03:"2526",e9ff60ad:"2530","814f3328":"2535",ddf9e0bd:"2542","672a376b":"2579",f06cb3e2:"2620","04644f5f":"2625","303c1e60":"2656",f332d221:"2717","7762a24e":"2753","3b18521e":"2773","489347ff":"2793","8c6c0796":"2816","7fd9a574":"2889",d6a3d698:"2890","905ecccc":"2939","981f7647":"2947",f7b9d2f4:"2958",ae3384b2:"2965","5feaaaeb":"2967",bbc01ba0:"3009",a6a1bc61:"3015",c60ea0ff:"3085",a6aa9e1f:"3089","0e33a907":"3092",bf933b37:"3095",d09f7e4b:"3098","211d6170":"3109","6d4355d3":"3122",c6b037a5:"3137",f8409a7e:"3206",ac23d7ee:"3213",dca6a1e3:"3239",d2935d14:"3259","7159c7ff":"3287","4a1c8300":"3324","1e8ecffe":"3333","4d43abad":"3365",d86f7a37:"3392",bbdd7e52:"3396","327fa616":"3407",c55d205b:"3438","537817cb":"3457",d20e0728:"3476","2d9296e4":"3483","9ca52986":"3490",a7e0d18f:"3519","20e99c2a":"3530","3b0f99e8":"3553","9e4087bc":"3608",fd5d2408:"3614","77f5fc5d":"3625",b301b20b:"3637",d5bb232a:"3651",a4a1e915:"3671","9f586ca3":"3673","366ddb85":"3691","3720c009":"3751",e6e259a5:"3771",a14ec7b5:"3833",e8d6e7ce:"3912","01a85c17":"4013",b2ebb6fd:"4091","454a6d0d":"4104","55960ee5":"4121",eff1d58f:"4137","8d05b77c":"4149",abb0816f:"4174",c7015929:"4185",c4f5d8e4:"4195","15eddcef":"4209","290b0a56":"4212","04c55e47":"4275","7bbc420e":"4311",a94703ab:"4368",c92f81ac:"4393","49f0f498":"4433","39da970a":"4457","494882d1":"4471",d3e1df19:"4483","6b54f6a4":"4558",e9624b4f:"4564",e0e4666e:"4665","53e4509a":"4722",f6807fb4:"4788",e32990cc:"4794","8d7288fe":"4801","43a97218":"4815","530ffa4f":"4818","5f81b25c":"4889","02ede3c9":"4934",eec33099:"4953",c189d18f:"4962","1a3abee6":"5035",db7928b3:"5046","54150be7":"5088","533bfc57":"5100",df147deb:"5103",f63a747b:"5131","3680bd07":"5173","3f6ea930":"5186",bd28dff2:"5210","26dc40bf":"5237",f90d0c52:"5294",e6a6ed43:"5300","6cfe3a99":"5319",cc519f63:"5323","75121fd5":"5335",aa73a035:"5371","9e4ad429":"5406",d6638f30:"5419","6412e40a":"5421",ee1dd2ad:"5435",c6d04683:"5436",bd64a762:"5463",d0e4cdf1:"5465","6425a984":"5467",da14f319:"5485","08726fcf":"5487",a9221bd5:"5507","5c38e66e":"5521","4430ab79":"5553",f156dfb9:"5602","424a3476":"5629","546ec22f":"5635","564337ec":"5649","1398b403":"5652","00931cc3":"5669","70a12cc4":"5682","39ee6679":"5717","051528db":"5753",a539c018:"5758","1781b1c4":"5785","7fbacf84":"5797","24b9bc70":"5798",e073eb07:"5819","4b79a3c9":"5838",dfc7013c:"5857",cf8e491a:"5870","8fbd512b":"5873",c6004f62:"5892","3c9c1743":"5900",d8cdf5ef:"5919","5a6c6934":"5953","9d8ee3a8":"5962","09fbb6bd":"5964","871c1e5a":"5966","6b69808d":"5990",a5557bb9:"5991","6093f82b":"6017","226700de":"6035",e21c8cc4:"6049",dab4c683:"6058","101b58de":"6084",ccc49370:"6103",f3e308ad:"6123","87070fc3":"6124","562496aa":"6161",be497a8d:"6172",eae2a611:"6180",c60995f6:"6199","0571a526":"6204","3c5aea38":"6250","1251d98b":"6276","5c07bdab":"6300","02689328":"6346",d8775059:"6387","79a97f4e":"6412",ae82353f:"6420","43fcf0e9":"6468","9dc4119a":"6490","130df38c":"6493","12cbeba7":"6508","1236fad7":"6515","1c93669b":"6526","0c390f0d":"6550",c037d168:"6587","6f385a52":"6608","3972c49f":"6629",d28e30d7:"6671",c3ea66fe:"6698",e2de2dbb:"6710","2f43e44a":"6743",f87bdf62:"6750",fbd57548:"6837","214206b9":"6857",bd4db8ee:"6883",f4f49e13:"6887","73688d5c":"6908","274c9143":"6984","54cb095e":"7009","6dd1c948":"7064","7881a85f":"7108",b7d33121:"7153","3ed04b60":"7157",d202e2c5:"7175","69a75ff2":"7181",cb6229c3:"7204","9bbc65ac":"7210",caf1b628:"7230","6c38e270":"7247","7e59392d":"7281","48faf148":"7328",ffb0fa11:"7400","14dc1923":"7403",c08e7a0d:"7404","70275fcd":"7412",df862072:"7474","66d1c769":"7476","75f50328":"7511",fb861301:"7563","2e10a69c":"7581","80960b4b":"7599","6c674d03":"7600","9e2e3982":"7617",a1877440:"7648","2b22d492":"7652","448c20a0":"7680","1d81daa1":"7681",b9bcab37:"7688","35293ec4":"7697","8e9dc6b3":"7709",b5f3dcc5:"7723","9cfe8fd1":"7725","3dd4d232":"7727",f0978ee1:"7740","2c9f5501":"7775",d65e25b7:"7776",af81a133:"7787","2c446262":"7797","4e394c08":"7805",a0410ab5:"7843","5a29fbab":"7857","635a92d5":"7891","2a8faff0":"7901","1a4e3797":"7920",d1e1bea4:"7945",d368e73e:"7954",c0cb7215:"7966","9d1fd2b0":"7972","270346fa":"7975","1664646a":"8036",d0840b01:"8037","41c44b28":"8106","3b12d42b":"8107",fed8bc04:"8110","5eed1665":"8142","255134d9":"8151","19f4ae8e":"8161",d60e2b0c:"8174","1fbde614":"8243","56e576e5":"8262","21e890b0":"8288","8dc09bac":"8338",fe273484:"8355","8ad2f007":"8360",a3614f73:"8474",f3493919:"8476","3d6c40c1":"8509",bf02a661:"8516",a7bd4aaa:"8518","9dec6b67":"8524",ac3fdf5d:"8548",d2611248:"8561","2a984615":"8606","6875c492":"8610","41b4728f":"8628",cef46b76:"8644",e7d2a655:"8652",cd68cda1:"8683",ee92877e:"8716",cc3bdf2f:"8817",f75a8651:"8882",bbc3f62a:"8894",aacfeabc:"8909",f042b56c:"8919",c1b17b3f:"8927","0a2eaa84":"8942",b421ebb7:"9055","198f8d8a":"9059",a85e626a:"9092","372ccfe9":"9111","18c69d70":"9171","101cf32b":"9239",c29bedb9:"9242","9b43eac8":"9286","8b79a48d":"9287","4515250b":"9304",d1cef389:"9310","42957a8d":"9312","829fa7b9":"9391","6bc709ad":"9393","52106a5f":"9396","21294bbb":"9412","8da65e83":"9427",db86613e:"9458",e2326195:"9467",fb48356a:"9534","9b56b618":"9538","72657f57":"9581","2b479afe":"9591",ef5b2427:"9606",a4349a81:"9623",d40f51e1:"9633","5e95c892":"9661","5a473bed":"9686","492a6565":"9702","1bb997fc":"9713",bd2d06b5:"9763",d88bdb28:"9788","1a6b9123":"9874","16f719ab":"9875",f580a9d0:"9887",e1a06456:"9910",df203c0f:"9924",e4ebfe18:"9940"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>d=e[a]=[f,b]));f.push(d[2]=b);var c=r.p+r.u(a),t=new Error;r.l(c,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var b=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,b,c=f[0],t=f[1],o=f[2],n=0;if(c.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n프로젝트

부족함을 많이 느껴서 개인적으로 힘들었던 기간이었다. 단순 개발뿐만이 아니라 일정 산출, 소통, 문서화와 같은 다양한 능력이 필요했었고, 자존감이 많이 떨어진 상태였다. -그래도 안드로이드 크루들과 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 -문제가 발생할 때 같이 해결하고, 팀원들과 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

+그래도 팀원들과 함께 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 +문제가 발생할 때 같이 해결하고, 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

레벨 5

이 기간 동안 가장 잘한 일은 주위 사람들에게 도움을 요청한 일이었다. 조금 억지스러운 도움 요청도 주변 크루들이 많이 들어주었고, 너무 감사하다. diff --git a/blackjack-retrospective.html b/blackjack-retrospective.html index 51d2aa152..a86dd6e40 100644 --- a/blackjack-retrospective.html +++ b/blackjack-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/blog.html b/blog.html index 38d3c0c52..c733c900d 100644 --- a/blog.html +++ b/blog.html @@ -13,7 +13,7 @@ - + diff --git a/book-leadership-and-self-deception.html b/book-leadership-and-self-deception.html index 356d5e799..73e67c831 100644 --- a/book-leadership-and-self-deception.html +++ b/book-leadership-and-self-deception.html @@ -13,7 +13,7 @@ - + diff --git a/book-writer.html b/book-writer.html index 98144b3e6..39f395373 100644 --- a/book-writer.html +++ b/book-writer.html @@ -13,7 +13,7 @@ - + diff --git a/chess-retrospective.html b/chess-retrospective.html index ca68170e7..7c7e4b9d1 100644 --- a/chess-retrospective.html +++ b/chess-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/cloudwatch.html b/cloudwatch.html index b32b30f95..f005c7b8c 100644 --- a/cloudwatch.html +++ b/cloudwatch.html @@ -13,7 +13,7 @@ - + diff --git a/composite.html b/composite.html index 3bc889191..df347f809 100644 --- a/composite.html +++ b/composite.html @@ -13,7 +13,7 @@ - + diff --git a/custom-jdbc-template.html b/custom-jdbc-template.html index 4081281af..9ab2d90e6 100644 --- a/custom-jdbc-template.html +++ b/custom-jdbc-template.html @@ -13,7 +13,7 @@ - + diff --git a/db-replication.html b/db-replication.html index b5b367072..e392b2ba0 100644 --- a/db-replication.html +++ b/db-replication.html @@ -13,7 +13,7 @@ - + diff --git a/docs.html b/docs.html index 332e571d6..f50a07b75 100644 --- a/docs.html +++ b/docs.html @@ -13,10 +13,10 @@ - + -

+ \ No newline at end of file diff --git a/docs/architecture/virtical-slice-architecture.html b/docs/architecture/virtical-slice-architecture.html index e9fe049f1..1ed0e921d 100644 --- a/docs/architecture/virtical-slice-architecture.html +++ b/docs/architecture/virtical-slice-architecture.html @@ -13,7 +13,7 @@ - + diff --git a/docs/book/getting-out-of-the-box.html b/docs/book/getting-out-of-the-box.html index 82bedd128..204d43a6c 100644 --- a/docs/book/getting-out-of-the-box.html +++ b/docs/book/getting-out-of-the-box.html @@ -13,7 +13,7 @@ - + diff --git a/docs/culture/postmortem.html b/docs/culture/postmortem.html index e5cdf83a2..a64371129 100644 --- a/docs/culture/postmortem.html +++ b/docs/culture/postmortem.html @@ -13,7 +13,7 @@ - + diff --git a/docs/database/maximumPoolSize.html b/docs/database/maximumPoolSize.html index 6f6495071..bd708421b 100644 --- a/docs/database/maximumPoolSize.html +++ b/docs/database/maximumPoolSize.html @@ -13,7 +13,7 @@ - + diff --git a/docs/database/query-execution.html b/docs/database/query-execution.html index a1f519b67..8a8a4ef64 100644 --- a/docs/database/query-execution.html +++ b/docs/database/query-execution.html @@ -13,7 +13,7 @@ - + diff --git a/docs/deploy/zero-downtime.html b/docs/deploy/zero-downtime.html index e70d23bee..d10359b1e 100644 --- a/docs/deploy/zero-downtime.html +++ b/docs/deploy/zero-downtime.html @@ -13,7 +13,7 @@ - + diff --git a/docs/design/package.html b/docs/design/package.html index e66dc45d9..0a8f78c0e 100644 --- a/docs/design/package.html +++ b/docs/design/package.html @@ -13,7 +13,7 @@ - + diff --git a/docs/etc/communication.html b/docs/etc/communication.html index 0c4bd15b2..30494c6ec 100644 --- a/docs/etc/communication.html +++ b/docs/etc/communication.html @@ -13,7 +13,7 @@ - + diff --git a/docs/etc/develop-with-spring.html b/docs/etc/develop-with-spring.html index a27137c2b..6708c243f 100644 --- a/docs/etc/develop-with-spring.html +++ b/docs/etc/develop-with-spring.html @@ -13,7 +13,7 @@ - + diff --git a/docs/etc/event-storming.html b/docs/etc/event-storming.html index 43eb4e1c0..89a2d896f 100644 --- a/docs/etc/event-storming.html +++ b/docs/etc/event-storming.html @@ -13,7 +13,7 @@ - + diff --git a/docs/etc/experience-and-self-question.html b/docs/etc/experience-and-self-question.html index 8175cca6f..f8cddc6a1 100644 --- a/docs/etc/experience-and-self-question.html +++ b/docs/etc/experience-and-self-question.html @@ -13,7 +13,7 @@ - + diff --git a/docs/etc/healthful-growth.html b/docs/etc/healthful-growth.html index f2e7891d1..3d3a2f892 100644 --- a/docs/etc/healthful-growth.html +++ b/docs/etc/healthful-growth.html @@ -13,7 +13,7 @@ - + diff --git a/docs/java/sequenced-collection.html b/docs/java/sequenced-collection.html index f504f6262..4368a0756 100644 --- a/docs/java/sequenced-collection.html +++ b/docs/java/sequenced-collection.html @@ -13,7 +13,7 @@ - + diff --git a/docs/jpa/key.html b/docs/jpa/key.html index cabaaba9c..3f467344a 100644 --- a/docs/jpa/key.html +++ b/docs/jpa/key.html @@ -13,7 +13,7 @@ - + diff --git a/docs/linux/shell.html b/docs/linux/shell.html index aff22c6d4..c3c4869e8 100644 --- a/docs/linux/shell.html +++ b/docs/linux/shell.html @@ -13,7 +13,7 @@ - + diff --git a/docs/linux/swap.html b/docs/linux/swap.html index 1b87380a1..ad98ef51a 100644 --- a/docs/linux/swap.html +++ b/docs/linux/swap.html @@ -13,7 +13,7 @@ - + diff --git a/docs/mac/java.html b/docs/mac/java.html index b290e2ebb..6317adf02 100644 --- a/docs/mac/java.html +++ b/docs/mac/java.html @@ -13,7 +13,7 @@ - + diff --git a/docs/monitoring/intro.html b/docs/monitoring/intro.html index 8d0e33e72..fd8e7daca 100644 --- a/docs/monitoring/intro.html +++ b/docs/monitoring/intro.html @@ -13,7 +13,7 @@ - + diff --git a/docs/network/load-balancing-algorithm.html b/docs/network/load-balancing-algorithm.html index e6f9d58bd..4316e479b 100644 --- a/docs/network/load-balancing-algorithm.html +++ b/docs/network/load-balancing-algorithm.html @@ -13,7 +13,7 @@ - + diff --git a/docs/network/load-balancing.html b/docs/network/load-balancing.html index 4913fae75..0afc620ac 100644 --- a/docs/network/load-balancing.html +++ b/docs/network/load-balancing.html @@ -13,7 +13,7 @@ - + diff --git a/docs/nginx/command.html b/docs/nginx/command.html index e04308b99..f3f9beea1 100644 --- a/docs/nginx/command.html +++ b/docs/nginx/command.html @@ -13,7 +13,7 @@ - + diff --git a/docs/nginx/static-file.html b/docs/nginx/static-file.html index cf24322d0..218e6940b 100644 --- a/docs/nginx/static-file.html +++ b/docs/nginx/static-file.html @@ -13,7 +13,7 @@ - + diff --git a/docs/performance/throughput-latency.html b/docs/performance/throughput-latency.html index 4edabfab6..930ca11cc 100644 --- a/docs/performance/throughput-latency.html +++ b/docs/performance/throughput-latency.html @@ -13,7 +13,7 @@ - + diff --git a/docs/performance/throughput.html b/docs/performance/throughput.html index e56fe0a42..c5ef6ae2c 100644 --- a/docs/performance/throughput.html +++ b/docs/performance/throughput.html @@ -13,7 +13,7 @@ - + diff --git a/docs/performance/types.html b/docs/performance/types.html index 00bc60dc3..a6be48ad0 100644 --- a/docs/performance/types.html +++ b/docs/performance/types.html @@ -13,7 +13,7 @@ - + diff --git a/docs/spring/essence.html b/docs/spring/essence.html index aa3ec4565..b3dddcda6 100644 --- a/docs/spring/essence.html +++ b/docs/spring/essence.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags.html b/docs/tags.html index 7b6e3f1d3..9cd17ab7a 100644 --- a/docs/tags.html +++ b/docs/tags.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/architecture.html b/docs/tags/architecture.html index 8a95a666e..2cc400275 100644 --- a/docs/tags/architecture.html +++ b/docs/tags/architecture.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/book.html b/docs/tags/book.html index d462360e2..e9bec810b 100644 --- a/docs/tags/book.html +++ b/docs/tags/book.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/collection.html b/docs/tags/collection.html index 51add7249..8434be5ef 100644 --- a/docs/tags/collection.html +++ b/docs/tags/collection.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/deploy.html b/docs/tags/deploy.html index 6d2d7839a..eebda7530 100644 --- a/docs/tags/deploy.html +++ b/docs/tags/deploy.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/etc.html b/docs/tags/etc.html index 73bf8bc02..b5269b18d 100644 --- a/docs/tags/etc.html +++ b/docs/tags/etc.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/java.html b/docs/tags/java.html index 6690920fa..974a9b479 100644 --- a/docs/tags/java.html +++ b/docs/tags/java.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/jpa.html b/docs/tags/jpa.html index 1d6118539..18d124b7e 100644 --- a/docs/tags/jpa.html +++ b/docs/tags/jpa.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/latency.html b/docs/tags/latency.html index 0ef89420f..15ea8d247 100644 --- a/docs/tags/latency.html +++ b/docs/tags/latency.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/load-balancing.html b/docs/tags/load-balancing.html index 15b17ab33..5107eb0d9 100644 --- a/docs/tags/load-balancing.html +++ b/docs/tags/load-balancing.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/monitoring.html b/docs/tags/monitoring.html index 92ddee02b..54eff29ea 100644 --- a/docs/tags/monitoring.html +++ b/docs/tags/monitoring.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/network.html b/docs/tags/network.html index 2560a9a98..3cdf5eb6c 100644 --- a/docs/tags/network.html +++ b/docs/tags/network.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/nginx.html b/docs/tags/nginx.html index 2fffd7229..3cedc75f3 100644 --- a/docs/tags/nginx.html +++ b/docs/tags/nginx.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/package.html b/docs/tags/package.html index 834f3fd67..05c6d568a 100644 --- a/docs/tags/package.html +++ b/docs/tags/package.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/performance.html b/docs/tags/performance.html index 5123f7a04..09c56f743 100644 --- a/docs/tags/performance.html +++ b/docs/tags/performance.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/postmortem.html b/docs/tags/postmortem.html index d17a5c890..134b043bd 100644 --- a/docs/tags/postmortem.html +++ b/docs/tags/postmortem.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/sequenced.html b/docs/tags/sequenced.html index fd881ea44..e010d7db0 100644 --- a/docs/tags/sequenced.html +++ b/docs/tags/sequenced.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/spring.html b/docs/tags/spring.html index 57198681b..32b0fabc1 100644 --- a/docs/tags/spring.html +++ b/docs/tags/spring.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/test.html b/docs/tags/test.html index ec63fbffd..09a5a48f6 100644 --- a/docs/tags/test.html +++ b/docs/tags/test.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/throughput.html b/docs/tags/throughput.html index 75555f5d8..21653f8bd 100644 --- a/docs/tags/throughput.html +++ b/docs/tags/throughput.html @@ -13,7 +13,7 @@ - + diff --git a/docs/tags/zero-downtime.html b/docs/tags/zero-downtime.html index d9a6218dc..6a68d33bd 100644 --- a/docs/tags/zero-downtime.html +++ b/docs/tags/zero-downtime.html @@ -13,7 +13,7 @@ - + diff --git a/docs/test/benefit.html b/docs/test/benefit.html index d811bc942..06148a623 100644 --- a/docs/test/benefit.html +++ b/docs/test/benefit.html @@ -13,7 +13,7 @@ - + diff --git a/docs/test/first.html b/docs/test/first.html index 67efa8f3e..1ee5f83f9 100644 --- a/docs/test/first.html +++ b/docs/test/first.html @@ -13,7 +13,7 @@ - + diff --git a/docs/test/heuristics.html b/docs/test/heuristics.html index 06c8331e2..fbea3849e 100644 --- a/docs/test/heuristics.html +++ b/docs/test/heuristics.html @@ -13,7 +13,7 @@ - + diff --git a/docs/test/stairstep.html b/docs/test/stairstep.html index c421ae1c8..fd2f1d0b9 100644 --- a/docs/test/stairstep.html +++ b/docs/test/stairstep.html @@ -13,7 +13,7 @@ - + diff --git a/docusaurus.html b/docusaurus.html index 090245ab1..bfd4e65f9 100644 --- a/docusaurus.html +++ b/docusaurus.html @@ -13,7 +13,7 @@ - + diff --git a/grasp.html b/grasp.html index d58579954..e0580b142 100644 --- a/grasp.html +++ b/grasp.html @@ -13,7 +13,7 @@ - + diff --git a/healthful-growth.html b/healthful-growth.html index 09ac18aaa..ae1d5c1bb 100644 --- a/healthful-growth.html +++ b/healthful-growth.html @@ -13,7 +13,7 @@ - + diff --git a/index.html b/index.html index ada6facd7..639b00bc3 100644 --- a/index.html +++ b/index.html @@ -13,7 +13,7 @@ - + diff --git a/innodb-lock.html b/innodb-lock.html index cf3164b5b..59b9a8679 100644 --- a/innodb-lock.html +++ b/innodb-lock.html @@ -13,7 +13,7 @@ - + diff --git a/intellij-settings.html b/intellij-settings.html index 708adb8e4..ac62bc393 100644 --- a/intellij-settings.html +++ b/intellij-settings.html @@ -13,7 +13,7 @@ - + diff --git a/java-class-file.html b/java-class-file.html index f0bda1e86..1b6adfa81 100644 --- a/java-class-file.html +++ b/java-class-file.html @@ -13,7 +13,7 @@ - + diff --git a/java-spring-springboot.html b/java-spring-springboot.html index bae170b0e..53dae4e72 100644 --- a/java-spring-springboot.html +++ b/java-spring-springboot.html @@ -13,7 +13,7 @@ - + diff --git a/jdbc-retrospective.html b/jdbc-retrospective.html index c3dae021a..0a0c02215 100644 --- a/jdbc-retrospective.html +++ b/jdbc-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/jenkins.html b/jenkins.html index a2ce35b3a..792ce7ee1 100644 --- a/jenkins.html +++ b/jenkins.html @@ -13,7 +13,7 @@ - + diff --git a/jsr-310.html b/jsr-310.html index 365b78afb..750fb7dc4 100644 --- a/jsr-310.html +++ b/jsr-310.html @@ -13,7 +13,7 @@ - + diff --git a/kotlin-null.html b/kotlin-null.html index 94a75e1c6..aa85c4c78 100644 --- a/kotlin-null.html +++ b/kotlin-null.html @@ -13,7 +13,7 @@ - + diff --git a/ladder-retrospective.html b/ladder-retrospective.html index f98354f3a..a42549788 100644 --- a/ladder-retrospective.html +++ b/ladder-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/level2-interview-retrospective.html b/level2-interview-retrospective.html index 42447eb6f..5fa0157f7 100644 --- a/level2-interview-retrospective.html +++ b/level2-interview-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/log-async-exception.html b/log-async-exception.html index 153ebeb4d..cf7235e02 100644 --- a/log-async-exception.html +++ b/log-async-exception.html @@ -13,7 +13,7 @@ - + diff --git a/mock-static-method.html b/mock-static-method.html index 98b87ecf5..45e32f182 100644 --- a/mock-static-method.html +++ b/mock-static-method.html @@ -13,7 +13,7 @@ - + diff --git a/mvc-retrospective.html b/mvc-retrospective.html index 5c978ebdf..5bf834a73 100644 --- a/mvc-retrospective.html +++ b/mvc-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/mysql-lock.html b/mysql-lock.html index 189086309..3cd3fe30a 100644 --- a/mysql-lock.html +++ b/mysql-lock.html @@ -13,7 +13,7 @@ - + diff --git a/order-retrospective.html b/order-retrospective.html index 8c24c9dc4..5e69d485a 100644 --- a/order-retrospective.html +++ b/order-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/page/10.html b/page/10.html index 5be611d05..f464db711 100644 --- a/page/10.html +++ b/page/10.html @@ -13,7 +13,7 @@ - + diff --git a/page/11.html b/page/11.html index 0a55d4e3a..6ee5f9b29 100644 --- a/page/11.html +++ b/page/11.html @@ -13,7 +13,7 @@ - + diff --git a/page/12.html b/page/12.html index 867b661a0..180a56a04 100644 --- a/page/12.html +++ b/page/12.html @@ -13,7 +13,7 @@ - + diff --git a/page/13.html b/page/13.html index bec1f780c..775592f51 100644 --- a/page/13.html +++ b/page/13.html @@ -13,7 +13,7 @@ - + diff --git a/page/14.html b/page/14.html index b39603ad1..5ae9bfff7 100644 --- a/page/14.html +++ b/page/14.html @@ -13,7 +13,7 @@ - + diff --git a/page/15.html b/page/15.html index 1070973df..3a85a6bba 100644 --- a/page/15.html +++ b/page/15.html @@ -13,7 +13,7 @@ - + diff --git a/page/16.html b/page/16.html index 0c457abce..c1b6b66b2 100644 --- a/page/16.html +++ b/page/16.html @@ -13,7 +13,7 @@ - + diff --git a/page/17.html b/page/17.html index b9692cbc0..64955bb7b 100644 --- a/page/17.html +++ b/page/17.html @@ -13,7 +13,7 @@ - + diff --git a/page/18.html b/page/18.html index bcb896ff1..3292f99ae 100644 --- a/page/18.html +++ b/page/18.html @@ -13,7 +13,7 @@ - + diff --git a/page/19.html b/page/19.html index bb2bb2b49..31f3d51da 100644 --- a/page/19.html +++ b/page/19.html @@ -13,7 +13,7 @@ - + diff --git a/page/2.html b/page/2.html index 1c1f40622..6edf737d7 100644 --- a/page/2.html +++ b/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/page/20.html b/page/20.html index e4d04096e..a69f227b8 100644 --- a/page/20.html +++ b/page/20.html @@ -13,7 +13,7 @@ - + diff --git a/page/21.html b/page/21.html index 0b7cc325d..c71941918 100644 --- a/page/21.html +++ b/page/21.html @@ -13,7 +13,7 @@ - + diff --git a/page/22.html b/page/22.html index e09f7a261..406ef3b1c 100644 --- a/page/22.html +++ b/page/22.html @@ -13,7 +13,7 @@ - + diff --git a/page/23.html b/page/23.html index 39bb08ff0..c5e6ee3cd 100644 --- a/page/23.html +++ b/page/23.html @@ -13,7 +13,7 @@ - + diff --git a/page/24.html b/page/24.html index 03099652a..992c1a28e 100644 --- a/page/24.html +++ b/page/24.html @@ -13,7 +13,7 @@ - + diff --git a/page/25.html b/page/25.html index e5f66f4e7..9bedd9f79 100644 --- a/page/25.html +++ b/page/25.html @@ -13,7 +13,7 @@ - + diff --git a/page/26.html b/page/26.html index 868c3bc7e..26e5bde84 100644 --- a/page/26.html +++ b/page/26.html @@ -13,7 +13,7 @@ - + diff --git a/page/27.html b/page/27.html index cde6767d7..a1145e8a5 100644 --- a/page/27.html +++ b/page/27.html @@ -13,7 +13,7 @@ - + diff --git a/page/28.html b/page/28.html index 342c2abeb..d19829569 100644 --- a/page/28.html +++ b/page/28.html @@ -13,7 +13,7 @@ - + diff --git a/page/29.html b/page/29.html index 5b3725f9e..5e4132e5f 100644 --- a/page/29.html +++ b/page/29.html @@ -13,7 +13,7 @@ - + diff --git a/page/3.html b/page/3.html index 5fa95c3a2..4cd644eb2 100644 --- a/page/3.html +++ b/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/page/30.html b/page/30.html index 954d102f1..abd7aba8d 100644 --- a/page/30.html +++ b/page/30.html @@ -13,7 +13,7 @@ - + diff --git a/page/31.html b/page/31.html index 8f7d477d9..3f599e343 100644 --- a/page/31.html +++ b/page/31.html @@ -13,7 +13,7 @@ - + diff --git a/page/32.html b/page/32.html index bb161cb53..3fbf34349 100644 --- a/page/32.html +++ b/page/32.html @@ -13,7 +13,7 @@ - + diff --git a/page/33.html b/page/33.html index f5ca990e3..6bb34e789 100644 --- a/page/33.html +++ b/page/33.html @@ -13,7 +13,7 @@ - + diff --git a/page/34.html b/page/34.html index e877ee3fb..60bbf0231 100644 --- a/page/34.html +++ b/page/34.html @@ -13,7 +13,7 @@ - + diff --git a/page/35.html b/page/35.html index 725e047dd..ca26d82c8 100644 --- a/page/35.html +++ b/page/35.html @@ -13,7 +13,7 @@ - + diff --git a/page/36.html b/page/36.html index 7990e19f9..03d6ccdae 100644 --- a/page/36.html +++ b/page/36.html @@ -13,7 +13,7 @@ - + diff --git a/page/37.html b/page/37.html index c2b9f5b4f..090a2012a 100644 --- a/page/37.html +++ b/page/37.html @@ -13,7 +13,7 @@ - + diff --git a/page/38.html b/page/38.html index 021691507..0fc32602a 100644 --- a/page/38.html +++ b/page/38.html @@ -13,7 +13,7 @@ - + diff --git a/page/39.html b/page/39.html index 9ae658d07..5202ac33d 100644 --- a/page/39.html +++ b/page/39.html @@ -13,7 +13,7 @@ - + diff --git a/page/4.html b/page/4.html index 22c51bc26..bdaa388dc 100644 --- a/page/4.html +++ b/page/4.html @@ -13,7 +13,7 @@ - + diff --git a/page/40.html b/page/40.html index d25fbd323..c3bbccaaa 100644 --- a/page/40.html +++ b/page/40.html @@ -13,7 +13,7 @@ - + diff --git a/page/41.html b/page/41.html index e5fae77e4..8cdcf3c18 100644 --- a/page/41.html +++ b/page/41.html @@ -13,7 +13,7 @@ - + diff --git a/page/42.html b/page/42.html index c31e84b5f..370e5336e 100644 --- a/page/42.html +++ b/page/42.html @@ -13,7 +13,7 @@ - + diff --git a/page/43.html b/page/43.html index 70f6e1bd0..123c90714 100644 --- a/page/43.html +++ b/page/43.html @@ -13,7 +13,7 @@ - + diff --git a/page/44.html b/page/44.html index d41dd520e..5c8a78672 100644 --- a/page/44.html +++ b/page/44.html @@ -13,7 +13,7 @@ - + diff --git a/page/45.html b/page/45.html index 15b594e78..83ddc76a5 100644 --- a/page/45.html +++ b/page/45.html @@ -13,7 +13,7 @@ - + diff --git a/page/46.html b/page/46.html index c82f2514c..ece525d60 100644 --- a/page/46.html +++ b/page/46.html @@ -13,7 +13,7 @@ - + diff --git a/page/47.html b/page/47.html index 85edd49e7..86a1030ec 100644 --- a/page/47.html +++ b/page/47.html @@ -13,7 +13,7 @@ - + diff --git a/page/48.html b/page/48.html index 2de014431..a61e99217 100644 --- a/page/48.html +++ b/page/48.html @@ -13,7 +13,7 @@ - + diff --git a/page/49.html b/page/49.html index 21902143e..3abb1a02d 100644 --- a/page/49.html +++ b/page/49.html @@ -13,7 +13,7 @@ - + diff --git a/page/5.html b/page/5.html index bddcb2575..217b7a1d7 100644 --- a/page/5.html +++ b/page/5.html @@ -13,7 +13,7 @@ - + diff --git a/page/50.html b/page/50.html index 62c996f96..13d2c9664 100644 --- a/page/50.html +++ b/page/50.html @@ -13,7 +13,7 @@ - + diff --git a/page/51.html b/page/51.html index 2a890c866..1af876cc0 100644 --- a/page/51.html +++ b/page/51.html @@ -13,7 +13,7 @@ - + diff --git a/page/52.html b/page/52.html index a812a9795..901bdeb26 100644 --- a/page/52.html +++ b/page/52.html @@ -13,7 +13,7 @@ - + diff --git a/page/53.html b/page/53.html index 9931a15a3..5950d2813 100644 --- a/page/53.html +++ b/page/53.html @@ -13,7 +13,7 @@ - + diff --git a/page/54.html b/page/54.html index c2997c7ec..cbee17012 100644 --- a/page/54.html +++ b/page/54.html @@ -13,7 +13,7 @@ - + diff --git a/page/6.html b/page/6.html index 67d99385f..677e0299f 100644 --- a/page/6.html +++ b/page/6.html @@ -13,7 +13,7 @@ - + diff --git a/page/7.html b/page/7.html index 2e4d63025..b163af994 100644 --- a/page/7.html +++ b/page/7.html @@ -13,7 +13,7 @@ - + diff --git a/page/8.html b/page/8.html index faad57bbf..6298968d7 100644 --- a/page/8.html +++ b/page/8.html @@ -13,7 +13,7 @@ - + diff --git a/page/9.html b/page/9.html index 0acb296ee..b2947463e 100644 --- a/page/9.html +++ b/page/9.html @@ -13,7 +13,7 @@ - + diff --git a/parameterized-tests.html b/parameterized-tests.html index a6ff59a55..0bd72d421 100644 --- a/parameterized-tests.html +++ b/parameterized-tests.html @@ -13,7 +13,7 @@ - + diff --git a/performance-test-type.html b/performance-test-type.html index 191c2bec5..5a347f870 100644 --- a/performance-test-type.html +++ b/performance-test-type.html @@ -13,7 +13,7 @@ - + diff --git a/racing-car-retrospective.html b/racing-car-retrospective.html index a26cf7e33..8f3d4a9e2 100644 --- a/racing-car-retrospective.html +++ b/racing-car-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/refactoring-retrospective.html b/refactoring-retrospective.html index 06836724d..c407a7681 100644 --- a/refactoring-retrospective.html +++ b/refactoring-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/route-image-async-with-event.html b/route-image-async-with-event.html index edd47e357..00686e99b 100644 --- a/route-image-async-with-event.html +++ b/route-image-async-with-event.html @@ -13,7 +13,7 @@ - + diff --git a/route-image-implementation.html b/route-image-implementation.html index 755f9a4f2..e9518a13d 100644 --- a/route-image-implementation.html +++ b/route-image-implementation.html @@ -13,7 +13,7 @@ - + diff --git a/route-image-intro.html b/route-image-intro.html index 14b335d70..7979e37f2 100644 --- a/route-image-intro.html +++ b/route-image-intro.html @@ -13,7 +13,7 @@ - + diff --git a/route-image-python.html b/route-image-python.html index 5afc8527f..6784deff9 100644 --- a/route-image-python.html +++ b/route-image-python.html @@ -13,7 +13,7 @@ - + diff --git a/rss.xml b/rss.xml index 31834d7a2..cf51f124e 100644 --- a/rss.xml +++ b/rss.xml @@ -40,8 +40,8 @@

프로젝트

부족함을 많이 느껴서 개인적으로 힘들었던 기간이었다. 단순 개발뿐만이 아니라 일정 산출, 소통, 문서화와 같은 다양한 능력이 필요했었고, 자존감이 많이 떨어진 상태였다. -그래도 안드로이드 크루들과 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 -문제가 발생할 때 같이 해결하고, 팀원들과 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

+그래도 팀원들과 함께 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 +문제가 발생할 때 같이 해결하고, 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

레벨 5

이 기간 동안 가장 잘한 일은 주위 사람들에게 도움을 요청한 일이었다. 조금 억지스러운 도움 요청도 주변 크루들이 많이 들어주었고, 너무 감사하다. diff --git a/search.html b/search.html index e99ff022b..e79576dd8 100644 --- a/search.html +++ b/search.html @@ -13,7 +13,7 @@ - + diff --git a/shopping-cart-retrospective.html b/shopping-cart-retrospective.html index 6d6b4b8e5..696105af0 100644 --- a/shopping-cart-retrospective.html +++ b/shopping-cart-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/spring-test-isolation.html b/spring-test-isolation.html index 809947b62..03217a443 100644 --- a/spring-test-isolation.html +++ b/spring-test-isolation.html @@ -13,7 +13,7 @@ - + diff --git a/subway-retrospective.html b/subway-retrospective.html index 04afa29a3..d20d90074 100644 --- a/subway-retrospective.html +++ b/subway-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/tags.html b/tags.html index 5fd7a7030..4377942ae 100644 --- a/tags.html +++ b/tags.html @@ -13,7 +13,7 @@ - + diff --git a/tags/async.html b/tags/async.html index 3a7d81f5a..ab76a5eed 100644 --- a/tags/async.html +++ b/tags/async.html @@ -13,7 +13,7 @@ - + diff --git a/tags/async/page/2.html b/tags/async/page/2.html index 87d2ed8d4..a3cbe4c42 100644 --- a/tags/async/page/2.html +++ b/tags/async/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/awt.html b/tags/awt.html index 5508a1b54..9d80282c7 100644 --- a/tags/awt.html +++ b/tags/awt.html @@ -13,7 +13,7 @@ - + diff --git a/tags/awt/page/2.html b/tags/awt/page/2.html index 1b99292d9..a607b8146 100644 --- a/tags/awt/page/2.html +++ b/tags/awt/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/book.html b/tags/book.html index 282d34063..0577d8977 100644 --- a/tags/book.html +++ b/tags/book.html @@ -13,7 +13,7 @@ - + diff --git a/tags/book/page/2.html b/tags/book/page/2.html index 70ff3d121..5042e7025 100644 --- a/tags/book/page/2.html +++ b/tags/book/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/book/page/3.html b/tags/book/page/3.html index 0bd80dbf6..6d6667a43 100644 --- a/tags/book/page/3.html +++ b/tags/book/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/tags/class.html b/tags/class.html index b07aee55f..3dcdc6b8a 100644 --- a/tags/class.html +++ b/tags/class.html @@ -13,7 +13,7 @@ - + diff --git a/tags/cloudwatch.html b/tags/cloudwatch.html index f6048a2a6..bc79f6d09 100644 --- a/tags/cloudwatch.html +++ b/tags/cloudwatch.html @@ -13,7 +13,7 @@ - + diff --git a/tags/composite.html b/tags/composite.html index 4599a2fc5..f3da1b092 100644 --- a/tags/composite.html +++ b/tags/composite.html @@ -13,7 +13,7 @@ - + diff --git a/tags/data-base.html b/tags/data-base.html index bc99b1413..151d53c29 100644 --- a/tags/data-base.html +++ b/tags/data-base.html @@ -13,7 +13,7 @@ - + diff --git a/tags/data-base/page/2.html b/tags/data-base/page/2.html index 7ac4581da..f4cfde284 100644 --- a/tags/data-base/page/2.html +++ b/tags/data-base/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/data-base/page/3.html b/tags/data-base/page/3.html index c834abaf9..edcfce27c 100644 --- a/tags/data-base/page/3.html +++ b/tags/data-base/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/tags/documentation.html b/tags/documentation.html index c275e8883..c4ffac699 100644 --- a/tags/documentation.html +++ b/tags/documentation.html @@ -13,7 +13,7 @@ - + diff --git a/tags/dto.html b/tags/dto.html index 254135365..0e4b203ea 100644 --- a/tags/dto.html +++ b/tags/dto.html @@ -13,7 +13,7 @@ - + diff --git a/tags/elastic-beanstalk.html b/tags/elastic-beanstalk.html index 7888d0145..2ab356c73 100644 --- a/tags/elastic-beanstalk.html +++ b/tags/elastic-beanstalk.html @@ -13,7 +13,7 @@ - + diff --git a/tags/etc.html b/tags/etc.html index 09b6e5b09..44ff90582 100644 --- a/tags/etc.html +++ b/tags/etc.html @@ -13,7 +13,7 @@ - + diff --git a/tags/event.html b/tags/event.html index 6075c4e4e..7d2f7f0ea 100644 --- a/tags/event.html +++ b/tags/event.html @@ -13,7 +13,7 @@ - + diff --git a/tags/exception.html b/tags/exception.html index 016735d88..c825ebedd 100644 --- a/tags/exception.html +++ b/tags/exception.html @@ -13,7 +13,7 @@ - + diff --git a/tags/grasp.html b/tags/grasp.html index 856a8ccf7..a3f910383 100644 --- a/tags/grasp.html +++ b/tags/grasp.html @@ -13,7 +13,7 @@ - + diff --git a/tags/image.html b/tags/image.html index c3509b3ea..49cf40800 100644 --- a/tags/image.html +++ b/tags/image.html @@ -13,7 +13,7 @@ - + diff --git a/tags/image/page/2.html b/tags/image/page/2.html index fac3963c4..6e6483b3f 100644 --- a/tags/image/page/2.html +++ b/tags/image/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/image/page/3.html b/tags/image/page/3.html index 9fb71a553..7e97afec0 100644 --- a/tags/image/page/3.html +++ b/tags/image/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/tags/inno-db.html b/tags/inno-db.html index a450e4a12..e2ac50770 100644 --- a/tags/inno-db.html +++ b/tags/inno-db.html @@ -13,7 +13,7 @@ - + diff --git a/tags/intelli-j.html b/tags/intelli-j.html index b23912c9b..ad383d06c 100644 --- a/tags/intelli-j.html +++ b/tags/intelli-j.html @@ -13,7 +13,7 @@ - + diff --git a/tags/isolation.html b/tags/isolation.html index 9b792c7ed..2df0ee6c0 100644 --- a/tags/isolation.html +++ b/tags/isolation.html @@ -13,7 +13,7 @@ - + diff --git a/tags/java.html b/tags/java.html index 36dbeb0b6..f8f98a9fe 100644 --- a/tags/java.html +++ b/tags/java.html @@ -13,7 +13,7 @@ - + diff --git a/tags/java/page/2.html b/tags/java/page/2.html index 07aa9f6d9..5a762b024 100644 --- a/tags/java/page/2.html +++ b/tags/java/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/java/page/3.html b/tags/java/page/3.html index 712d088d4..7393933ac 100644 --- a/tags/java/page/3.html +++ b/tags/java/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/tags/java/page/4.html b/tags/java/page/4.html index 5a3e4990e..7b928b1df 100644 --- a/tags/java/page/4.html +++ b/tags/java/page/4.html @@ -13,7 +13,7 @@ - + diff --git a/tags/java/page/5.html b/tags/java/page/5.html index 133b5b114..b13ac1d46 100644 --- a/tags/java/page/5.html +++ b/tags/java/page/5.html @@ -13,7 +13,7 @@ - + diff --git a/tags/jdbc.html b/tags/jdbc.html index a8095e560..11d882003 100644 --- a/tags/jdbc.html +++ b/tags/jdbc.html @@ -13,7 +13,7 @@ - + diff --git a/tags/jenkins.html b/tags/jenkins.html index 9f40c89a9..0c0e90834 100644 --- a/tags/jenkins.html +++ b/tags/jenkins.html @@ -13,7 +13,7 @@ - + diff --git a/tags/kotlin.html b/tags/kotlin.html index f9be2ffde..c2cad09fe 100644 --- a/tags/kotlin.html +++ b/tags/kotlin.html @@ -13,7 +13,7 @@ - + diff --git a/tags/lock.html b/tags/lock.html index dd9ae44be..c6dfbe12b 100644 --- a/tags/lock.html +++ b/tags/lock.html @@ -13,7 +13,7 @@ - + diff --git a/tags/lock/page/2.html b/tags/lock/page/2.html index e55c8cb9f..85fae28ea 100644 --- a/tags/lock/page/2.html +++ b/tags/lock/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/log.html b/tags/log.html index 7432d7190..2e6b648b0 100644 --- a/tags/log.html +++ b/tags/log.html @@ -13,7 +13,7 @@ - + diff --git a/tags/mock.html b/tags/mock.html index 13dc600a4..085b8f0a6 100644 --- a/tags/mock.html +++ b/tags/mock.html @@ -13,7 +13,7 @@ - + diff --git a/tags/mockito.html b/tags/mockito.html index f4f7d8ddf..fdf410e46 100644 --- a/tags/mockito.html +++ b/tags/mockito.html @@ -13,7 +13,7 @@ - + diff --git a/tags/monitoring.html b/tags/monitoring.html index 23395cfe9..e4f2be1e9 100644 --- a/tags/monitoring.html +++ b/tags/monitoring.html @@ -13,7 +13,7 @@ - + diff --git a/tags/my-sql.html b/tags/my-sql.html index 474242147..585f15503 100644 --- a/tags/my-sql.html +++ b/tags/my-sql.html @@ -13,7 +13,7 @@ - + diff --git a/tags/mysql.html b/tags/mysql.html index 351fabc88..f4737ddb3 100644 --- a/tags/mysql.html +++ b/tags/mysql.html @@ -13,7 +13,7 @@ - + diff --git a/tags/oop.html b/tags/oop.html index 76e3eb321..2ab4bf8a8 100644 --- a/tags/oop.html +++ b/tags/oop.html @@ -13,7 +13,7 @@ - + diff --git a/tags/pattern.html b/tags/pattern.html index b8ca8e550..077960a67 100644 --- a/tags/pattern.html +++ b/tags/pattern.html @@ -13,7 +13,7 @@ - + diff --git a/tags/performance-test.html b/tags/performance-test.html index 985b78764..af244bf29 100644 --- a/tags/performance-test.html +++ b/tags/performance-test.html @@ -13,7 +13,7 @@ - + diff --git a/tags/python.html b/tags/python.html index 53fea5d06..0d15533dd 100644 --- a/tags/python.html +++ b/tags/python.html @@ -13,7 +13,7 @@ - + diff --git a/tags/replication.html b/tags/replication.html index acb33544b..83aa70748 100644 --- a/tags/replication.html +++ b/tags/replication.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective.html b/tags/retrospective.html index e72f5ad22..b27a9c9df 100644 --- a/tags/retrospective.html +++ b/tags/retrospective.html @@ -13,7 +13,7 @@ - + @@ -43,8 +43,8 @@

프로젝트

부족함을 많이 느껴서 개인적으로 힘들었던 기간이었다. 단순 개발뿐만이 아니라 일정 산출, 소통, 문서화와 같은 다양한 능력이 필요했었고, 자존감이 많이 떨어진 상태였다. -그래도 안드로이드 크루들과 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 -문제가 발생할 때 같이 해결하고, 팀원들과 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

+그래도 팀원들과 함께 만들었던 앱이 동작하고 플레이스토어에 배포된 것을 볼 때 신기했고 +문제가 발생할 때 같이 해결하고, 팀 문화를 만드는 것 그리고 데모데이가 기억이 남는다.

레벨 5

이 기간 동안 가장 잘한 일은 주위 사람들에게 도움을 요청한 일이었다. 조금 억지스러운 도움 요청도 주변 크루들이 많이 들어주었고, 너무 감사하다. diff --git a/tags/retrospective/page/10.html b/tags/retrospective/page/10.html index 457379ac3..e3ff7f33a 100644 --- a/tags/retrospective/page/10.html +++ b/tags/retrospective/page/10.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/11.html b/tags/retrospective/page/11.html index 7f9eae19b..75abdaa21 100644 --- a/tags/retrospective/page/11.html +++ b/tags/retrospective/page/11.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/12.html b/tags/retrospective/page/12.html index fe7f7fd61..87a0db4a8 100644 --- a/tags/retrospective/page/12.html +++ b/tags/retrospective/page/12.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/13.html b/tags/retrospective/page/13.html index 371789a58..20938de83 100644 --- a/tags/retrospective/page/13.html +++ b/tags/retrospective/page/13.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/14.html b/tags/retrospective/page/14.html index d1a03dd83..376aceba0 100644 --- a/tags/retrospective/page/14.html +++ b/tags/retrospective/page/14.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/15.html b/tags/retrospective/page/15.html index 3a7920e36..87baaecd5 100644 --- a/tags/retrospective/page/15.html +++ b/tags/retrospective/page/15.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/16.html b/tags/retrospective/page/16.html index 8b2bd1fec..1ff17eb4e 100644 --- a/tags/retrospective/page/16.html +++ b/tags/retrospective/page/16.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/17.html b/tags/retrospective/page/17.html index 277903fae..5bdff30cb 100644 --- a/tags/retrospective/page/17.html +++ b/tags/retrospective/page/17.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/18.html b/tags/retrospective/page/18.html index b078c4005..5785ee6ae 100644 --- a/tags/retrospective/page/18.html +++ b/tags/retrospective/page/18.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/19.html b/tags/retrospective/page/19.html index 4b4e27851..67c8e7485 100644 --- a/tags/retrospective/page/19.html +++ b/tags/retrospective/page/19.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/2.html b/tags/retrospective/page/2.html index b888220ac..8f62c870b 100644 --- a/tags/retrospective/page/2.html +++ b/tags/retrospective/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/20.html b/tags/retrospective/page/20.html index be72ba87a..89e04135c 100644 --- a/tags/retrospective/page/20.html +++ b/tags/retrospective/page/20.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/21.html b/tags/retrospective/page/21.html index e141372b6..ec69684c5 100644 --- a/tags/retrospective/page/21.html +++ b/tags/retrospective/page/21.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/3.html b/tags/retrospective/page/3.html index 038d12177..8c1350b66 100644 --- a/tags/retrospective/page/3.html +++ b/tags/retrospective/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/4.html b/tags/retrospective/page/4.html index 84ef15234..4727ba1d7 100644 --- a/tags/retrospective/page/4.html +++ b/tags/retrospective/page/4.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/5.html b/tags/retrospective/page/5.html index fda144027..325e4088f 100644 --- a/tags/retrospective/page/5.html +++ b/tags/retrospective/page/5.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/6.html b/tags/retrospective/page/6.html index 8999f1eac..bfb29de11 100644 --- a/tags/retrospective/page/6.html +++ b/tags/retrospective/page/6.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/7.html b/tags/retrospective/page/7.html index 2fa28100e..ba31e0999 100644 --- a/tags/retrospective/page/7.html +++ b/tags/retrospective/page/7.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/8.html b/tags/retrospective/page/8.html index a7f021b87..eefd74a4b 100644 --- a/tags/retrospective/page/8.html +++ b/tags/retrospective/page/8.html @@ -13,7 +13,7 @@ - + diff --git a/tags/retrospective/page/9.html b/tags/retrospective/page/9.html index 7e9550246..9cf6bf2c2 100644 --- a/tags/retrospective/page/9.html +++ b/tags/retrospective/page/9.html @@ -13,7 +13,7 @@ - + diff --git a/tags/spring-boot.html b/tags/spring-boot.html index 66c6806b0..b2e8e539a 100644 --- a/tags/spring-boot.html +++ b/tags/spring-boot.html @@ -13,7 +13,7 @@ - + diff --git a/tags/spring.html b/tags/spring.html index 5b101a3cf..f0e426117 100644 --- a/tags/spring.html +++ b/tags/spring.html @@ -13,7 +13,7 @@ - + diff --git a/tags/static.html b/tags/static.html index 033a20413..f22e1560a 100644 --- a/tags/static.html +++ b/tags/static.html @@ -13,7 +13,7 @@ - + diff --git a/tags/teco-chat.html b/tags/teco-chat.html index 880765e3f..e62d8672e 100644 --- a/tags/teco-chat.html +++ b/tags/teco-chat.html @@ -13,7 +13,7 @@ - + diff --git a/tags/teco-chat/page/2.html b/tags/teco-chat/page/2.html index e4ca4823c..c82f0ed94 100644 --- a/tags/teco-chat/page/2.html +++ b/tags/teco-chat/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/teco-chat/page/3.html b/tags/teco-chat/page/3.html index 8b0bcf486..1db2a8867 100644 --- a/tags/teco-chat/page/3.html +++ b/tags/teco-chat/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/tags/test.html b/tags/test.html index 242c4605a..17859d5dd 100644 --- a/tags/test.html +++ b/tags/test.html @@ -13,7 +13,7 @@ - + diff --git a/tags/test/page/2.html b/tags/test/page/2.html index 7d0c910b5..54e4e888f 100644 --- a/tags/test/page/2.html +++ b/tags/test/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/time.html b/tags/time.html index 53499f904..12cb61df3 100644 --- a/tags/time.html +++ b/tags/time.html @@ -13,7 +13,7 @@ - + diff --git a/tags/transaction.html b/tags/transaction.html index f556f272d..8b6250cf7 100644 --- a/tags/transaction.html +++ b/tags/transaction.html @@ -13,7 +13,7 @@ - + diff --git a/tags/web-application.html b/tags/web-application.html index b90bf760f..45ac1e8e8 100644 --- a/tags/web-application.html +++ b/tags/web-application.html @@ -13,7 +13,7 @@ - + diff --git a/tags/web-socket.html b/tags/web-socket.html index 93f5a0278..5874ecc8f 100644 --- a/tags/web-socket.html +++ b/tags/web-socket.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowacon.html b/tags/woowacon.html index a65e613ef..bca4eb507 100644 --- a/tags/woowacon.html +++ b/tags/woowacon.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse.html b/tags/woowahan-techcourse.html index a5897b0a6..b55c1d120 100644 --- a/tags/woowahan-techcourse.html +++ b/tags/woowahan-techcourse.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/10.html b/tags/woowahan-techcourse/page/10.html index 12238068e..1599b51a9 100644 --- a/tags/woowahan-techcourse/page/10.html +++ b/tags/woowahan-techcourse/page/10.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/11.html b/tags/woowahan-techcourse/page/11.html index 81d43a003..b34498838 100644 --- a/tags/woowahan-techcourse/page/11.html +++ b/tags/woowahan-techcourse/page/11.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/12.html b/tags/woowahan-techcourse/page/12.html index 98523fbe8..6db05b397 100644 --- a/tags/woowahan-techcourse/page/12.html +++ b/tags/woowahan-techcourse/page/12.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/13.html b/tags/woowahan-techcourse/page/13.html index d0987c7d7..2c1ecf017 100644 --- a/tags/woowahan-techcourse/page/13.html +++ b/tags/woowahan-techcourse/page/13.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/14.html b/tags/woowahan-techcourse/page/14.html index b84b9ca6d..ced77b50e 100644 --- a/tags/woowahan-techcourse/page/14.html +++ b/tags/woowahan-techcourse/page/14.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/15.html b/tags/woowahan-techcourse/page/15.html index 84d842d8f..2eaa3f0d4 100644 --- a/tags/woowahan-techcourse/page/15.html +++ b/tags/woowahan-techcourse/page/15.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/16.html b/tags/woowahan-techcourse/page/16.html index 2e24abe84..39edcfccd 100644 --- a/tags/woowahan-techcourse/page/16.html +++ b/tags/woowahan-techcourse/page/16.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/2.html b/tags/woowahan-techcourse/page/2.html index 12f05326f..dba9cd69a 100644 --- a/tags/woowahan-techcourse/page/2.html +++ b/tags/woowahan-techcourse/page/2.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/3.html b/tags/woowahan-techcourse/page/3.html index 6df9fe7bd..58422bef3 100644 --- a/tags/woowahan-techcourse/page/3.html +++ b/tags/woowahan-techcourse/page/3.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/4.html b/tags/woowahan-techcourse/page/4.html index 6ec7cc4d0..964d60053 100644 --- a/tags/woowahan-techcourse/page/4.html +++ b/tags/woowahan-techcourse/page/4.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/5.html b/tags/woowahan-techcourse/page/5.html index e35f14ebd..66c3d887c 100644 --- a/tags/woowahan-techcourse/page/5.html +++ b/tags/woowahan-techcourse/page/5.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/6.html b/tags/woowahan-techcourse/page/6.html index 3435caad4..0ad65103a 100644 --- a/tags/woowahan-techcourse/page/6.html +++ b/tags/woowahan-techcourse/page/6.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/7.html b/tags/woowahan-techcourse/page/7.html index f781966bf..d841f094e 100644 --- a/tags/woowahan-techcourse/page/7.html +++ b/tags/woowahan-techcourse/page/7.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/8.html b/tags/woowahan-techcourse/page/8.html index ac945fe26..93156aa8e 100644 --- a/tags/woowahan-techcourse/page/8.html +++ b/tags/woowahan-techcourse/page/8.html @@ -13,7 +13,7 @@ - + diff --git a/tags/woowahan-techcourse/page/9.html b/tags/woowahan-techcourse/page/9.html index ba610382d..c4da13f68 100644 --- a/tags/woowahan-techcourse/page/9.html +++ b/tags/woowahan-techcourse/page/9.html @@ -13,7 +13,7 @@ - + diff --git a/tecochat-retrospective-1.html b/tecochat-retrospective-1.html index f0b1739d4..cf3a5bb25 100644 --- a/tecochat-retrospective-1.html +++ b/tecochat-retrospective-1.html @@ -13,7 +13,7 @@ - + diff --git a/tecochat-retrospective-2.html b/tecochat-retrospective-2.html index b7ea431b1..cd12a3102 100644 --- a/tecochat-retrospective-2.html +++ b/tecochat-retrospective-2.html @@ -13,7 +13,7 @@ - + diff --git a/tecochat-retrospective-3.html b/tecochat-retrospective-3.html index e5c376170..e2e44fc51 100644 --- a/tecochat-retrospective-3.html +++ b/tecochat-retrospective-3.html @@ -13,7 +13,7 @@ - + diff --git a/test-double.html b/test-double.html index 9c356351d..f3b5c1f5d 100644 --- a/test-double.html +++ b/test-double.html @@ -13,7 +13,7 @@ - + diff --git a/the-essence-of-object-orientation.html b/the-essence-of-object-orientation.html index 8041f846a..e65d392f8 100644 --- a/the-essence-of-object-orientation.html +++ b/the-essence-of-object-orientation.html @@ -13,7 +13,7 @@ - + diff --git a/tomcat-retrospective.html b/tomcat-retrospective.html index 79135c9f2..60e44dd43 100644 --- a/tomcat-retrospective.html +++ b/tomcat-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/transaction-and-isolation.html b/transaction-and-isolation.html index b1b64025a..a0e276233 100644 --- a/transaction-and-isolation.html +++ b/transaction-and-isolation.html @@ -13,7 +13,7 @@ - + diff --git a/web-application-evolution.html b/web-application-evolution.html index 940de6afb..22e52b7dc 100644 --- a/web-application-evolution.html +++ b/web-application-evolution.html @@ -13,7 +13,7 @@ - + diff --git a/web-racing-car-retrospective.html b/web-racing-car-retrospective.html index dd03ad530..633f14541 100644 --- a/web-racing-car-retrospective.html +++ b/web-racing-car-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/websocket.html b/websocket.html index 9cd433b61..ae6df592c 100644 --- a/websocket.html +++ b/websocket.html @@ -13,7 +13,7 @@ - + diff --git a/woowacon-2023.html b/woowacon-2023.html index b4b5500ab..2d826b4f9 100644 --- a/woowacon-2023.html +++ b/woowacon-2023.html @@ -13,7 +13,7 @@ - + diff --git a/woowacourse-level1-retrospective.html b/woowacourse-level1-retrospective.html index 129108bce..e034a171f 100644 --- a/woowacourse-level1-retrospective.html +++ b/woowacourse-level1-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/woowacourse-level2-retrospective.html b/woowacourse-level2-retrospective.html index 69766c89e..bdf75f0fb 100644 --- a/woowacourse-level2-retrospective.html +++ b/woowacourse-level2-retrospective.html @@ -13,7 +13,7 @@ - + diff --git a/woowacourse-level3-retrospective.html b/woowacourse-level3-retrospective.html index 52cbe9fb4..c32176d81 100644 --- a/woowacourse-level3-retrospective.html +++ b/woowacourse-level3-retrospective.html @@ -13,7 +13,7 @@ - +