<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩 세상</title>
    <link>https://darkstart.tistory.com/</link>
    <description>문의 사항은 질문 남겨주세요~</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 01:02:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>드리머즈</managingEditor>
    <item>
      <title>queryDSL @oneToOne 추가 쿼리 나가는 것 방지하기</title>
      <link>https://darkstart.tistory.com/366</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. working&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;.leftJoin(aEntity.b, BEntity)&lt;br /&gt;&amp;nbsp;.fetchJoin()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. not working&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.leftJoin(bEntity)&lt;br /&gt;.on(aEntity.b.eq(bEntity))&lt;br /&gt;.fetchJoin()&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/366</guid>
      <comments>https://darkstart.tistory.com/366#entry366comment</comments>
      <pubDate>Wed, 2 Jul 2025 06:41:56 +0900</pubDate>
    </item>
    <item>
      <title>리액트 실행시 메모리 누수나고 접속(실행) 안될 때</title>
      <link>https://darkstart.tistory.com/365</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;node lts 버전으로 다운그레이드 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749967186614&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;--- Last few GCs ---&amp;gt;

[18062:0x148030000]   152000 ms: Scavenge (interleaved) 8178.6 (8199.5) -&amp;gt; 8172.9 (8200.5) MB, pooled: 0 MB, 10.50 / 0.00 ms  (average mu = 0.333, current mu = 0.311) allocation failure; 
[18062:0x148030000]   157527 ms: Mark-Compact (reduce) 8173.3 (8200.5) -&amp;gt; 8172.8 (8186.6) MB, pooled: 0 MB, 4086.71 / 0.00 ms  (+ 28.8 ms in 0 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 4223 ms) (average mu = 0.316,

&amp;lt;--- JS stacktrace ---&amp;gt;

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

 1: 0x1025b077c node::OOMErrorHandler(char const*, v8::OOMDetails const&amp;amp;) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 2: 0x1027597e4 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&amp;amp;) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 3: 0x102759798 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&amp;amp;) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 4: 0x1029172a8 v8::internal::Heap::CallGCPrologueCallbacks(v8::GCType, v8::GCCallbackFlags, v8::internal::GCTracer::Scope::ScopeId) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 5: 0x102918fac v8::internal::Heap::DevToolsTraceEventScope::~DevToolsTraceEventScope() [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 6: 0x102917970 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags)::$_1::operator()() const [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 7: 0x102917620 void heap::base::Stack::SetMarkerAndCallbackImpl&amp;lt;v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags)::$_1&amp;gt;(heap::base::Stack*, void*, void const*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 8: 0x1024c0028 PushAllRegistersAndIterateStack [/opt/homebrew/Cellar/node/23.4.0/bin/node]
 9: 0x102915bc8 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
10: 0x1028a3a28 v8::internal::StackGuard::HandleInterrupts(v8::internal::StackGuard::InterruptLevel) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
11: 0x102c1b544 v8::internal::Runtime_StackGuardWithGap(int, unsigned long*, v8::internal::Isolate*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
12: 0x10239f9f4 Builtins_CEntry_Return1_ArgvOnStack_NoBuiltinExit [/opt/homebrew/Cellar/node/23.4.0/bin/node]
13: 0x10c7e5340 
14: 0x10c8f2404 
15: 0x10c8efc90 
16: 0x10c7e7878 
17: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
18: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
19: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
20: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
21: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
22: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
23: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
24: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
25: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
26: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
27: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
28: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
29: 0x102308838 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/23.4.0/bin/node]
30: 0x102345e20 Builtins_AsyncFunctionAwaitResolveClosure [/opt/homebrew/Cellar/node/23.4.0/bin/node]
31: 0x102413298 Builtins_PromiseFulfillReactionJob [/opt/homebrew/Cellar/node/23.4.0/bin/node]
32: 0x102335214 Builtins_RunMicrotasks [/opt/homebrew/Cellar/node/23.4.0/bin/node]
33: 0x1023063f0 Builtins_JSRunMicrotasksEntry [/opt/homebrew/Cellar/node/23.4.0/bin/node]
34: 0x10287c0a0 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&amp;amp;) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
35: 0x10287c770 v8::internal::(anonymous namespace)::InvokeWithTryCatch(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&amp;amp;) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
36: 0x1028a1858 v8::internal::MicrotaskQueue::RunMicrotasks(v8::internal::Isolate*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
37: 0x1028a15e8 v8::internal::MicrotaskQueue::PerformCheckpointInternal(v8::Isolate*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
38: 0x1024c15e8 node::InternalCallbackScope::Close() [/opt/homebrew/Cellar/node/23.4.0/bin/node]
39: 0x1024c1b98 node::InternalMakeCallback(node::Environment*, v8::Local&amp;lt;v8::Object&amp;gt;, v8::Local&amp;lt;v8::Object&amp;gt;, v8::Local&amp;lt;v8::Function&amp;gt;, int, v8::Local&amp;lt;v8::Value&amp;gt;*, node::async_context, v8::Local&amp;lt;v8::Value&amp;gt;) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
40: 0x1024d9ab0 node::AsyncWrap::MakeCallback(v8::Local&amp;lt;v8::Function&amp;gt;, int, v8::Local&amp;lt;v8::Value&amp;gt;*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
41: 0x1025b69dc node::fs::FSReqCallback::Resolve(v8::Local&amp;lt;v8::Value&amp;gt;) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
42: 0x1025b836c node::fs::AfterNoArgs(uv_fs_s*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
43: 0x1025a7130 node::MakeLibuvRequestCallback&amp;lt;uv_fs_s, void (*)(uv_fs_s*)&amp;gt;::Wrapper(uv_fs_s*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
44: 0x10718a5f0 uv__work_done [/opt/homebrew/Cellar/libuv/1.49.2/lib/libuv.1.dylib]
45: 0x10718dc9c uv__async_io [/opt/homebrew/Cellar/libuv/1.49.2/lib/libuv.1.dylib]
46: 0x10719e110 uv__io_poll [/opt/homebrew/Cellar/libuv/1.49.2/lib/libuv.1.dylib]
47: 0x10718e130 uv_run [/opt/homebrew/Cellar/libuv/1.49.2/lib/libuv.1.dylib]
48: 0x1024c248c node::SpinEventLoopInternal(node::Environment*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
49: 0x1025faeac node::NodeMainInstance::Run(node::ExitCode*, node::Environment*) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
50: 0x1025fac00 node::NodeMainInstance::Run() [/opt/homebrew/Cellar/node/23.4.0/bin/node]
51: 0x102570840 node::Start(int, char**) [/opt/homebrew/Cellar/node/23.4.0/bin/node]
52: 0x189b7f154 start [/usr/lib/dyld]
✨  Done in 159.12s.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/fe</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/365</guid>
      <comments>https://darkstart.tistory.com/365#entry365comment</comments>
      <pubDate>Sun, 15 Jun 2025 15:00:04 +0900</pubDate>
    </item>
    <item>
      <title>도커 실행 안되는 이슈(임시방편)(해결중)</title>
      <link>https://darkstart.tistory.com/364</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-06-03 at 9.47.54 AM.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7xgu4/btsOo8HRUaR/6npEZKPikrD7T6Z6qtOH2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7xgu4/btsOo8HRUaR/6npEZKPikrD7T6Z6qtOH2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7xgu4/btsOo8HRUaR/6npEZKPikrD7T6Z6qtOH2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7xgu4%2FbtsOo8HRUaR%2F6npEZKPikrD7T6Z6qtOH2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;942&quot; data-filename=&quot;Screenshot 2025-06-03 at 9.47.54 AM.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발생한지 꽤나 된 이슈이다. 반년은 넘은 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집에서 도커 데스크탑을 실행할 때 갑자기 발생하기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 내용은..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #080b0e; color: #adbecb; text-align: start;&quot; data-testid=&quot;errorscreen-error&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;initializing backend: retrieving system info: retrieving system version: exec: &quot;sw_vers&quot;: executable file not found in $PATH
initializing app: getting system info: retrieving system version: exec: &quot;sw_vers&quot;: executable file not found in $PATH&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 한다. 당시에 구글링해도.. 딱히 도움이 되는 정보가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-06-03 at 9.51.56 AM.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqT0gz/btsOoneAfdV/8pYJ89UkQxCKfKxDadvJnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqT0gz/btsOoneAfdV/8pYJ89UkQxCKfKxDadvJnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqT0gz/btsOoneAfdV/8pYJ89UkQxCKfKxDadvJnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqT0gz%2FbtsOoneAfdV%2F8pYJ89UkQxCKfKxDadvJnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;232&quot; data-filename=&quot;Screenshot 2025-06-03 at 9.51.56 AM.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 해결책은.. 위의 경로에 가서 도커를.. 실행시키는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./com.docker.backend&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(완벽한 해결 방법은 찾는중)&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/364</guid>
      <comments>https://darkstart.tistory.com/364#entry364comment</comments>
      <pubDate>Tue, 3 Jun 2025 09:56:36 +0900</pubDate>
    </item>
    <item>
      <title>x86, x64(=amd64), arm64 간단 정리</title>
      <link>https://darkstart.tistory.com/363</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰 개발도 꽤 했고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 조립도 자주하는데 기억력이 붕어인 것 같아 간단히 다시 정리해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x86은.. 그냥 예전 인텔 cpu라고 보면 될 것 같고(정확히는 아키텍쳐겠지만..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x64, amd64는 요즘 나오는 인텔이나 AMD의 cpu..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arm64는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퀄컴에서만 제공하는 지는 모르겠으나..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 스마트폰 개발할 때 퀄컴에서 만든..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 모바일용 cpu.. (스냅드래곤?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 찾아보니 iOS에서 쓰이는 칩들도 arm64 아키텍쳐라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 애플 실리콘 M칩들도 그러니 음..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 arm64가 인프라에서 인기가 많은 것 아닐까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/cjs0308cjs/223242935705&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://m.blog.naver.com/cjs0308cjs/223242935705&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@wltjd3459/iOS-CPU-Architecture%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@wltjd3459/iOS-CPU-Architecture%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/363</guid>
      <comments>https://darkstart.tistory.com/363#entry363comment</comments>
      <pubDate>Sat, 24 May 2025 19:25:04 +0900</pubDate>
    </item>
    <item>
      <title>[자바 스크립트][js/ts] ... 연산자는 무엇?</title>
      <link>https://darkstart.tistory.com/361</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 잠깐 넥스트 공부하면서 배웠던 것인데 시간이 지나서 보니 까먹어서 여기에 기록을 남겨야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;... 연산자는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열에 있던 값들을 분해해주는? 역알을 한다고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크로 가서 예제를 보면 바로 이해할 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735552770459&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spread syntax (...) - JavaScript | MDN&quot; data-og-description=&quot;The spread (...) syntax allows an iterable, such as an array or string, to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected. In an object literal, the spread syntax enumerates the propert&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CEOzy/hyXSpVvDTU/vDt7oKJZLIK2gk0fAKrnF1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CEOzy/hyXSpVvDTU/vDt7oKJZLIK2gk0fAKrnF1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spread syntax (...) - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The spread (...) syntax allows an iterable, such as an array or string, to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected. In an object literal, the spread syntax enumerates the propert&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/fe</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/361</guid>
      <comments>https://darkstart.tistory.com/361#entry361comment</comments>
      <pubDate>Mon, 30 Dec 2024 19:01:34 +0900</pubDate>
    </item>
    <item>
      <title>키클락 마이그레이션 성공!(23.0.5 -&amp;gt; 25.0.2)</title>
      <link>https://darkstart.tistory.com/360</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키클락이 오픈소스이고 좋은데 단점이.. 기본적으로? 인피니스팬이라는 메모리에 세션이 저장되다보니 재시작을 하게 되면 사용자들의 로그인이 다 풀리게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 들어서 25 버전부터? db에 세션을 저장하는 기능을 지원한다.(persistent-user-sessions라는 키클락 기능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는.. 이전 버전에는 세션 관련 정보들이 메모리에 있어서 끌 수가 없다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키클락 오픈소스를 다운받아서 이리저리 분석해본 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키클락 admin rest api로 각 렐름의.. 세션 정보들을 받아와서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 것을 토대로 db에 들어갈 쿼리 문을 만들면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OFFLINE_USER_SESSION&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OFFLINE_CLIENT_SESSION&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 넣어주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(내용이 좀 길어져서 자세한 부분은 생략)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 키클락에서는 손쉬운 마이그레이션 방법을 제공하지 않는걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 못 찾은 것인지..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/360</guid>
      <comments>https://darkstart.tistory.com/360#entry360comment</comments>
      <pubDate>Sun, 6 Oct 2024 20:46:03 +0900</pubDate>
    </item>
    <item>
      <title>[맥] 맥에서 인텔리제이 빌드 속도가 느렸던 이유</title>
      <link>https://darkstart.tistory.com/359</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;집에서 쓰는 맥미니가 인텔리제이에서 클린 빌드를 했을 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 맥북프로에 비해 속도가 너무나 느렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 맥북프로에서는 1분이면 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집에서 하면 5분정도 걸렸었다. 램이 작아서 그런가 싶었었는데 문제는 다른 곳에 있었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-08-18 at 5.42.57 PM.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCeldT/btsI8pOKwWM/NMMvCpj02hCO5n4eGnYP11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCeldT/btsI8pOKwWM/NMMvCpj02hCO5n4eGnYP11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCeldT/btsI8pOKwWM/NMMvCpj02hCO5n4eGnYP11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCeldT%2FbtsI8pOKwWM%2FNMMvCpj02hCO5n4eGnYP11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1720&quot; height=&quot;1248&quot; data-filename=&quot;Screenshot 2024-08-18 at 5.42.57 PM.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이에 의해 실행된 자바가.. 인텔 칩셋용이다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-08-18 at 5.41.42 PM.png&quot; data-origin-width=&quot;4554&quot; data-origin-height=&quot;1928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqhGYs/btsI8aEnKPP/8DUsWV1dApHj5L5GhyvvJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqhGYs/btsI8aEnKPP/8DUsWV1dApHj5L5GhyvvJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqhGYs/btsI8aEnKPP/8DUsWV1dApHj5L5GhyvvJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqhGYs%2FbtsI8aEnKPP%2F8DUsWV1dApHj5L5GhyvvJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4554&quot; height=&quot;1928&quot; data-filename=&quot;Screenshot 2024-08-18 at 5.41.42 PM.png&quot; data-origin-width=&quot;4554&quot; data-origin-height=&quot;1928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/downloads-list.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/downloads-list.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사이트에 들어가서 애플 M 칩셋(실리콘)용으로 받자. (&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/macos-install.html&quot;&gt;macOS aarch64&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치하면 자동으로 덮어쓰기가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 경로는 대략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk/Contents/Home&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같으니.. 알아서 한 번 확인해보자. (문제가 있다면)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-08-18 at 5.42.26 PM.png&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xZk9Q/btsI6g7wdVc/sK1wtoIAXNiliK1byrnl01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xZk9Q/btsI6g7wdVc/sK1wtoIAXNiliK1byrnl01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xZk9Q/btsI6g7wdVc/sK1wtoIAXNiliK1byrnl01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxZk9Q%2FbtsI6g7wdVc%2FsK1wtoIAXNiliK1byrnl01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1702&quot; height=&quot;1250&quot; data-filename=&quot;Screenshot 2024-08-18 at 5.42.26 PM.png&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;1250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올바르게 설치 후~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 속도가 1분으로 회사 컴퓨터와 동일해졌다~&lt;/p&gt;</description>
      <category>맥</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/359</guid>
      <comments>https://darkstart.tistory.com/359#entry359comment</comments>
      <pubDate>Sun, 18 Aug 2024 17:45:53 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스] aws에서 도커 컨테이너가 129로 죽는 이슈</title>
      <link>https://darkstart.tistory.com/358</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;키클락의 경우 세션매니져로 서버에 접속하여 docker attach 등을 하면.. 콘트롤+C 를 누르면 도커가 종료되어 버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 콘트롤 + P, Q를 눌러서 빠져나오려고 했으나 크롬에서 해버리면.. 크롬이 종료되버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨋든 attach로 하여 로그를 보고.. 키클락 컨테이너를 종료시키기는 싫어서 탭을 닫았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 그냥 백그라운드로 잘 돌아갈 것이라고 생각했었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 매니저가 종료되는 시점에 키클락 도커 컨테이너도 동시에 죽는 현상을 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker inspect에서 129 종료 시그널을 볼 수 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스로 보면(128 + &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;No&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Default&amp;nbsp;Action&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Description&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SIGHUP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;terminate&amp;nbsp;process&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;terminal&amp;nbsp;line&amp;nbsp;hangup&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 비슷한 증상을 겪는 사람은 로그를 docker attach로 보지 말고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker inspect해서 나오는 로그 경로의 파일을 cat으로 해서 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;tail도 금지!!!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;docker logs -f &amp;lt;컨테이너_ID&amp;gt; 로 보는 건 괜찮음!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/358</guid>
      <comments>https://darkstart.tistory.com/358#entry358comment</comments>
      <pubDate>Fri, 26 Jul 2024 11:11:55 +0900</pubDate>
    </item>
    <item>
      <title>[인텔리제이] zsh 적용 안되는 문제</title>
      <link>https://darkstart.tistory.com/357</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 맥 터미널에서는 zsh을 깔고 oh-my-zsh도 설치하여 보기가 편한데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이의 터미널에서는 이상하게도 zsh이 적용되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u53Uw/btsFO1rUoRT/3GTBR9lzNvhxJn5TghOdK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u53Uw/btsFO1rUoRT/3GTBR9lzNvhxJn5TghOdK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u53Uw/btsFO1rUoRT/3GTBR9lzNvhxJn5TghOdK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu53Uw%2FbtsFO1rUoRT%2F3GTBR9lzNvhxJn5TghOdK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1936&quot; height=&quot;248&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이 Settings에서 기본 쉘을 zsh로 했음에도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-16 오후 7.51.36.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ltu2j/btsFRZ6Wfmz/0Fp0KkekPu8wnmWQQesjB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ltu2j/btsFRZ6Wfmz/0Fp0KkekPu8wnmWQQesjB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ltu2j/btsFRZ6Wfmz/0Fp0KkekPu8wnmWQQesjB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLtu2j%2FbtsFRZ6Wfmz%2F0Fp0KkekPu8wnmWQQesjB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1136&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2024-03-16 오후 7.51.36.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상하게 bash가 계속 기본 쉘로 지정이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710586421771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chsh -s /bin/zsh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어도 소용이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노트북 재부팅도 소용이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가 버그가 있었던 것 같다. 인텔리제이에서 환경변수를 확인해보고 SHELL이 zsh로 적용된 것을 확인하고.. 딱히 어떤 값을 수정하지는 않았는데 갑자기 인텔리제이에서 echo &quot;$SHELL&quot; 로 확인했을 경우 zsh이 나와서 인텔리제이의 터미널을 껐다가 키니.. zsh이 적용이 됐다.. 뭐 이런 신기한 버그가 다 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-16 오후 8.11.25.png&quot; data-origin-width=&quot;2152&quot; data-origin-height=&quot;1460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuiee6/btsFQTTUNYQ/qBHHvv5QMSm3xcW9CJTFAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuiee6/btsFQTTUNYQ/qBHHvv5QMSm3xcW9CJTFAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuiee6/btsFQTTUNYQ/qBHHvv5QMSm3xcW9CJTFAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuiee6%2FbtsFQTTUNYQ%2FqBHHvv5QMSm3xcW9CJTFAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2152&quot; height=&quot;1460&quot; data-filename=&quot;스크린샷 2024-03-16 오후 8.11.25.png&quot; data-origin-width=&quot;2152&quot; data-origin-height=&quot;1460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-16 오후 8.14.32.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBgTd/btsFQy3vrMz/skl5uEqhr8MawB7a00CAvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBgTd/btsFQy3vrMz/skl5uEqhr8MawB7a00CAvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBgTd/btsFQy3vrMz/skl5uEqhr8MawB7a00CAvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBgTd%2FbtsFQy3vrMz%2Fskl5uEqhr8MawB7a00CAvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;222&quot; data-filename=&quot;스크린샷 2024-03-16 오후 8.14.32.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/357</guid>
      <comments>https://darkstart.tistory.com/357#entry357comment</comments>
      <pubDate>Sat, 16 Mar 2024 19:53:54 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스] 자주쓰는 명령어 netstat</title>
      <link>https://darkstart.tistory.com/356</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 통신이 안될 때 어딘가 방화벽 설정이 잘못됐다거나 서버에서 듣고 있지않다거나 둘 중에 문제가 있는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 aws에서 route53부터 시작해서 해당 서버까지 보안그룹 문제가 없는지 확인도 하고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 되는 서버에서 아래의 netstat 명령어를 써서 서버는 문제가 없는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런저런 다른 것을 하다보니 이 명령어 옵션도 긴가민가해서.. 아무래도 기록으로 남겨둬야 겠다.&lt;/p&gt;
&lt;pre id=&quot;code_1709290444737&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   netstat -nltp : LISTEN 중인 포트 정보 표시&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://cafe24.zendesk.com/hc/ko/articles/9801441063449-LINUX-netstat-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%83%81%EC%84%B8-%EC%84%A4%EB%AA%85&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cafe24.zendesk.com/hc/ko/articles/9801441063449-LINUX-netstat-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%83%81%EC%84%B8-%EC%84%A4%EB%AA%85&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/356</guid>
      <comments>https://darkstart.tistory.com/356#entry356comment</comments>
      <pubDate>Fri, 1 Mar 2024 19:55:28 +0900</pubDate>
    </item>
    <item>
      <title>[서버] nslookup이 여러 결과는 주는 경우</title>
      <link>https://darkstart.tistory.com/355</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://community.spiceworks.com/topic/2128911-nslookup-giving-multiple-ip-for-same-name&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://community.spiceworks.com/topic/2128911-nslookup-giving-multiple-ip-for-same-name&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 링크를 참조함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multiple A records for a single host lookup is commonly known as &lt;span style=&quot;color: #ee2323;&quot;&gt;round-robin DNS&lt;/span&gt;.&lt;span style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot;&gt;It is a feature&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;It is related to high-availability and load-sharing&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Be advised early on that round-robin DNS is at best a mixed-bag. For more information, please consult the following resources:&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.zytrax.com/books/dns/ch9/rr.html&quot;&gt;http://www.zytrax.com/books/dns/ch9/rr.html&lt;/a&gt;&lt;a style=&quot;color: #007fa2;&quot; href=&quot;http://www.zytrax.com/books/dns/ch9/rr.html&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.zytrax.com/books/dns/ch7/queries.html#rrset-order&quot;&gt;http://www.zytrax.com/books/dns/ch7/queries.html#rrset-order&lt;/a&gt;&lt;a style=&quot;color: #007fa2;&quot; href=&quot;http://www.zytrax.com/books/dns/ch7/queries.html#rrset-order&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.rightscale.com/blog/enterprise-cloud-strategies/dns-load-balancing-and-using-multiple-loa...&quot;&gt;http://www.rightscale.com/blog/enterprise-cloud-strategies/dns-load-balancing-and-using-multiple-loa...&lt;/a&gt;&lt;a style=&quot;color: #007fa2;&quot; href=&quot;http://www.rightscale.com/blog/enterprise-cloud-strategies/dns-load-balancing-and-using-multiple-load-balancers-cloud&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AWS &lt;b&gt;Route53&lt;/b&gt;에서도 손쉽게 설정이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://stackoverflow.com/questions/40841273/multiple-ip-addresses-for-resource-record-sets-of-route-53&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/40841273/multiple-ip-addresses-for-resource-record-sets-of-route-53&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ua30s/btsEnXXpikI/erFDlkxDNQPJkksDURW2t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ua30s/btsEnXXpikI/erFDlkxDNQPJkksDURW2t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ua30s/btsEnXXpikI/erFDlkxDNQPJkksDURW2t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fua30s%2FbtsEnXXpikI%2FerFDlkxDNQPJkksDURW2t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;512&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/355</guid>
      <comments>https://darkstart.tistory.com/355#entry355comment</comments>
      <pubDate>Sat, 3 Feb 2024 20:42:16 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] 서비스 게이트웨이는 단일 서버여야 하는가?</title>
      <link>https://darkstart.tistory.com/354</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 서비스 게이트웨이(api 게이트웨이)를 이야기할 때 단일 서버로 많이 가정하는 것 같다. 그런 곳도 많을 것 같고.. 하지만 단일 서버로 구성하면 SPOF(Single Point Of Failure)이 되기 때문에 대규모 트래픽 처리에 문제가 있지 않을까? 그래서 오랜만에 다시 책을 읽었더니 아래와 같은 내용을 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 마이크로서비스 코딩 공작소에서 내용 펌(p.203)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠깐, 서비스 케이트웨이가 단일 장애 지점이나 잠재적 병목 지점은 아닐까?&lt;br /&gt;4장&amp;nbsp;초반부에&amp;nbsp;유레카를&amp;nbsp;소개할&amp;nbsp;때&amp;nbsp;집중화된&amp;nbsp;로드&amp;nbsp;밸런서가&amp;nbsp;단일&amp;nbsp;장애&amp;nbsp;지점과&amp;nbsp;서비스의&amp;nbsp;병목점이&amp;nbsp;될&amp;nbsp;가능성이&amp;nbsp;있다고&lt;br /&gt;이야기했다.&amp;nbsp;서비스&amp;nbsp;게이트웨이를&amp;nbsp;올바르게&amp;nbsp;구현하지&amp;nbsp;않는다면&amp;nbsp;동일한&amp;nbsp;위험&amp;nbsp;부담이&amp;nbsp;있다.&amp;nbsp;서비스&amp;nbsp;게이트웨이를&amp;nbsp;구현할&lt;br /&gt;때는&amp;nbsp;다음을&amp;nbsp;염두에&amp;nbsp;두기&amp;nbsp;바란다.&lt;br /&gt;로드&amp;nbsp;밸런서는&amp;nbsp;각&amp;nbsp;서비스&amp;nbsp;그룹&amp;nbsp;앞에&amp;nbsp;있을&amp;nbsp;때&amp;nbsp;여전히&amp;nbsp;유용하다.&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;이때&amp;nbsp;여러&amp;nbsp;서비스&amp;nbsp;게이트웨이&amp;nbsp;인스턴스&amp;nbsp;앞에&amp;nbsp;로드&amp;nbsp;밸런&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;서를 두는 것은 적절한 설계이며, 서비스 게이트웨이를 확장할 수 있다.&lt;/span&gt; 모든 서비스 인스턴스 앞에 로드 밸런서를 두&lt;br /&gt;는 것은 병목점(chokepoint)이 될 수 있어 좋은 생각은 아니다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;작성하는&amp;nbsp;서비스&amp;nbsp;게이트웨이&amp;nbsp;코드를&amp;nbsp;무상태(stateless)&lt;/span&gt;로&amp;nbsp;유지하자.&amp;nbsp;서비스&amp;nbsp;게이트웨이의&amp;nbsp;정보를&amp;nbsp;메모리에&amp;nbsp;저장하지&lt;br /&gt;밀자.&amp;nbsp;주의하지&amp;nbsp;않으면&amp;nbsp;게이트웨이의&amp;nbsp;확장성을&amp;nbsp;제한하고&amp;nbsp;모든&amp;nbsp;서비스&amp;nbsp;게이트웨이&amp;nbsp;인스턴스에&amp;nbsp;데이터가&amp;nbsp;복제되도록&amp;nbsp;해&lt;br /&gt;야한다.&lt;br /&gt;작성하는 서비스 게이트웨이 코드를 가법게 유지하자. 서비스 게이트웨이는 서비스 호출에 대한 '병목점'이다. 여러 데&lt;br /&gt;이터베이스&amp;nbsp;호출이&amp;nbsp;포함된&amp;nbsp;복잡한&amp;nbsp;코드는&amp;nbsp;서비스&amp;nbsp;게이트웨이에서&amp;nbsp;추적하기&amp;nbsp;힘든&amp;nbsp;성능&amp;nbsp;문제의&amp;nbsp;원인이&amp;nbsp;된다.&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/354</guid>
      <comments>https://darkstart.tistory.com/354#entry354comment</comments>
      <pubDate>Fri, 2 Feb 2024 21:13:07 +0900</pubDate>
    </item>
    <item>
      <title>[gradle] 라이브러리 의존성 추적하기</title>
      <link>https://darkstart.tistory.com/353</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그래들을 사용하다보면 라이브러리가 어떤 디펜던시에 의해 생겼는지 알기가 어려워서 곤란한 적이 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 검색 중에 그 방법을 찾았다~!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 사용하면 된다!&lt;/p&gt;
&lt;pre id=&quot;code_1702535388509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./gradlew dependencyInsight --dependency &quot;junit:junit&quot; --configuration &quot;testCompileClasspath&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예제는 테스트 환경에서 junit 라이브러리가 어디서 가져오고 있는지를 알아내는 명령어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 Junit5를 사용하려고 하는데 Junit4가 포함되어 있어서 그 원인을 찾고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 아래와 같은 형식으로 나온다.&lt;/p&gt;
&lt;pre id=&quot;code_1702535547940&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

&amp;gt; Task :dependencyInsight
junit:junit:4.13.2 (selected by rule)
   variant &quot;compile&quot; [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.environment     = standard-jvm
         org.gradle.jvm.version         = 17
   ]

junit:junit:4.10 -&amp;gt; 4.13.2
\--- com.googlecode.json-simple:json-simple:1.1.1
     \--- testCompileClasspath

org.junit:junit-bom:5.9.1
   variant &quot;apiElements&quot; [
      org.gradle.category            = platform
      org.gradle.usage               = java-api
      org.gradle.status              = release (not requested)

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.environment     = standard-jvm
         org.gradle.libraryelements     = classes
         org.gradle.jvm.version         = 17
   ]

org.junit:junit-bom:5.9.1
+--- org.junit.jupiter:junit-jupiter:5.9.1
|    +--- org.springframework.boot:spring-boot-starter-test:3.0.1
|    |    \--- testCompileClasspath (requested org.springframework.boot:spring-boot-starter-test)
|    \--- org.junit:junit-bom:5.9.1 (*)
+--- org.junit.jupiter:junit-jupiter-api:5.9.1
|    +--- org.junit.jupiter:junit-jupiter-params:5.9.1
|    |    +--- org.junit:junit-bom:5.9.1 (*)
|    |    \--- org.junit.jupiter:junit-jupiter:5.9.1 (*)
|    +--- org.junit:junit-bom:5.9.1 (*)
|    \--- org.junit.jupiter:junit-jupiter:5.9.1 (*)
+--- org.junit.jupiter:junit-jupiter-params:5.9.1 (*)
\--- org.junit.platform:junit-platform-commons:1.9.1
     +--- org.junit.jupiter:junit-jupiter-api:5.9.1 (*)
     \--- org.junit:junit-bom:5.9.1 (*)

(*) - dependencies omitted (listed previously)

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 8s
1 actionable task: 1 executed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 위를 근거로&lt;/p&gt;
&lt;pre id=&quot;code_1702536718791&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	implementation('com.googlecode.json-simple:json-simple:1.1.1') {
		exclude group: 'junit', module: 'junit' // [231214] junit4 버전 제외
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래들을 수정했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://dev.to/art_ptushkin/how-to-properly-ignore-junit-4-in-gradle-and-maven-3o82&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev.to/art_ptushkin/how-to-properly-ignore-junit-4-in-gradle-and-maven-3o82&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/353</guid>
      <comments>https://darkstart.tistory.com/353#entry353comment</comments>
      <pubDate>Thu, 14 Dec 2023 15:33:13 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스] 쉘에서 base64인코딩 쉽게 하기</title>
      <link>https://darkstart.tistory.com/351</link>
      <description>&lt;pre id=&quot;code_1702199607362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo -ne password123 | base64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo 옵션으로 -ne를 주고 인코딩할 값을 입력하고 파이프로 base64로 주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo -n 옵션은 에코 결과값을 개행하지 않겠다는, 1줄로 표시하겠다는 것이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-e 옵션은 \t 과 같은 \ 와 사용되는 특수문자?를 인식하겠다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/351</guid>
      <comments>https://darkstart.tistory.com/351#entry351comment</comments>
      <pubDate>Sun, 10 Dec 2023 18:16:51 +0900</pubDate>
    </item>
    <item>
      <title>unknown shorthand flag: 'f' in -fSee 'docker --help'.</title>
      <link>https://darkstart.tistory.com/350</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Mattermost 설치 중&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700858780948&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 사용하라는 부분이 있어서 사용을 했더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;unknown&amp;nbsp;shorthand&amp;nbsp;flag:&amp;nbsp;'f'&amp;nbsp;in&amp;nbsp;-fSee&amp;nbsp;'docker&amp;nbsp;--help'.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커와 도커 컴포즈 2버전을 써서 생긴 문제인지는 잘 모르겠으나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker compose 대신 docker-compose 명령어를 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1700858838843&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo docker-compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/350</guid>
      <comments>https://darkstart.tistory.com/350#entry350comment</comments>
      <pubDate>Sat, 25 Nov 2023 05:48:04 +0900</pubDate>
    </item>
    <item>
      <title>[devops] 방화벽(firewall)에 대해</title>
      <link>https://darkstart.tistory.com/349</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffe6e6; color: #1b58ff;&quot;&gt;&lt;b&gt;◆ Stateful Firewall과 Stateless Firewall&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-39d14ad5-b6b2-4857-b21c-8d67f255b2b1&quot; style=&quot;background-color: #ffffff; color: #8a8a8a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-32cda9fd-90f3-4f96-a17a-a8896633d641&quot; style=&quot;background-color: #ffffff; color: #8a8a8a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Stateful Firewall과 Stateless Firewall은 일반적으로 Network Firewall로 분류되어 IP 주소와 Port 번호를 기반으로 트래픽을 제어합니다. 그러나, 두 방화벽의 작동 방식은 전혀 다릅니다. Stateful Firewall은 트래픽의 허용 여부를 패킷의 상태와 맥락에 따라 판단하고 Stateless Firewall은 오로지 사용자가 사전에 정의한 정책에 의해서만 판단합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-62039a68-72e3-4b4e-9670-1656a578bce8&quot; style=&quot;background-color: #ffffff; color: #8a8a8a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ec0924e4-e50a-4d27-967a-a11a64bb5510&quot; style=&quot;background-color: #ffffff; color: #8a8a8a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;예를 들어, &lt;b&gt;Stateful Firewall은 80번 포트에 대한 요청(Request)이 허용된 경우, &lt;span style=&quot;color: #ee2323;&quot;&gt;해당 요청과 관련된 응답(Response)은 사용자가 명시적으로 설정하지 않아도 허용합니다.&lt;/span&gt; 반면, Stateless 방화벽은 80번 포트에 대한 요청과 응답을 모두 허용해야만 80번 포트를 통한 통신을 원활히 수행할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5253bb4b-ecdb-49e6-afbb-acd4d5c1a689&quot; style=&quot;background-color: #ffffff; color: #8a8a8a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-456cebe9-ac7d-49d7-a894-7ed67c6aa74b&quot; style=&quot;background-color: #ffffff; color: #8a8a8a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Stateful Firewall은 위와 같은 특징으로 편리하게 사용할 수 있는 방화벽입니다. 다만, 명시적으로 정의하지 않은 트래픽도 허용되는 만큼 사용하는데 주의가 필요할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://blog.naver.com/nhncloud_official/223266592689&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/nhncloud_official/223266592689&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/349</guid>
      <comments>https://darkstart.tistory.com/349#entry349comment</comments>
      <pubDate>Sat, 18 Nov 2023 15:01:14 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스] ssh, sftp 간단 정리</title>
      <link>https://darkstart.tistory.com/348</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;791&quot; data-ke-size=&quot;size16&quot;&gt;접속하고자하는 &lt;b&gt;클라이언트 서버(src)에서 ssh-keygen으로 개인키, 공개키 생성을 한 후 공개키&lt;/b&gt;를&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;접속하고자하는 &lt;b&gt;리모트 서버(dst)의 특정 유저 계정의 .ssh 폴더에 authorized_keys 파일을 만들 후 공개키들을 한 줄씩 추가&lt;/b&gt;하면 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;리모트 서버의 .ssh 폴더의 authorized_keys에 클라이언트 서버의 공개키를 넣는다는 것이 의미하는 것 자체가 이 클라이언트 서버의 접속을 허용하겠다라는 것이다. 이 동작을 하려면 리모트 서버에 대한 접근 권한이 있어야 하니깐.&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;ssh와 sftp는 동일하게 포트 22번을 사용한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot;&gt;(클라이언트 서버): $ssh  &amp;lt;리모트 유저 계정&amp;gt;@&amp;lt;리모트 서버 ip&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #e9f2ff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;(클라이언트 서버): $ssh ssh-user@ip-1-2-3-4&lt;br /&gt;(클라이언트 서버) $sftp sftp-user@ip-1-2-3-4&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/348</guid>
      <comments>https://darkstart.tistory.com/348#entry348comment</comments>
      <pubDate>Fri, 10 Nov 2023 10:49:08 +0900</pubDate>
    </item>
    <item>
      <title>[devops] DSR(Dynamic Source Routing protocol)</title>
      <link>https://darkstart.tistory.com/347</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;음.. 로드밸런서를 통해 목적지에 도달한 request.. 그리고 그 이후에 response가 어떻게 클라이언트로 돌아가게 되는지 궁금했는데 로드밸런서가 바로 ip 위치를 담아서.. request를 보내는 것 같다. ㅎㅎ;; 신기하네.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #323752; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;DSR(Dynamic Source Routing protocol)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-15B1BC16-FCA1-4E60-B84D-250A881606D5&quot; style=&quot;background-color: #ffffff; color: #323752; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt; - 서버에서 유저에게 돌아갈 때 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;u&gt;&lt;b&gt;로드밸런서&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;는 네트워크 스위치를 거치지 않고 바로 클라이언트로 찾아갈 수 있게 클라이언트 IP를 전달해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-200445DF-2D7F-4E3A-A6DE-EE491A137AB7&quot; style=&quot;background-color: #ffffff; color: #323752; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[출처]&lt;/b&gt; &lt;a style=&quot;color: #000000;&quot; href=&quot;https://blog.naver.com/rlagnlwls0127/222897934983&quot;&gt;로드밸런서(Load Balancer)란 무엇인가?&lt;/a&gt;&lt;span&gt;|&lt;/span&gt;&lt;b&gt;작성자&lt;/b&gt; &lt;a style=&quot;color: #000000;&quot; href=&quot;https://blog.naver.com/rlagnlwls0127&quot;&gt;rlagnlwls0127&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/347</guid>
      <comments>https://darkstart.tistory.com/347#entry347comment</comments>
      <pubDate>Tue, 31 Oct 2023 15:12:07 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps]Route 53 프라이빗 호스팅 영역을 다른 AWS 계정의 VPC와 연결하려면 어떻게 해야 하나요?</title>
      <link>https://darkstart.tistory.com/346</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://repost.aws/ko/knowledge-center/route53-private-hosted-zone&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://repost.aws/ko/knowledge-center/route53-private-hosted-zone&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698674337749&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Route 53 프라이빗 호스팅 영역을 다른 AWS 계정의 VPC와 연결&quot; data-og-description=&quot;Amazon Route 53 프라이빗 호스팅 영역을 다른 AWS 계정에 속한 Virtual Private Cloud(VPC)와 연결하고 싶습니다.&quot; data-og-host=&quot;repost.aws&quot; data-og-source-url=&quot;https://repost.aws/ko/knowledge-center/route53-private-hosted-zone&quot; data-og-url=&quot;https://repost.aws/ko/knowledge-center/route53-private-hosted-zone&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rBR2Q/hyUklQeZt2/8zvSryNACOtw4DhceR5iF1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://repost.aws/ko/knowledge-center/route53-private-hosted-zone&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://repost.aws/ko/knowledge-center/route53-private-hosted-zone&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rBR2Q/hyUklQeZt2/8zvSryNACOtw4DhceR5iF1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Route 53 프라이빗 호스팅 영역을 다른 AWS 계정의 VPC와 연결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon Route 53 프라이빗 호스팅 영역을 다른 AWS 계정에 속한 Virtual Private Cloud(VPC)와 연결하고 싶습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;repost.aws&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; AWS CLI로만 연결이 가능하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결된 것은 AWS Route53의 프라이빗 도메인의 &lt;b&gt;호스팅 세부영역&lt;/b&gt;에서 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #000000; text-align: center;&quot;&gt;
&lt;div data-test=&quot;total-votes&quot;&gt;0&lt;/div&gt;
&lt;span style=&quot;color: #535d69; text-align: center;&quot; data-test=&quot;downvote&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #232f3e; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div data-test=&quot;kcArticle-description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon Route 53 프라이빗 호스팅 영역을 다른 AWS 계정에 속한 Virtual Private Cloud(VPC)와 연결하고 싶습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div data-test=&quot;kcArticle-body&quot;&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 해결 방법에서는 다음 옵션 중 하나를 사용하여 명령을 실행합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;옵션 1:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AWS Command Line Interface(AWS CLI). 이 해결 방법에서는 두 가지 예제 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스(하나는 계정 A에, 다른 하나는 계정 B에 있음)를 사용합니다. 두 개의 Amazon EC2 인스턴스가 없거나 새 EC2 인스턴스를 시작할 수 있는 액세스 권한이 없는 경우에는 로컬 시스템에서 AWS CLI를 사용합니다. 두 계정의 올바른 AWS Identity and Access Management(AWS IAM) 보안 인증 정보를 사용합니다. 자세한 내용은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0073bb;&quot; href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/sso-using-profile.html&quot;&gt;IAM Identity Center에서 활성화된 명명된 프로필 사용&lt;/a&gt;을 참조합니다.&lt;br /&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AWS CLI 명령을 실행할 때 오류가 발생한다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0073bb;&quot; href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-troubleshooting.html&quot;&gt;최신 AWS CLI 버전을 사용하고 있는지 확인합니다&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;옵션 2:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0073bb;&quot; href=&quot;https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html&quot;&gt;AWS CloudShell&lt;/a&gt;(AWS CLI 미설치)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 프로세스에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0073bb;&quot; href=&quot;https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-associate-vpcs-different-accounts.html&quot;&gt;AWS SDK 또는 Route 53 API&lt;/a&gt;를 사용할 수도 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;계정 A의 EC2 인스턴스에 연결합니다.&lt;/li&gt;
&lt;li&gt;AWS CLI를 사용하는 경우 다음 명령을 실행하여 AWS CLI 버전을 업데이트합니다. Route 53 액세스 권한이 있는 AWS Identity and Access Management(AWS IAM) 사용자의 보안 인증을 사용하도록 AWS CLI를 구성합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;brainfuck&quot; style=&quot;background-color: #e4e5e5; color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;pip3 install awscli --upgrade --user&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;계정 A의 EC2 인스턴스에서 다음 명령을 실행하여 사용 가능한 호스팅 영역을 나열합니다. 계정 B와 연결하려는 계정 A의 호스팅 영역 ID를 기록해 둡니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;background-color: #e4e5e5; color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;aws route53 list-hosted-zones&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;계정 A의 EC2 인스턴스에서 다음 명령을 실행합니다. 명령 결과에는 프라이빗 호스팅 영역에 연결할 수 있는 다른 계정의 VPC가 나열됩니다. 명령 결과에 나열된 계정은 하나 이상의 ** CreateVPCAssociationAuthorization** 요청을 제출한 계정입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;dsconfig&quot; style=&quot;background-color: #e4e5e5; color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;aws route53 list-vpc-association-authorizations --hosted-zone-id &amp;lt;hosted-zone-id&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;계정 B의 VPC가 VPC 연결 승인 목록에 나타나지 않는다면, 5단계로 진행합니다. VPC가 목록에 표시된다면, 6단계로 진행합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;계정 A의 EC2 인스턴스에서 다음 명령을 실행합니다. 이 명령은 계정 A의 프라이빗 호스팅 영역과 계정 B의 VPC 간의 연결을 승인합니다. 다음 명령은 이전 단계에서 얻은 호스팅 영역 ID를 사용합니다. 계정 B의 VPC AWS 리전 및 ID를 사용합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;: 다음 시나리오에 해당하는 상황이라면, 명령에**--region** 명령을 입력합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 리전의 EC2 인스턴스에서 명령을 실행하고 있습니다.&lt;/li&gt;
&lt;li&gt;사용자의 보안 인증 정보가 us-east-1 이외의 리전과 연결되어 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dsconfig&quot; style=&quot;background-color: #e4e5e5; color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;aws route53 create-vpc-association-authorization --hosted-zone-id &amp;lt;hosted-zone-id&amp;gt; --vpc VPCRegion=&amp;lt;region&amp;gt;,VPCId=&amp;lt;vpc-id&amp;gt; --region us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;계정 B의 EC2 인스턴스에 연결합니다.&lt;/li&gt;
&lt;li&gt;계정 B의 EC2 인스턴스에서 다음 명령을 실행합니다. 이 명령은 계정 A의 프라이빗 호스팅 영역과 계정 B의 VPC 간에 연결을 생성합니다. 3단계의 호스팅 영역 ID를 사용합니다. 계정 B의 VPC 리전 및 ID를 사용합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0073bb;&quot; href=&quot;https://docs.aws.amazon.com/Route53/latest/APIReference/API_AssociateVPCWithHostedZone.html&quot;&gt;AssociateVPCWithHostedZone&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0073bb;&quot; href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html&quot;&gt;DescribeVpcs&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;API 권한을 가진 IAM 사용자 또는 역할을 사용하여 계정 B에서 다음 명령을 실행합니다.&lt;/p&gt;
&lt;pre class=&quot;gml&quot; style=&quot;background-color: #e4e5e5; color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;aws route53 associate-vpc-with-hosted-zone --hosted-zone-id &amp;lt;hosted-zone-id&amp;gt; --vpc VPCRegion=&amp;lt;region&amp;gt;,VPCId=&amp;lt;vpc-id&amp;gt; --region us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**참고:**샘플 결과는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;PENDING&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상태가 표시될 수 있습니다. 이는 VPC가 프라이빗 호스팅 영역을 사용하여 DNS 확인을 수행할 수 없기 때문에 발생합니다. 프라이빗 호스팅 영역이 VPC와 연결되고 변경 사항이 전파되는 데 몇 분 정도 걸릴 수 있습니다./p &amp;gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;연결을 생성한 후에는 연결 승인을 삭제하는 것이 가장 좋습니다. 이 단계를 진행하면 나중에 동일한 연결을 다시 만들 수 없습니다. 승인을 삭제하려면 계정 A의 EC2 인스턴스에 다시 연결한 후 다음 명령을 실행합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;dsconfig&quot; style=&quot;background-color: #e4e5e5; color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;aws route53 delete-vpc-association-authorization --hosted-zone-id &amp;lt;hosted-zone-id&amp;gt;  --vpc VPCRegion=&amp;lt;region&amp;gt;,VPCId=&amp;lt;vpc-id&amp;gt; --region us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프라이빗 호스팅 영역에 대한 VPC 연결을 확인하려면 다음 단계를 완료합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0073bb;&quot; href=&quot;https://console.aws.amazon.com/route53/&quot;&gt;Route 53 콘솔&lt;/a&gt;을 엽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이빗 호스팅 영역 도메인 이름을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정 B&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;호스팅 영역 세부 정보&lt;/b&gt;의 VPC ID를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 계정 B의 VPC에 있는 EC2 인스턴스가 계정 A의 프라이빗 호스팅 영역에 있는 레코드를 확인할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/346</guid>
      <comments>https://darkstart.tistory.com/346#entry346comment</comments>
      <pubDate>Mon, 30 Oct 2023 22:58:19 +0900</pubDate>
    </item>
    <item>
      <title>[devOps] AWS 서버간 통신 문제</title>
      <link>https://darkstart.tistory.com/345</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;좀 된일이라 기억이 잘 나지 않는데.. 기억을 되살려거 기록으로 남겨 놓으려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 시간이 없어서 답변 받은 것만 남기고 나중에 상황을 다시 정리해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버간&amp;nbsp;통신은&amp;nbsp;내부통신으로&amp;nbsp;외부접근용&amp;nbsp;ALB를&amp;nbsp;타지않기때문에&amp;nbsp;EC2에&amp;nbsp;SG로&amp;nbsp;오픈해줘야&amp;nbsp;합니다.&lt;br /&gt;도메인으로&amp;nbsp;호출을&amp;nbsp;위해서는&amp;nbsp;기존&amp;nbsp;ALB가&amp;nbsp;아닌&amp;nbsp;private&amp;nbsp;ALB를&amp;nbsp;생성해야하고,&amp;nbsp;도메인또한&amp;nbsp;내부호출용&amp;nbsp;도메인을&amp;nbsp;새로&amp;nbsp;따서&amp;nbsp;할당해&amp;nbsp;주어야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버간&amp;nbsp;접근은&amp;nbsp;현재&amp;nbsp;내부ip(10.x대역)로&amp;nbsp;해야하고&amp;nbsp;도메인으로&amp;nbsp;호출이&amp;nbsp;필요할경우&amp;nbsp;별도&amp;nbsp;내부lb와&amp;nbsp;내부도메인을&amp;nbsp;따서&amp;nbsp;진행해야합니다.&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/345</guid>
      <comments>https://darkstart.tistory.com/345#entry345comment</comments>
      <pubDate>Fri, 20 Oct 2023 10:43:23 +0900</pubDate>
    </item>
    <item>
      <title>[db] mariadb &amp;amp; flyway 사용시 case 키워드 사용시 에러 발생</title>
      <link>https://darkstart.tistory.com/344</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;case 문을 if문으로 실행하면 flyway 마이그레이션이 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev-handbook.tistory.com/90&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev-handbook.tistory.com/90&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697694705390&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MariaDB] MariaDB 10.1, 10.2 시퀀스 기능 구현&quot; data-og-description=&quot;cafe24에 포팅 작업을 하면서 DB는 MariaDB로 알고 비교적 최근 버전의 안정화 버전을 사용을 해서 포팅 작업을 진행했습니다. 원래는 포팅 하려는 시스템의 환경과 소프트웨어의 버전을 정확하게 &quot; data-og-host=&quot;dev-handbook.tistory.com&quot; data-og-source-url=&quot;https://dev-handbook.tistory.com/90&quot; data-og-url=&quot;https://dev-handbook.tistory.com/90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bC0RFC/hyUdPRxjL2/ovc0PQcdULVvCmZuK4JuFK/img.png?width=800&amp;amp;height=124&amp;amp;face=0_0_800_124,https://scrap.kakaocdn.net/dn/c6ZPXB/hyUgRtmjTt/Z7pfH7t8tKfCBY2UGwVjI1/img.png?width=800&amp;amp;height=124&amp;amp;face=0_0_800_124,https://scrap.kakaocdn.net/dn/jV8rz/hyUgPWBNWe/Kg6UESHGNzvM0RwgyXvxi1/img.png?width=1638&amp;amp;height=255&amp;amp;face=0_0_1638_255&quot;&gt;&lt;a href=&quot;https://dev-handbook.tistory.com/90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-handbook.tistory.com/90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bC0RFC/hyUdPRxjL2/ovc0PQcdULVvCmZuK4JuFK/img.png?width=800&amp;amp;height=124&amp;amp;face=0_0_800_124,https://scrap.kakaocdn.net/dn/c6ZPXB/hyUgRtmjTt/Z7pfH7t8tKfCBY2UGwVjI1/img.png?width=800&amp;amp;height=124&amp;amp;face=0_0_800_124,https://scrap.kakaocdn.net/dn/jV8rz/hyUgPWBNWe/Kg6UESHGNzvM0RwgyXvxi1/img.png?width=1638&amp;amp;height=255&amp;amp;face=0_0_1638_255');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MariaDB] MariaDB 10.1, 10.2 시퀀스 기능 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;cafe24에 포팅 작업을 하면서 DB는 MariaDB로 알고 비교적 최근 버전의 안정화 버전을 사용을 해서 포팅 작업을 진행했습니다. 원래는 포팅 하려는 시스템의 환경과 소프트웨어의 버전을 정확하게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-handbook.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 링크대로 routine의 top과 bottom에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697694744311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DELIMITER //

&amp;lt;.. 코드 .. &amp;gt;
//
DELIMITER ;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 처럼 넣어주니 잘 동작한다. flyway의 문제가 아니라 mariadb의 문제인가? 흠.. 둘의 호환성 문제인가.. ㅎㅎ&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/344</guid>
      <comments>https://darkstart.tistory.com/344#entry344comment</comments>
      <pubDate>Thu, 19 Oct 2023 14:53:12 +0900</pubDate>
    </item>
    <item>
      <title>[devOps] TGW로 연결된 EC2끼리 통신이 안될 때 확인해볼 것</title>
      <link>https://darkstart.tistory.com/343</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VPC -&amp;gt;&lt;span style=&quot;color: #000000; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Transit Gateway -&amp;gt; &lt;b&gt;Transit Gateway 라우팅 테이블&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서 서로 연결이 되어있는지 확인을 해보자.&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/343</guid>
      <comments>https://darkstart.tistory.com/343#entry343comment</comments>
      <pubDate>Thu, 19 Oct 2023 11:23:01 +0900</pubDate>
    </item>
    <item>
      <title>맥 캡(caps lock)키로 한/영 전화하는 방법</title>
      <link>https://darkstart.tistory.com/342</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 맥미니 2023을 새로 샀습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 한영 전환을 할 때 컨트롤 + 스페이스바로도 하지만 불편하기 때문에 캡키로 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 새 맥에서는 그게 안되더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 키로 변환할 수 있게 되어있는데 2키의 조합으로만 되는 것 같았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 캡 키로만 변환되면 되기에 메뉴를 이리저리 찾아봤더니 여기에 그 옵션이 있네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진에서 빨간색 부분을 활성화 시켜 주시면 됩니다 ㅎㅎ;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 것 떄문에 새 맥미니에서 한영 전환이 잘 안되서 진짜 불편했었습니다..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-09-01 at 4.53.30 PM.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqZNE0/btssHA8Ex9e/TU0JUx2kvXgksyc3PwiQTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqZNE0/btssHA8Ex9e/TU0JUx2kvXgksyc3PwiQTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqZNE0/btssHA8Ex9e/TU0JUx2kvXgksyc3PwiQTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqZNE0%2FbtssHA8Ex9e%2FTU0JUx2kvXgksyc3PwiQTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1458&quot; height=&quot;1306&quot; data-filename=&quot;Screenshot 2023-09-01 at 4.53.30 PM.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>맥</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/342</guid>
      <comments>https://darkstart.tistory.com/342#entry342comment</comments>
      <pubDate>Fri, 1 Sep 2023 17:00:12 +0900</pubDate>
    </item>
    <item>
      <title>java.lang.IllegalArgumentException: restricted header name: &amp;quot;Connection&amp;quot;</title>
      <link>https://darkstart.tistory.com/340</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;새 컴퓨터에 이클립스를 설치하고 기존 프로젝트를 다운받아 실행을 하니 아래의 에러가 발생했다. jdk, jre 등이 달라져서 그런가 했는데 그게 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;java.lang.IllegalArgumentException:&amp;nbsp;restricted&amp;nbsp;header&amp;nbsp;name:&amp;nbsp;&quot;Connection&quot;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;at&amp;nbsp;java.net.http/jdk.internal.net.http.common.Utils.newIAE(Utils.java:282)&lt;br /&gt;at&amp;nbsp;java.net.http/jdk.internal.net.http.HttpRequestBuilderImpl.checkNameAndValue(HttpRequestBuilderImpl.java:110)&lt;br /&gt;at&amp;nbsp;java.net.http/jdk.internal.net.http.HttpRequestBuilderImpl.header(HttpRequestBuilderImpl.java:126)&lt;br /&gt;at&amp;nbsp;java.net.http/jdk.internal.net.http.HttpRequestBuilderImpl.headers(HttpRequestBuilderImpl.java:140)&lt;br /&gt;at java.net.http/jdk.internal.net.http.HttpRequestBuilderImpl.headers(HttpRequestBuilderImpl.java:43)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진과 코드를 참고하여 VM 옵션을 추가하면 된다. 기록을 자주 해야 하는데 바쁘다는 핑계로 잘 못하고 있다. 간단하게라도 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;2100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1SMnk/btso6j2xbeC/LakN7KmXFI5b8zg2Rkakf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1SMnk/btso6j2xbeC/LakN7KmXFI5b8zg2Rkakf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1SMnk/btso6j2xbeC/LakN7KmXFI5b8zg2Rkakf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1SMnk%2Fbtso6j2xbeC%2FLakN7KmXFI5b8zg2Rkakf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;854&quot; height=&quot;2100&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;2100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;1336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Ug1v/btso6MpQ5W4/C5J25wCgfmpJZ8ZV0YsLs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Ug1v/btso6MpQ5W4/C5J25wCgfmpJZ8ZV0YsLs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Ug1v/btso6MpQ5W4/C5J25wCgfmpJZ8ZV0YsLs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Ug1v%2Fbtso6MpQ5W4%2FC5J25wCgfmpJZ8ZV0YsLs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1656&quot; height=&quot;1336&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;1336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1690371179702&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-Djdk.httpclient.allowRestrictedHeaders=connection,content-length,host&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/자바</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/340</guid>
      <comments>https://darkstart.tistory.com/340#entry340comment</comments>
      <pubDate>Wed, 26 Jul 2023 20:33:53 +0900</pubDate>
    </item>
    <item>
      <title>[DB] 연결된 커넥션 수/허용되는 최대 커넥션 수 확인하는 쿼리</title>
      <link>https://darkstart.tistory.com/337</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671776338680&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 현재 연결된 커넥션 수
show status like 'threads_connected';

-- 허용하는 최대 커넥션 수
show variables like 'max_connections';&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/337</guid>
      <comments>https://darkstart.tistory.com/337#entry337comment</comments>
      <pubDate>Fri, 23 Dec 2022 15:19:04 +0900</pubDate>
    </item>
    <item>
      <title>[서버] AWS EMR script에 찍은 로그 보는 방법</title>
      <link>https://darkstart.tistory.com/335</link>
      <description>&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인증키 준비하기(***.pem 파일)&lt;/li&gt;
&lt;li&gt;적당한 경로로 옮기고 파일 접근권한 강화하기
&lt;div&gt;
&lt;div id=&quot;highlighter_315120&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;chmod&lt;span&gt;&amp;nbsp;&lt;/span&gt;600&lt;span&gt;&amp;nbsp;&lt;/span&gt;***.pem&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;emr 접속하기 (여기서 ip주소는 aws emr 에서 보이는 마스터 주소)
&lt;div&gt;
&lt;div id=&quot;highlighter_881946&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;ssh -i &amp;lt;***.pem 경로&amp;gt; hadoop@10.10.10.10&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;아래의 명령어를 치면서 변경한 스크립트 이름 뜰 때까지 반복하기(더 효율적인 방법이 있을텐데 흠)
&lt;div&gt;
&lt;div id=&quot;highlighter_581909&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;yarn application -list&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
해당 스크립트가 실행 완료된 다음에 아래 과정에서 로그를 떠야 제대로 된 로그가 보임(스크립트 실행 완료에는 시간이 어느 정도 걸림)&lt;/li&gt;
&lt;li&gt;로그 보기&lt;br /&gt;앞서 구한 Application-Id를 이용해서 파일로 만들고 vim 등의 툴로 내용을 보자.&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;highlighter_565178&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;yarn logs -applicationId=&amp;lt;applicationId&amp;gt; &amp;gt; &amp;lt;applicationId&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
그리고 vim 내에서 /를 누르고 검색할 단어를 입력하고 엔터 누르기&lt;br /&gt;(이 상태에서 n을 누르면 다음 단어, N을 누르면 이전 단어를 찾게 됨)
&lt;div&gt;
&lt;div id=&quot;highlighter_220115&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;vim &amp;lt;applicationId&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/335</guid>
      <comments>https://darkstart.tistory.com/335#entry335comment</comments>
      <pubDate>Wed, 30 Nov 2022 22:04:13 +0900</pubDate>
    </item>
    <item>
      <title>[자바] 현재 애플리케이션이 구동되는 위치 구하기</title>
      <link>https://darkstart.tistory.com/334</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 경로를 알아야 이를 기반으로 다른 파일의 위치를 지정해줄 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1668331233529&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;      Path currentRelativePath = Paths.get(&quot;&quot;);
      String s = currentRelativePath.toAbsolutePath().toString();
      System.out.println(&quot;Current absolute path is: &quot; + s);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/15954821/7225691&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/a/15954821/7225691&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/자바</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/334</guid>
      <comments>https://darkstart.tistory.com/334#entry334comment</comments>
      <pubDate>Sun, 13 Nov 2022 18:21:14 +0900</pubDate>
    </item>
    <item>
      <title>[스프링] Spring Data JPA VS JPA</title>
      <link>https://darkstart.tistory.com/333</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 제 기억 보존을 위해 간단하게 자료 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진은 아주 멋진 사진인데, 어디서 구했는지 출처를 몰라 출처를 못남기네요.. 죄송합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 처럼 스프링 부트부터 시작한 사람들은 Spring Data JPA와 JPA가 뭔지 혼동될 떄가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트에서는 편의를 위해 Spring Data JPA를 씁니다. 흔히 JpaRepository를 extends해서 사용해서 사용이 편리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 JPA는.. 저에게는 과거의 자료 스프링 부트가 나오기 전?에 쓰이던&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EntityManager를 사용하는 그 기술?이 JPA입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA를 보다 손쉽게 사용할 수 있게 해주는게 Spring Data JPA이고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트를 사용하는 여러분들이라면 이미 이것을 쓰고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 보통 JPA의 구현체로는 하이버네이트를 사용하구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2022-11-13-17-31-49.png&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;1312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7YUd3/btrQ65Wum3N/5o27laKM4jp4wBK9GVVi0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7YUd3/btrQ65Wum3N/5o27laKM4jp4wBK9GVVi0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7YUd3/btrQ65Wum3N/5o27laKM4jp4wBK9GVVi0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7YUd3%2FbtrQ65Wum3N%2F5o27laKM4jp4wBK9GVVi0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1992&quot; height=&quot;1312&quot; data-filename=&quot;KakaoTalk_Photo_2022-11-13-17-31-49.png&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;1312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/333</guid>
      <comments>https://darkstart.tistory.com/333#entry333comment</comments>
      <pubDate>Sun, 13 Nov 2022 17:37:58 +0900</pubDate>
    </item>
    <item>
      <title>[스프링] pod 힙 덤프 뜨는 방법과 인텔리제이에서 profiler로 보는 법</title>
      <link>https://darkstart.tistory.com/331</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 시간이 부족해 간단하게 과정만 글로 남기니 양해 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 주의: 파드 힙 덤프를 뜨면 gc가 발생하는 것으로 알고 있음. 상용환경에서 괜찮을지 확인 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문제의 파드 접근하기(pod의 이름이 my-pod 이라고 가정)&lt;/p&gt;
&lt;pre id=&quot;code_1666858307008&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl exec -it my-pod sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 파드 셀에서 힘 덤프 떠주는 프로그램 설치하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pod shell 모드로 진입 후 아래의 명령어로 jattach 설치하기(&lt;a href=&quot;https://github.com/apangin/jattach&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/apangin/jattach&lt;/a&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1666858378154&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apk add --no-cache jattach --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 실행&amp;nbsp;중인&amp;nbsp;프로세스&amp;nbsp;확인하기&lt;br /&gt;아래의&amp;nbsp;명령어로&amp;nbsp;간단하게&amp;nbsp;실행&amp;nbsp;중인&amp;nbsp;프로세스를&amp;nbsp;확인하자.&amp;nbsp;ax옵션은&amp;nbsp;BSD&amp;nbsp;포멧으로&amp;nbsp;출력하는&amp;nbsp;옵션이라고&amp;nbsp;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1666858486505&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ps ax&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오전 11.20.58.png&quot; data-origin-width=&quot;2276&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zMxIY/btrPJnxMnAR/kb9nHSnzQfjojvsOdmKuP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zMxIY/btrPJnxMnAR/kb9nHSnzQfjojvsOdmKuP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zMxIY/btrPJnxMnAR/kb9nHSnzQfjojvsOdmKuP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzMxIY%2FbtrPJnxMnAR%2Fkb9nHSnzQfjojvsOdmKuP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2276&quot; height=&quot;352&quot; data-filename=&quot;스크린샷 2022-10-27 오전 11.20.58.png&quot; data-origin-width=&quot;2276&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어로 덤프 뜰 pid 확인(1번임)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.힙&amp;nbsp;덤프&amp;nbsp;파일&amp;nbsp;생성&lt;br /&gt;아래의&amp;nbsp;명령어로&amp;nbsp;POD에&amp;nbsp;힙&amp;nbsp;덤프&amp;nbsp;파일&amp;nbsp;생성&lt;/p&gt;
&lt;pre id=&quot;code_1666858539426&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jattach 1 dumpheap /tmp/java_pid1-$(date +%Y-%m-%d_%H-%M-%S).hprof&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 폴더로 가서 생성된 파일을 압축함(안그러면 로컬로 복사할 때 error: unexpected EOF 에러가 발생했음)&lt;/p&gt;
&lt;pre id=&quot;code_1666858755059&quot; class=&quot;angelscript&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gzip java_pid1-2022-10-27_02-25-38.hprof&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.덤프&amp;nbsp;뜬&amp;nbsp;파일&amp;nbsp;로컬로&amp;nbsp;복사하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pod&amp;nbsp;shell&amp;nbsp;모드&amp;nbsp;종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어로 pod 내 힙덤프파일을 로컬로 복사&lt;/p&gt;
&lt;pre id=&quot;code_1666858606691&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl cp {namespace}/{pod}:{filepath}/{filename} {localpath}/{localfilename}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1666858897073&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl cp my-qa2/my-pod:tmp/java_pid1-2022-10-27_02-25-38.hprof.gz heapdump/java_pid1-2022-10-27_02-25-38.hprof.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사가 성공하면 압축을 해제하자.&lt;/p&gt;
&lt;pre id=&quot;code_1666858856465&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gzip -d java_pid1-2022-10-27_02-25-38.hprof.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.분석툴로&amp;nbsp;힙덤프&amp;nbsp;분석해보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이에서&amp;nbsp;View&amp;nbsp;&amp;gt;&amp;nbsp;Tool&amp;nbsp;Windows&amp;nbsp;&amp;gt;&amp;nbsp;Profiler를&amp;nbsp;클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.23.46.png&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ruuO6/btrPJYqO91o/omnJI1okQcWKDET6ZsJkk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ruuO6/btrPJYqO91o/omnJI1okQcWKDET6ZsJkk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ruuO6/btrPJYqO91o/omnJI1okQcWKDET6ZsJkk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FruuO6%2FbtrPJYqO91o%2FomnJI1okQcWKDET6ZsJkk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2576&quot; height=&quot;930&quot; data-filename=&quot;스크린샷 2022-10-27 오후 4.23.46.png&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #172b4d;&quot;&gt;프로파일러 뷰가 열리면 Open snapsho: jfr or hproof file 을 클릭하고&amp;nbsp; 해당 파일을 열면 끝~&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/331</guid>
      <comments>https://darkstart.tistory.com/331#entry331comment</comments>
      <pubDate>Thu, 27 Oct 2022 17:24:17 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드] 구글 파이어베이스로 디버깅 쉽게 하기</title>
      <link>https://darkstart.tistory.com/330</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Crashlytics&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-26 오후 12.08.26.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crtQAe/btrAqI5WAOo/jQY3uUip6vKZxvk1Frs23K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crtQAe/btrAqI5WAOo/jQY3uUip6vKZxvk1Frs23K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crtQAe/btrAqI5WAOo/jQY3uUip6vKZxvk1Frs23K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrtQAe%2FbtrAqI5WAOo%2FjQY3uUip6vKZxvk1Frs23K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;466&quot; data-filename=&quot;스크린샷 2022-04-26 오후 12.08.26.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1650942632535&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Firebase.crashlytics.setUserId(userId)
Firebase.crashlytics.log(&quot;exception message : $myMessage&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린 코드에서 위와 같이 입력하고 예외가 발생하면 거의 실시간으로 Crashlytics에서 추가로 제공한 정보 확인 가능하기 때문에 디버깅이 더 쉬워짐.&lt;br /&gt;참고: &lt;a href=&quot;https://firebase.google.com/docs/crashlytics/customize-crash-reports?authuser=0&amp;amp;hl=ko&amp;amp;platform=android#kotlin+ktx&quot;&gt;https://firebase.google.com/docs/crashlytics/customize-crash-reports?authuser=0&amp;amp;hl=ko&amp;amp;platform=android#kotlin+ktx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. DebugView &amp;amp; Events&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-26 오후 12.12.40.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZWsxN/btrAqIdRkaj/0kfgl3FTYN3NTijfqDOftK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZWsxN/btrAqIdRkaj/0kfgl3FTYN3NTijfqDOftK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZWsxN/btrAqIdRkaj/0kfgl3FTYN3NTijfqDOftK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZWsxN%2FbtrAqIdRkaj%2F0kfgl3FTYN3NTijfqDOftK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2022-04-26 오후 12.12.40.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크래쉬를 발생시키지 않고도 파이어베이스에서 로그? 이벤트?를 확인할 수 있음.&lt;/p&gt;
&lt;pre id=&quot;code_1650943018371&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Firebase.analytics.setUserId(userId)
val bundle = Bundle()
bundle.putString(&quot;exceptions&quot;, exceptions)
Firebase.analytics.logEvent(&quot;message&quot;, bundle)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Crashlytics과 비슷하게 코드를 작성하면 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 Events에서는 4~5시간 정도 모아서 정보를 보여준다고 하므로 (4월 26일 오후 4시에 보고를 했는데 4월 27일 10시 5분 정도에 갱신이 됐음. 그러나 파이어베이스의 어낼리틱스 이벤트에서는 자세한 정보를 볼 수 없어서 그냥 어낼리틱스에서 자세한 정보를 볼 수 있는지 알아보는 중 -&amp;gt; 그냥 구글 어낼리틱스에서도 자세한 정보, 매개변수, 를 볼 수는 없는 것 같음.. 빅 쿼리? 등의 유료 플랜을 함께 사용해야 하는 것 같습니다.... 이럴거면 그냥 크래쉬 발생시키고 디버깅 하는게 나을듯 ㅜㅜ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간으로 Analytics가 동작하는지 보려면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1650943101442&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb shell setprop debug.firebase.analytics.app &amp;lt;package_name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 위의 명령어로 자신의 앱을 파이어베이스 어낼러틱스 디버깅모드로 전환을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 거의 실시간으로 이벤트 발생을 눈으로 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-26 오후 12.05.48.png&quot; data-origin-width=&quot;2882&quot; data-origin-height=&quot;2108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oIvoz/btrArdEFPfV/w1kPXe5F76D9eIt3Fn4VQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oIvoz/btrArdEFPfV/w1kPXe5F76D9eIt3Fn4VQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oIvoz/btrArdEFPfV/w1kPXe5F76D9eIt3Fn4VQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoIvoz%2FbtrArdEFPfV%2Fw1kPXe5F76D9eIt3Fn4VQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2882&quot; height=&quot;2108&quot; data-filename=&quot;스크린샷 2022-04-26 오후 12.05.48.png&quot; data-origin-width=&quot;2882&quot; data-origin-height=&quot;2108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅 테스트가 끝나면 아래의 명령어도 파이어베이스 어낼러틱스 디버깅 모드를 꺼주자.&lt;/p&gt;
&lt;pre id=&quot;code_1650943435087&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb shell setprop debug.firebase.analytics.app .none.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://support.google.com/analytics/answer/7201382?hl=ko&amp;amp;utm_id=ad&quot;&gt;https://support.google.com/analytics/answer/7201382?hl=ko&amp;amp;utm_id=ad&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/안드로이드</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/330</guid>
      <comments>https://darkstart.tistory.com/330#entry330comment</comments>
      <pubDate>Tue, 26 Apr 2022 12:24:39 +0900</pubDate>
    </item>
    <item>
      <title>맥에서 인텔 칩과 m1칩의 스프링 빌드 차이는 얼마나 날까?</title>
      <link>https://darkstart.tistory.com/329</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 시간이 없어서 간단히만 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 2019 맥북프로 16인치&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;인텔 i9 램 32GB&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;빌드 버튼 누르고 로컬 WAS 뜨기까지 1분 55초&lt;br /&gt;(&lt;span style=&quot;background-color: #f8f8f8; color: #1d1c1d;&quot;&gt;Started XXXApplication in 49.027 seconds (JVM running for 50.311)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;2. 2021 맥북프로 16인치&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;M1 Pro 램 32GB&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;빌드 버튼 누르고 로컬 WAS 뜨기까지 1분 8초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;span style=&quot;background-color: #f8f8f8; color: #1d1c1d;&quot;&gt;Started XXXApplication in 28.291 seconds (JVM running for 28.933)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f8; color: #1d1c1d;&quot;&gt;M1 Pro가.. 인텔 i9에 비해서 약 2배에 가까운 성능을 내주고 있습니다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f8; color: #1d1c1d;&quot;&gt;정말 엄청 나네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f8; color: #1d1c1d;&quot;&gt;거기다가 발열도 없고 소음도 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f8; color: #1d1c1d;&quot;&gt;맥 스튜디오가 빨리 출시되면 좋겠네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/329</guid>
      <comments>https://darkstart.tistory.com/329#entry329comment</comments>
      <pubDate>Fri, 8 Apr 2022 09:19:50 +0900</pubDate>
    </item>
    <item>
      <title>구글 FCM 간단히 테스트하기</title>
      <link>https://darkstart.tistory.com/328</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 시간이 촉박해.. 간단하게만 내용 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FCM에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 2종류의 메시지가 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림 메시지, 데이터 메시지 이렇게 2가지인데요,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.08.35.png&quot; data-origin-width=&quot;2260&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tdKGc/btryt6zSWOc/nEw4yjHaeXKHiK2UJFkVs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tdKGc/btryt6zSWOc/nEw4yjHaeXKHiK2UJFkVs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tdKGc/btryt6zSWOc/nEw4yjHaeXKHiK2UJFkVs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtdKGc%2Fbtryt6zSWOc%2FnEw4yjHaeXKHiK2UJFkVs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2260&quot; height=&quot;1624&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.08.35.png&quot; data-origin-width=&quot;2260&quot; data-origin-height=&quot;1624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 보내는 메시지는 알림 메시지입니다. (알림 메시지에 데이터?를 추가로 담을 수 있지만.. 그렇다고 해서 데이터 메시지가 되는 것은 아니며 둘은 태생이 다르다고 보시면 됩니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림 메시지는.. 앱이 백그라운드에 있을 때 개발자가 따로 핸들링을 할 수 없기에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 앱이 백그라운드에 있든 포그라운드에 있든 대부분 데이터 메시지를 사용해야한다고 봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러기 위해서는..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포스트맨으로 하면 편한데요, 액세스 토큰 얻는게 문제였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://developers.google.com/oauthplayground&quot;&gt;https://developers.google.com/oauthplayground&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;개발자 놀이터에 들어가셔서 구글 FCM 용? 액세스 토큰을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발급 받아 사용하시면 손쉽게 테스트가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.11.58.png&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;2364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ugQma/btrytjzwq4x/97ZByiP9XPW9OnJ7PLGHRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ugQma/btrytjzwq4x/97ZByiP9XPW9OnJ7PLGHRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ugQma/btrytjzwq4x/97ZByiP9XPW9OnJ7PLGHRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FugQma%2Fbtrytjzwq4x%2F97ZByiP9XPW9OnJ7PLGHRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1808&quot; height=&quot;2364&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.11.58.png&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;2364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간 즈음에 Firebase Cloud Messaging API v1의 하위 항목을 선택하시고.. Authorize APIs를 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 관련 파이어 베이스 계정으로 로그인 하고.. 권한 승인하고 하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.13.06.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7AALV/btryu94eFhc/n72pZK8BGGkWe1lMM9sSOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7AALV/btryu94eFhc/n72pZK8BGGkWe1lMM9sSOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7AALV/btryu94eFhc/n72pZK8BGGkWe1lMM9sSOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7AALV%2Fbtryu94eFhc%2Fn72pZK8BGGkWe1lMM9sSOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;1360&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.13.06.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 화면에서 액세스토근을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.14.52.png&quot; data-origin-width=&quot;3216&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzsYG/btryt43aTPA/tQ6Q0YsDT3Z860MmOXRIn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzsYG/btryt43aTPA/tQ6Q0YsDT3Z860MmOXRIn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzsYG/btryt43aTPA/tQ6Q0YsDT3Z860MmOXRIn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzsYG%2Fbtryt43aTPA%2FtQ6Q0YsDT3Z860MmOXRIn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3216&quot; height=&quot;1030&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.14.52.png&quot; data-origin-width=&quot;3216&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.11.21.png&quot; data-origin-width=&quot;3444&quot; data-origin-height=&quot;1442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2xf5/btrytkd6TuB/n2BXnpBmmZFUoenNmuMR2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2xf5/btrytkd6TuB/n2BXnpBmmZFUoenNmuMR2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2xf5/btrytkd6TuB/n2BXnpBmmZFUoenNmuMR2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2xf5%2Fbtrytkd6TuB%2Fn2BXnpBmmZFUoenNmuMR2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3444&quot; height=&quot;1442&quot; data-filename=&quot;스크린샷 2022-04-05 오후 1.11.21.png&quot; data-origin-width=&quot;3444&quot; data-origin-height=&quot;1442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이렇게 포스트맨으로 간단하게 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;데이터 메시지&lt;/b&gt;&lt;/span&gt;를 보낼 수 있습니다.&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/328</guid>
      <comments>https://darkstart.tistory.com/328#entry328comment</comments>
      <pubDate>Tue, 5 Apr 2022 13:16:10 +0900</pubDate>
    </item>
    <item>
      <title>맥 인텔리제이에서 자동완성 안 됨(해결 방법)</title>
      <link>https://darkstart.tistory.com/327</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저는 윈도우에서 IntelliJ나 안드로이드 스튜디오를 썼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 Mac에서 인텔리제이를 쓰는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESC나 콘트롤+스페이스를 눌러서 하는 자동 완성이 안되더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 안되는지 이유를 찾기 못하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 이전 글자 지웠다가 다시 쓰면 나오는 자동 완성을 이용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다가 생각보다 불편해서 인터넷 검색을 통해 원인을 찾았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 맥에서 이미 해당 단축키를 다른 용도(한/영 전환)로 사용하고 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템 환경 설정 &amp;gt; 키보드 &amp;gt; 단축키 &amp;gt; 입력 소스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 가면 아래의 두 목록이 있는데 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;체크를 해제&lt;/b&gt;&lt;/span&gt;하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아마 처음 것만 해제해도 될 것 같습니다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;600&quot; data-filename=&quot;스크린샷 2021-08-13 오후 8.54.38.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqjuvI/btrb82enyzr/qOOUQn9giAIQauvnIh3O11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqjuvI/btrb82enyzr/qOOUQn9giAIQauvnIh3O11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqjuvI/btrb82enyzr/qOOUQn9giAIQauvnIh3O11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqjuvI%2Fbtrb82enyzr%2FqOOUQn9giAIQauvnIh3O11%2Fimg.png&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;600&quot; data-filename=&quot;스크린샷 2021-08-13 오후 8.54.38.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/327</guid>
      <comments>https://darkstart.tistory.com/327#entry327comment</comments>
      <pubDate>Fri, 13 Aug 2021 21:01:35 +0900</pubDate>
    </item>
    <item>
      <title>[스프링][코틀린] validation이 안될 때 확인해볼 것</title>
      <link>https://darkstart.tistory.com/324</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin으로 @Valid를 사용하려고 하니 잘 안됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 가지 확인해볼 것을 아래에 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. data class의 생성자에 제약 조건을 걸지 않았는지 체크&lt;/p&gt;
&lt;pre id=&quot;code_1622345734298&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//잘못된 코드
data class UserInfoDto (
    @NotEmpty(message=&quot;이메일 주소를 입력하세요&quot;)
    @NotBlank
    @Email(message=&quot;이메일 주소가 올바르지 않습니다&quot;)
    var email : String?,
    var password : String?,
    var role : String?,
)
//올바른 코드
data class UserInfoDto (
    @field:NotEmpty(message=&quot;이메일 주소를 입력하세요&quot;)
    @field:NotBlank
    @field:Email(message=&quot;이메일 주소가 올바르지 않습니다&quot;)
    var email : String?,
    var password : String?,
    var role : String?,
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 적절한 곳에 @Valid 사용했는지 체크&lt;/p&gt;
&lt;pre id=&quot;code_1622345790659&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; @RequestMapping(value = [&quot;/signup&quot;], method = [RequestMethod.POST])
    fun signupProcessing(modelAndView: ModelAndView, @Valid infoDto: UserInfoDto, bindingResult: BindingResult): ModelAndView&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 요청을 받을 때 체크를 하도록 하는 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &amp;lt;arg&amp;gt;-Xemit-jvm-type-annotations&amp;lt;/arg&amp;gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린 버전이 낮으면 kotlin-maven-plugin에 &amp;lt;arg&amp;gt;-Xemit-jvm-type-annotations&amp;lt;/arg&amp;gt;를 추가해야 한다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;a href=&quot;https://stackoverflow.com/questions/52345291/bean-validation-not-working-with-kotlin-jsr-380&quot;&gt;https://stackoverflow.com/questions/52345291/bean-validation-not-working-with-kotlin-jsr-380&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;저는 코틀린 1.4.31 버전을 써서 그런지 위의 코드가 없어도 정상 동작을 하네요.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 추가해야 generics에 대한 규칙도 체크를 하므로 넣는게 좋겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. dependency 체크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;intelliJ에서 생각없이 dependency를 추가하다 보니 아래의 의존성이 추가됐었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1622346248082&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;jakarta.validation&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jakarta.validation-api&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.0.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 Validation이 동작을 안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1622346288673&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-validation&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 의존성이 추가됐는지 확인합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1622346182716&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;kotlin and @Valid Spring annotation&quot; data-og-description=&quot;I have an entity: class SomeInfo( @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) { var id: Long? = null } And controller method: @RequestMapping(value = &amp;quot;/som...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation&quot; data-og-url=&quot;https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/czlGg1/hyKnuWA5XT/EGIKkFfVk0EUBj6PdkivfK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/czlGg1/hyKnuWA5XT/EGIKkFfVk0EUBj6PdkivfK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;kotlin and @Valid Spring annotation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I have an entity: class SomeInfo( @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) { var id: Long? = null } And controller method: @RequestMapping(value = &quot;/som...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.baeldung.com/spring-boot-bean-validation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.baeldung.com/spring-boot-bean-validation&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/324</guid>
      <comments>https://darkstart.tistory.com/324#entry324comment</comments>
      <pubDate>Sun, 30 May 2021 12:45:08 +0900</pubDate>
    </item>
    <item>
      <title>블렌더 3D 프린터 관련 기본 설정들</title>
      <link>https://darkstart.tistory.com/323</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 블렌더에서 3D 프린팅을 할 때 변경하는? 기본 설정들 정리합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 034.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bog9im/btq52bWTArA/i2Tg6ufYL6sjYgPDwsSL71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bog9im/btq52bWTArA/i2Tg6ufYL6sjYgPDwsSL71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bog9im/btq52bWTArA/i2Tg6ufYL6sjYgPDwsSL71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbog9im%2Fbtq52bWTArA%2Fi2Tg6ufYL6sjYgPDwsSL71%2Fimg.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 034.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 035.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcx3D6/btq52oVWRYJ/i1J7XyNz3EPOGtLRWav770/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcx3D6/btq52oVWRYJ/i1J7XyNz3EPOGtLRWav770/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcx3D6/btq52oVWRYJ/i1J7XyNz3EPOGtLRWav770/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcx3D6%2Fbtq52oVWRYJ%2Fi1J7XyNz3EPOGtLRWav770%2Fimg.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 035.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edit &amp;gt; Preference &amp;gt; Input &amp;gt; Emulator Numpad 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 036.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/22JBM/btq5Yq1LsxS/Wkpy8YkDJB8PDy3P6ELZV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/22JBM/btq5Yq1LsxS/Wkpy8YkDJB8PDy3P6ELZV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/22JBM/btq5Yq1LsxS/Wkpy8YkDJB8PDy3P6ELZV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F22JBM%2Fbtq5Yq1LsxS%2FWkpy8YkDJB8PDy3P6ELZV1%2Fimg.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 036.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keymap &amp;gt; Preferences &amp;gt; Select with Mouse Button &amp;gt; Left&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 037.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBLwy6/btq51Q6uhQK/MSFZUk521wgq6FgjzrkKh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBLwy6/btq51Q6uhQK/MSFZUk521wgq6FgjzrkKh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBLwy6/btq51Q6uhQK/MSFZUk521wgq6FgjzrkKh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBLwy6%2Fbtq51Q6uhQK%2FMSFZUk521wgq6FgjzrkKh0%2Fimg.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 037.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 하단의 삼선 표시 &amp;gt; Save&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 043.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJskME/btq5Yp2RAkg/T3bsk4dUegamjdT1P6m9AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJskME/btq5Yp2RAkg/T3bsk4dUegamjdT1P6m9AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJskME/btq5Yp2RAkg/T3bsk4dUegamjdT1P6m9AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJskME%2Fbtq5Yp2RAkg%2FT3bsk4dUegamjdT1P6m9AK%2Fimg.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 043.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측의 Scene &amp;gt; Units &amp;gt; Unit Scale &amp;gt; 0.001로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측의 Scene &amp;gt; Units &amp;gt; Length &amp;gt; Milimeters로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 046.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdEQbj/btq5Y8T9Bpq/6yLcI0ignFHbY4xcAzekY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdEQbj/btq5Y8T9Bpq/6yLcI0ignFHbY4xcAzekY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdEQbj/btq5Y8T9Bpq/6yLcI0ignFHbY4xcAzekY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdEQbj%2Fbtq5Y8T9Bpq%2F6yLcI0ignFHbY4xcAzekY1%2Fimg.png&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;719&quot; data-filename=&quot;이미지 046.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 상단의 화살표 클릭 &amp;gt; 빨간 네모 부분 0.001로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 수정을 하면 grid 1개의 길이가 1mm가 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;651&quot; data-filename=&quot;이미지 047.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UstI5/btq5Y7AUtBE/bYtfLxsRH0DIKL6Ft2uskK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UstI5/btq5Y7AUtBE/bYtfLxsRH0DIKL6Ft2uskK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UstI5/btq5Y7AUtBE/bYtfLxsRH0DIKL6Ft2uskK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUstI5%2Fbtq5Y7AUtBE%2FbYtfLxsRH0DIKL6Ft2uskK%2Fimg.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;651&quot; data-filename=&quot;이미지 047.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;599&quot; data-filename=&quot;이미지 048.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EGAdI/btq53PSCPw7/OuA5VJsPPkJwzXgk3TnUvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EGAdI/btq53PSCPw7/OuA5VJsPPkJwzXgk3TnUvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EGAdI/btq53PSCPw7/OuA5VJsPPkJwzXgk3TnUvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEGAdI%2Fbtq53PSCPw7%2FOuA5VJsPPkJwzXgk3TnUvk%2Fimg.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;599&quot; data-filename=&quot;이미지 048.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;359&quot; data-filename=&quot;이미지 049.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diI09b/btq52ZVGXmJ/xbEjKCWkoJMDH5fdl1qfY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diI09b/btq52ZVGXmJ/xbEjKCWkoJMDH5fdl1qfY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diI09b/btq52ZVGXmJ/xbEjKCWkoJMDH5fdl1qfY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiI09b%2Fbtq52ZVGXmJ%2FxbEjKCWkoJMDH5fdl1qfY0%2Fimg.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;359&quot; data-filename=&quot;이미지 049.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/yYUGMvZsu3w&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/yYUGMvZsu3w&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=yYUGMvZsu3w&amp;amp;feature=youtu.be&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cpGyel/hyKnmpg2VJ/8N8k7NDv74Kp1jFuCNcMeK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/yYUGMvZsu3w&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;</description>
      <category>소소한 일상</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/323</guid>
      <comments>https://darkstart.tistory.com/323#entry323comment</comments>
      <pubDate>Fri, 28 May 2021 17:48:33 +0900</pubDate>
    </item>
    <item>
      <title>slf4j LoggerFactory쓸 때 주의할 점</title>
      <link>https://darkstart.tistory.com/322</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;slf4j를 사용하여 로깅을 하는데 로그가 제대로 출력되지 않는 현상이 발견됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1622178265951&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;logger.debug(&quot;displayRegistration: infoDto = {}&quot;, infoDto)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ifoDto에는 적당한 값이 들어가 있기에 출력이 되어야 함에도.. 아래와 같은 로그가 출력됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;displayRegtration: infoDto = {}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 원인은 import였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoggerFactory를 import할 때 3개 lib이 떴었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별 생각없이 1번째 rt.jar에 속한 com.sun.org.slf4j.internal.LoggerFactory를 import했더니 동작이 제대로 되질 않네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;111&quot; data-filename=&quot;이미지 057.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZOgr7/btq5W9FpHil/vO1TFtLWiZnKK30TFMiP0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZOgr7/btq5W9FpHil/vO1TFtLWiZnKK30TFMiP0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZOgr7/btq5W9FpHil/vO1TFtLWiZnKK30TFMiP0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZOgr7%2Fbtq5W9FpHil%2FvO1TFtLWiZnKK30TFMiP0K%2Fimg.png&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;111&quot; data-filename=&quot;이미지 057.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1622178783806&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import com.sun.org.slf4j.internal.LoggerFactory //문제 발생시킴&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1622179411727&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.slf4j.LoggerFactory //정상동작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;org.slf4j.LoggerFactory를 import하면 정상동작 합니다. ㅜㅜ&lt;/p&gt;</description>
      <category>프로그래밍/자바</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/322</guid>
      <comments>https://darkstart.tistory.com/322#entry322comment</comments>
      <pubDate>Fri, 28 May 2021 14:23:51 +0900</pubDate>
    </item>
    <item>
      <title>한성컴퓨터 미니슈트 R55 SSD 프리징(간헐적 멈춤)</title>
      <link>https://darkstart.tistory.com/319</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;올해 초에 친구가 친구의 부모님이 쓸 컴퓨터를 추천해달라고 해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한성컴퓨터의 미니슈트 R55 제품을 추천했었습니다.(정품 윈도우도 함께 구입)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 구입 초기부터 간헐적으로 컴퓨터가 멈추는 증상이 있다고 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멈추고 10~20초 뒤에 풀리긴 합니다;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 뷰어를 통해 친구의 컴퓨터를 좀 자세히 살펴봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간헐적인 이 증상은 부팅 후 처음 실행하는 프로그램을 실행할 때 낮은 확률로 발생하는 것으로 보였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;863&quot; data-filename=&quot;이미지 077_.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewkxeP/btq5SQLICyv/GAlOTplPBdwwjezlHZbp41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewkxeP/btq5SQLICyv/GAlOTplPBdwwjezlHZbp41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewkxeP/btq5SQLICyv/GAlOTplPBdwwjezlHZbp41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FewkxeP%2Fbtq5SQLICyv%2FGAlOTplPBdwwjezlHZbp41%2Fimg.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;863&quot; data-filename=&quot;이미지 077_.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업관리자와 리소스 모니터도 열어서 이슈가 재현되는 순간을 확인했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 처음 생각과 달리 디스크 요청을 많이 하는 프로세스가 갑자기 생기거나 그렇지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려.. &lt;b&gt;디스크 점유율은 100%가 되는데 읽기 속도, 쓰기 속도는 0KB/s&lt;/b&gt;로 내려갔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 것이 말로만 듣던.. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;SSD 프리징&lt;/b&gt;&lt;/span&gt; 문제가 아닌가 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://answers.microsoft.com/en-us/windows/forum/all/spikes-of-100-disk-usage-0-readwrite-speed-on-a/eabef922-4d1e-46d8-ae89-f1eef87e84b8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://answers.microsoft.com/en-us/windows/forum/all/spikes-of-100-disk-usage-0-readwrite-speed-on-a/eabef922-4d1e-46d8-ae89-f1eef87e84b8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외국 유저중에 거의 똑같은 증상을 겪은 사람이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문자는 컴퓨터를 좀 잘 하는 사람같은데 참 다양한 시도를 했음에도 결국 해결을 하지 못했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Kingston A400 480 GB SSD 를 사용했네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;답변자는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Nothing&amp;nbsp;worked,&amp;nbsp;so&amp;nbsp;I&amp;nbsp;then&amp;nbsp;installed&amp;nbsp;Windows&amp;nbsp;10&amp;nbsp;onto&amp;nbsp;the&amp;nbsp;SSD&amp;nbsp;in&amp;nbsp;another&amp;nbsp;PC,&amp;nbsp;and&amp;nbsp;still&amp;nbsp;had&amp;nbsp;the&amp;nbsp;same&amp;nbsp;disk&amp;nbsp;usage&amp;nbsp;issue.&amp;nbsp;That&amp;nbsp;told&amp;nbsp;me&amp;nbsp;it&amp;nbsp;was&amp;nbsp;a&amp;nbsp;hardware&amp;nbsp;problem,&amp;nbsp;so&amp;nbsp;I&amp;nbsp;returned&amp;nbsp;the&amp;nbsp;SSD&amp;nbsp;and&amp;nbsp;got&amp;nbsp;a&amp;nbsp;Samsung.&amp;nbsp;No&amp;nbsp;issues&amp;nbsp;anymore.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라고 합니다. SSD를 삼성 제품으로 교체 후 문제가 사라졌다고 하네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저도 일단은 SSD 하드웨어 문제가 아닐까 의심이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 확인을 하려면 다른 SSD를 장착해봐야해서 확인이 어렵네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;미니슈트 R55에 장착된 하드는 klevv neo n610 256 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;471&quot; data-filename=&quot;이미지 053.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MwJj8/btq5VxrBE7q/NNW8fNNaAikeQk6NfLKIz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MwJj8/btq5VxrBE7q/NNW8fNNaAikeQk6NfLKIz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MwJj8/btq5VxrBE7q/NNW8fNNaAikeQk6NfLKIz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwJj8%2Fbtq5VxrBE7q%2FNNW8fNNaAikeQk6NfLKIz1%2Fimg.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;471&quot; data-filename=&quot;이미지 053.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차 포멧: 카톡 설치, 유튜브 시청에선 이슈 재현 안됨. AMD VGA 드라이버 설치 과정에서 이슈 재현됨. 그리고 이후에 또 이슈가 재현됨. AMD VGA 드라이버랑 관련있는지 알기 위해 다시 포멧 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차 포멧: 포멧 후 중요 드라이버 설치 안했으나 이슈 재현 됨 -&amp;gt; 이러나 저러나 이슈가 재현되니 하드웨어 문제일 확률이 높아보임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2021년 6월 2일&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btPonA/btq6lmqEfIq/cyInAE2xbfq6lEUTcJzkKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btPonA/btq6lmqEfIq/cyInAE2xbfq6lEUTcJzkKk/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;KakaoTalk_20210602_141932233.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btPonA/btq6lmqEfIq/cyInAE2xbfq6lEUTcJzkKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtPonA%2Fbtq6lmqEfIq%2FcyInAE2xbfq6lEUTcJzkKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxfcRA/btq6pHUQnKa/2tBVHC8uQAqzvaqXYLdKY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxfcRA/btq6pHUQnKa/2tBVHC8uQAqzvaqXYLdKY1/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;KakaoTalk_20210602_141853533.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxfcRA/btq6pHUQnKa/2tBVHC8uQAqzvaqXYLdKY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxfcRA%2Fbtq6pHUQnKa%2F2tBVHC8uQAqzvaqXYLdKY1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUC4UA/btq6nbPQoRi/F6blLVwjHWBIkLJqJIRsp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUC4UA/btq6nbPQoRi/F6blLVwjHWBIkLJqJIRsp1/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;KakaoTalk_20210602_135532823.jpg&quot; style=&quot;width: 32.5581%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUC4UA/btq6nbPQoRi/F6blLVwjHWBIkLJqJIRsp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUC4UA%2Fbtq6nbPQoRi%2FF6blLVwjHWBIkLJqJIRsp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한성컴퓨터에서 의뢰한 곳의 AS기사님이 친구집을 방문했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSD만 교체할 줄 알았는데 정확한 문제의 원인을 바로 알 수 없고 시간이 걸리니..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한성컴퓨터에서 모든 제품 교체를 요청했나 보더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파워, 메인보드, SSD, CPU, 램 다 갈았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 기존 SSD의 문제인지 아닌지가 궁금했었는데.. 알 길이 요원해졌군요.. ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 전 부품을 다 교체했기에 기존의 문제는 발생하지 않을 것 같지만 좀 더 지켜봐야할 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어 다 교체 후.. 정상동작 하는 것 같습니다. ㅎㅎㅎ;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;</description>
      <category>윈도우</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/319</guid>
      <comments>https://darkstart.tistory.com/319#entry319comment</comments>
      <pubDate>Thu, 27 May 2021 14:49:15 +0900</pubDate>
    </item>
    <item>
      <title>[스프링][kotlin][Reactor] zipWith 알아보기</title>
      <link>https://darkstart.tistory.com/314</link>
      <description>&lt;pre id=&quot;code_1619863932225&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final &amp;lt;T2,O&amp;gt; Mono&amp;lt;O&amp;gt; zipWith(Mono&amp;lt;? extends T2&amp;gt; other,
                                    BiFunction&amp;lt;? super T,? super T2,? extends O&amp;gt; combinator)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reactor의 Mono에서 사용가능한 zipWith 함수에 대해 알아보겠습니다. 바로 위의 함수입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;이미지 023.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;389&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHLKm/btq3VNC4xn8/4MQqIvhcyk9UtZBU98PAG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHLKm/btq3VNC4xn8/4MQqIvhcyk9UtZBU98PAG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHLKm/btq3VNC4xn8/4MQqIvhcyk9UtZBU98PAG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHLKm%2Fbtq3VNC4xn8%2F4MQqIvhcyk9UtZBU98PAG0%2Fimg.png&quot; data-filename=&quot;이미지 023.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;389&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 사진이 zipWith 함수가 하는 일을 잘 보여줍니다.&lt;/p&gt;
&lt;p&gt;초록색 A와 황색 1은 각각의 Mono에서 발생되는 값입니다. 시간이 흐름에 따라 Mono 값이 발생하며 정상적으로 Mono가 종료되는 것은 검은색 세로 선으로 표시됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;반응형으로 코드를 짜는 경우 서로 다른 두 Mono가 완료되는 시점에 특정 동작을 하는 것은 흔한 일인 것 같습니다.&lt;/p&gt;
&lt;p&gt;예를 들어 어떤 함수에선 외부의 User 서비스에 유저 정보를 요청하고 또 다른 외부 Item 서비스에 아이템 정보를 요청한 뒤 이를 조합하여 리턴할 수 있습니다. 그런데 네트워크의 상황에 따라 User 서비스의 리턴 값을 먼저 받기도 하고 아니면 Item 서비스의 리턴 값을 먼저 받을 수도 있습니다. 이런 상황에서 zipWith 함수를 이용하면 유용합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;zipWith 함수를 이용하면 서로 다른 두 Mono가 완료되는 시점에 이 두 내용을 조작하여 하나의 Mono를 발생 시킬 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1619865050951&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return aMono.zipWith(bMono) { a, b -&amp;gt; a + b }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코틀린의 람다 표현식에서 인자 부분에는 소괄호가 없는 것을 유의하며 코드를 작성해주면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1619863866247&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Mono (reactor-core 3.4.5)&quot; data-og-description=&quot;static &amp;nbsp;Mono using(Callable &amp;nbsp;resourceSupplier, Function &amp;gt;&amp;nbsp;sourceSupplier, Consumer &amp;nbsp;resourceCleanup, boolean&amp;nbsp;eager) Uses a resource, generated by a supplier for each individual Subscriber, while streaming the value from a Mono derived from the same re&quot; data-og-host=&quot;projectreactor.io&quot; data-og-source-url=&quot;https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html&quot; data-og-url=&quot;https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Mono (reactor-core 3.4.5)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;static &amp;nbsp;Mono using(Callable &amp;nbsp;resourceSupplier, Function &amp;gt;&amp;nbsp;sourceSupplier, Consumer &amp;nbsp;resourceCleanup, boolean&amp;nbsp;eager) Uses a resource, generated by a supplier for each individual Subscriber, while streaming the value from a Mono derived from the same re&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;projectreactor.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://kotlinlang.org/docs/lambdas.html#instantiating-a-function-type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;kotlinlang.org/docs/lambdas.html#instantiating-a-function-type&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1619866638046&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;High-order functions and lambdas | Kotlin&quot; data-og-description=&quot; &quot; data-og-host=&quot;kotlinlang.org&quot; data-og-source-url=&quot;https://kotlinlang.org/docs/lambdas.html#instantiating-a-function-type&quot; data-og-url=&quot;http://www.jetbrains.com/idea/1.4.32/lambdas.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://kotlinlang.org/docs/lambdas.html#instantiating-a-function-type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kotlinlang.org/docs/lambdas.html#instantiating-a-function-type&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;High-order functions and lambdas | Kotlin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;kotlinlang.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/314</guid>
      <comments>https://darkstart.tistory.com/314#entry314comment</comments>
      <pubDate>Sat, 1 May 2021 19:56:54 +0900</pubDate>
    </item>
    <item>
      <title>OOP의 SOLID 알아보기</title>
      <link>https://darkstart.tistory.com/313</link>
      <description>&lt;p&gt;OOP에서 SOLID는 객체지향에서 어떻게 개발하면 좋다에 대한 5가지 원칙에서 앞 글자를 따온 이름입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;S&lt;/b&gt;ingle Responsibility Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;O&lt;/b&gt;pen-closed Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;L&lt;/b&gt;iskov Substitution Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;I&lt;/b&gt;nterface Segregation Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;D&lt;/b&gt;ependency Inversion Principle&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인터넷에 검색해보면 이에 대한 내용이 좀 있으나 이해가 잘 되는 글이 없어서 직접 정리해보려고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. S&lt;/b&gt;ingle Responsibility Principle(&lt;span style=&quot;color: #333333;&quot;&gt;단일 책임의 원칙)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;클래스를 설계할 때 각 클래스는 하나의 일만&lt;span style=&quot;color: #333333;&quot;&gt;(only one job)&lt;/span&gt; 하도록 설계하자는 원칙입니다. 하나의 일을 어떻게 봐야하나 좀 애매하지만 대충 느낌은 옵니다. 하나의 함수를 의미하는 것이 아니라 하나의 주제?에 맞는 일을 해야합니다. 하나의 클래스에서 여러 일을 한다면 클래스를 쪼개서 하나의 일만 하도록 수정해야 합니다.&lt;/p&gt;
&lt;p&gt;이는 Highly Cohesive와도 관련있는 내용 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. O&lt;/b&gt;pen-closed Principle&lt;/h3&gt;
&lt;p&gt;클래스는 확장에는 열려있고 수정에는 닫혀있어야 한다는 원칙입니다. 이 말만 들으면 사실 이해가 잘 안됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;확장은 새 기능을 추가하는 것을 의미하고, 수정은 말 그대로 기존 클래스의 코드를 수정하는 것을 의미합니다.&lt;/p&gt;
&lt;p&gt;이 말을 좀 더 쉽게하면&lt;b&gt; 기존 코드를 수정하지 않고 새 기능 추가가 가능해야한다&lt;/b&gt;는 말입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저는 처음에 그냥 클래스에 새 함수를 추가하면 되는 것이 아닌가 했는데 항상 그렇게 되는 것 같지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;경우에 따라서는 기존 함수에 새 기능과 관련된 코드를 추가해야 하는 경우도 있을 것입니다. 그런데 이렇게 되면 Open-closed principle을 위배하게 됩니다. 동작이 잘 되는 기존 코드를 수정한다는 것은 상당한 리스크가 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 중요한 것은 java의 interface입니다. 애초에 설계를 잘 해서 새 기능을 추가할 때 기존 함수를 수정하는 것이 아니라 interface에 기능 추가와 관련된 추상 함수를 추가하고 이를 구현(implements)하는 함수에서 그 클래스를 정의하도록 하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. L&lt;/b&gt;iskov Substitution Principle&lt;/h3&gt;
&lt;p&gt;리스코프의 치환 법칙은 자식 클래스가 부모 클래스를 치환할 수 있어야 한다는 법칙입니다.&lt;/p&gt;
&lt;p&gt;부모 클래스를 A, 이를 상속받는 클래스를 B라고 했을 때, 클래스 A를 인자로 받는 함수에 클래스 B를 넘겨도 문제없이 잘 동작해야한다는 이야기입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이는 클래스의 상속에 의해 자연스럽게 만족될까요?. 자식 클래스는 부모 클래스의 기능을 확장하고 줄이지는 않으니까요. 그런데 어떤 경우는 자식 클래스에서 @Override를 통해 재 정의한 함수로 인해 리스코프의 치환법칙을 위배하게 되는 경우도 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하단 참고 부분의 영어 강좌들을 보면 이 예제에 대한 긴 설명이 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://reflectoring.io/lsp-explained/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;reflectoring.io/lsp-explained/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;왜 이 법칙이 필요한지에 대한 설명을 찾아봤는데 위 링크에 그 내용이 좀 있는 것 같습니다.&lt;/p&gt;
&lt;p&gt;리스코프의 치환 법칙을 위배한다면.. 부모 클래스 A를 인자로 하는 함수에선 동작이 잘 되도록 instanceof 체크 구문을 넣어야하는데 유지측면에서 좋지 않은 방법입니다. 기존에 잘 작성하던 함수를 수정해야하는 것이니까요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. I&lt;/b&gt;nterface Segregation Principle&lt;/h3&gt;
&lt;p&gt;인터페이스 분리 법칙은 말 그대로 인터페이스를 분리하는 것을 의미합니다.&lt;/p&gt;
&lt;p&gt;1개의 범용적으로 쓰이는 인터페이스보단 필요?에 따라 여러 인터페이스를 갖는 것이 더 좋습니다.&lt;/p&gt;
&lt;p&gt;범용적인 인터페이스로 인해 이를 구현하는 어떤 클래스는 자신에게 필요없는 함수까지 구현해야할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. D&lt;/b&gt;ependency Inversion Principle&lt;/h3&gt;
&lt;p&gt;DDD에서도 배운 내용입니다.&lt;/p&gt;
&lt;p&gt;상위 모듈에서 하위 모듈을 사용하는데, 그냥 일반적으로 설계를 하면 상위 모듈이 하위 모듈에 의존하게 됩니다. 하위 모듈이 바뀌기라도 한다면 상위 모듈도 따라 변경될 수 있어 올바르지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그래서 이런 경우에 상위 모듈에서 사용하는 하위 모듈의 특정 함수들에 대해 인터페이스로 정의합니다.&lt;/p&gt;
&lt;p&gt;상위 모듈에선 하위 모듈을 바로 사용하는게 아니라 이 인터페이스의 함수들을 접근합니다.&lt;/p&gt;
&lt;p&gt;그리고 하위 모듈은 이 인터페이스를 구현해서 상위 모듈이 문제없이 동작되도록 하면됩니다.&lt;/p&gt;
&lt;p&gt;하위 모듈이 변경되는 경우를 생각해보면, 변경된 하위 모듈만 인터페이스를 잘 구현하도록 하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.freecodecamp.org/news/solid-principles-explained-in-plain-english/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/conceptual_articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.digitalocean.com/community/conceptual_articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/자바</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/313</guid>
      <comments>https://darkstart.tistory.com/313#entry313comment</comments>
      <pubDate>Fri, 30 Apr 2021 11:22:12 +0900</pubDate>
    </item>
    <item>
      <title>[자바] Anonymouns class는 inner class일까 static class일까</title>
      <link>https://darkstart.tistory.com/311</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;익명 클래스(Anonymouns class) 문법은 아주 흔하게 사용하게 되는 자바의 문법이 아닌가 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다를 쓰면서도 이 익명 클래스가 사용되는 듯 한데, 호기심이 생긴 김에 간단하게 조사좀 해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Inner 클래스와 Static 클래스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 중첩(nested) 클래스는 2가지 종류가 유명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(전체는 총 4개)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inner 클래스와 Static 클래스로 불리는데 자바를 좀 써본 사람들이라면 이 차이를 알 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inner 클래스는 Outer 클래스에 대한 참조를 가지고 있어 Outer 클래스의 멤버에 바로 접근할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 Static 클래스는 기본적으로는 Outer 클래스의 멤버에 접근할 수 없고 생성자로 Outer 클래스의 객체를 받든지 해야합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1619318608894&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class OuterClass {

    int outerInt = 5;

    class InnerClass {

        public void testFunc() {
            System.out.println(&quot;outerInt = &quot; + outerInt);
        }
    }

    static class StaticClass {

        /*
        //기본적으로 Outer 클래스의 멤버 접근 못함
        public void testFunc() {
            System.out.println(&quot;outerInt = &quot; + OuterClass.this.outerInt);
        }
        */
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 익명 클래스는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ에서 몇 가지 테스트를 해봤는데 우리가 쓰는 익명 클래스는 또 다른 형태네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 흔히 사용하는 함수 내부에서 사용하는 익명 클래스는.. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Method&amp;ndash;Local inner classes&lt;/b&gt;&lt;/span&gt;인 것 같습니다. 번역하면 메소드 내부 클래스 정도 될까요? 말 그대로 함수 내부에 정의된 클래스입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1619320088387&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public static void main(String[] args) {
        System.out.println(&quot;Hello World&quot;);

        int a = 5;

        //[S] 익명 클래스
        new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println(&quot;a = &quot; + a);
            }
        }).start();
        //[E] 익명 클래스
        
        //[S] 익명 클래스-람다 표현
        new Thread(() -&amp;gt;System.out.println(&quot;a = &quot; + a)).start();
        //[E] 익명 클래스-람다 표현

        //a = 6; //초기화 이후 a가 수정되면 더 이상 effectively final이 아니게 되어 Method-Local class에서 참조 불가능
        
        //[S] Named class
        class RunnableTest implements Runnable {
            @Override
            public void run() {
                System.out.println(&quot;a = &quot; + a);
            }
        }
        Runnable namedRunnable = new RunnableTest();
        new Thread(namedRunnable).start();
        //[E] Named class
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 익명이든 아니든.. main이라는 함수 내부의 변수에 접근이 가능해야 하므로 이 함수 내부에서 정의된 클래스여야 합니다. 그런데 이렇게 함수 내부의 정의된 클래스(method-local inner class)의 경우에는 outer method의 변수에 접근(읽기)하려면 이 변수가 effectively final이거나 final 이어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(값 변경은 불가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 그럴까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설계가 됐다고 봐야할 것 같습니다. (익명 클래스를 호출하는 쓰레드와 같은 쓰레드에서 실행될 수도 있지만..) HTTP 콜백이 불리는 경우를 생각해보면 콜백으로 불리는 익명 클래스의 코드는, 그 익명 클래스를 정의한 외부 함수가 종료된 이후에 실행될 수 있습니다. 이렇게 라이프 사이클이 다르기 때문에 익명 클래스(메소드 내부 클래스)에서 외부 함수의 변수에 직접적으로 접근이 가능하다면, 외부 함수가 종료된 이후에 접근하는 문제가 생길 수 있습니다. 그래서 이렇게 직접적인 접근을 허락하기 보다는 capture라고 하여 익명 클래스가 생성되는 시점에 이 익명 클래스에서 사용하는 메소드 내부의 지역 변수들을 copy하여 가지고 있는 것 같습니다. 이런 구조에서 만약 메소드 내부의 지역 변수(위 예제 코드에선 변수 a)가 추후에 바뀌게 된다면 동시성 문제가 생길 수 있으니 에러를 출력하도록 만든 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이런 설계/구조가 좋은 것일까요? 흠..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 그럼 코틀린에서는?&lt;/h3&gt;
&lt;pre id=&quot;code_1619321946422&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Main
    fun main(args: Array&amp;lt;String&amp;gt;) {
        println(&quot;Hello World&quot;)
        var a = 5

        //[S] 익명 클래스
        Thread {
            println(&quot;a = $a&quot;)
        }.start()
        //[E] 익명 클래스

        a = 6
        println(&quot;main: a = $a&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 신기하게도 코틀린에서는 함수 내부 클래스가 외부 함수의 지역변수가 effectively final이 아니더라도 접근(읽기/쓰기)이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goyalnitesh.medium.com/kotlin-final-variables-in-anonymous-class-8ef9fe690c49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;goyalnitesh.medium.com/kotlin-final-variables-in-anonymous-class-8ef9fe690c49&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 글에 이에 대한 자세한 설명이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 간단하게 설명하면, 코틀린에서는 이런 경우에 단순 변수가 아닌 ObjectRef나 IntRef 타입의 변수가 사용된다고 합니다. 마치 익명 클래스 내부에서 포인터를 통해 외부 변수를 접근하는 것처럼 되어서 수정이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 한가지 걱정되던 외부 함수가 종료되면 어떻게 되나를 생각해봤는데 외부 함수가 사라져도 스택에 있던 포인터 변수가 사라지는 것이지, 힙에 생성된 객체가 사라지는 것 같지는 않습니다. 외부 함수가 종료되어도 스택에 있던 포인터 변수만 사라지고.. 힙에 생성된 객체가 있기에 문제가 되지 않고 GC에도 살아남을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://thdev.tech/kotlin/2020/11/17/kotlin_effective_11/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;thdev.tech/kotlin/2020/11/17/kotlin_effective_11/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://beginnersbook.com/2013/05/inner-class/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;beginnersbook.com/2013/05/inner-class/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://darkstart.tistory.com/199&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Lambda에서 사용 가능한 변수(Stack과 Heap)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goyalnitesh.medium.com/kotlin-final-variables-in-anonymous-class-8ef9fe690c49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;goyalnitesh.medium.com/kotlin-final-variables-in-anonymous-class-8ef9fe690c49&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;</description>
      <category>프로그래밍/자바</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/311</guid>
      <comments>https://darkstart.tistory.com/311#entry311comment</comments>
      <pubDate>Sun, 25 Apr 2021 12:52:10 +0900</pubDate>
    </item>
    <item>
      <title>java.lang.ClassNotFoundException: com.netflix.hystrix.exception.HystrixRuntimeException</title>
      <link>https://darkstart.tistory.com/310</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 현상&lt;/h3&gt;
&lt;p&gt;스프링 부트와 클라우드의 버전을 변경 후 다음 날 앱을 실행하니 에러가 발생하고 종료됐습니다.&lt;/p&gt;
&lt;p&gt;(오잉.. 어제는 잘 됐는데 maven은 종종 이럴 때가 있는 것 같습니다. gradle에선 이런 경우가 없었던 것 같습니다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1618912631720&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Caused by: java.lang.ClassNotFoundException: com.netflix.hystrix.exception.HystrixRuntimeException
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0-272]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0-272]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) ~[na:1.8.0-272]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0-272]
	... 48 common frames omitted&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p&gt;com.netflix.hystrix.exception.HystrixRuntimeException는 hystrix-core에 포함된 클래스입니다.&lt;/p&gt;
&lt;p&gt;제 프로젝트 설정을 보면 hystrix-core 1.5.18 버전을 사용 중이며 소스를 확인해보면 이 버전에도 해당 클래스는 존재합니다.(&lt;a href=&quot;https://github.com/Netflix/Hystrix/blob/v1.5.18/hystrix-core/src/main/java/com/netflix/hystrix/exception/HystrixRuntimeException.java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/Netflix/Hystrix/blob/v1.5.18/hystrix-core/src/main/java/com/netflix/hystrix/exception/HystrixRuntimeException.java&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;이미지 030.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;158&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/831qf/btq22b6Xm5d/kMBwBbvT0OHwhkRR7sKRvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/831qf/btq22b6Xm5d/kMBwBbvT0OHwhkRR7sKRvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/831qf/btq22b6Xm5d/kMBwBbvT0OHwhkRR7sKRvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F831qf%2Fbtq22b6Xm5d%2FkMBwBbvT0OHwhkRR7sKRvk%2Fimg.png&quot; data-filename=&quot;이미지 030.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;158&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그런데 제 프로젝트 모듈을 보면.. 해당 라이브러리를 제대로 못 가져온 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;이미지 031.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;115&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcR5wk/btq232u0bSD/cBUL2AiwF60CIPEAKNIWW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcR5wk/btq232u0bSD/cBUL2AiwF60CIPEAKNIWW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcR5wk/btq232u0bSD/cBUL2AiwF60CIPEAKNIWW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcR5wk%2Fbtq232u0bSD%2FcBUL2AiwF60CIPEAKNIWW1%2Fimg.png&quot; data-filename=&quot;이미지 031.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;115&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;이미지 033.png&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;284&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxFzjv/btq21C4RwcB/T7Be3JjbHlvsLKwtCO9KZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxFzjv/btq21C4RwcB/T7Be3JjbHlvsLKwtCO9KZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxFzjv/btq21C4RwcB/T7Be3JjbHlvsLKwtCO9KZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxFzjv%2Fbtq21C4RwcB%2FT7Be3JjbHlvsLKwtCO9KZk%2Fimg.png&quot; data-filename=&quot;이미지 033.png&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;284&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Maven project에서 Download Sources를 하고 Reload project를 하니 문제가 해결 됐습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;이미지 034.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;102&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O9UA0/btq23sOcYm7/TtS0fNUMH6xUTloiNpqkb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O9UA0/btq23sOcYm7/TtS0fNUMH6xUTloiNpqkb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O9UA0/btq23sOcYm7/TtS0fNUMH6xUTloiNpqkb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO9UA0%2Fbtq23sOcYm7%2FTtS0fNUMH6xUTloiNpqkb1%2Fimg.png&quot; data-filename=&quot;이미지 034.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;102&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Netflix/Hystrix/blob/3cb21589895e9f8f87cfcdbc9d96d9f63d48b848/hystrix-core/src/main/java/com/netflix/hystrix/exception/HystrixRuntimeException.java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/Netflix/Hystrix/blob/3cb21589895e9f8f87cfcdbc9d96d9f63d48b848/hystrix-core/src/main/java/com/netflix/hystrix/exception/HystrixRuntimeException.java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618912851744&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Netflix/Hystrix&quot; data-og-description=&quot;Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex di...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Netflix/Hystrix/blob/3cb21589895e9f8f87cfcdbc9d96d9f63d48b848/hystrix-core/src/main/java/com/netflix/hystrix/exception/HystrixRuntimeException.java&quot; data-og-url=&quot;https://github.com/Netflix/Hystrix&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Q9uiP/hyJWuJg6zf/x3t1Ojpo2wbcLy1fIicIs0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Netflix/Hystrix/blob/3cb21589895e9f8f87cfcdbc9d96d9f63d48b848/hystrix-core/src/main/java/com/netflix/hystrix/exception/HystrixRuntimeException.java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Netflix/Hystrix/blob/3cb21589895e9f8f87cfcdbc9d96d9f63d48b848/hystrix-core/src/main/java/com/netflix/hystrix/exception/HystrixRuntimeException.java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Q9uiP/hyJWuJg6zf/x3t1Ojpo2wbcLy1fIicIs0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Netflix/Hystrix&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex di...&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/310</guid>
      <comments>https://darkstart.tistory.com/310#entry310comment</comments>
      <pubDate>Tue, 20 Apr 2021 19:09:58 +0900</pubDate>
    </item>
    <item>
      <title>[서버][스프링] Error creating bean with name 'configurationPropertiesBeans'</title>
      <link>https://darkstart.tistory.com/309</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 현상&lt;/h3&gt;
&lt;p&gt;자바로 작성된 스프링 앱의 버전을 올리고 실행했을 때 에러가 발생하고 바로 종료됨&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;스프링 부트 버전: 2.0.3.RELEASE -&amp;gt; 2.4.4&lt;/p&gt;
&lt;p&gt;스프링 클라우드 버전: Finchley.RELEASE -&amp;gt; 2020.0.2&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1618817790216&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationPropertiesBeans' defined in org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.context.properties.ConfigurationPropertiesBeans]: Factory method 'configurationPropertiesBeans' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:486) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1334) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:270) ~[spring-context-5.3.5.jar:5.3.5]
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762) ~[spring-context-5.3.5.jar:5.3.5]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567) ~[spring-context-5.3.5.jar:5.3.5]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:769) ~[spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) ~[spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:144) [spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:197) [spring-cloud-context-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:104) [spring-cloud-context-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:70) [spring-cloud-context-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) [spring-context-5.3.5.jar:5.3.5]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) [spring-context-5.3.5.jar:5.3.5]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) [spring-context-5.3.5.jar:5.3.5]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131) [spring-context-5.3.5.jar:5.3.5]
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:82) [spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:63) [spring-boot-2.4.4.jar:2.4.4]
	at java.util.ArrayList.forEach(ArrayList.java:1259) ~[na:1.8.0-272]
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) [spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111) [spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:62) [spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:362) ~[spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) ~[spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1313) ~[spring-boot-2.4.4.jar:2.4.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-2.4.4.jar:2.4.4]
	at com.dreamaz.gongga.user.Application.main(Application.java:18) ~[classes/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.context.properties.ConfigurationPropertiesBeans]: Factory method 'configurationPropertiesBeans' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.5.jar:5.3.5]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.5.jar:5.3.5]
	... 35 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
	at org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration.configurationPropertiesBeans(ConfigurationPropertiesRebinderAutoConfiguration.java:51) ~[spring-cloud-context-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$66eb8005.CGLIB$configurationPropertiesBeans$1(&amp;lt;generated&amp;gt;) ~[spring-cloud-context-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$66eb8005$$FastClassBySpringCGLIB$$d5f6867b.invoke(&amp;lt;generated&amp;gt;) ~[spring-cloud-context-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.3.5.jar:5.3.5]
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.3.5.jar:5.3.5]
	at org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$66eb8005.configurationPropertiesBeans(&amp;lt;generated&amp;gt;) ~[spring-cloud-context-2.0.0.RELEASE.jar:2.0.0.RELEASE]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0-272]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0-272]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0-272]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0-272]
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.5.jar:5.3.5]
	... 36 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0-272]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0-272]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) ~[na:1.8.0-272]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0-272]
	... 47 common frames omitted&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p&gt;스프링 버전이 올라가면서 hystrix(circuit breaker)에 변화가 생긴 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;spring-cloud-dependencies &lt;span style=&quot;color: #333333;&quot;&gt;Finchley.RELEASE 버전에선 netflix hystrix 버전이 명시되어 있는데,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;a href=&quot;https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-netflix-dependencies/2.0.0.RELEASE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-netflix-dependencies/2.0.0.RELEASE&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2020.0.2 버전에선 빠져있네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;a href=&quot;https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-netflix-dependencies/3.0.2&quot;&gt;mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-netflix-dependencies/3.0.2&lt;/a&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;spring-cloud-netflix-dependencies의 3버전대부터 hystrix가 빠져있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;공식 홈페이지에 이 내용이 있네요 ㅎㅎ;;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2020.0-Release-Notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2020.0-Release-Notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://spring.io/blog/2019/12/23/spring-cloud-roadmap-and-hoxton-and-greenwich-maintenance-and-eol-announcements&quot;&gt;announced&lt;/a&gt;, the following modules have been removed from spring-cloud-netflix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;spring-cloud-netflix-archaius&lt;/li&gt;
&lt;li&gt;spring-cloud-netflix-concurrency-limits&lt;/li&gt;
&lt;li&gt;spring-cloud-netflix-core&lt;/li&gt;
&lt;li&gt;spring-cloud-netflix-dependencies&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;spring-cloud-netflix-hystrix&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;spring-cloud-netflix-hystrix-contract&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;spring-cloud-netflix-hystrix-dashboard&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;spring-cloud-netflix-hystrix-stream&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;(생략..)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그 이유를 찾아보면 넷플릭스에서 이러한 모듈들을 maintenance mode로 관리하기로 했기 때문이라고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;What is Maintenance Mode?&lt;/p&gt;
&lt;p&gt;Placing a module in maintenance mode means that the Spring Cloud team will no longer be adding new features to the module. We will fix blocker bugs and security issues, and we will also consider and review small pull requests from the community.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;maintenance mode로 바뀌고 나서는 새로운 기능이 추가되지 않는다고 하네요. 그러나 버그 수정이나 보안, 커뮤니티의 pull request는 좀 보겠다고 합니다. (&lt;a href=&quot;https://github.com/Netflix/Hystrix#hystrix-status&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/Netflix/Hystrix#hystrix-status&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p&gt;수동으로 버전을 명시해주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1618818649239&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-hystrix&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.2.7.RELEASE&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;를 보면 최신 버전이 2.2.7.RELEASE입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;이미지 027.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;313&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkat48/btq2QUdkO64/R9NnOUFhw8KdiQhBW8tuKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkat48/btq2QUdkO64/R9NnOUFhw8KdiQhBW8tuKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkat48/btq2QUdkO64/R9NnOUFhw8KdiQhBW8tuKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkat48%2Fbtq2QUdkO64%2FR9NnOUFhw8KdiQhBW8tuKk%2Fimg.png&quot; data-filename=&quot;이미지 027.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;313&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그런데 &lt;span style=&quot;color: #333333;&quot;&gt;흠.. 사용에는 문제가 없을텐데 &lt;/span&gt;이제 deprecated가 뜨네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/66779166/spring-cloud-netflix-hystrix-gradle-dependency-not-allowing-spring-boot-applicat&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stackoverflow.com/questions/66779166/spring-cloud-netflix-hystrix-gradle-dependency-not-allowing-spring-boot-applicat&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618819039991&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring cloud Netflix-Hystrix gradle dependency not allowing spring boot application to start&quot; data-og-description=&quot;I have built simple microservice application using Spring-Boot and Eureka server. Now, I want to add fault-tolerance in case any of service registered in Eureka server is down. So, I used netflix-h...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/66779166/spring-cloud-netflix-hystrix-gradle-dependency-not-allowing-spring-boot-applicat&quot; data-og-url=&quot;https://stackoverflow.com/questions/66779166/spring-cloud-netflix-hystrix-gradle-dependency-not-allowing-spring-boot-applicat&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bFD14E/hyJWtbwPhw/DunfrknxgNHKWHoxpzp8b1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/66779166/spring-cloud-netflix-hystrix-gradle-dependency-not-allowing-spring-boot-applicat&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/66779166/spring-cloud-netflix-hystrix-gradle-dependency-not-allowing-spring-boot-applicat&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bFD14E/hyJWtbwPhw/DunfrknxgNHKWHoxpzp8b1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Spring cloud Netflix-Hystrix gradle dependency not allowing spring boot application to start&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;I have built simple microservice application using Spring-Boot and Eureka server. Now, I want to add fault-tolerance in case any of service registered in Eureka server is down. So, I used netflix-h...&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/309</guid>
      <comments>https://darkstart.tistory.com/309#entry309comment</comments>
      <pubDate>Mon, 19 Apr 2021 18:04:22 +0900</pubDate>
    </item>
    <item>
      <title>[서버][스프링][Kotlin] WebClient의 response를 generics로 매핑하는 방법</title>
      <link>https://darkstart.tistory.com/307</link>
      <description>&lt;p&gt;스프링에서 WebClient의 response를 generics으로 매핑하는 방법을 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;generics 관련 정보는 컴파일 단계에서 사라지므로 간단하게 해결되지 않습니다.&lt;/p&gt;
&lt;p&gt;더군다나 코틀린으로 하면 조금 더 복잡해 지는 것 같네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Generics가 없다면 그냥 아래와 같이 사용하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;bodyToMono(ApiResult::class.java)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;그런데 response가 ApiResult&amp;lt;RoomDto&amp;gt;의 타입이라면 방법을 좀 바꿔야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;java라면&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1618757931200&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bodyToMono(new ParameterizedTypeReference&amp;lt;ApiResult&amp;lt;RoomDto&amp;gt;&amp;gt;() {})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 코드를 사용하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코틀린에서는?&lt;/p&gt;
&lt;pre id=&quot;code_1618757973821&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bodyToMono(object : ParameterizedTypeReference&amp;lt;ApiResult&amp;lt;RoomDto&amp;gt;&amp;gt;() {})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 사용하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;object: 부분이 없으면 에러가 발생합니다.&lt;/p&gt;
&lt;p&gt;문법이 좀 특이해 보이네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://umbum.dev/925&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;umbum.dev/925&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618756378394&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;RestTemplate 사용 시 ResponseType으로 generic 타입 받기 (ParameterizedTypeReference)&quot; data-og-description=&quot;Response를 받을 때 Generic 타입으로 매핑하여&amp;nbsp;받고 싶을 때가 있다. &amp;#96;&amp;#96;&amp;#96;java DefaultResponseWrapper userInfoResponseWrapper = restTemplate.postForObject( userInfoUrl, new UserInfoRequest(&amp;quot;MTA1&amp;quot;, &amp;quot;HH_S..&quot; data-og-host=&quot;umbum.dev&quot; data-og-source-url=&quot;https://umbum.dev/925&quot; data-og-url=&quot;https://umbum.dev/925&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bupome/hyJWBNMYr2/sNh3A8VAQMqpUZe4P4k8w0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/YUnh0/hyJWxEChUP/zY6Zsz2FDDnYaGgOkx8601/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://umbum.dev/925&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://umbum.dev/925&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bupome/hyJWBNMYr2/sNh3A8VAQMqpUZe4P4k8w0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/YUnh0/hyJWxEChUP/zY6Zsz2FDDnYaGgOkx8601/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;RestTemplate 사용 시 ResponseType으로 generic 타입 받기 (ParameterizedTypeReference)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Response를 받을 때 Generic 타입으로 매핑하여&amp;nbsp;받고 싶을 때가 있다. ```java DefaultResponseWrapper userInfoResponseWrapper = restTemplate.postForObject( userInfoUrl, new UserInfoRequest(&quot;MTA1&quot;, &quot;HH_S..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;umbum.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/307</guid>
      <comments>https://darkstart.tistory.com/307#entry307comment</comments>
      <pubDate>Sun, 18 Apr 2021 23:32:59 +0900</pubDate>
    </item>
    <item>
      <title>[서버][스프링] WebClient post로 request pody 전달하는 방법</title>
      <link>https://darkstart.tistory.com/306</link>
      <description>&lt;pre id=&quot;code_1618752076502&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val response = webClient
                .mutate()
                .build()
                .post()
                .uri(&quot;/v1/items/roomPriceSum&quot;)
                .bodyValue(roomPriceSumDtoList)
                .retrieve()
                .bodyToMono(ApiResult::class.java)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WebClient에서 그냥 body()를 사용하면 Flux나 Mono와 같은 wrapper?를 써야한다는 불편함이 있습니다.&lt;/p&gt;
&lt;p&gt;body()가 아닌 bodyValue를 쓰면 더 쉬운 것 같네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/61379713/7225691&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stackoverflow.com/a/61379713/7225691&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618751999733&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring WebFlux throws 'producer' type is unknow when I return value in the response body&quot; data-og-description=&quot;I'm using Spring Boot with Kotlin, and now trying to get status value from a GET restful service by passing a handler for a reactive service. I can see that the handler I'm passing is in the reque...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/a/61379713/7225691&quot; data-og-url=&quot;https://stackoverflow.com/questions/58519036/spring-webflux-throws-producer-type-is-unknow-when-i-return-value-in-the-respo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ix5sa/hyJWuVnX43/G3giEI3MBr6tK0eN7sKFb0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/61379713/7225691&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/a/61379713/7225691&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ix5sa/hyJWuVnX43/G3giEI3MBr6tK0eN7sKFb0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Spring WebFlux throws 'producer' type is unknow when I return value in the response body&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;I'm using Spring Boot with Kotlin, and now trying to get status value from a GET restful service by passing a handler for a reactive service. I can see that the handler I'm passing is in the reque...&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/306</guid>
      <comments>https://darkstart.tistory.com/306#entry306comment</comments>
      <pubDate>Sun, 18 Apr 2021 22:22:39 +0900</pubDate>
    </item>
    <item>
      <title>[메이븐] compile 과 install 차이점</title>
      <link>https://darkstart.tistory.com/305</link>
      <description>&lt;p&gt;*mvn compile 했을 때&lt;/p&gt;
&lt;pre id=&quot;code_1618732566987&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;C:\Program Files\Java\openjdk-8u272-b10-windows-64\bin\java.exe&quot; -Dmaven.multiModuleProjectDirectory=C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common &quot;-Dmaven.home=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3&quot; &quot;-Dclassworlds.conf=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3\bin\m2.conf&quot; &quot;-Dmaven.ext.class.path=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven-event-listener.jar&quot; &quot;-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\lib\idea_rt.jar=63560:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\bin&quot; -Dfile.encoding=UTF-8 -classpath &quot;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3\boot\plexus-classworlds-2.6.0.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3\boot\plexus-classworlds.license&quot; org.codehaus.classworlds.Launcher -Didea.version=2021.1 compile
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------&amp;lt; com.dreamaz.gongga:common &amp;gt;----------------------
[INFO] Building common 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kotlin-maven-plugin:1.4.31:kapt (kapt) @ common ---
[WARNING] Source root doesn't exist: C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\src\main\java
[INFO] Applied plugin: 'spring'
[INFO] Applied plugin: 'jpa'
[INFO] Applied plugin: 'no-arg'
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ common ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 0 resource
[INFO] Copying 0 resource
[INFO] 
[INFO] --- kotlin-maven-plugin:1.4.31:compile (compile) @ common ---
[INFO] Applied plugin: 'spring'
[INFO] Applied plugin: 'jpa'
[INFO] Applied plugin: 'no-arg'
[WARNING] Duplicate source root: C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\generated-sources\kapt\compile
[WARNING] Duplicate source root: C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\generated-sources\kaptKotlin\compile
[WARNING] C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\src\main\kotlin\com\dreamaz\gongga\common\util\DateUtil.kt: (19, 17) Variable 'monthRangeArray' is never used
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (java-compile) @ common ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  10.431 s
[INFO] Finished at: 2021-04-18T16:55:57+09:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;*mvn install 했을 때&lt;/p&gt;
&lt;pre id=&quot;code_1618732503177&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;C:\Program Files\Java\openjdk-8u272-b10-windows-64\bin\java.exe&quot; -Dmaven.multiModuleProjectDirectory=C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common &quot;-Dmaven.home=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3&quot; &quot;-Dclassworlds.conf=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3\bin\m2.conf&quot; &quot;-Dmaven.ext.class.path=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven-event-listener.jar&quot; &quot;-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\lib\idea_rt.jar=63536:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\bin&quot; -Dfile.encoding=UTF-8 -classpath &quot;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3\boot\plexus-classworlds-2.6.0.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\plugins\maven\lib\maven3\boot\plexus-classworlds.license&quot; org.codehaus.classworlds.Launcher -Didea.version=2021.1 install
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------&amp;lt; com.dreamaz.gongga:common &amp;gt;----------------------
[INFO] Building common 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kotlin-maven-plugin:1.4.31:kapt (kapt) @ common ---
[WARNING] Source root doesn't exist: C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\src\main\java
[INFO] Applied plugin: 'spring'
[INFO] Applied plugin: 'jpa'
[INFO] Applied plugin: 'no-arg'
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ common ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 0 resource
[INFO] Copying 0 resource
[INFO] 
[INFO] --- kotlin-maven-plugin:1.4.31:compile (compile) @ common ---
[INFO] Applied plugin: 'spring'
[INFO] Applied plugin: 'jpa'
[INFO] Applied plugin: 'no-arg'
[WARNING] Duplicate source root: C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\generated-sources\kapt\compile
[WARNING] Duplicate source root: C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\generated-sources\kaptKotlin\compile
[WARNING] C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\src\main\kotlin\com\dreamaz\gongga\common\util\DateUtil.kt: (19, 17) Variable 'monthRangeArray' is never used
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (java-compile) @ common ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ common ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\src\test\resources
[INFO] 
[INFO] --- kotlin-maven-plugin:1.4.31:test-compile (test-compile) @ common ---
[WARNING] No sources found skipping Kotlin compile
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (java-test-compile) @ common ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ common ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ common ---
[INFO] Building jar: C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\common-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ common ---
[INFO] Installing C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\common-0.0.1-SNAPSHOT.jar to C:\Users\mazend\.m2\repository\com\dreamaz\gongga\common\0.0.1-SNAPSHOT\common-0.0.1-SNAPSHOT.jar
[INFO] Installing C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\pom.xml to C:\Users\mazend\.m2\repository\com\dreamaz\gongga\common\0.0.1-SNAPSHOT\common-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  12.697 s
[INFO] Finished at: 2021-04-18T16:54:25+09:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mvn install의 로그가 더 깁니다.&lt;/p&gt;
&lt;p&gt;여기서 주목해서 봐야할 부분은 바로 아래의 부분입니다.(mvn install)&lt;/p&gt;
&lt;pre id=&quot;code_1618732648588&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ common ---
[INFO] Installing C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\target\common-0.0.1-SNAPSHOT.jar to C:\Users\mazend\.m2\repository\com\dreamaz\gongga\common\0.0.1-SNAPSHOT\common-0.0.1-SNAPSHOT.jar
[INFO] Installing C:\Users\mazend\IdeaProjects\gongga_spring\gongga\common\pom.xml to C:\Users\mazend\.m2\repository\com\dreamaz\gongga\common\0.0.1-SNAPSHOT\common-0.0.1-SNAPSHOT.pom&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;compile의 결과물을 아래와 같은 local repository로 복사합니다. 이렇게 해야 다른 프로젝트에서 이 jar를 dependency로 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;C:\Users\mazend\.m2\repository\com\dreamaz\gongga\common\0.0.1-SNAPSHOT\common-0.0.1-SNAPSHOT.jar&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;validate&lt;span&gt;&amp;nbsp;&lt;/span&gt;- validate the project is correct and all necessary information is available&lt;/li&gt;
&lt;li&gt;compile&lt;span&gt;&amp;nbsp;&lt;/span&gt;- compile the source code of the project&lt;/li&gt;
&lt;li&gt;test&lt;span&gt;&amp;nbsp;&lt;/span&gt;- test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed&lt;/li&gt;
&lt;li&gt;package&lt;span&gt;&amp;nbsp;&lt;/span&gt;- take the compiled code and package it in its distributable format, such as a JAR.&lt;/li&gt;
&lt;li&gt;verify&lt;span&gt;&amp;nbsp;&lt;/span&gt;- run any checks on results of integration tests to ensure quality criteria are met&lt;/li&gt;
&lt;li&gt;install&lt;span&gt;&amp;nbsp;&lt;/span&gt;- install the package into the &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;local repository, for use as a dependency in other projects locally&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;deploy&lt;span&gt;&amp;nbsp;&lt;/span&gt;- done in the build environment, copies the final package to the remote repository for sharing with other developers and projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618732403855&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Maven &amp;ndash; Introduction to the Build Lifecycle&quot; data-og-description=&quot;The build lifecycle is simple enough to use, but when you are constructing a Maven build for a project, how do you go about assigning tasks to each of those build phases? The first, and most common way, is to set the packaging for your project via the equa&quot; data-og-host=&quot;maven.apache.org&quot; data-og-source-url=&quot;https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&quot; data-og-url=&quot;https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Maven &amp;ndash; Introduction to the Build Lifecycle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;The build lifecycle is simple enough to use, but when you are constructing a Maven build for a project, how do you go about assigning tasks to each of those build phases? The first, and most common way, is to set the packaging for your project via the equa&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;maven.apache.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/305</guid>
      <comments>https://darkstart.tistory.com/305#entry305comment</comments>
      <pubDate>Sun, 18 Apr 2021 16:59:54 +0900</pubDate>
    </item>
    <item>
      <title>[스프링][map struct] error: Property &amp;quot;itemId&amp;quot; has no write accessor in ItemDtoInfo.</title>
      <link>https://darkstart.tistory.com/304</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 현상&lt;/h3&gt;
&lt;p&gt;메이븐 빌드 시 아래의 에러가 발생함&lt;/p&gt;
&lt;pre id=&quot;code_1618731976862&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;error: Property &quot;itemId&quot; has no write accessor in ItemDtoInfo.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;*ItemDtoInfo 코드&lt;/p&gt;
&lt;pre id=&quot;code_1618731988155&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data class ItemDtoInfo(val itemId: String, var roomId : String, var incomeType: Int, var price: BigDecimal, var item: String)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p&gt;ItemDtoInfo에서 itemId가 val로 선언되서 생긴 문제로 보입니다.&lt;/p&gt;
&lt;p&gt;val로 선언되면 컴파일 후에도 getItemId() 함수만 생성되고 setItemId()가 생성되지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그런데 컴파일 단계에서 생성된 mapper implement를 보면 생성자가 아닌 setXXX() 등의 함수로 값이 설정되기 때문에 이런 문제가 생깁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1618741934141&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public ItemDtoInfo itemToItemDtoInfo(Item item) {
        if (item == null) {
            return null;
        } else {
            String arg0 = null;
            String arg1 = null;
            int arg2 = 0;
            BigDecimal arg3 = null;
            String arg4 = null;
            ItemDtoInfo itemDtoInfo = new ItemDtoInfo((String)arg0, (String)arg1, arg2, (BigDecimal)arg3, (String)arg4);
            itemDtoInfo.setItemId(item.getItemId());
            itemDtoInfo.setRoomId(item.getRoomId());
            itemDtoInfo.setIncomeType(item.getIncomeType());
            itemDtoInfo.setPrice(item.getPrice());
            itemDtoInfo.setItem(item.getItem());
            return itemDtoInfo;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ItemDtoInfo에서 itemId가 var로 변경하면 문제가 해결됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;없음&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/304</guid>
      <comments>https://darkstart.tistory.com/304#entry304comment</comments>
      <pubDate>Sun, 18 Apr 2021 16:51:11 +0900</pubDate>
    </item>
    <item>
      <title>[링크][영어] db의 timestamp를 Entity에 매핑하는 방법</title>
      <link>https://darkstart.tistory.com/302</link>
      <description>&lt;p&gt;제가 볼 때는 LocalDateTime을 이용하는게 좋아보이네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vladmihalcea.com/date-timestamp-jpa-hibernate/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;vladmihalcea.com/date-timestamp-jpa-hibernate/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618727079150&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;How to map Date and Timestamp with JPA and Hibernate - Vlad Mihalcea&quot; data-og-description=&quot;Learn the best way to map Date, Timestamp, or DateTime column types when using JPA and Hibernate using Date, LocalDate, and LocalDateTime.&quot; data-og-host=&quot;vladmihalcea.com&quot; data-og-source-url=&quot;https://vladmihalcea.com/date-timestamp-jpa-hibernate/&quot; data-og-url=&quot;https://vladmihalcea.com/date-timestamp-jpa-hibernate/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfIKv4/hyJU3EITyy/tz48jQZKNluXqum8FCUoVK/img.png?width=680&amp;amp;height=239&amp;amp;face=0_0_680_239,https://scrap.kakaocdn.net/dn/3KdeF/hyJU0H063l/rxvJkOnnDY5ZgjrRdnkL01/img.png?width=768&amp;amp;height=402&amp;amp;face=0_0_768_402,https://scrap.kakaocdn.net/dn/c5ELzN/hyJU6OZ8Qv/oz6fFz1enNsdzYqnXDEl71/img.png?width=988&amp;amp;height=266&amp;amp;face=0_0_988_266&quot;&gt;&lt;a href=&quot;https://vladmihalcea.com/date-timestamp-jpa-hibernate/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vladmihalcea.com/date-timestamp-jpa-hibernate/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfIKv4/hyJU3EITyy/tz48jQZKNluXqum8FCUoVK/img.png?width=680&amp;amp;height=239&amp;amp;face=0_0_680_239,https://scrap.kakaocdn.net/dn/3KdeF/hyJU0H063l/rxvJkOnnDY5ZgjrRdnkL01/img.png?width=768&amp;amp;height=402&amp;amp;face=0_0_768_402,https://scrap.kakaocdn.net/dn/c5ELzN/hyJU6OZ8Qv/oz6fFz1enNsdzYqnXDEl71/img.png?width=988&amp;amp;height=266&amp;amp;face=0_0_988_266');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;How to map Date and Timestamp with JPA and Hibernate - Vlad Mihalcea&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Learn the best way to map Date, Timestamp, or DateTime column types when using JPA and Hibernate using Date, LocalDate, and LocalDateTime.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vladmihalcea.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/스크랩</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/302</guid>
      <comments>https://darkstart.tistory.com/302#entry302comment</comments>
      <pubDate>Sun, 18 Apr 2021 15:28:14 +0900</pubDate>
    </item>
    <item>
      <title>[링크][영어] git flow 참고 사이트</title>
      <link>https://darkstart.tistory.com/301</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;친구가 알려준 git flow 참고 사이트입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://danielkummer.github.io/git-flow-cheatsheet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;danielkummer.github.io/git-flow-cheatsheet/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618723547171&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;git-flow cheatsheet&quot; data-og-description=&quot;&quot; data-og-host=&quot;danielkummer.github.io&quot; data-og-source-url=&quot;https://danielkummer.github.io/git-flow-cheatsheet/&quot; data-og-url=&quot;https://danielkummer.github.io/git-flow-cheatsheet/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AgAbw/hyJU5WNzPU/T0yvkmtezh6R83deJZL9K1/img.png?width=620&amp;amp;height=341&amp;amp;face=0_0_620_341&quot;&gt;&lt;a href=&quot;https://danielkummer.github.io/git-flow-cheatsheet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://danielkummer.github.io/git-flow-cheatsheet/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AgAbw/hyJU5WNzPU/T0yvkmtezh6R83deJZL9K1/img.png?width=620&amp;amp;height=341&amp;amp;face=0_0_620_341');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;git-flow cheatsheet&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;danielkummer.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;그리고 이건 git이나 git flow를 좀 더 편하게 UI로 처리할 수 있는 SourceTree라는 프로그램의 가이드입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618723572479&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Smart branching with SourceTree and Git-flow | SourceTree Blog&quot; data-og-description=&quot;By Steve on August 1, 2012 Note: for brevity this article refers to Git and git-flow, but SourceTree supports exactly the same concepts in Mercurial via Hg Flow too. In early 2010,&amp;nbsp;Vincent Driessen wrote an article called&amp;nbsp;&amp;ldquo;A successful Git branching mo&quot; data-og-host=&quot;blog.sourcetreeapp.com&quot; data-og-source-url=&quot;https://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/&quot; data-og-url=&quot;https://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JxOZE/hyJUXLfRi2/txDinitbFN0Gljo6HUIKKk/img.jpg?width=352&amp;amp;height=296&amp;amp;face=0_0_352_296,https://scrap.kakaocdn.net/dn/bbB6S7/hyJUVGGgwj/KouYtdNwlbrf8JIrLzN8CK/img.jpg?width=352&amp;amp;height=277&amp;amp;face=0_0_352_277,https://scrap.kakaocdn.net/dn/wiFCw/hyJUZPPhKy/mHTIJBPNQycbIkpAWClF5k/img.jpg?width=352&amp;amp;height=212&amp;amp;face=0_0_352_212&quot;&gt;&lt;a href=&quot;https://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JxOZE/hyJUXLfRi2/txDinitbFN0Gljo6HUIKKk/img.jpg?width=352&amp;amp;height=296&amp;amp;face=0_0_352_296,https://scrap.kakaocdn.net/dn/bbB6S7/hyJUVGGgwj/KouYtdNwlbrf8JIrLzN8CK/img.jpg?width=352&amp;amp;height=277&amp;amp;face=0_0_352_277,https://scrap.kakaocdn.net/dn/wiFCw/hyJUZPPhKy/mHTIJBPNQycbIkpAWClF5k/img.jpg?width=352&amp;amp;height=212&amp;amp;face=0_0_352_212');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Smart branching with SourceTree and Git-flow | SourceTree Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;By Steve on August 1, 2012 Note: for brevity this article refers to Git and git-flow, but SourceTree supports exactly the same concepts in Mercurial via Hg Flow too. In early 2010,&amp;nbsp;Vincent Driessen wrote an article called&amp;nbsp;&amp;ldquo;A successful Git branching mo&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;blog.sourcetreeapp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;git fork와 pull request 설명:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/axisj/github-fork-%EC%97%90%EC%84%9C-pull-request-%EA%B9%8C%EC%A7%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-merge-a22bdd097283&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;medium.com/axisj/github-fork-%EC%97%90%EC%84%9C-pull-request-%EA%B9%8C%EC%A7%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-merge-a22bdd097283&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618723666877&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;github fork 에서 pull request 까지 그리고 merge&quot; data-og-description=&quot;요즘 gitHub에 가면 어마어마한 소스코드들이 널려있습니다. 개발자로서 자신의 한계를 충분히 느끼게 해줍니다. ㅜ.ㅜ (충분해도 너무 충분해)&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/axisj/github-fork-%EC%97%90%EC%84%9C-pull-request-%EA%B9%8C%EC%A7%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-merge-a22bdd097283&quot; data-og-url=&quot;https://medium.com/axisj/github-fork-%EC%97%90%EC%84%9C-pull-request-%EA%B9%8C%EC%A7%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-merge-a22bdd097283&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3F54M/hyJU3q9Zgk/tLjMpQA0AZ3i5Qrk2EuNbK/img.png?width=931&amp;amp;height=1024&amp;amp;face=0_0_931_1024,https://scrap.kakaocdn.net/dn/cq9mqY/hyJUXj9CGm/g5HLe8AjSVVsfX3vbrrLq1/img.png?width=60&amp;amp;height=15&amp;amp;face=0_0_60_15,https://scrap.kakaocdn.net/dn/p0iOQ/hyJUWlfC53/Y4uQ7JkWsuWzyBrOgvVC91/img.png?width=54&amp;amp;height=59&amp;amp;face=0_0_54_59&quot;&gt;&lt;a href=&quot;https://medium.com/axisj/github-fork-%EC%97%90%EC%84%9C-pull-request-%EA%B9%8C%EC%A7%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-merge-a22bdd097283&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/axisj/github-fork-%EC%97%90%EC%84%9C-pull-request-%EA%B9%8C%EC%A7%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-merge-a22bdd097283&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3F54M/hyJU3q9Zgk/tLjMpQA0AZ3i5Qrk2EuNbK/img.png?width=931&amp;amp;height=1024&amp;amp;face=0_0_931_1024,https://scrap.kakaocdn.net/dn/cq9mqY/hyJUXj9CGm/g5HLe8AjSVVsfX3vbrrLq1/img.png?width=60&amp;amp;height=15&amp;amp;face=0_0_60_15,https://scrap.kakaocdn.net/dn/p0iOQ/hyJUWlfC53/Y4uQ7JkWsuWzyBrOgvVC91/img.png?width=54&amp;amp;height=59&amp;amp;face=0_0_54_59');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;github fork 에서 pull request 까지 그리고 merge&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;요즘 gitHub에 가면 어마어마한 소스코드들이 널려있습니다. 개발자로서 자신의 한계를 충분히 느끼게 해줍니다. ㅜ.ㅜ (충분해도 너무 충분해)&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;git flow에서 브랜치와 remote 관계:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/54201051/7225691&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stackoverflow.com/a/54201051/7225691&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1618728772037&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;With gitflow, which branch must be on local and which one must be on remote?&quot; data-og-description=&quot;I'm going to switch to gitflow ! i'm confused if i should create all branches on remote or there are branches that should be on local ! thank you for your help.&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/a/54201051/7225691&quot; data-og-url=&quot;https://stackoverflow.com/questions/54200818/with-gitflow-which-branch-must-be-on-local-and-which-one-must-be-on-remote&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h2yWU/hyJUWr4UuI/4ZhYv0kzj3utomk6DIVUc0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/54201051/7225691&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/a/54201051/7225691&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h2yWU/hyJUWr4UuI/4ZhYv0kzj3utomk6DIVUc0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;With gitflow, which branch must be on local and which one must be on remote?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;I'm going to switch to gitflow ! i'm confused if i should create all branches on remote or there are branches that should be on local ! thank you for your help.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/스크랩</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/301</guid>
      <comments>https://darkstart.tistory.com/301#entry301comment</comments>
      <pubDate>Sun, 18 Apr 2021 14:26:44 +0900</pubDate>
    </item>
    <item>
      <title>[자바] Bit Shift간단 정리(비트 조작)</title>
      <link>https://darkstart.tistory.com/300</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &amp;lt;&amp;lt; (Left Shift)&lt;/h3&gt;
&lt;p&gt;간단하게 모든 비트를 왼쪽으로 이동 시킴&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1618465479485&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//양수 테스트
int a = 1073741824+1; // 0100 0000 0000 0000 0000 0000 0000 0000 0001
a = a &amp;lt;&amp;lt; 1; //1000 0000 0000 0000 0000 0000 0000 0010(10진수로 -2147483646의 값)

//음수 테스트
int a = -2147483646; // 1000 0000 0000 0000 0000 0000 0000 0010
a = a &amp;lt;&amp;lt; 1; //0000 0000 0000 0000 0000 0000 0000 0100 (10진수로 4의 값)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &amp;gt;&amp;gt; (Arithmetic/Signed Right Shift)&lt;/h3&gt;
&lt;p&gt;부호의 정보를 담은 MSB를 제외한 나머지 비트를 오른쪽으로 이동시킴&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;MSB 바로 오른쪽 비트의 값이 MSB와 같은 값이 되는 것을 유의&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;양수든 음수든 1칸 비트를 이동시킬 때마다 값이 약 절반으로 줄어드므로 Arithmetic Right Shift라 불립니다.&lt;/p&gt;
&lt;p&gt;양수나 음수 모두 잘 적용되기에 Signed Right Shift라고도 불리는 것 같네요.&lt;/p&gt;
&lt;pre id=&quot;code_1618465649079&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//양수 테스트
int a = 1073741824+1; // 0100 0000 0000 0000 0000 0000 0000 0000 0001
a = a &amp;gt;&amp;gt; 1; //0010 0000 0000 0000 0000 0000 0000 0000 (10진수로 536870912의 값)

//음수 테스트
int a = -2147483646; // 1000 0000 0000 0000 0000 0000 0000 0010
a = a &amp;gt;&amp;gt; 1; //1100 0000 0000 0000 0000 0000 0000 0001 (10진수로 -1073741823의 값)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &amp;gt;&amp;gt;&amp;gt; (Logical/Unsigned Right Shift)&lt;/h3&gt;
&lt;p&gt;부호의 정보를 담은 MSB도 다른 비트와 동일하게 모두 오른쪽으로 이동시킴&lt;/p&gt;
&lt;pre id=&quot;code_1618465801118&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//양수 테스트
int a = 1073741824+1; // 0100 0000 0000 0000 0000 0000 0000 0000 0001
a = a &amp;gt;&amp;gt;&amp;gt; 1; //0010 0000 0000 0000 0000 0000 0000 0000 (10진수로 536870912의 값)

//음수 테스트
int a = -2147483646; // 1000 0000 0000 0000 0000 0000 0000 0010
a = a &amp;gt;&amp;gt;&amp;gt; 1; //0100 0000 0000 0000 0000 0000 0000 0001 (10진수로 1073741825의 값)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;음수인 경우는 모든 비트를 1칸씩 옮기면 값이 약 절반으로 줄어드는 게 아니므로 Arithmetic이 아닙니다.&lt;/p&gt;
&lt;p&gt;양수인 경우에만 비트를 1칸씩 옮길 때 값이 약 절반으로 줄어드므로 Logical/Unsigned Right Shift라고 불리네요.&lt;/p&gt;</description>
      <category>프로그래밍/자바</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/300</guid>
      <comments>https://darkstart.tistory.com/300#entry300comment</comments>
      <pubDate>Thu, 15 Apr 2021 14:51:26 +0900</pubDate>
    </item>
    <item>
      <title>[스프링] @RequestBody 파싱이 제대로 안될 때(null)</title>
      <link>https://darkstart.tistory.com/299</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 현상&lt;/h3&gt;
&lt;pre id=&quot;code_1617934099345&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;userId&quot;: &quot;99999&quot;,
    &quot;nickName&quot;: &quot;TEST&quot;,
    &quot;fToken&quot;: &quot;dsfsdfsdf&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;테스트를 위해 Postman에서 위와 같은 request를 서버로 날리면 fToken만 제대로 파싱이 되지 않아 DTO의 fToken 값이 null이 되는 문제가 발생했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;*User DTO&lt;/p&gt;
&lt;pre id=&quot;code_1617934230273&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Data
@AllArgsConstructor(staticName = &quot;of&quot;)
@NoArgsConstructor
public static class UserInsert {
    String userId;
    String nickName;
    String fToken;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;pre id=&quot;code_1617934516725&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public String getUserId() {
    return this.userId;
}

public String getNickName() {
    return this.nickName;
}

public String getFToken() {
    return this.fToken;
}

  
public void setUserId(final String userId) {
    this.userId = userId;
}

public void setNickName(final String nickName) {
    this.nickName = nickName;
}

public void setFToken(final String fToken) {
    this.fToken = fToken;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lombok에 의해 위의 setter/getter가 자동 생성됩니다.&lt;/p&gt;
&lt;p&gt;Controller의 특정 함수에서 json을 담은 request를 전달 받으면 스프링에선 Jackson을 이용하여 자바 객체를 만듭니다. 이 때 setter/getter를 이용해서 필드값을 채우는 데 이 때 규칙이 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;userId를 설정할 때는 setUserId(), getUserId()를 찾기에 문제가 되지 않습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그런데 fToken처럼 소문자 1개만 있고 바로 그 다음이 대문자인 경우에는 Jaskson에서 setFToken(), getFToken()을 찾는게 아니라 setfToken(), getfToken()함수를 찾습니다. 이 함수가 없기 때문에 그냥 무시하고 넘어가게 되고 결국 null 값을 가지게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p&gt;방법1. 직접 setfToken(), getfToken() 함수를 만들어도 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;방법2. 혹은 아래와 같이 @JsonProperty 어노테이션을 이용해 json property의 이름을 명시해줘도 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1617935888694&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@JsonProperty(&quot;fToken&quot;)
String fToken;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;*추가로 map struct를 쓰면 DTO에서 Entity로 변환시킬 때 또 문제가 생깁니다.&lt;/p&gt;
&lt;p&gt;아래와 같이 명시적으로 Mapping을 선언해주면 문제가 해결됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1617937015692&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @Mapping(source = &quot;fToken&quot;, target = &quot;fToken&quot;)
    User userInsertToUser(UserDto.UserInsert userInsert);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.programmersought.com/article/99231692158/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.programmersought.com/article/99231692158/&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/서버</category>
      <author>드리머즈</author>
      <guid isPermaLink="true">https://darkstart.tistory.com/299</guid>
      <comments>https://darkstart.tistory.com/299#entry299comment</comments>
      <pubDate>Fri, 9 Apr 2021 11:32:34 +0900</pubDate>
    </item>
  </channel>
</rss>