<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>네오가 필요해</title>
    <link>https://needneo.tistory.com/</link>
    <description>코딩, 설정, 아키텍쳐, DB, stackoverflow 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 07:03:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>The Neo</managingEditor>
    <image>
      <title>네오가 필요해</title>
      <url>https://tistory1.daumcdn.net/tistory/2396776/attach/3ccbb15abfaf4f3c9e5f2823270c366d</url>
      <link>https://needneo.tistory.com</link>
    </image>
    <item>
      <title>[MacOS] nano로 MacOS 환경 설정 추가하기</title>
      <link>https://needneo.tistory.com/275</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;Python으로 새로운 것을 설치하는 도중, zshrc를 수정해야 되는 일이 발생하였고, nano 툴로 수정을 해야 됐었다. 나는 그동안에 리눅스에 있는 환경 설정은 vi로 bashrc만 건드렸었는데 nano툴도 잘 적응이 안돼서, 정리해보도록 해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;내가 사용하는 쉘 확인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Zshrc를 사용하는지 bashrc를 사용하는지 알아야 되는데 아래의 명령어로 확인이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1734669943221&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo $SHELL&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;필자의 컴퓨터는 위와 같은 명령어를 수행했을 때 아래와 같이 zshrc를 수정해야 된다는 것을 알았다.&lt;/p&gt;
&lt;pre id=&quot;code_1734669994811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/bin/zsh&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;nano로 zshrc 파일 열기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경 설정을 하기 위해서 zshrc를 nano 편집기로 열어야 한다.&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;데이터 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734670042968&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pyenv 설정
export PYENV_ROOT=&quot;$HOME/.pyenv&quot;
export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;
eval &quot;$(pyenv init --path)&quot;
eval &quot;$(pyenv init -)&quot;&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;위 내용은 pyenv의 환경을 추가하기 위해서 추가한 것으로 본인이 필요한 내용을 추가한다.&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-12-20 오후 1.49.31.png&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AcKms/btsLpHOLU5G/VkggrslEAp0PKvzNQOhrB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AcKms/btsLpHOLU5G/VkggrslEAp0PKvzNQOhrB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AcKms/btsLpHOLU5G/VkggrslEAp0PKvzNQOhrB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAcKms%2FbtsLpHOLU5G%2FVkggrslEAp0PKvzNQOhrB1%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;951&quot; height=&quot;584&quot; data-filename=&quot;스크린샷 2024-12-20 오후 1.49.31.png&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;584&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;Ctrl + O(WriteOut)를 눌러 저장 하고, Enter 키를 눌러 파일 이름을 확인하고 저장하며 Ctrl + X로 종료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수정 내용 반영&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1734670123997&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.bashrc  # Bash 사용자
source ~/.zshrc   # Zsh 사용자&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;수정 내용은 source [파일] 로 환경을 반영 시킨다&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>Server, OS/MacOS</category>
      <category>nano</category>
      <category>zshrc</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/275</guid>
      <comments>https://needneo.tistory.com/275#entry275comment</comments>
      <pubDate>Fri, 20 Dec 2024 13:51:11 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot 첫 실행 시, Login 페이지 뜨는 경우</title>
      <link>https://needneo.tistory.com/274</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 만든지 얼마 되지 않았고, Web 소스를 만든적도 없는데 아래와 같은 로그인 페이지가 떠서 당황스러울 수 있습니다. 내가 이런 페이지를 만들었었나? 생각 할 수 있지만, 이는 스프링 부트에서 만들어낸 자체적인 기능으로, 보안설정 때문에 아이디, 패스워드를 입력받는 페이지입니다.&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;로그인_페이지.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdkl2E/btsHFwCKMvJ/olsLVyiK2U76PnKss6tqN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdkl2E/btsHFwCKMvJ/olsLVyiK2U76PnKss6tqN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdkl2E/btsHFwCKMvJ/olsLVyiK2U76PnKss6tqN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdkl2E%2FbtsHFwCKMvJ%2FolsLVyiK2U76PnKss6tqN0%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;836&quot; height=&quot;435&quot; data-filename=&quot;로그인_페이지.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;435&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;보안코드.png&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVF3DZ/btsHFNEgaHF/LetxegsNLhWDQ8SUArPpnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVF3DZ/btsHFNEgaHF/LetxegsNLhWDQ8SUArPpnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVF3DZ/btsHFNEgaHF/LetxegsNLhWDQ8SUArPpnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVF3DZ%2FbtsHFNEgaHF%2FLetxegsNLhWDQ8SUArPpnK%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;1175&quot; height=&quot;199&quot; data-filename=&quot;보안코드.png&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;199&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;Using generated security password: 라고 콘솔창에 띄워져 있는 것을 볼 수 있는데요. 해당 부분의 값이 Password입니다. 그리고 id는 user가 됩니다.&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;로그인_인증.png&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBt4eA/btsHF1I98zD/zBcnY8lF86Z97DvOouK120/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBt4eA/btsHF1I98zD/zBcnY8lF86Z97DvOouK120/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBt4eA/btsHF1I98zD/zBcnY8lF86Z97DvOouK120/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBt4eA%2FbtsHF1I98zD%2FzBcnY8lF86Z97DvOouK120%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;819&quot; height=&quot;395&quot; data-filename=&quot;로그인_인증.png&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;395&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_보안_자동설정해제.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wLUAt/btsHGlN2XdZ/NGImhLmcStxIEAhnufntek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wLUAt/btsHGlN2XdZ/NGImhLmcStxIEAhnufntek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wLUAt/btsHGlN2XdZ/NGImhLmcStxIEAhnufntek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwLUAt%2FbtsHGlN2XdZ%2FNGImhLmcStxIEAhnufntek%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;730&quot; height=&quot;323&quot; data-filename=&quot;edited_보안_자동설정해제.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;323&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;Springboot의 시작클래스로 가서 위와 같이 exclude로 지정하면 됩니다.&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>Language/Spring</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/274</guid>
      <comments>https://needneo.tistory.com/274#entry274comment</comments>
      <pubDate>Tue, 28 May 2024 18:24:40 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Could not find com.mysql:mysql-connector-j 에러 해결 원인</title>
      <link>https://needneo.tistory.com/273</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리J(Intellij)로 Spring boot를 사용하여 Java Application을 만드는 와중, 인텔리J에서 직접 실행을 할 때에는 이상이 없었으나, Jar로 빌드를 한 후 실행을 하게 되면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714742978260&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Could not find com.mysql:mysql-connector-j&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;위와 같은 에러 문구가 뜨면서 실행이 되질 않았다. 그렇게 원인을 찾아본 순간, 내 Gradle 설정에 MySQL Connector가 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;그리고 이렇게 중복으로 설정된 가장 큰 원인은 MySQL Connector가 버전에 따라 패키지 명이 바뀌게 되면서 인지를 하지 못했기 때문이었다.&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;Mysql_oracle_blog.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/evMGM0/btsHcruk8vg/yxq7lRnjQ47m8tXlbv5u60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/evMGM0/btsHcruk8vg/yxq7lRnjQ47m8tXlbv5u60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/evMGM0/btsHcruk8vg/yxq7lRnjQ47m8tXlbv5u60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FevMGM0%2FbtsHcruk8vg%2Fyxq7lRnjQ47m8tXlbv5u60%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;1386&quot; height=&quot;663&quot; data-filename=&quot;Mysql_oracle_blog.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;663&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;MySQL 8.0.31 이전 버전&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 예전부터 내가 자주 사용하였던, 8.0.31 이전 버전의 커넥터는 패키지가 mysql:mysql-connector-java이다.&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;b&gt;Maven pom.xml 설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1714743243068&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;&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;&lt;b&gt;Gradle build.gradle 설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1714743297443&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	runtimeOnly 'mysql:mysql-connector-java'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8.0.31 이후 버전의 설정&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Maven pom.xml&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1714743362499&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;groupId&amp;gt;com.mysql&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;mysql-connector-j&amp;lt;/artifactId&amp;gt;&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;&lt;b&gt;Gradle build.gradle 설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1714743393467&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	runtimeOnly 'com.mysql:mysql-connector-j'
}&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고자료&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1] Oracle Blog, MySQL Connector/J has new Maven Coordinates&lt;/p&gt;</description>
      <category>Stackoverflow/Java</category>
      <category>connectorj</category>
      <category>mysql</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/273</guid>
      <comments>https://needneo.tistory.com/273#entry273comment</comments>
      <pubDate>Fri, 3 May 2024 22:39:57 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] RestController 인식이 안되는 경우</title>
      <link>https://needneo.tistory.com/272</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트로 프로젝트를 생성한 후, RestController를 사용해야 돼서, 어노테이션을 걸었지만 해당 어노테이션관련 라이브러리 Import가 되질 않았다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;레스트_인식_불가.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpCsND/btsExP5JiAh/jqTfZZoUILGz6Q1n3jiRC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpCsND/btsExP5JiAh/jqTfZZoUILGz6Q1n3jiRC0/img.png&quot; data-alt=&quot;Rest Controller가 인식 안되는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpCsND/btsExP5JiAh/jqTfZZoUILGz6Q1n3jiRC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpCsND%2FbtsExP5JiAh%2FjqTfZZoUILGz6Q1n3jiRC0%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;708&quot; height=&quot;314&quot; data-filename=&quot;레스트_인식_불가.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Rest Controller가 인식 안되는 경우&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;내가 설치한 Dependency는 아래와 같았는데 RestController는 당연히 기본적으로 적용이 될거라 생각한 나의 착각이었다. 스프링부트가 아닌 일반적인 스프링 기반으로 프로젝트를 할 경우 아무런 문제없이 라이브러리가 추가되었었기 때문이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;디펜던시(Dependencies) 추가&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0JJW/btsEwI6RiJm/nN7fsOLhKuAyHmQARSHrEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0JJW/btsEwI6RiJm/nN7fsOLhKuAyHmQARSHrEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0JJW/btsEwI6RiJm/nN7fsOLhKuAyHmQARSHrEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0JJW%2FbtsEwI6RiJm%2FnN7fsOLhKuAyHmQARSHrEK%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;704&quot; height=&quot;218&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;218&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;원인을 찾은 결과 spring-web을 설치해야 하는데 나는 web을 rest와 연관지어 생각지 못했기 때문에 web을 추가하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707195996260&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'org.springframework.boot:spring-boot-starter-web'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;spring_web_설정.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3IK4/btsEtjfWc8z/s5jne91AlpQW7ONwk3oty0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3IK4/btsEtjfWc8z/s5jne91AlpQW7ONwk3oty0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3IK4/btsEtjfWc8z/s5jne91AlpQW7ONwk3oty0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3IK4%2FbtsEtjfWc8z%2Fs5jne91AlpQW7ONwk3oty0%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;736&quot; height=&quot;249&quot; data-filename=&quot;spring_web_설정.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;249&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;위와 같이 spring-boot-starter-web dependency를 등록한 후, 확인을 해보니 import가 되는 것을 볼 수 있었다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;import_생김.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNXGmT/btsEu4ii7QZ/oOvE8ZJqA8aF6ksgszb63K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNXGmT/btsEu4ii7QZ/oOvE8ZJqA8aF6ksgszb63K/img.png&quot; data-alt=&quot;import class가 생긴 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNXGmT/btsEu4ii7QZ/oOvE8ZJqA8aF6ksgszb63K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNXGmT%2FbtsEu4ii7QZ%2FoOvE8ZJqA8aF6ksgszb63K%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;537&quot; height=&quot;231&quot; data-filename=&quot;import_생김.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;import class가 생긴 모습&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;import_완료.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbzZcO/btsEqWZEs8u/S4g1m1od9jHekbmqK3gRw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbzZcO/btsEqWZEs8u/S4g1m1od9jHekbmqK3gRw1/img.png&quot; data-alt=&quot;RestController를 등록한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbzZcO/btsEqWZEs8u/S4g1m1od9jHekbmqK3gRw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbzZcO%2FbtsEqWZEs8u%2FS4g1m1od9jHekbmqK3gRw1%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;707&quot; height=&quot;219&quot; data-filename=&quot;import_완료.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RestController를 등록한 모습&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Stackoverflow/Java</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/272</guid>
      <comments>https://needneo.tistory.com/272#entry272comment</comments>
      <pubDate>Tue, 6 Feb 2024 14:08:11 +0900</pubDate>
    </item>
    <item>
      <title>ModuleNotFoundError: No module named 'cchardet'</title>
      <link>https://needneo.tistory.com/271</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;에러 메세지&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1706745602619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;D:\anaconda3\envs\gpt\python.exe D:/gpt/_openai.py
Traceback (most recent call last):
  File &quot;D:\anaconda3\envs\gpt\lib\site-packages\aiohttp\client_reqrep.py&quot;, line 70, in &amp;lt;module&amp;gt;
    import cchardet as chardet
ModuleNotFoundError: No module named 'cchardet'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File &quot;D:/gpt/_openai.py&quot;, line 2, in &amp;lt;module&amp;gt;
    import openai
  File &quot;D:\anaconda3\envs\gpt\lib\site-packages\openai\__init__.py&quot;, line 15, in &amp;lt;module&amp;gt;
    import aiohttp
  File &quot;D:\anaconda3\envs\gpt\lib\site-packages\aiohttp\__init__.py&quot;, line 6, in &amp;lt;module&amp;gt;
    from .client import (
  File &quot;D:\anaconda3\envs\gpt\lib\site-packages\aiohttp\client.py&quot;, line 59, in &amp;lt;module&amp;gt;
    from .client_reqrep import (
  File &quot;D:\anaconda3\envs\gpt\lib\site-packages\aiohttp\client_reqrep.py&quot;, line 72, in &amp;lt;module&amp;gt;
    import charset_normalizer as chardet  # type: ignore[no-redef]
  File &quot;D:\anaconda3\envs\gpt\lib\site-packages\charset_normalizer\__init__.py&quot;, line 23, in &amp;lt;module&amp;gt;
    from charset_normalizer.api import from_fp, from_path, from_bytes, normalize
  File &quot;D:\anaconda3\envs\gpt\lib\site-packages\charset_normalizer\api.py&quot;, line 10, in &amp;lt;module&amp;gt;
    from charset_normalizer.md import mess_ratio
  File &quot;charset_normalizer\md.py&quot;, line 5, in &amp;lt;module&amp;gt;
ImportError: cannot import name 'COMMON_SAFE_ASCII_CHARACTERS' from 'charset_normalizer.constant' (D:\anaconda3\envs\gpt\lib\site-packages\charset_normalizer\constant.py)

Process finished with exit code 1&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;openai를 python으로 테스트 하기 위해서 코드를 짜봤으나, 에러가 발생하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러를 읽어보니, Charset에 대한 에러로 아래와 같이 해결이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결방안&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1706745726415&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install cchardet&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3g8yi/btsEiy4agwL/CHUklxg2pcW8z7DOS7BvIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3g8yi/btsEiy4agwL/CHUklxg2pcW8z7DOS7BvIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3g8yi/btsEiy4agwL/CHUklxg2pcW8z7DOS7BvIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3g8yi%2FbtsEiy4agwL%2FCHUklxg2pcW8z7DOS7BvIk%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;714&quot; height=&quot;202&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;202&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;chardet도 있지만, 여기서 에러는 cchardet이라는 것을 명심해야 한다.&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>Stackoverflow/Python</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/271</guid>
      <comments>https://needneo.tistory.com/271#entry271comment</comments>
      <pubDate>Thu, 1 Feb 2024 09:08:59 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot] application.yml, application.properties 차이점 정리 및 사용예시</title>
      <link>https://needneo.tistory.com/270</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot에서 application.properties와 application.yml은 모두 어플리케이션의 구성 설정을 위한 파일이며, 둘간의 주요 차이점은 파일 형식과 구문에 있습니다. 둘간의 차이점을 알아보고, 각각에서 mysql과 mongodb 세팅의 차이점을 알아보도록 하겠습니다.&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;springboot_application_설정.jpg&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIcYY3/btsDUhIHuxf/0z0CNp7QrI9dhYDRwHKkek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIcYY3/btsDUhIHuxf/0z0CNp7QrI9dhYDRwHKkek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIcYY3/btsDUhIHuxf/0z0CNp7QrI9dhYDRwHKkek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIcYY3%2FbtsDUhIHuxf%2F0z0CNp7QrI9dhYDRwHKkek%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;860&quot; height=&quot;484&quot; data-filename=&quot;springboot_application_설정.jpg&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;484&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;파일 형식&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;application.properties&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전통적인 프로퍼티 형식을 사용하며, 설정은 키 밸류 형태로, key=value 형식으로 표현됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;application.yml&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- YAML(Yet Another Markup Language 혹은 YAML Ain't Markup Language) 형식을 사용하며, 계층적이고 가독성이 높은 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;구문&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.properties에서는 동일한 접두사를 가진 속성들이 반복적으로 나열이 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1706003875110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.name=my_app
app.description=application
app.version=1.0.5&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;예를 들어, 위와 같이 app이라고 하는 접두사를 기반으로 name, description, version이라는 속성들이 존재합니다.&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;application.yml에서는 계층 구조를 사용하여 속성들을 그룹화 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1706003941980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app:
	name: my_app
	description: application
	version: 1.0.5&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;공통적으로 들어가는 접두사 app을 하나의 키로 넣고, 다시 하위 속성들을 각각 입력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;설정 예시&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 데이터베이스를 이용하여 MySQL에 연결하기 위한 datasource를 예시로 설명을 하겠습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;application.properties&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1706004092277&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.url=jdbc:mysql://localhost:3306/[데이터베이스명]
spring.datasource.username=[아이디]
spring.datasource.password=[패스워드]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver&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;&lt;b&gt;application.yml&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1706004107062&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  datasource:
    url: jdbc:mysql://localhost:3306/[데이터베이스명]
    username: [아이디]
    password: [패스워드]
    driver-class-name: com.mysql.cj.jdbc.Driver&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;datasource의 경우 spring.datasource의 접두사를 가지기 때문에, application.yml에서는 2번의 그룹을 하게 됩니다.&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;properties와 yml은 취향차이라 볼 수 있지만, 복잡하게 설정이 필요한 대규모 어플리케이션 개발의 경우, 가독성과 구조화가 가능하고, 유지 보수성이 좋은 yml의 손을 들어줄 수밖에 없기 때문에 되도록이면 yml로 개발을 하는 것을 권장하게 됩니다.&lt;/p&gt;</description>
      <category>Language/Spring</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/270</guid>
      <comments>https://needneo.tistory.com/270#entry270comment</comments>
      <pubDate>Tue, 23 Jan 2024 19:12:05 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ로 Spring-Boot 하는 법 (Step-by-Step)</title>
      <link>https://needneo.tistory.com/269</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;여태까지 Spring-boot를 사용했던 케이스는 STS(Spring Tools Suite)을 사용하여 개발을 했었는데요. Java 어플리케이션은 IntelliJ로 개발을 하다보니, 어느덧 IntelliJ로 Spring-boot를 개발을 해봐야 겠다라는 생각을 가지게 되었습니다.&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;15년 가까이 Eclipse를 사용했지만, 이제는 놔줘야 될때가 온 것도 같습니다. 아직도 많은 SI 사이트들은 전자정부프레임워크를 사용할테지만, IntelliJ와 성능 차이가 너무 심하게 나서 저는 도저히 못쓸 것 같네요. 그럼 IntelliJ로 Spring 설정하는 법을 설명하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Spring Boot 프로젝트 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;springboot_0.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvmGjH/btsDLKqPsXj/5IwT13iXymTvN5l6VZLsVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvmGjH/btsDLKqPsXj/5IwT13iXymTvN5l6VZLsVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvmGjH/btsDLKqPsXj/5IwT13iXymTvN5l6VZLsVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvmGjH%2FbtsDLKqPsXj%2F5IwT13iXymTvN5l6VZLsVk%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;499&quot; height=&quot;461&quot; data-filename=&quot;springboot_0.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;461&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;IntelliJ를 실행한 후, New Project를 선택합니다.&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;774&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btgmIX/btsDLLw0mX3/FUGOiSjqb1M5G6MfFIwci1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btgmIX/btsDLLw0mX3/FUGOiSjqb1M5G6MfFIwci1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btgmIX/btsDLLw0mX3/FUGOiSjqb1M5G6MfFIwci1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtgmIX%2FbtsDLLw0mX3%2FFUGOiSjqb1M5G6MfFIwci1%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;774&quot; height=&quot;674&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;674&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;New Project 탭이 뜨면, 왼쪽 메뉴 중간 정도에 위치한 &lt;b&gt;Spring Initializr&lt;/b&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-origin-width=&quot;573&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4r4LU/btsDP9KTotA/GQ91p4A2AW8fpp4st4tQk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4r4LU/btsDP9KTotA/GQ91p4A2AW8fpp4st4tQk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4r4LU/btsDP9KTotA/GQ91p4A2AW8fpp4st4tQk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4r4LU%2FbtsDP9KTotA%2FGQ91p4A2AW8fpp4st4tQk0%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;573&quot; height=&quot;256&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;256&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;Project SDK에서 원하는 Java를 설정하며, 버전이 없을 경우 JDK를 설치하여 다시 설정한 후, Next를 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로젝트 메타데이터 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Initializr Project Settings 탭에서 Group과 Artifact 이름을 설정합니다. 보통 Group은 회사의 도메인을 적고, Artifact는 프로젝트 명칭을 적게 됩니다.&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;774&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DEhwx/btsDNHVntvB/RO4v668QuHzq97CeOkDxb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DEhwx/btsDNHVntvB/RO4v668QuHzq97CeOkDxb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DEhwx/btsDNHVntvB/RO4v668QuHzq97CeOkDxb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDEhwx%2FbtsDNHVntvB%2FRO4v668QuHzq97CeOkDxb1%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;774&quot; height=&quot;674&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;674&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;Project Name과 설정 언어, 빌드 툴(Gradle, Maven 등). 자바 버전, 패키징 (Jar, War) 등을 모두 세팅하였다면, 설정 후 Next를 선택합니다. Spring Boot의 경우 최신 버전이 올드 자바버전을 지원하지 않기 때문에 1.8과 같은 예전 자바 버전을 사용해야 하는 경우, 인텔리J에서 설정하는 방식이 아닌 다른 방식으로 설정을 해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Spring Boot Dependencies 추가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 세팅을 하였다면, 이제는 종속성(Dependency)를 추가해줘야 합니다.&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;774&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buHPkE/btsDKxZyHkg/RrqXYdY5UWNK22IbytSMDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buHPkE/btsDKxZyHkg/RrqXYdY5UWNK22IbytSMDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buHPkE/btsDKxZyHkg/RrqXYdY5UWNK22IbytSMDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuHPkE%2FbtsDKxZyHkg%2FRrqXYdY5UWNK22IbytSMDK%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;774&quot; height=&quot;674&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;674&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;그때그때 추가하는 경우도 있지만 웬만하면 초반에 다 세팅을 하는게 나중에 문제가 덜할 수 있습니다. 오히려 사용할지 안할지 결정 장애가 발동될 때에는 일단 설정하는 것도 하나의 방법입니다.&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;springboot_4.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w0t6z/btsDQaJhylb/NjfkrD6MEI7uusxCNzZrg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w0t6z/btsDQaJhylb/NjfkrD6MEI7uusxCNzZrg1/img.png&quot; data-alt=&quot;디펜던시 설정한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w0t6z/btsDQaJhylb/NjfkrD6MEI7uusxCNzZrg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw0t6z%2FbtsDQaJhylb%2FNjfkrD6MEI7uusxCNzZrg1%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;774&quot; height=&quot;674&quot; data-filename=&quot;springboot_4.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;674&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;종속성 체크를 완료하였다면, Next를 클릭합니다. 참고로 저는 Lombok과 JPA, MySQL 드라이버 그리고 MongoDB만 선택하였습니다.&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;774&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkoK2f/btsDI63u1iM/xt0C6clvo6KEUyUC8ayg8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkoK2f/btsDI63u1iM/xt0C6clvo6KEUyUC8ayg8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkoK2f/btsDI63u1iM/xt0C6clvo6KEUyUC8ayg8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkoK2f%2FbtsDI63u1iM%2Fxt0C6clvo6KEUyUC8ayg8K%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;774&quot; height=&quot;674&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;674&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;모든 설정이 완료되었다면, 프로젝트 이름과 프로젝트 설치 장소를 설정 한후 Finish를 클릭합니다.&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;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MWEJr/btsDQSB7S54/KKtAqFI5jG21QQSfoJSAgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MWEJr/btsDQSB7S54/KKtAqFI5jG21QQSfoJSAgk/img.png&quot; data-alt=&quot;성공적으로 프로젝트가 생성된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MWEJr/btsDQSB7S54/KKtAqFI5jG21QQSfoJSAgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMWEJr%2FbtsDQSB7S54%2FKKtAqFI5jG21QQSfoJSAgk%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;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&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;Finish를 하게 되면, 설정을 읽어들여서 프로젝트를 생성하게 됩니다. Spring-Boot의 경우 현재 JDK 17 이상을 요구를 하고 있다보니, JDK가 이전 버전이라면 JDK를 설치하는 것이 좋습니다. 2.x.x로 세팅하는 방법도 있긴 한데 개발을 할 때에는 현재 JDK 21이 26년 9월까지 무료이기 때문에 사용해본 후, OpenJDK 등으로 변경하는 것도 하나의 답일 것 같네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Spring</category>
      <category>intellij</category>
      <category>springboot</category>
      <category>인텔리j</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/269</guid>
      <comments>https://needneo.tistory.com/269#entry269comment</comments>
      <pubDate>Mon, 22 Jan 2024 10:57:40 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 널(Null)일 경우, 교체하는 2가지 방법 (COALESCE, IFNULL)</title>
      <link>https://needneo.tistory.com/268</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 혹은 MariaDB에서 널(NULL) 값을 다른 값으로 교체를 하고 싶을 경우, 대표적으로 2가지의 방법을 활용하는데요. 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;NULL_MYSQL_2가지바법.jpg&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lTB6y/btsBugFIFBM/Wu4btRdXa7HAiJwYinjp30/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lTB6y/btsBugFIFBM/Wu4btRdXa7HAiJwYinjp30/img.jpg&quot; data-alt=&quot;[MySQL] 널(Null)일 경우, 교체하는 2가지 방법 (COALESCE, IFNULL)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lTB6y/btsBugFIFBM/Wu4btRdXa7HAiJwYinjp30/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlTB6y%2FbtsBugFIFBM%2FWu4btRdXa7HAiJwYinjp30%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;860&quot; height=&quot;491&quot; data-filename=&quot;NULL_MYSQL_2가지바법.jpg&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[MySQL] 널(Null)일 경우, 교체하는 2가지 방법 (COALESCE, IFNULL)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IFNULL 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 NULL값을 가장 심플하게 처리하는 방법으로는 IFNULL이 있습니다. IFNULL은 2개의 인자를 받아서 첫번째 인자가 NULL값인 경우 두번째 인자로 대체하는 함수입니다. 간단히 생각해서 IFNULL(값, 대체값) 형식으로 사용되며, 여기서 값이 NULL일 경우 대체값으로 처리 되는 방식입니다.&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;b&gt;사용 방식&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701770745699&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT IFNULL(column_name, '교체할값') From table_name;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701770802375&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT IFNULL(sales, 0) from sales_table;&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;sales_table의 sales 컬럼이 널일 경우, 0으로 대체합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701770855200&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT name, IFNULL(email, 'No Email') FROM contacts;&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;contacts 테이블에서 name과 email을 출력하지만, email의 값이 null일 경우, No Email 이라는 문자열이 출력됩니다.&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;위 예시처럼, IFNULL은 말 그대로 NULL에 특화된 함수로 해당 값을 처리할 때 매우 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;COALESCE 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IFNULL과 함께 COALESCE 함수 역시, NULL값을 처리하기 위해서 사용되는 함수입니다. IFNULL이 단 2개의 인자값으로 처리하는 것과 달리 이 함수는 여러개의 인자값을 받으면서, Null이 아닌 값을 리턴합니다.&amp;nbsp;&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;b&gt;사용방식&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701771179248&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT COALESCE(column1, column2, '기본값') FROM table_name;&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;우선 방식은 위와 같이 값을 나열하면 됩니다. 위 사용방식 예시를 보면, 마지막에 '기본값'이라는 문자열이 있기 때문에 결과적으로 최종적으로는 Null 값이 리턴되지는 않습니다.&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;첫번째로 column1 값을 검사하여, Null값일 경우 column2 값을 검사하며 마찬가지로 Null값일 경우 마지막 '기본값'을 출력하게 됩니다.&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;b&gt;사용예시&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701771521431&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT COALESCE(end_date, start_date, CURRENT_DATE) from recommend;&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;recommend라는 테이블에서 end_date 컬럼을 검사하고 null이면, start_date를 검사한 후 마찬가지로 null이면 CURRENT_DATE를 리턴합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701771586918&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT COALESCE(salary, 0) FROM salary_table;&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;salary_table에서 salary 컬럼을 검사하여 Null이면, 0을 리턴합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 IFNULL과 COALSCE는 유사하지만, 엄밀히 보자면 전혀 다른 로직을 가진 메소드입니다만 COALSCE가 IFNULL 메소드의 역할을 정확히 대체할 수 있기 때문에 더 다양한 기능을 가진 메소드라 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB/Mysql</category>
      <category>coalesce</category>
      <category>ifnull</category>
      <category>mysql</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/268</guid>
      <comments>https://needneo.tistory.com/268#entry268comment</comments>
      <pubDate>Tue, 5 Dec 2023 19:25:31 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 소수점을 %로 변경하는 두가지 방법</title>
      <link>https://needneo.tistory.com/267</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바(Java)에서 숫자를 퍼센트(%) 형식으로 표시하려면 일반적으로 NumberFormat 형식과 고전적으로 값을 곱하는 방식이 존재하는데요. 두가지의 방법의 차이와 NumberFormat 사용법에 대해서 알려드리도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;비교할 데이터&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699428546996&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TestMain {

    public static void main(String[] args) {
        double a = 0.23;
        double b = 0.045;
        double c = 0.00713;
    }
}&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;명확한 값의 차이를 알기 위해, 위와 같이 3가지의 값을 지정해봤습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;고전적인 방식&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼센트값은 당연하게도 0~1의 사이인 값으로 되어 있습니다. 이렇게 값이 정해져있기 때문에 퍼센트로 치환하는 방식 역시 생각보다 쉬울 수 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699428654059&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 고전적인 방법
 */
public static void type1(double value) {
    int quoatient = (int)(value * 100);
    System.out.println(&quot;type1-&amp;gt;&quot; + quoatient + &quot;%&quot;);
}&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;위와 같이 double 형태의 값에 100을 곱해주면 됩니다. 이 방식은 간단하게 퍼센트를 구할수 있는 장점이 있지만, 핸들링을 하려면 복잡해 지는 문제가 있는데요.&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;자바는 내장 함수로 이를 쉽게 핸들링할 수 있는 NumberFormat이라는 클래스를 제공해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;NumberFormat 방식&lt;/b&gt;&lt;/h2&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 id=&quot;code_1699428826316&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * NumberFormat 방법
 */
public static void type2(double value) {
    // NumberFormat에서 퍼센트 인스턴스를 가져온다
    NumberFormat percentFormat = NumberFormat.getPercentInstance();

    // 소수점 아래 자릿수 설정
    percentFormat.setMinimumFractionDigits(0);  // 최소 자리수
    percentFormat.setMaximumFractionDigits(0);  // 최대 자리수

    String formatted = percentFormat.format(value);
    System.out.println(&quot;type2-&amp;gt;&quot; + formatted);
}&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;간단하게 소수값에 100을 곱했던 이전 방식보다 복잡해 보이는 느낌이 있습니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/h2&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;pre id=&quot;code_1699428929852&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
    double a = 0.23;
    double b = 0.045;
    double c = 0.00713;

    type1(a);
    type2(a);

    type1(b);
    type2(b);

    type1(c);
    type2(c);
}&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;테스트 1 결과&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1699428950986&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type1-&amp;gt;23%
type2-&amp;gt;23%
type1-&amp;gt;4%
type2-&amp;gt;4%
type1-&amp;gt;0%
type2-&amp;gt;1%&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;테스트 1의 경우 대개 유사하지만, 마지막 0.00713이라는 값의 경우 type1은 0이라는 값이 나왔고, type2는 1%라는 값이 나온 것을 알 수 있는데요. 즉, NumberFormat 방식은 반올림이 알아서 적용된다는 것을 알 수 있습니다.&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;그리고 퍼센트에서도 나머지 소수점을 표현할 수 있는데요. 예를 들어, 0.2345 라는 값이 있을 경우 23.45%와 같이 두자리수까지 표현하는 케이스는 첫번째 방식으로 구현하는 방식이 복잡해집니다. 하지만 NumberFormat은 설정값만 변경하면 끝입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699429130396&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;percentFormat.setMaximumFractionDigits(2);&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;위와 같이 최대 자리수를 지정하면 되는데요. 위와 같이 최대자리수를 2로 지정할 경우 어떻게 결과가 나오는지 다시 한번 호출해보겠습니다.&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;b&gt;테스트 2 결과&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1699429175618&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type1-&amp;gt;23%
type2-&amp;gt;23%
type1-&amp;gt;4%
type2-&amp;gt;4.5%
type1-&amp;gt;0%
type2-&amp;gt;0.71%&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;최대 소수점 자리수를 2로 지정한 결과 위와 같이 4% -&amp;gt; 4.5%, 1% -&amp;gt; 0.71%로 전혀 다르게 나온 것을 확인할 수 있습니다. 즉, 확률, 비율 등으로 퍼센트를 사용해야 할 경우에는 복잡하게 고전 방식으로 구현하지 말고, NumberFormat을 사용하는 것을 권유드립니다.&lt;/p&gt;</description>
      <category>Stackoverflow/Java</category>
      <category>NumberFormat</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/267</guid>
      <comments>https://needneo.tistory.com/267#entry267comment</comments>
      <pubDate>Wed, 8 Nov 2023 16:40:56 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT 에러, AttributeError: partially initialized module 'openai' has no attribute 'Completion'</title>
      <link>https://needneo.tistory.com/266</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 ChatGPT API를 Java로 Rest 기반으로 호출하여 사용을 잘하고 있는데 Python의 패키지를 이용하여 ChatGPT를 실행해보고자, 사이트에 있는 Python 예제를 그대로 실행해보려 하였습니다.&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;edited_ChatGPT_openai_에러.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRbZLX/btstNy218ri/kFOlvYf6BszXBDP13cy7h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRbZLX/btstNy218ri/kFOlvYf6BszXBDP13cy7h1/img.png&quot; data-alt=&quot;ChatGPT 에러,&amp;amp;amp;nbsp;'openai' has no attribute&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRbZLX/btstNy218ri/kFOlvYf6BszXBDP13cy7h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRbZLX%2FbtstNy218ri%2FkFOlvYf6BszXBDP13cy7h1%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;500&quot; height=&quot;500&quot; data-filename=&quot;edited_ChatGPT_openai_에러.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ChatGPT 에러,&amp;amp;nbsp;'openai' has no attribute&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;openai 패키지를 정상적으로 설치 한후, 예제 코드를 그대로 실행하였으나, openai 패키지 관련 에러가 발생하였는데요. 원인이 무엇이고 어떻게 해결을 하였는지 좀 황당스럽지만 포스팅 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;에러 예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1694618633623&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import openai

openai.api_key = os.getenv(&quot;OPEN_AI_LICENSE&quot;)

response = openai.Completion.create(
  model=&quot;text-davinci-003&quot;,
  prompt=&quot;The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\nHuman: Hello, who are you?\nAI: I am an AI created by OpenAI. How can I help you today?\nHuman: I'd like to cancel my subscription.\nAI:&quot;,
  temperature=0.9,
  max_tokens=150,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0.6,
  stop=[&quot; Human:&quot;, &quot; AI:&quot;]
)&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;위 예제 코드는 금일자 Open AI에서 제공하고 있는 예제 코드인데요. 이를 그대로 실행하니 아래와 같은 에러가 발생하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;D:\anaconda3\envs\gpt\python.exe D:/gpt/openai.py &lt;br /&gt;Traceback (most recent call last): &lt;br /&gt;&amp;nbsp; File &quot;D:/gpt/openai.py&quot;, line 2, in &amp;lt;module&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; import openai &lt;br /&gt;&amp;nbsp; File &quot;D:\gpt\openai.py&quot;, line 6, in &amp;lt;module&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp;response = openai.Completion.create( &lt;br /&gt;AttributeError: partially initialized module 'openai' has no attribute 'Completion' (most likely due to a circular import)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 openai에 Completion이라는 펑션이 존재하지 않는 걸로 보였습니다. 그래서 확인을 위해 openai를 입력 후 점을 누른 후 자동완성된 펑션 리스트를 확인해보니 Completion은 보이지 않았습니다.&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;그래서 버전 문제라 판단이 들어서 구글링을 해보니 파이썬 3.10 버전 이상을 설치해야 최신 openai 라이브러리를 받을 수 있다는 말을 하는데 또 어떤 분은 3.7.x 에서 설치하여 진행하는 것을 보니 파이썬 문제로 보이진 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 네오본문반응형 --&gt;
&lt;div&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8177628756262013&quot; data-ad-slot=&quot;2866406147&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1차 시도, 삭제 및 재설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pip uninstall openai&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694653559084&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(gpt) D:\gpt&amp;gt;pip uninstall openai
Found existing installation: openai 0.28.0
Uninstalling openai-0.28.0:
  Would remove:
    d:\anaconda3\envs\gpt\lib\site-packages\openai-0.28.0.dist-info\*
    d:\anaconda3\envs\gpt\lib\site-packages\openai\*
    d:\anaconda3\envs\gpt\scripts\openai.exe
Proceed (Y/n)? y
  Successfully uninstalled openai-0.28.0&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;b&gt;pip install openai&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694653621726&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(gpt) D:\gpt&amp;gt;pip install openai
Collecting openai
  Using cached openai-0.28.0-py3-none-any.whl (76 kB)
Requirement already satisfied: tqdm in d:\anaconda3\envs\gpt\lib\site-packages (from openai) (4.65.0)
Requirement already satisfied: requests&amp;gt;=2.20 in d:\anaconda3\envs\gpt\lib\site-packages (from openai) (2.29.0)
Requirement already satisfied: aiohttp in d:\anaconda3\envs\gpt\lib\site-packages (from openai) (3.8.4)
Requirement already satisfied: urllib3&amp;lt;1.27,&amp;gt;=1.21.1 in d:\anaconda3\envs\gpt\lib\site-packages (from requests&amp;gt;=2.20-&amp;gt;openai) (1.26.15)
Requirement already satisfied: charset-normalizer&amp;lt;4,&amp;gt;=2 in d:\anaconda3\envs\gpt\lib\site-packages (from requests&amp;gt;=2.20-&amp;gt;openai) (3.1.0)
Requirement already satisfied: idna&amp;lt;4,&amp;gt;=2.5 in d:\anaconda3\envs\gpt\lib\site-packages (from requests&amp;gt;=2.20-&amp;gt;openai) (3.4)
Requirement already satisfied: certifi&amp;gt;=2017.4.17 in d:\anaconda3\envs\gpt\lib\site-packages (from requests&amp;gt;=2.20-&amp;gt;openai) (2022.12.7)
Requirement already satisfied: yarl&amp;lt;2.0,&amp;gt;=1.0 in d:\anaconda3\envs\gpt\lib\site-packages (from aiohttp-&amp;gt;openai) (1.8.2)
Requirement already satisfied: frozenlist&amp;gt;=1.1.1 in d:\anaconda3\envs\gpt\lib\site-packages (from aiohttp-&amp;gt;openai) (1.3.3)
Requirement already satisfied: attrs&amp;gt;=17.3.0 in d:\anaconda3\envs\gpt\lib\site-packages (from aiohttp-&amp;gt;openai) (22.2.0)
Requirement already satisfied: aiosignal&amp;gt;=1.1.2 in d:\anaconda3\envs\gpt\lib\site-packages (from aiohttp-&amp;gt;openai) (1.3.1)
Requirement already satisfied: async-timeout&amp;lt;5.0,&amp;gt;=4.0.0a3 in d:\anaconda3\envs\gpt\lib\site-packages (from aiohttp-&amp;gt;openai) (4.0.2)
Requirement already satisfied: multidict&amp;lt;7.0,&amp;gt;=4.5 in d:\anaconda3\envs\gpt\lib\site-packages (from aiohttp-&amp;gt;openai) (6.0.4)
Requirement already satisfied: colorama in d:\anaconda3\envs\gpt\lib\site-packages (from tqdm-&amp;gt;openai) (0.4.6)
Installing collected packages: openai
Successfully installed openai-0.28.0&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2m38/btstVfBaGUV/MCy5pqFQ1W5HrqL7ktqpuk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2m38/btstVfBaGUV/MCy5pqFQ1W5HrqL7ktqpuk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2m38/btstVfBaGUV/MCy5pqFQ1W5HrqL7ktqpuk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2m38%2FbtstVfBaGUV%2FMCy5pqFQ1W5HrqL7ktqpuk%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;500&quot; height=&quot;375&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;375&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQMLMQ/btstSA6V3XI/YgABpY2KVkqDBDjSDRmKeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQMLMQ/btstSA6V3XI/YgABpY2KVkqDBDjSDRmKeK/img.png&quot; data-alt=&quot;파일명 문제를 얘기하는 유저&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQMLMQ/btstSA6V3XI/YgABpY2KVkqDBDjSDRmKeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQMLMQ%2FbtstSA6V3XI%2FYgABpY2KVkqDBDjSDRmKeK%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;799&quot; height=&quot;197&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;197&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;이 말을 본 순간 작성한 파일을 보니... 제가 테스트로 만든 파일 명이 openai.py였던 것이었죠. 그래서 파일명을 변경하니 변경을 하니 이제는 다른 문제에 직면하였지만, 다음과 같이 정의되어 있지 않는 펑션이다라는 메세지를 사라졌습니다.&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;결국 문제는 제가 openai를 재정의해버려서 제가 만든 파일명의 내용을 제가 호출하고 있던 것이었습니다. 그러니 당연히 자동완성이 되지 않았던 것이죠.&amp;nbsp;진짜 너무 황당한 실수를 한 것 같네요. 테스트를 하실 때 openai.py로 파일명을 만들지 않길 바랍니다.;;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AttributeError:&amp;nbsp;module&amp;nbsp;&amp;lsquo;openai&amp;rsquo;&amp;nbsp;has&amp;nbsp;no&amp;nbsp;attribute&amp;nbsp;&amp;lsquo;ChatCompletion&amp;rsquo;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://community.openai.com/t/attributeerror-module-openai-has-no-attribute-chatcompletion/81490/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://community.openai.com/t/attributeerror-module-openai-has-no-attribute-chatcompletion/81490/26&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694654194785&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;AttributeError: module 'openai' has no attribute 'ChatCompletion'&quot; data-og-description=&quot;Dude I dont know how or why that worked but hell yeah it did, just changed my main file from openai.py to _openai.py, ran it and holy * it ran.&quot; data-og-host=&quot;community.openai.com&quot; data-og-source-url=&quot;https://community.openai.com/t/attributeerror-module-openai-has-no-attribute-chatcompletion/81490/26&quot; data-og-url=&quot;https://community.openai.com/t/attributeerror-module-openai-has-no-attribute-chatcompletion/81490/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dszXpx/hyTStaaaub/iXDiY6QTy2qiPUUC9dMKL1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/eo9FPF/hyTV29OemP/QdXceqAt4Muh8qvHvihUh0/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://community.openai.com/t/attributeerror-module-openai-has-no-attribute-chatcompletion/81490/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://community.openai.com/t/attributeerror-module-openai-has-no-attribute-chatcompletion/81490/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dszXpx/hyTStaaaub/iXDiY6QTy2qiPUUC9dMKL1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/eo9FPF/hyTV29OemP/QdXceqAt4Muh8qvHvihUh0/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&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;AttributeError: module 'openai' has no attribute 'ChatCompletion'&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Dude I dont know how or why that worked but hell yeah it did, just changed my main file from openai.py to _openai.py, ran it and holy * it ran.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;community.openai.com&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>Stackoverflow/Python</category>
      <category>ChatGPT</category>
      <category>gpt</category>
      <category>OpenAI</category>
      <author>The Neo</author>
      <guid isPermaLink="true">https://needneo.tistory.com/266</guid>
      <comments>https://needneo.tistory.com/266#entry266comment</comments>
      <pubDate>Thu, 14 Sep 2023 10:17:00 +0900</pubDate>
    </item>
  </channel>
</rss>