<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>우아한테크코스 on 의찬의 개발 블로그</title><link>https://uechann.github.io/categories/%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC%EC%BD%94%EC%8A%A4/</link><description>Recent content in 우아한테크코스 on 의찬의 개발 블로그</description><generator>Hugo</generator><language>ko-kr</language><lastBuildDate>Sat, 06 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://uechann.github.io/categories/%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC%EC%BD%94%EC%8A%A4/index.xml" rel="self" type="application/rss+xml"/><item><title>Testcontainers란?</title><link>https://uechann.github.io/posts/wooteco-mission/testcontainers%EB%9E%80/</link><pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/testcontainers%EB%9E%80/</guid><description>&lt;h2 id="어떤-개념일까"&gt;어떤 개념일까?&lt;/h2&gt;
&lt;h3 id="testcontainers는"&gt;Testcontainers는&lt;/h3&gt;
&lt;p&gt;Docker 컨테이너로 실제 서비스 (DB, 메시지 브로커, 브라우저 등)의 일회용 인스턴스를 테스트 코드에서 직접 띄우고, 끝나면 자동으로 정리해주는 라이브러리이다.&lt;/p&gt;</description></item><item><title>동시성 테스트 코드 작성 CountDownLatch vs CyclicBarrier</title><link>https://uechann.github.io/posts/wooteco-mission/%EB%8F%99%EC%8B%9C%EC%84%B1-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1-countdownlatch-vs-cyclicbarrier/</link><pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EB%8F%99%EC%8B%9C%EC%84%B1-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1-countdownlatch-vs-cyclicbarrier/</guid><description>&lt;h2 id="어떤-개념일까"&gt;어떤 개념일까?&lt;/h2&gt;
&lt;h3 id="countdownlatch"&gt;CountDownLatch&lt;/h3&gt;
&lt;p&gt;한번쓰고 버리는 카운터 게이트이다.
하나 이상의 스레드가, 다른 스레드들에서 진행되는 일련의 작업이 끝날 때까지 기다리게 해주는 동기화 도구이다.&lt;/p&gt;</description></item><item><title>네오의 방탈출</title><link>https://uechann.github.io/posts/wooteco-mission/%EB%84%A4%EC%98%A4%EC%9D%98-%EB%B0%A9%ED%83%88%EC%B6%9C/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EB%84%A4%EC%98%A4%EC%9D%98-%EB%B0%A9%ED%83%88%EC%B6%9C/</guid><description>&lt;h3 id="큰-그림-이-코드는-정답이-아니라-다리"&gt;큰 그림: 이 코드는 &amp;ldquo;정답&amp;quot;이 아니라 &amp;ldquo;다리&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;스프링 환경에서도 객체지향을 지키라&amp;quot;고 했더니 다들 갈피조차 못 잡는 것 같아서, 직접 빌드해 공개한 코드입니다. 그래서 &lt;strong&gt;모범 답안이 아니라 갈피만 잡으라고 던진 다리&lt;/strong&gt;예요. 오늘 보고 다시는 보지 말라는 말이 핵심입니다. 따라 하면 억지로 끼워넣게 되고 부작용이 더 큽니다.&lt;/p&gt;</description></item><item><title>ThemeSlot을 이용한 Aggregate Root 적용</title><link>https://uechann.github.io/posts/wooteco-mission/themeslot%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-aggregate-root-%EC%A0%81%EC%9A%A9/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/themeslot%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-aggregate-root-%EC%A0%81%EC%9A%A9/</guid><description>&lt;h2 id="1-문제-인식-및-배경"&gt;1. 문제 인식 및 배경&lt;/h2&gt;
&lt;p&gt;&lt;img src="img-02e701936d.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;대상 클래스&lt;/strong&gt;: &lt;code&gt;Reservation&lt;/code&gt;과 &lt;code&gt;ThemeSlot&lt;/code&gt; 도메인 객체와 &lt;code&gt;ReservationService&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;리뷰어가 말씀하시기를 Reservation과 ThemeSlot 객체를 보았을 때,
서비스가 두 객체를 동시에 직접 조율하고 있다는 말을 하였다.&lt;/p&gt;</description></item><item><title>equals &amp; hashCode 사용 목적과 id null일 수 있을 때, 어떤 정책으로 동등성, 동일성 검사를 할 수 있을까?</title><link>https://uechann.github.io/posts/wooteco-mission/equals-hashcode-%EC%82%AC%EC%9A%A9-%EB%AA%A9%EC%A0%81%EA%B3%BC-id-null%EC%9D%BC-%EC%88%98-%EC%9E%88%EC%9D%84-%EB%95%8C-%EC%96%B4%EB%96%A4-%EC%A0%95%EC%B1%85%EC%9C%BC%EB%A1%9C-%EB%8F%99%EB%93%B1%EC%84%B1-%EB%8F%99%EC%9D%BC%EC%84%B1-%EA%B2%80%EC%82%AC%EB%A5%BC-%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/equals-hashcode-%EC%82%AC%EC%9A%A9-%EB%AA%A9%EC%A0%81%EA%B3%BC-id-null%EC%9D%BC-%EC%88%98-%EC%9E%88%EC%9D%84-%EB%95%8C-%EC%96%B4%EB%96%A4-%EC%A0%95%EC%B1%85%EC%9C%BC%EB%A1%9C-%EB%8F%99%EB%93%B1%EC%84%B1-%EB%8F%99%EC%9D%BC%EC%84%B1-%EA%B2%80%EC%82%AC%EB%A5%BC-%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C/</guid><description>&lt;p&gt;엔티티의 동등성을 무엇으로 정의할 것인가?&lt;/p&gt;
&lt;h2 id="equals--hashcode-사용-목적"&gt;equals / hashCode 사용 목적&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;동일성 (identity, &lt;code&gt;==&lt;/code&gt;): 두 참조가 같은 객체 인스턴스를 가리키는가. JVM 메모리 주소 비교&lt;/li&gt;
&lt;li&gt;동등성(equality, &lt;code&gt;equals&lt;/code&gt;): 두 객체가 논리적으로 같은 것을 의미하는가.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;a.equals(b)&lt;/code&gt;가 true 이면, &lt;code&gt;a.hashCode() == b.hashCode()&lt;/code&gt;이어야 한다.&lt;/p&gt;</description></item><item><title>ExceptionHandler에서 핸들링하지 못한 예외가 발생 했을 때 어떤 문제가 발생할 수 있을까?</title><link>https://uechann.github.io/posts/wooteco-mission/exceptionhandler%EC%97%90%EC%84%9C-%ED%95%B8%EB%93%A4%EB%A7%81%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%98%88%EC%99%B8%EA%B0%80-%EB%B0%9C%EC%83%9D-%ED%96%88%EC%9D%84-%EB%95%8C-%EC%96%B4%EB%96%A4-%EB%AC%B8%EC%A0%9C%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/exceptionhandler%EC%97%90%EC%84%9C-%ED%95%B8%EB%93%A4%EB%A7%81%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%98%88%EC%99%B8%EA%B0%80-%EB%B0%9C%EC%83%9D-%ED%96%88%EC%9D%84-%EB%95%8C-%EC%96%B4%EB%96%A4-%EB%AC%B8%EC%A0%9C%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C/</guid><description>&lt;h1 id="-의도적-파괴-학습-로그"&gt;💥 의도적 파괴 학습 로그&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;개념 / 대상 코드:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;roomescape.global.exception&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RestControllerAdvice&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GlobalExceptionHandler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleIllegalArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;illegalArgumentException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServletRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponseBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BAD_REQUEST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;illegalArgumentException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRequestURI&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timeStamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LocalDateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;traceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MDC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;traceId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpStatus&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CustomException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleCustomException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CustomException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServletRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponseBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getErrorCode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getHttpStatus&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getErrorCode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRequestURI&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timeStamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LocalDateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;traceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MDC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;traceId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHttpStatus&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MethodArgumentNotValidException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleMethodArgumentNotValidException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MethodArgumentNotValidException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;methodArgumentNotValidException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServletRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponseBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BAD_REQUEST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;요청값이 잘못됐습니다.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRequestURI&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timeStamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LocalDateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;traceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MDC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;traceId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BAD_REQUEST&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConstraintViolationException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleConstraintViolationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConstraintViolationException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;constraintViolationException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServletRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponseBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BAD_REQUEST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;요청값이 잘못됐습니다.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRequestURI&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timeStamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LocalDateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;traceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MDC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;traceId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BAD_REQUEST&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="어떤-개념인가요"&gt;어떤 개념인가요?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@RestControllerAdvice&lt;/code&gt; + &lt;code&gt;@ExceptionHandler&lt;/code&gt;로 전역 예외를 잡아 일관된 &lt;code&gt;ErrorResponse&lt;/code&gt;(traceId · apiUrl · timeStamp 포함)로 변환하는 구조.&lt;/p&gt;</description></item><item><title>import * 와일드 카드 사용시 문제점과 FakeRepository 테스트를 병렬로 수행시 문제 점과 storage와 sequence에 접근했을 때 어떤 방어 로직이나 객체가 필요할까?</title><link>https://uechann.github.io/posts/wooteco-mission/import-%EC%99%80%EC%9D%BC%EB%93%9C-%EC%B9%B4%EB%93%9C-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EB%AC%B8%EC%A0%9C%EC%A0%90%EA%B3%BC-fakerepository-%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EB%B3%91%EB%A0%AC%EB%A1%9C-%EC%88%98%ED%96%89%EC%8B%9C-%EB%AC%B8%EC%A0%9C-%EC%A0%90%EA%B3%BC-storage%EC%99%80-sequence%EC%97%90-%EC%A0%91%EA%B7%BC%ED%96%88%EC%9D%84-%EB%95%8C-%EC%96%B4%EB%96%A4-%EB%B0%A9%EC%96%B4-%EB%A1%9C%EC%A7%81%EC%9D%B4%EB%82%98-%EA%B0%9D%EC%B2%B4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/import-%EC%99%80%EC%9D%BC%EB%93%9C-%EC%B9%B4%EB%93%9C-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EB%AC%B8%EC%A0%9C%EC%A0%90%EA%B3%BC-fakerepository-%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EB%B3%91%EB%A0%AC%EB%A1%9C-%EC%88%98%ED%96%89%EC%8B%9C-%EB%AC%B8%EC%A0%9C-%EC%A0%90%EA%B3%BC-storage%EC%99%80-sequence%EC%97%90-%EC%A0%91%EA%B7%BC%ED%96%88%EC%9D%84-%EB%95%8C-%EC%96%B4%EB%96%A4-%EB%B0%A9%EC%96%B4-%EB%A1%9C%EC%A7%81%EC%9D%B4%EB%82%98-%EA%B0%9D%EC%B2%B4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C/</guid><description>&lt;h2 id="어떤-개념일까"&gt;어떤 개념일까?&lt;/h2&gt;
&lt;h2 id="1-import-javautil-와일드카드의-문제"&gt;1. &lt;code&gt;import java.util.*;&lt;/code&gt; 와일드카드의 문제&lt;/h2&gt;
&lt;h3 id="이름-충돌"&gt;이름 충돌&lt;/h3&gt;
&lt;p&gt;와일드카드를 여러 패키지에 쓰면 같은 단순 이름의 클래스가 부딪힌다.
나중에 와일드 카드 임포트가 추가되거나 JDK버전이 올라가서 새로운 클래스가 생긴다면 멀쩡하던 코드가 문제가 생길 수 있다.&lt;/p&gt;</description></item><item><title>TraceIdFilter의 사용 목적</title><link>https://uechann.github.io/posts/wooteco-mission/traceidfilter%EC%9D%98-%EC%82%AC%EC%9A%A9-%EB%AA%A9%EC%A0%81/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/traceidfilter%EC%9D%98-%EC%82%AC%EC%9A%A9-%EB%AA%A9%EC%A0%81/</guid><description>&lt;h2 id="어떤-개념일까"&gt;어떤 개념일까?&lt;/h2&gt;
&lt;p&gt;TraceId는 어떤 목적으로 사용할까?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TraceIdFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;doFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServletRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ServletResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FilterChain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;throws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ServletException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MDC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;traceId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;doFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MDC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CustomException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleCustomException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CustomException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServletRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErrorResponseBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getErrorCode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getHttpStatus&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getErrorCode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpServletRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRequestURI&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timeStamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LocalDateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;traceId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MDC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;traceId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHttpStatus&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errorResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이 로그가 어느 요청에서 나온 것인지 추적할 수 있게 해주는 장치의 목적으로 사용한다.&lt;/p&gt;</description></item><item><title>상태 패턴에서 상태 객체들을 싱글톤으로 선언하는 이유는?</title><link>https://uechann.github.io/posts/wooteco-mission/%EC%83%81%ED%83%9C-%ED%8C%A8%ED%84%B4%EC%97%90%EC%84%9C-%EC%83%81%ED%83%9C-%EA%B0%9D%EC%B2%B4%EB%93%A4%EC%9D%84-%EC%8B%B1%EA%B8%80%ED%86%A4%EC%9C%BC%EB%A1%9C-%EC%84%A0%EC%96%B8%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EC%83%81%ED%83%9C-%ED%8C%A8%ED%84%B4%EC%97%90%EC%84%9C-%EC%83%81%ED%83%9C-%EA%B0%9D%EC%B2%B4%EB%93%A4%EC%9D%84-%EC%8B%B1%EA%B8%80%ED%86%A4%EC%9C%BC%EB%A1%9C-%EC%84%A0%EC%96%B8%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94/</guid><description>&lt;h2 id="어떤-개념일까"&gt;어떤 개념일까?&lt;/h2&gt;
&lt;h2 id="상태-패턴에서-상태-객체를-왜-싱글톤으로-선언하는가"&gt;상태 패턴에서 상태 객체를 왜 싱글톤으로 선언하는가?&lt;/h2&gt;
&lt;h3 id="1-상태-객체는-필드가-없고-행위만-있는-무상태stateless-객체입니다"&gt;1. 상태 객체는 필드가 없고 행위만 있는 &lt;code&gt;무상태(stateless)&lt;/code&gt; 객체입니다.&lt;/h3&gt;
&lt;p&gt;상태 객체들은 내부에 인스턴스 필드를 소유하지 않고 있고, 오직 행위 행동만 정의되어 있습니다.&lt;/p&gt;</description></item><item><title>네오 방탈출 테스트코드 피드백</title><link>https://uechann.github.io/posts/wooteco-mission/%EB%84%A4%EC%98%A4-%EB%B0%A9%ED%83%88%EC%B6%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%BD%94%EB%93%9C-%ED%94%BC%EB%93%9C%EB%B0%B1/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EB%84%A4%EC%98%A4-%EB%B0%A9%ED%83%88%EC%B6%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%BD%94%EB%93%9C-%ED%94%BC%EB%93%9C%EB%B0%B1/</guid><description>&lt;p&gt;방탈출 사이클3 공통 피드백 전달합니다!!&lt;/p&gt;
&lt;p&gt;해당 내용 읽고 이따 10시 40분에 질문 답변 받을게요~&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;## 진단&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;여러분은 답을 모르는 게 아니라, 답을 평가할 기준이 비어 있어요.&lt;/p&gt;</description></item><item><title>방탈출-싸이클1 리팩터링1</title><link>https://uechann.github.io/posts/wooteco-mission/%EB%B0%A9%ED%83%88%EC%B6%9C-%EC%8B%B8%EC%9D%B4%ED%81%B41-%EB%A6%AC%ED%8C%A9%ED%84%B0%EB%A7%811/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EB%B0%A9%ED%83%88%EC%B6%9C-%EC%8B%B8%EC%9D%B4%ED%81%B41-%EB%A6%AC%ED%8C%A9%ED%84%B0%EB%A7%811/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;대상:&lt;/strong&gt; (예: OrderService, 결제 모듈, API 응답 구조 등)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;언어 / 프레임워크:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-개요"&gt;1. 개요&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;항목&lt;/th&gt;
					&lt;th&gt;내용&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;한 줄 요약&lt;/td&gt;
					&lt;td&gt;(예: 중복된 할인 계산 로직을 전략 패턴으로 분리)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;리팩터링 범위&lt;/td&gt;
					&lt;td&gt;(예: 단일 메서드 / 클래스 / 모듈 / 아키텍처 레이어)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;소요 시간&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;난이도&lt;/td&gt;
					&lt;td&gt;⭐ / ⭐⭐ / ⭐⭐⭐ / ⭐⭐⭐⭐ / ⭐⭐⭐⭐⭐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="2-문제-인식--무엇이-문제였나"&gt;2. 문제 인식 — 무엇이 문제였나?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;현재 코드 혹은 구조에서 느낀 불편함, 버그, 유지보수 어려움 등을 구체적으로 기록하세요.&lt;/p&gt;</description></item><item><title>방탈출-싸이클1 엔티티는 record → class로 수정</title><link>https://uechann.github.io/posts/wooteco-mission/%EB%B0%A9%ED%83%88%EC%B6%9C-%EC%8B%B8%EC%9D%B4%ED%81%B41-%EC%97%94%ED%8B%B0%ED%8B%B0%EB%8A%94-record-class%EB%A1%9C-%EC%88%98%EC%A0%95/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EB%B0%A9%ED%83%88%EC%B6%9C-%EC%8B%B8%EC%9D%B4%ED%81%B41-%EC%97%94%ED%8B%B0%ED%8B%B0%EB%8A%94-record-class%EB%A1%9C-%EC%88%98%EC%A0%95/</guid><description>&lt;h1 id="엔티티는-record--class로-수정"&gt;엔티티는 record → class로 수정&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;**대상: 방탈출-회원 예약 싸이클1**
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;## 문제 인식 — 무엇이 문제였나?

&amp;gt; 현재 코드 혹은 구조에서 느낀 불편함, 버그, 유지보수 어려움 등을 구체적으로 기록하세요.

### 문제 상황

- 도메인 엔티티를 record 자료형으로 사용했을 때의 문제점
1. record를 값 그 자체를 식별자로 갖게된다.

엔티티는 id를 가지는 도메인 엔티티인데 id를 생명 주기로 가지게 된다.
하지만 record는 모든 필드값이 같으면 같은 객체로 equals로 동등성을 비교하게 된다.

그러면 record를 도메인 엔티티로 사용하는게 맞을까 ?
아니다 맞지 않다.

엔티티의 동일성은 식별자 기반이어야 한다. 도메인 객체는 값이 바뀌어도 같은 존재이다.
2. 불변성 문제
record는 완전한 불변 객체이기 때문에 
저장 후에 id를 받고 받은 id로 다시 record를 생성하게 되는데 이것은 도메인의 영역이 아니게 된다.

즉, 값 그 자체가 식별자인 객체는 도메인이 아니고, 
`생명주기와 식별자를 갖는 객체는 class로 설계하는게 맞다.`

### 문제가 되는 코드 / 구조


```plain text
// 문제가 있는 코드나 구조를 붙여넣으세요 (코드가 아닌 경우 텍스트로 설명)
```


### 문제 유형 체크

- [ ] 중복 코드 / 로직
- [ ] 불명확한 이름 (변수, 메서드, 클래스 등)
- [ ] 단일 책임 원칙(SRP) 위반 — 너무 많은 역할
- [ ] 높은 결합도 — 변경 시 여러 곳에 영향
- [ ] 낮은 응집도 — 관련 없는 것들이 한곳에
- [ ] 확장하기 어려운 구조 (OCP 위반)
- [ ] 테스트하기 어려운 구조
- [ ] 성능 문제
- [ ] 가독성 / 이해하기 어려움
- [x] 기타: 엔티티 자료형의 문제

## 변경 이유 — 왜 바꿔야 하는가?

&amp;gt; 지금 당장 동작하더라도 왜 바꾸어야 하는지 그 필요성을 설득력 있게 정리하세요.

엔티티를 record로 사용했을 때,


생명주기와 식별자는 갖는 객체를 record로 설계한다면
값 그 자체가 식별자가 되고 불변 객체인 record의 목적과 맞지 않게 된다.


## 변경 방향 — 어떻게 바꿀 것인가?

&amp;gt; 어떤 방식으로 접근할지, 어떤 기법·패턴·원칙을 적용할지 계획을 기록하세요.

### 접근 전략

- 엔티티에 만든 Reservation, Time, Theme 레코드를 class로 바꾼다.
- equals hashCode를 id 기반으로 재정의 한다.

### 적용할 기법 / 패턴 / 원칙

- [ ] 메서드 추출 (Extract Method)
- [ ] 클래스 / 인터페이스 추출
- [ ] 디자인 패턴 적용 (패턴명: )
- [ ] 레이어 / 모듈 분리
- [ ] 의존성 역전 (DIP) 적용
- [ ] 불변 객체 / VO 도입
- [ ] 기타:

## 회고


### 배운 점

- 엔티티를 record로 사용하면 안되는 이유
- 생명주기와 식별자에 대한 개념
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>방탈출-싸이클1 예약가능한 시간 관리 수정</title><link>https://uechann.github.io/posts/wooteco-mission/%EB%B0%A9%ED%83%88%EC%B6%9C-%EC%8B%B8%EC%9D%B4%ED%81%B41-%EC%98%88%EC%95%BD%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%8B%9C%EA%B0%84-%EA%B4%80%EB%A6%AC-%EC%88%98%EC%A0%95/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EB%B0%A9%ED%83%88%EC%B6%9C-%EC%8B%B8%EC%9D%B4%ED%81%B41-%EC%98%88%EC%95%BD%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%8B%9C%EA%B0%84-%EA%B4%80%EB%A6%AC-%EC%88%98%EC%A0%95/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;대상:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="문제-인식--무엇이-문제였나"&gt;문제 인식 — 무엇이 문제였나?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;현재 코드 혹은 구조에서 느낀 불편함, 버그, 유지보수 어려움 등을 구체적으로 기록하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="문제-상황"&gt;문제 상황&lt;/h3&gt;
&lt;p&gt;예약 가능한 시간 조회할 때, 모든 시간들을 다 조회하고, reseration 테이블에서 조회 후에
예약이 존재하는 timeId들에 대해서 다시 비교 하는 로직을 거친 후에 예약 가능한 시간에 대한 데이터를 생성 후 반환해주고 있다.&lt;/p&gt;</description></item><item><title>스키마 변경에 따른 변경 전파</title><link>https://uechann.github.io/posts/wooteco-mission/%EC%8A%A4%ED%82%A4%EB%A7%88-%EB%B3%80%EA%B2%BD%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B3%80%EA%B2%BD-%EC%A0%84%ED%8C%8C/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EC%8A%A4%ED%82%A4%EB%A7%88-%EB%B3%80%EA%B2%BD%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B3%80%EA%B2%BD-%EC%A0%84%ED%8C%8C/</guid><description>&lt;h1 id="스키마-변경-영향-분석reservationtheme_slot_idfk-도입"&gt;&lt;strong&gt;스키마 변경 영향 분석:&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;reservation.theme_slot_id&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;FK 도입&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id="변경-개요"&gt;&lt;strong&gt;변경 개요&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;reservation&lt;/code&gt; 테이블의 &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;time_id&lt;/code&gt;, &lt;code&gt;theme_id&lt;/code&gt; 컬럼을 제거하고,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;theme_slot(id)&lt;/code&gt;를 참조하는 외래키 &lt;code&gt;theme_slot_id&lt;/code&gt; 단일 컬럼으로 대체한다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 변경 전CREATETABLE reservation( id BIGINTNOTNULL AUTO_INCREMENT,nameVARCHAR(255)NOTNULL, statusVARCHAR(255)NOTNULL,dateDATENOTNULL, time_id BIGINTNOTNULL, theme_id BIGINTNOTNULL,PRIMARYKEY(id),FOREIGNKEY(time_id)REFERENCEStime(id),FOREIGNKEY(theme_id)REFERENCES theme(id));-- 변경 후CREATETABLE reservation( id BIGINTNOTNULL AUTO_INCREMENT,nameVARCHAR(255)NOTNULL, statusVARCHAR(255)NOTNULL, theme_slot_id BIGINTNOTNULL,PRIMARYKEY(id),FOREIGNKEY(theme_slot_id)REFERENCES theme_slot(id));
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="영향-파일-목록"&gt;&lt;strong&gt;영향 파일 목록&lt;/strong&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;레이어&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;파일&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;변경 규모&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DB 스키마&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;schema.sql&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;컬럼 교체&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;초기 데이터&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;data.sql&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;전면 재작성&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;도메인&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Reservation.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;필드·생성자·검증 전체&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;리포지토리 인터페이스&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ReservationRepository.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;메서드 시그니처 변경&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;리포지토리 구현&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;JdbcReservationRepository.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;SQL 쿼리 전체&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;리포지토리 인터페이스&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ThemeSlotRepository.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;신규 메서드 추가&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;리포지토리 구현&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;JdbcThemeSlotRepository.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;신규 메서드 구현&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;서비스&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ReservationService.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;조회·검증·생성 로직&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;컨트롤러&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ReservationController.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;toResponse()&lt;/code&gt; 위임 확인&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DTO&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ReservationModifyRequest.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;검증 로직 이동 고려&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;테스트 Fake&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;FakeReservationDao.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;인터페이스 변경 동기화&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;테스트 Fake&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;FakeThemeSlotDao.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;신규 메서드 구현&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;단위 테스트&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ReservationTest.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;생성자 호출부 전체&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;통합 테스트&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;JdbcReservationRepositoryTest.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;테스트 픽스처 전체&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;서비스 테스트&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ReservationServiceTest.java&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;픽스처·어설션 일부&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="파일별-상세-변경-내용"&gt;&lt;strong&gt;파일별 상세 변경 내용&lt;/strong&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id="1srcmainresourcesschemasql"&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;src/main/resources/schema.sql&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- reservation 테이블 재정의CREATETABLE IFNOTEXISTS reservation( id BIGINTNOTNULL AUTO_INCREMENT,nameVARCHAR(255)NOTNULL, statusVARCHAR(255)NOTNULL, theme_slot_id BIGINTNOTNULL,-- 신규PRIMARYKEY(id),FOREIGNKEY(theme_slot_id)REFERENCES theme_slot(id)-- 신규-- 제거: date DATE, time_id BIGINT, theme_id BIGINT, 기존 FK 2개);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;주의&lt;/strong&gt;: &lt;code&gt;theme_slot&lt;/code&gt; 테이블 CREATE 문이 &lt;code&gt;reservation&lt;/code&gt;보다 먼저 위치해야 FK 참조가 성립한다.&lt;/p&gt;</description></item><item><title>예약 상태 패턴</title><link>https://uechann.github.io/posts/wooteco-mission/%EC%98%88%EC%95%BD-%EC%83%81%ED%83%9C-%ED%8C%A8%ED%84%B4/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://uechann.github.io/posts/wooteco-mission/%EC%98%88%EC%95%BD-%EC%83%81%ED%83%9C-%ED%8C%A8%ED%84%B4/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;대상:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="문제-인식--무엇이-문제였나"&gt;문제 인식 — 무엇이 문제였나?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;현재 코드 혹은 구조에서 느낀 불편함, 버그, 유지보수 어려움 등을 구체적으로 기록하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="문제-상황"&gt;문제 상황&lt;/h3&gt;
&lt;p&gt;예약 도메인은 상태 전이가 중요한 핵심 비즈니스 로직이다.&lt;/p&gt;</description></item></channel></rss>