<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>끄적끄적</title>
    <link>https://soosue.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 8 Aug 2026 15:42:09 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>soosue</managingEditor>
    <item>
      <title>[Git] alias</title>
      <link>https://soosue.tistory.com/35</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git 의 명령어를 계속 사용하다 보면 다 치기 귀찮을 때가 있다.&lt;/li&gt;
&lt;li&gt;이 때 alias 를 이용하여 git 명령어를 단축 명령어로 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;등록 방법은 2가지가 있다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git 명령어로 하는 방법&lt;/li&gt;
&lt;li&gt;gitconfig 파일을 이용하는 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git log 명령어를 git l 로 실행하는 방법을 알아보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. git 명령어로 하는 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git config --global alias.l log : 다른 프로젝트에서도 적용된다.&lt;/li&gt;
&lt;li&gt;git config --local alias.l log : 해당 프로젝트에서만 적용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. gitconfig 파일을 이용하는 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gitconfig 파일은 git 관련된 설정이 저장되어 있는 파일이다.&lt;/li&gt;
&lt;li&gt;해당 파일은 2곳에 위치한다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.git/config : 해당 프로젝트 폴더의 .git 폴더 안의 config 파일&lt;/li&gt;
&lt;li&gt;~/.gitconfig : 사용자의 홈 디렉토리 안의 .gitconfig 파일&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;해당 파일을 열어 아래 내용을 추가로 입력 해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1665059044153&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[alias]
	l = log&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.git 의 config 파일에 적는 설정은 해당 프로젝트에만 적용된다.&lt;/li&gt;
&lt;li&gt;사용자 홈의 .gitconfig 파일에 적는 설정은 해당 사용자를 이용한 프로젝트에 모두 적용된다.&lt;/li&gt;
&lt;li&gt;양쪽에 같은 설정이 존재하는 경우, .git 의 config 설정이 우선순위를 가진다.&lt;/li&gt;
&lt;li&gt;git config --global alias.l log 명령어를 쓰는 경우. 사용자 홈의 .gitconfig 파일에 저장되므로 결국 같은 방법이다.&lt;/li&gt;
&lt;li&gt;git config --local alias.l log 는 .git 의 config 파일에 저장된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;현재 적용되어 있는 alias 확인하는 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git config --local --get-regexp alias : .git/config 파일에 설정된 alias 확인&lt;/li&gt;
&lt;li&gt;git config --global --get-regexp alias : ~/.gitconfig 파일에 설정된 alias 확인&lt;/li&gt;
&lt;li&gt;git config --get-regexp alias : 양쪽 파일에 설정된 alias 확인&lt;/li&gt;
&lt;/ul&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;pre class=&quot;nix&quot;&gt;&lt;code&gt;[alias]
		b = branch
		l = log
		co = checkout
		si = switch
		st = status
		p = push
		pl = pull
		sc = switch -c
		r = remote
		rv = remote -v
&lt;/code&gt;&lt;/pre&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;a href=&quot;https://git-scm.com/book/ko/v2/Git의-기초-Git-Alias&quot;&gt;https://git-scm.com/book/ko/v2/Git의-기초-Git-Alias&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/ko/v2/시작하기-Git-최초-설정&quot;&gt;https://git-scm.com/book/ko/v2/시작하기-Git-최초-설정&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>git</category>
      <category>.gitconfig</category>
      <category>.gitconfig 파일</category>
      <category>alias</category>
      <category>git alias</category>
      <category>git alias 설정</category>
      <category>git alias 하는법</category>
      <category>git config</category>
      <category>git config alias</category>
      <category>git config파일</category>
      <category>git 명령어 alias</category>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/35</guid>
      <comments>https://soosue.tistory.com/35#entry35comment</comments>
      <pubDate>Thu, 6 Oct 2022 21:27:30 +0900</pubDate>
    </item>
    <item>
      <title>[Git] remote repository branch 가져와서 바로 local branch 만들기</title>
      <link>https://soosue.tistory.com/34</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFLr4M/btrNX8iKLaI/m8SgPUdK8C3TfH282mjjl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFLr4M/btrNX8iKLaI/m8SgPUdK8C3TfH282mjjl0/img.png&quot; data-alt=&quot;remote 의 branch 를 가져와서 사용하고 싶다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFLr4M/btrNX8iKLaI/m8SgPUdK8C3TfH282mjjl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFLr4M%2FbtrNX8iKLaI%2Fm8SgPUdK8C3TfH282mjjl0%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;183&quot; height=&quot;279&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;remote 의 branch 를 가져와서 사용하고 싶다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이런 상황이다. local 에서 remote 의 mybranch 를 가져오고 동시에 해당 branch 로 전환하고 싶다.&lt;/li&gt;
&lt;li&gt;어떻게 하겠는가? git 명령어 2개면 할 수 있다. (현재 작업 중이던 내용이 없다고 할 때!)&lt;/li&gt;
&lt;/ul&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;643&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PFOOm/btrNZn0sxHy/SbdkU5AWIJVEpbeZVDACSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PFOOm/btrNZn0sxHy/SbdkU5AWIJVEpbeZVDACSk/img.png&quot; data-alt=&quot;remote 에 push 하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PFOOm/btrNZn0sxHy/SbdkU5AWIJVEpbeZVDACSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPFOOm%2FbtrNZn0sxHy%2FSbdkU5AWIJVEpbeZVDACSk%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;643&quot; height=&quot;345&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;remote 에 push 하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git 을 remote repository 와 함께 사용하다보면 local 의 branch 를 remote 에 올리는 일은 빈번하게 일어난다.&lt;/li&gt;
&lt;li&gt;그런데 회사에서 저 branch 를 사용하고 싶다. 한 번에 할 수 있는 방법이 있다.&lt;/li&gt;
&lt;/ul&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;839&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1zsJs/btrNYfPFlnZ/0XZzgb9n0lflAr3AtpGdf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1zsJs/btrNYfPFlnZ/0XZzgb9n0lflAr3AtpGdf0/img.png&quot; data-alt=&quot;remote 에서 branch 가져와서 사용하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1zsJs/btrNYfPFlnZ/0XZzgb9n0lflAr3AtpGdf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1zsJs%2FbtrNYfPFlnZ%2F0XZzgb9n0lflAr3AtpGdf0%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;839&quot; height=&quot;373&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;remote 에서 branch 가져와서 사용하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git remote update 명령어를 통해 remote 의 branch 들을 local (회사) 에 동기화 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git branch -a 로 remote 의 branch 들도 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;git switch -t origin/mybranch 명령어로 origin/mybranch 기반으로 local 에 mybranch 라는 이름의 branch 로 변경할 수 있다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>git</category>
      <category>branch</category>
      <category>git</category>
      <category>local branch</category>
      <category>remote</category>
      <category>remote branch</category>
      <category>remote repository</category>
      <category>switch -t</category>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/34</guid>
      <comments>https://soosue.tistory.com/34#entry34comment</comments>
      <pubDate>Thu, 6 Oct 2022 21:21:02 +0900</pubDate>
    </item>
    <item>
      <title>slf4j가 Logger 구현체를 선택하는 방법(feat. Logger만들기)</title>
      <link>https://soosue.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아무도 궁금해하지 않겠지만, &lt;a href=&quot;https://soosue.tistory.com/29&quot; target=&quot;_self&quot;&gt;&lt;span&gt;눈팅으로 하는 웹 어플리케이션 서버 실습&lt;/span&gt;&lt;/a&gt;의 요구사항을 구현하면서 Logger를 사용하다보니 문득, slf4j의 Logger의 구현체는 어떻게 선택되는가 하는 의문이 들었다. (왜 항상 이런게 궁금한걸까...)&lt;br&gt;&lt;br&gt;자바에서는 Logging을 slf4j의 인터페이스인 Logger를 이용하여 남기기를 권장한다.&lt;br&gt;그렇게 하면 좋은 점은 classpath에 Logger구현체가 존재하면 해당 구현체를 이용하여 로깅하고, classpath의 구현체(라이브러리. logback이나 log4j)를 바꾸더라도 프로덕트 코드에는 영향이 없게 된다.&lt;br&gt; &lt;br&gt;즉, 자바의 추상화 기능을 잘 이용한 사례가 된다고 볼 수 있다.&lt;br&gt; &lt;br&gt;그럼 한 번 알아보자.&lt;br&gt;&lt;br&gt;slf4j를 통해 Logger를 사용하는 방법은&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xLQ3R/btrKrKZtWZs/UnJaeyueDjv4OjiVaKZ010/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xLQ3R/btrKrKZtWZs/UnJaeyueDjv4OjiVaKZ010/img.png&quot; data-alt=&quot; slf4j를 이용한 logger 사용법 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xLQ3R/btrKrKZtWZs/UnJaeyueDjv4OjiVaKZ010/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxLQ3R%2FbtrKrKZtWZs%2FUnJaeyueDjv4OjiVaKZ010%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;766&quot; height=&quot;53&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; slf4j를 이용한 logger 사용법 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; &lt;br&gt;slf4j의 LoggerFactory에서 getLogger()를 이용해 Logger 객체를 가져오고 해당 객체를 이용해 로깅을 남기면 된다.&lt;br&gt;그렇다면 당연히 LoggerFactory.getLogger(Class) 메소드를 확인해보면 구현체를 가져오는 코드가 있을 것이다.&lt;br&gt; &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZKqDS/btrLiAOxcoe/kQugxvifj0H7gLeWxYipS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZKqDS/btrLiAOxcoe/kQugxvifj0H7gLeWxYipS1/img.png&quot; data-alt=&quot; LoggerFactory.getLogger(Class) 메서드 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZKqDS/btrLiAOxcoe/kQugxvifj0H7gLeWxYipS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZKqDS%2FbtrLiAOxcoe%2FkQugxvifj0H7gLeWxYipS1%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;1082&quot; height=&quot;282&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; LoggerFactory.getLogger(Class) 메서드 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYjNDX/btrLgp2nhmH/MG5Dxxw25ZfbbkSqqKg530/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYjNDX/btrLgp2nhmH/MG5Dxxw25ZfbbkSqqKg530/img.png&quot; data-alt=&quot; LoggerFactory.getLogger(String) 메서드 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYjNDX/btrLgp2nhmH/MG5Dxxw25ZfbbkSqqKg530/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYjNDX%2FbtrLgp2nhmH%2FMG5Dxxw25ZfbbkSqqKg530%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;518&quot; height=&quot;106&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; LoggerFactory.getLogger(String) 메서드 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt;한 번에 많이 타고 왔지만 별 것 없다. 위에서부터 차례대로 천천히 코드를 읽어보면 getLogger() 메서드를 2번 거치고, getILoggerFactory() 메서드까지 온다는 것을 알 수 있다. 그리고 이곳에서 slf4j가 구현체를 선택하는 방법을 확인할 수 있다.&lt;br&gt;&lt;b&gt;StaticLoggerBinder.getSingleton().getLoggerFactory() &lt;/b&gt;바로 이 부분이 slf4j에서 logback으로 넘어가는 순간이다.&lt;br&gt; &lt;br&gt;코드를 보면 if문에서 초기화를 하고 switch문으로 넘어간다.&lt;br&gt;초기화가 성공하면, case SUCCESSFULL_INITIALIZATION로 넘어가는데, &lt;b&gt;StaticLoggerBinder.getSingleton().getLoggerFactory() &lt;/b&gt;이 코드는 slf4j 라이브러리에 없는 코드이다.&lt;br&gt; &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8gTTr/btrLgSprHvF/wDY7XD0JnzF8gYqkl9kpU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8gTTr/btrLgSprHvF/wDY7XD0JnzF8gYqkl9kpU1/img.png&quot; data-alt=&quot; LoggerFactory.getLoggerFactory() 메서드 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8gTTr/btrLgSprHvF/wDY7XD0JnzF8gYqkl9kpU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8gTTr%2FbtrLgSprHvF%2FwDY7XD0JnzF8gYqkl9kpU1%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;646&quot; height=&quot;517&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; LoggerFactory.getLoggerFactory() 메서드 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vnasz/btrLgvaoBi9/DcRwiWqyvUilAsI2bY41V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vnasz/btrLgvaoBi9/DcRwiWqyvUilAsI2bY41V0/img.png&quot; data-alt=&quot; slf4j 라이브러리. &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vnasz/btrLgvaoBi9/DcRwiWqyvUilAsI2bY41V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvnasz%2FbtrLgvaoBi9%2FDcRwiWqyvUilAsI2bY41V0%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;413&quot; height=&quot;305&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; slf4j 라이브러리. &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;저 StaticLoggerBinder클래스는 org.slf4j.impl 패키지에 존재해야하는데, slf4j 라이브러리에는 impl패키지가 존재하지 않는다.&lt;br&gt;여기서 logback의 코드를 보면 실마리를 찾을 수 있다. 저 코드는 logback이나 log4j와 같은 로깅라이브러리에서 작성해서 제공해야하는 코드인 것이다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMbrLl/btrLhXpV8Dv/m5zcEKKz2pRAI75k0Os4e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMbrLl/btrLhXpV8Dv/m5zcEKKz2pRAI75k0Os4e0/img.png&quot; data-alt=&quot; logback의 StaticLoggerBinder 클래스 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMbrLl/btrLhXpV8Dv/m5zcEKKz2pRAI75k0Os4e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMbrLl%2FbtrLhXpV8Dv%2Fm5zcEKKz2pRAI75k0Os4e0%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;368&quot; height=&quot;202&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; logback의 StaticLoggerBinder 클래스 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 로깅 라이브러리에서 StaticLoggerBinder를 제공해주고, slf4j의 인터페이스에 맞게 구현체들을 제공해주면, Logging을 할 수 있게 된다.&lt;br&gt; &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyHpyF/btrLge1cKpb/2AKKuKlG7IE6PKyaYkCmb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyHpyF/btrLge1cKpb/2AKKuKlG7IE6PKyaYkCmb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyHpyF/btrLge1cKpb/2AKKuKlG7IE6PKyaYkCmb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyHpyF%2FbtrLge1cKpb%2F2AKKuKlG7IE6PKyaYkCmb0%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;630&quot; height=&quot;349&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되는 것이다.&lt;br&gt; &lt;br&gt; &lt;br&gt;그러면 이것을 이용해 Logger를 만들어볼 수 있지 않을까?&lt;br&gt; &lt;br&gt;우선 logback의존성을 제거한다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFwbIU/btrLihocX9C/b9iOHVhkPMBrVrFoUXTym0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFwbIU/btrLihocX9C/b9iOHVhkPMBrVrFoUXTym0/img.png&quot; data-alt=&quot; build.gradle에서 logback 의존성 제거 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFwbIU/btrLihocX9C/b9iOHVhkPMBrVrFoUXTym0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFwbIU%2FbtrLihocX9C%2Fb9iOHVhkPMBrVrFoUXTym0%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;538&quot; height=&quot;84&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; build.gradle에서 logback 의존성 제거 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 해주면, classpath에 StaticLoggerBinder를 찾을 수 없기 때문에, 바로 알려준다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uX2dL/btrLiq6oHDr/baLtcG6m2wOTGCUp2UR4Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uX2dL/btrLiq6oHDr/baLtcG6m2wOTGCUp2UR4Jk/img.png&quot; data-alt=&quot; slf4j의 LoggerFactory.getILoggerFactory()의 일부분 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uX2dL/btrLiq6oHDr/baLtcG6m2wOTGCUp2UR4Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuX2dL%2FbtrLiq6oHDr%2FbaLtcG6m2wOTGCUp2UR4Jk%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;569&quot; height=&quot;124&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; slf4j의 LoggerFactory.getILoggerFactory()의 일부분 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이제 StaticLoggerBinder를 만들어보자.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SP2YV/btrLhtQjI3F/bAwJrRrLluit0DQliCMwx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SP2YV/btrLhtQjI3F/bAwJrRrLluit0DQliCMwx1/img.png&quot; data-alt=&quot; 만든 StaticLoggerBinder 클래스 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SP2YV/btrLhtQjI3F/bAwJrRrLluit0DQliCMwx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSP2YV%2FbtrLhtQjI3F%2FbAwJrRrLluit0DQliCMwx1%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;761&quot; height=&quot;516&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; 만든 StaticLoggerBinder 클래스 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 getSingleton()과 getLoggerFactory() 메서드를 구현해준다.&lt;br&gt; &lt;br&gt;다음은 ILoggerFactory 구현체이다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx23pS/btrLgFjFZNB/99KyP2ZofAs8OUhoUGheGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx23pS/btrLgFjFZNB/99KyP2ZofAs8OUhoUGheGK/img.png&quot; data-alt=&quot; 만든 ILoggerFactory 구현체 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx23pS/btrLgFjFZNB/99KyP2ZofAs8OUhoUGheGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx23pS%2FbtrLgFjFZNB%2F99KyP2ZofAs8OUhoUGheGK%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;507&quot; height=&quot;267&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; 만든 ILoggerFactory 구현체 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 getLogger()메서드를 구현한다.&lt;br&gt; &lt;br&gt;마지막 Logger&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rj67F/btrLhPeyrBL/GTgIGEXF3XugxMtW48KHZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rj67F/btrLhPeyrBL/GTgIGEXF3XugxMtW48KHZk/img.png&quot; data-alt=&quot; 만든 Logger 구현체 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rj67F/btrLhPeyrBL/GTgIGEXF3XugxMtW48KHZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frj67F%2FbtrLhPeyrBL%2FGTgIGEXF3XugxMtW48KHZk%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;389&quot; height=&quot;145&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; 만든 Logger 구현체 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;Logger 인터페이스를 구현해야해서, 오버라이드 메서드들이 많다. 여기선 편의상 Systme.out의 메서드들을 사용해서 구현하도록 하겠다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ToQAu/btrLgFRwlpc/Pg4dBSzjMLZuGXrK2Z2MY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ToQAu/btrLgFRwlpc/Pg4dBSzjMLZuGXrK2Z2MY0/img.png&quot; data-alt=&quot; Logger 인터페이스 구현 메서드 중 일부 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ToQAu/btrLgFRwlpc/Pg4dBSzjMLZuGXrK2Z2MY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FToQAu%2FbtrLgFRwlpc%2FPg4dBSzjMLZuGXrK2Z2MY0%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;889&quot; height=&quot;533&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; Logger 인터페이스 구현 메서드 중 일부 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 info 메서드처럼 나머지 trace, debug, warn, error 메서드들도 구현해준다.&lt;br&gt;그리고 서버를 실행시키면&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4tqfE/btrLiAVpb9m/yYaUOmS5ArenhUIw1rg27k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4tqfE/btrLiAVpb9m/yYaUOmS5ArenhUIw1rg27k/img.png&quot; data-alt=&quot; Custom Logger 사용모습 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4tqfE/btrLiAVpb9m/yYaUOmS5ArenhUIw1rg27k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4tqfE%2FbtrLiAVpb9m%2FyYaUOmS5ArenhUIw1rg27k%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;795&quot; height=&quot;138&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; Custom Logger 사용모습 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;Custom Logger가 사용되는 모습을 확인할 수 있다.&lt;br&gt; &lt;br&gt;이렇게 slf4j가 구현체를 선택하는 방법을 알아보고 이를 이용해 Logger를 만들어 보았다.&lt;br&gt;당장에 써먹을 곳이 있을까 싶지만, 개발은 즐거워야하지 않을까? 궁금한 점을 풀 수 있어 좋은 시간이었다.&lt;/p&gt;</description>
      <category>spring</category>
      <category>Logger 구현체</category>
      <category>Logger 구현체 선택</category>
      <category>Logger만들기</category>
      <category>slf4j Logger</category>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/33</guid>
      <comments>https://soosue.tistory.com/33#entry33comment</comments>
      <pubDate>Fri, 2 Sep 2022 20:49:02 +0900</pubDate>
    </item>
    <item>
      <title>Tip. 자동으로 getLogger 코드 작성 당하기(feat. IntelliJ File and Code Templates)</title>
      <link>https://soosue.tistory.com/32</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;눈팅으로 하는 웹 어플리케이션 서버 실습을 하다 보니 귀찮은 점 하나가 생겼다. 그것은 바로 로그를 남기기 위해서 작성하는 Logger객체를 할당하는 코드였다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class A {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static final Logger logger = LoggerFactory.getLogger(A.class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;로그 남기고 싶을 때마다 저 코드 치는게 왜 이렇게 귀찮은걸까&amp;hellip; 누가 쳐줬으면 좋겠다 했다.&lt;br /&gt;&lt;br /&gt;그래서 생각한게 '클래스가 생성될 때 알아서 저 코드가 작성되어주면 얼마나 좋을까?'였고, 찾은 것이 File and Code Templates 기능이다.&lt;br /&gt;&lt;br /&gt;File and Code Templates은 간단하게 말하면 새로운 파일을 생성할 때 내가 작성한 내용들을 작성해주는 기능이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 알아보자.&lt;br /&gt;&lt;br /&gt;먼저, 인텔리제이가 필요하다. IDE로 인텔리제이가 아닌 다른 프로그램을 사용하고 계시다면&amp;hellip; 다른 글을 찾아보셔야 한다.&lt;br /&gt;&lt;br /&gt;인텔리제이를 사용하고 있다면 Ctrl+Alt+S를 누르자. 그러면 Settings가 뜰텐데 좌측 상단 검색창에 template를 치면 결과 중에 File and Code Templates를 찾을 수 있다. 못 찾겠다면 Editor &amp;gt; File and Code Templates 를 통해 선택해도 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KEJxp/btrKWB9JU7l/mDAM6k8TdawMDjY5OTvnP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KEJxp/btrKWB9JU7l/mDAM6k8TdawMDjY5OTvnP1/img.png&quot; data-alt=&quot;Ctrl + Alt + S 누르면 뜨는 Settings 창과 File and Code Templates 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KEJxp/btrKWB9JU7l/mDAM6k8TdawMDjY5OTvnP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKEJxp%2FbtrKWB9JU7l%2FmDAM6k8TdawMDjY5OTvnP1%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;253&quot; height=&quot;464&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ctrl + Alt + S 누르면 뜨는 Settings 창과 File and Code Templates 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;찾게 되면 여러 파일들이 나타나게 되는데 그 중 우리는 Class를 만들 때 적용하고 싶으므로 Class를 선택하도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIeckq/btrKWCnhinm/NmPaMmSK4uG5IZdvR8veSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIeckq/btrKWCnhinm/NmPaMmSK4uG5IZdvR8veSK/img.png&quot; data-alt=&quot;Class 파일의 기본 Code templates&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIeckq/btrKWCnhinm/NmPaMmSK4uG5IZdvR8veSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIeckq%2FbtrKWCnhinm%2FNmPaMmSK4uG5IZdvR8veSK%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;743&quot; height=&quot;310&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Class 파일의 기본 Code templates&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;자 이제 여기에 코드를 작성해주면 끝이다. 이 파일을 보면 인텔리제이에서 클래스 파일을 생성하면, 기본으로 작성되는 코드들도 이 기능을 이용해서 작성되는 것이라는 사실을 알 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;662&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckoDmg/btrKWAQBtyo/zCiTd7B8xabA5rpcGNKxR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckoDmg/btrKWAQBtyo/zCiTd7B8xabA5rpcGNKxR0/img.png&quot; data-alt=&quot;Logger가 코드가 작성된 Class 파일의 Code templates&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckoDmg/btrKWAQBtyo/zCiTd7B8xabA5rpcGNKxR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckoDmg%2FbtrKWAQBtyo%2FzCiTd7B8xabA5rpcGNKxR0%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;662&quot; height=&quot;275&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Logger가 코드가 작성된 Class 파일의 Code templates&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Logger코드를 다 작성했다면, OK를 누르고 확인을 해보자.&lt;br /&gt;&lt;br /&gt;클래스를 생성해주면, &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjOGQl/btrKY4jrMpz/vre2VwPpBtODb5Kl76Lxc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjOGQl/btrKY4jrMpz/vre2VwPpBtODb5Kl76Lxc1/img.png&quot; data-alt=&quot;클래스 파일 생성 후 Logger 코드 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjOGQl/btrKY4jrMpz/vre2VwPpBtODb5Kl76Lxc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjOGQl%2FbtrKY4jrMpz%2Fvre2VwPpBtODb5Kl76Lxc1%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;647&quot; height=&quot;199&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 파일 생성 후 Logger 코드 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;짠, Logger코드가 작성된 채로 클래스가 생성된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>spring</category>
      <category>code templates</category>
      <category>intellij file and code templates</category>
      <category>intellij logger template</category>
      <category>live templates</category>
      <category>logger template</category>
      <category>로거 작성</category>
      <category>로거 템플릿</category>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/32</guid>
      <comments>https://soosue.tistory.com/32#entry32comment</comments>
      <pubDate>Tue, 30 Aug 2022 22:31:58 +0900</pubDate>
    </item>
    <item>
      <title>자바 클래스 로드와 초기화(Loading and Initializing)</title>
      <link>https://soosue.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어제 스터디를 하는데 같이 하시는 분이 질문을 주셨다. static 클래스에 관한 얘기였는데, 질문은 완전 다른 방향으로 흘러가서 당황했다.&lt;br&gt; &lt;br&gt;우선 아래 문제를 풀어보자. 출력 결과를 예상할 수 있겠는가?&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;class Main {
    public static void main(Strin[] args) {
        System.out.println(StaticTest.class);
    }
}

class StaticTest {
    public static String value = “init me!”;

    static {
        System.out.println(“init static!”);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;출력 결과는&lt;br&gt;아무 것도 없다.&lt;br&gt;(질문자와 나는 &quot;init static!&quot;이 출력 결과일 것이라고 생각하고 있었다. 지금 보면 너무 당연하지만, 당시에는 무언가 잘못 생각하고 있었던 것 같다.)&lt;br&gt; &lt;br&gt; &lt;br&gt;질문은 이거였다.&lt;br&gt;&lt;br&gt;“클래스가 로드 될 때, 클래스의 스태틱 관련된 정보들이 JVM메모리의 메소드(스태틱) 영역에 올라간다고 했는데 왜 아래 코드가 실행이 되지 않는걸까요?”&lt;br&gt;&lt;br&gt;우리는 클래스가 로드 될 때, 스태틱 변수들에 값이 할당 되어 메소드 영역에 올라간다고 생각하고 있었다.&lt;br&gt;이 생각은 잘못된 생각이었다.&lt;br&gt; &lt;br&gt; &lt;br&gt;이유를 말하자면 바로,&lt;br&gt;&lt;b&gt;로드(load)와 초기화(initialize)는 별개의 작업이기 때문이다.&lt;/b&gt;&lt;br&gt; &lt;br&gt;자바 공식문서를 보면 Loading, Linking, and Initializing 로 정확하게 구분되어있다.&lt;br&gt; &lt;br&gt;그리고 초기화가 되는 시점은 아래와 같다. (se17기준)&lt;br&gt; &lt;br&gt;1. 아래의 JVM 명령어들이 호출될 때.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;getstatic - static 변수를 호출.&lt;/li&gt;
 &lt;li&gt;putstatic - static 변수에 값을 할당.&lt;/li&gt;
 &lt;li&gt;invokestatic - static 메서드를 호출.&lt;/li&gt;
 &lt;li&gt;new - 객체를 생성.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 클래스 라이브러리(Class 클래스나 java.lang.reflect)의 특정 메소드를 호출했을 때.&lt;br&gt;3. 하위 클래스가 초기화 되기 전(클래스인 경우)&lt;br&gt;4. 구현체가 초기화 되기 전(인터페이스인 경우)&lt;br&gt;5. JVM이 시작될 때 초기화되도록 설계된 initial class나 interface들.&lt;br&gt; &lt;br&gt;주의. 상수를 호출할 때는 static이긴 하더라도 초기화가 되지 않는다. (상수는 컴파일시점에 초기화가 된다. 상수의 호출은 컴파일시점에 복사해 놓은 값을 호출하는 것이므로 초기화를 유발하지 않는다.)&lt;br&gt; &lt;br&gt;위 문제를 다시 보면, StaticTest.class를 호출했을 때, 클래스로더에 의하여 StaticTest클래스가 로드(load) 되는 것은 맞지만, StaticTest클래스가 초기화되는 것은 아니다.&lt;br&gt; &lt;br&gt;따라서 static 블럭 또한 호출될 일이 없고, 그렇기에 &quot;init static!&quot;이라는 메시지가 출력되지 않은 것이다.&lt;br&gt; &lt;br&gt; &lt;br&gt;어찌되었던 같이 하시는 분의 질문을 통해서 클래스가 로드될 때, static 변수들이 메모리에 올라간다는 잘못된 생각을 바로 잡을 수 있었다. 좋은 시간이었다.&lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;a href=&quot;https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-5.html#jvms-5.5&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-5.html#jvms-5.5&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.5&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.5&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://docs.oracle.com/javase/specs/jvms/se6/html/Concepts.doc.html#19075&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://docs.oracle.com/javase/specs/jvms/se6/html/Concepts.doc.html#19075&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.javacodegeeks.com/2018/04/jvm-architecture-jvm-class-loader-and-runtime-data-areas.html&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://www.javacodegeeks.com/2018/04/jvm-architecture-jvm-class-loader-and-runtime-data-areas.html&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://docs.oracle.com/javase/specs/jls/se17/html/jls-12.html#jls-12.2&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://docs.oracle.com/javase/specs/jls/se17/html/jls-12.html#jls-12.4&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.javacodegeeks.com/2018/04/jvm-architecture-jvm-class-loader-and-runtime-data-areas.html&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;https://www.javacodegeeks.com/2018/04/jvm-architecture-jvm-class-loader-and-runtime-data-areas.html&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br&gt; &lt;/p&gt;</description>
      <category>java</category>
      <category>java initialize</category>
      <category>java 클래스로드</category>
      <category>자바 초기화</category>
      <category>클래스로드와 초기화</category>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/31</guid>
      <comments>https://soosue.tistory.com/31#entry31comment</comments>
      <pubDate>Tue, 30 Aug 2022 01:18:35 +0900</pubDate>
    </item>
    <item>
      <title>자바 static 초기화 순서</title>
      <link>https://soosue.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바에는 크게 클래스 변수와 인스턴스 변수가 존재한다.&lt;br&gt;클래스 변수는, 클래스 변수라는 이름답게 해당 클래스의 모든 객체들이 같은 값을 공유한다. (static키워드를 사용해서 static변수라고도 한다.)&lt;br&gt;&lt;br&gt;static 변수는 static 변수가 호출되거나, 해당 클래스가 인스턴스화 될 때, 초기화가 한 번 일어난다.&lt;br&gt;&lt;br&gt;그리고 static 변수의 값을 초기화 하는 방법으로는 2가지가 있다.&lt;br&gt;1. 직접 값을 할당한다.&lt;br&gt;2. static 블록을 이용하여 값을 할당한다.&lt;br&gt;&lt;br&gt;여기서는, 저 두 가지가 같이 사용되었을 경우에 우선순위가 어떻게 되는가에 대한 글이다.&lt;br&gt;&lt;br&gt;문제를 풀어보자.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        System.out.println(A.a);
    }
}

class A {
    static {
        a = &quot;b&quot;;
    }
    static String a = &quot;a&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 어떤 값이 출력 될 것 같은가? 작성자는 b라고 생각했다.&lt;br&gt; &lt;br&gt; &lt;br&gt;정답은 &lt;span style=&quot;background-color: #000000;&quot;&gt;a&lt;/span&gt;이다.&lt;br&gt;&lt;br&gt;자바에서 static 초기화는 &lt;b&gt;문자 순서대로&lt;/b&gt; 이루어진다.&lt;br&gt;&lt;br&gt;따라서 먼저 등장하는 static 블록의 a = &quot;b&quot;로 먼저 초기화가 이루어진 이후, a = &quot;a&quot;의 초기화가 이루어진다.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://docs.oracle.com/javase/specs/jvms/se6/html/Concepts.doc.html#32316&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://docs.oracle.com/javase/specs/jvms/se6/html/Concepts.doc.html#32316&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>java</category>
      <category>java static 초기화</category>
      <category>java static 초기화 순서</category>
      <category>static block</category>
      <category>static 블록</category>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/30</guid>
      <comments>https://soosue.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 29 Aug 2022 22:25:09 +0900</pubDate>
    </item>
    <item>
      <title>눈팅으로 하는 웹 어플리케이션 서버 실습</title>
      <link>https://soosue.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;벌써 2022년도 반이 훨씬 지났고, 8월도 반이 넘어 갔다. 개발자로서 나은 개발자라고 생각했지만 그렇지 않았나보다. 여러 면접에서 계속 떨어지고 난 후, 자존감이 바닥을 치고 내 실력에 대해 회의감이 들었다.&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;하지만 계속 우울해할 순 없지 않은가? 이번 기회에 하고 싶었던 포비님이 노란책으로 출간하셨었고, nextstep에서는 수강신청에 실패했던 &lt;code&gt;만들면서 배우는 spring&lt;/code&gt; 어플리케이션 만들기라도 해봐야겠다는 생각이 들었다. &lt;i&gt;(무엇을 해야 실력이 나아지는지 모르겠고, 혼란이 와서 재밌어 보이는 코딩이라도 해봐야겠다는 생각이 들었다.)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brC262/btrKpy50wEV/C13DSZMjE5TbkPH3mb9OGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brC262/btrKpy50wEV/C13DSZMjE5TbkPH3mb9OGK/img.png&quot; data-alt=&quot;이 책이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brC262/btrKpy50wEV/C13DSZMjE5TbkPH3mb9OGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrC262%2FbtrKpy50wEV%2FC13DSZMjE5TbkPH3mb9OGK%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;214&quot; height=&quot;269&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 책이다.&lt;/figcaption&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;결과적으로는 현재 10일차 정도 되었는데, 재밌게 진행하고 있다. 제대로 알지 못하고 있던 기본 개념들도 점검할 수 있었고, 무엇보다 스프링 없이 순수 java만으로 http통신을 할 수 있는 서버를 이렇게 만들 수 있구나 하는 생각이 컸다.&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;우선 요구사항만을 만족하도록 빠르게 코딩하고, (가능하면 tdd로 진행)&lt;/li&gt;
&lt;li&gt;스스로 리팩토링을 해본 후,&lt;/li&gt;
&lt;li&gt;책을 통해서 리팩토링을 보완하는 방식으로 진행할 예정이다.&lt;/li&gt;
&lt;li&gt;nextstep repo가 있는데, pr과 리뷰등도 같이 볼 예정이긴 하다.(불법일지는 모르겠다...)&lt;/li&gt;
&lt;/ol&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;code&gt;README.md&lt;/code&gt;에 기록하고, 블로깅을 해볼 생각이다. 다시 해보자!&lt;/p&gt;</description>
      <category>spring</category>
      <category>NextStep</category>
      <category>노란책</category>
      <category>만들면서 배우는 스프링</category>
      <category>자바 웹 프로그래밍 next step</category>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/29</guid>
      <comments>https://soosue.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 23 Aug 2022 16:52:46 +0900</pubDate>
    </item>
    <item>
      <title>aws - ec2</title>
      <link>https://soosue.tistory.com/28</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;퍼블릭주소와 프라이빗주소가 존재한다&lt;br /&gt;퍼블릭은 외부와 통신 가능한 ip&lt;br /&gt;프라이빗은 내부 aws서버들끼리 통신 가능한 ip&lt;br /&gt;&lt;br /&gt;ec2인스턴스를 stop한 후 다시 키고 퍼블릭주소로 접근시 에러가 발생할 수 있다.&lt;br /&gt;이유는 ec2인스턴스가 실행될 때마다 새로운 퍼블릭주소를 할당받기 때문이다.&lt;br /&gt;고정주소를 사용하려면 탄력적ip를 이용해야한다.&lt;/p&gt;</description>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/28</guid>
      <comments>https://soosue.tistory.com/28#entry28comment</comments>
      <pubDate>Sat, 9 Jul 2022 00:48:36 +0900</pubDate>
    </item>
    <item>
      <title>jpa에서 cascade를 써야하는 이유</title>
      <link>https://soosue.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;1. 연관관계를 맺고 있는 엔티티들의 저장을 위해선 영속화를 해줘야하는데, 일일이 영속화를 해주지 않아도 된다.&lt;br&gt;&lt;br&gt;2. spring data jpa를 사용하는 경우에 영속화를 위해선 각 엔티티들을 타입으로 갖고 있는 JpaRepository가 필요한데, Service 클래스에서 해당 repository들에 의존하게 되고 많은 의존성을 관리하게 된다. cascade를 이용하면 service에서 repository로 향하는 의존성을 줄일 수 있다.&lt;/p&gt;</description>
      <author>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/27</guid>
      <comments>https://soosue.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 7 Jul 2022 09:29:56 +0900</pubDate>
    </item>
    <item>
      <title>좋은 설계를 위해 생각해보기</title>
      <link>https://soosue.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. dto를 어디까지 사용할 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- service에 dto를 넘겨주는 것이 좋은 방법일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dto는 service쪽 패키지에 존재해야할까? controller쪽 패키지에 존재해야할까?&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. enum들은 어느 패키지에 속해 있어야하는걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dto에서 enum을 써도 되는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- domain에서 enum을 정의해서 사용하는건 어떤가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- domain에서 enum을 정의했을 때, 다른 패키지에서 enum을 사용하는 것은?&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. service쪽에 dto를 넘겨주는 것이 맞는 것 같음. 패키지 의존성을 그려보면 그래야만이 사이클 의존성을 제거할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- controller에서 request로 받기만 하고, response로 넘겨주기만 한다면 controller(web)쪽에 있는 것이 좋음. 하지만 service의 메서드 호출할 때 파라미터나 return값으로 넘겨주고 있다면 service쪽에 있는 것이 좋다.&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>soosue</author>
      <guid isPermaLink="true">https://soosue.tistory.com/26</guid>
      <comments>https://soosue.tistory.com/26#entry26comment</comments>
      <pubDate>Wed, 6 Jul 2022 21:16:10 +0900</pubDate>
    </item>
  </channel>
</rss>