<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>algml0703</title>
    <link>https://mihee0703.tistory.com/</link>
    <description>기록 하자</description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 17:38:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>algml0703</managingEditor>
    <item>
      <title>내부 네트워크를 이용해서 외부 단말기 접속 방법</title>
      <link>https://mihee0703.tistory.com/257</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;gt;&amp;nbsp; ifconfig | grep &quot;inet &quot; | grep -v 127.0.0.1&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;맥에서 위의 명령어 입력 시 아래와 같은 결과를 출력하여주는데, 해당 명령어는 현재 컴퓨터의 네트워크 인터페이스에서 루프백주소(Loopback) 즉 127.0.0.1을 제외한 IPv4주소를 출력하여 주는 명령어이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ifconfig -&amp;gt; 현재 네트워크 인터페이스 정보를 출력하여 주는 명령어&amp;nbsp; ifconfig(=interface configuration)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;grep &quot;inet &quot; -&amp;gt; ifconfig를 통한 결과에서 inet 문자열을 포함하는 줄들을 찾는 명령어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;grep -v 127.0.0.1 -&amp;gt; 위에서 찾은 줄들에서 127.0.0.1이 포함된 줄을 제외하고 출력하여 주는 명령어&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;inet 123.45.6.7 netmask 0xffffff00 broadcast &lt;b&gt;123.45.6.&lt;/b&gt;255&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 예를 들어 내 노트북 컴퓨터에서 로컬호스트로 서버를 실행 시킨 후에 같은 네트워크를(ex 와이파이 or 유선 랜/이더넷)를 사용중인 휴대폰이나 다른 컴퓨터를 통해 123.45.6.7와 서버를 실행 시킨 포트에 접속하면 내 노트북에서 실행되는 서버에 접속이 가능하다. (방화벽으로 막힌 경우를 제외...)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위에서 출력된 결과를 확인해보면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;inet 123.45.6.7&lt;/b&gt; -&amp;gt; 현재 네트워크 인터페이스의 IPv4 주소, 즉 현재 내 컴퓨터가 사용하는 네트워크의 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;netmask 0xffffff00&lt;/b&gt; -&amp;gt; 16진수로 표현된 서브넷 마스크 (255.255.255.0)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;broadcase 123.45.6.255&lt;/b&gt; -&amp;gt; 브로드캐스트 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #006dd7; text-align: left;&quot;&gt;TODO: 더 자세히 알아볼 내용&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;* 이더넷&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;* 네트워크 인터페이스&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;컴퓨터와 네트워크를 연결하는 장치를 의미&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;- 물리적 네트워크 인터페이스&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;- 가상 네트워크 인터페이스&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;* 루프백(Loopback) 주소&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;~ 개발할 때 자기 자신의 서비스(예: 로컬 DB, API 서버 등)와 통신하는 용도로 활용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;* 서브넷 마스크&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;* IPv4 주소&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;컴퓨터나 장치가 네트워크에서 식별되는 고유한 숫자 주소로, 같은 네트워크에 있는 다른 장치들과 통신하기 위해 사용되는 주소이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>ifconfig</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/257</guid>
      <comments>https://mihee0703.tistory.com/257#entry257comment</comments>
      <pubDate>Tue, 11 Feb 2025 19:58:27 +0900</pubDate>
    </item>
    <item>
      <title>[ docker ] - docker에서 oracle 데이터베이스 설치 실행 (feat. mac m1)</title>
      <link>https://mihee0703.tistory.com/254</link>
      <description>&lt;h2 style=&quot;text-align: left; box-shadow: 2px 3px 5px 0px #D8D8D8; madrin-left: 3px;&quot; data-ke-size=&quot;size26&quot;&gt;docker에서 oracle 데이터베이스 설치 실행 (feat. mac m1)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오라클 데이터베이스의 경우 공식적으로는 macOS를 지원하지 않아서 mac에서 로컬로 오라클 데이터베이스를 사용하기 위해서는 도커를 사용하거나, Virtual Box나 VMware같은 가상화 소프트웨어를 이용해야 한다. 그 중에서는 나는 도커를 사용하여 오라클 데이터베이스를 로컬에서 실행해보았다. 근데 기존에 도커에서 그냥 단순히 이미지를 pull 받아서 해당 이미지를 run하여 컨테이너로 만들어 실행시키는 방식이 나의 경우 무엇이 문제인지 정확히 모르겠지만 계속 에러가 났다. docker를 삭제했다가 재설치 하는 식으로도 여러 번 해보고, 오라클 이미지를 각기 다른 이미지를 받아 실행시켜 보았는데도 실행하면 계속 컨테이너가 꺼졌다. 어찌 어찌 해결은 했는데 추후에 혹시 또 노트북 바꾸거나 새로 세팅해야 하는 경우를 대비하여 글로 작성하였다. (아래의 방식은 직접 오라클 도커 이미지를 빌드한 후 직접 빌드한 이미지를 컨테이너로 실행시킨 것이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 맥에서 직접 오라클을 실행시키는 것은 안 되고, 도커로 이미지를 빌드해서 오라클을 실행시키는 것은 가능한 이유?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;1. git에서 직접 oracle docker-images 다운 받기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736682794985&quot; class=&quot;html xml&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; git clone https://github.com/oracle/docker-images&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;a href=&quot;https://github.com/oracle/docker-images&quot;&gt;https://github.com/oracle/docker-images&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위치는 바탕화면에 docker-images 폴더 하위에 프로젝트를 받았다. 즉 프로젝트가 desktop/docker-images/docker-images로 존재하는데 나는 프로젝트 폴더명을 oracle로 변경하여서 desktop/docker-images/oracle 구조가 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-12 오후 2.05.14.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2ODtR/btsLJOfYMBw/TK5hSL1yNDm5pKf5x6cq8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2ODtR/btsLJOfYMBw/TK5hSL1yNDm5pKf5x6cq8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2ODtR/btsLJOfYMBw/TK5hSL1yNDm5pKf5x6cq8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2ODtR%2FbtsLJOfYMBw%2FTK5hSL1yNDm5pKf5x6cq8k%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;801&quot; height=&quot;313&quot; data-filename=&quot;스크린샷 2025-01-12 오후 2.05.14.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. oracle 실행 zip 다운로드&amp;nbsp; (LINUX.X64_191900_db_home.zip)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.oracle.com/database/technologies/oracle19c-linux-arm64-downloads.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.oracle.com/database/technologies/oracle19c-linux-arm64-downloads.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위의 링크를 통해 오라클 데이터베이스를 직접 다운로드 받고, 해당 zip파일(LINUX.X64_191900_db_home.zip)은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles/19.3.0 폴더의 하위에 위치시킨다. (이때 주의&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-12 오후 4.33.10.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3YcV5/btsLKvmE58V/SaTz7XP7fmlYvk6rRu0tdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3YcV5/btsLKvmE58V/SaTz7XP7fmlYvk6rRu0tdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3YcV5/btsLKvmE58V/SaTz7XP7fmlYvk6rRu0tdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3YcV5%2FbtsLKvmE58V%2FSaTz7XP7fmlYvk6rRu0tdk%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;663&quot; height=&quot;319&quot; data-filename=&quot;스크린샷 2025-01-12 오후 4.33.10.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;점은 압축파일을 해제해서 위치시키는게 아니라 zip 파일 그대로 위치시키는 것이다.)&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3.&amp;nbsp; docker image build&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736683112672&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; ./buildContainerImage.sh -e -v 19.3.0 -t oracle19c&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 위 명령어는&amp;nbsp;도커 이미지 빌드 시 oracle19c 라는 도커 이미지명을 사용하고, 버전은 19.3.0임&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles 폴더 하위에 buildContainerImage.sh란 파일이 존재하는데 도커 이미지로 빌드하기 위해 위의 명령어로 해당 파일을 실행시킨다. 이때 명령어 실행하는 터미널 위치는 desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles 이어야 한다. 해당 위치가 아닌 경우에는 /desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles/buildContainerImage.sh -e -v 19.3.0 -t oracle19c 이와 같이 경로를 모두 명시해주어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-12 오후 3.01.21.png&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOCBe6/btsLLPdnVgE/OaHXf5VQ2E5y4UAZ2C41OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOCBe6/btsLLPdnVgE/OaHXf5VQ2E5y4UAZ2C41OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOCBe6/btsLLPdnVgE/OaHXf5VQ2E5y4UAZ2C41OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOCBe6%2FbtsLLPdnVgE%2FOaHXf5VQ2E5y4UAZ2C41OK%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;2226&quot; height=&quot;778&quot; data-filename=&quot;스크린샷 2025-01-12 오후 3.01.21.png&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;** 이때에 주의점은 두번째 단계에서 다운로드하였던 설치 파일이 해당 버전의 디렉토리 안에 존재해야 한다. 즉 dockerfiles/19.3.0 폴더 하위에 오라클 설치 파일(=LINUX.X64_191900_db_home.zip)이 존재해야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;도커 이미지 빌드가 완료되면 최종적으로 build completed in ~ 이런 식으로 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-12 오후 8.45.03.png&quot; data-origin-width=&quot;2174&quot; data-origin-height=&quot;1228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c69Qte/btsLJvuhaGN/i1ubTIKz2tDJxydPiqANu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c69Qte/btsLJvuhaGN/i1ubTIKz2tDJxydPiqANu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c69Qte/btsLJvuhaGN/i1ubTIKz2tDJxydPiqANu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc69Qte%2FbtsLJvuhaGN%2Fi1ubTIKz2tDJxydPiqANu1%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;2174&quot; height=&quot;1228&quot; data-filename=&quot;스크린샷 2025-01-12 오후 8.45.03.png&quot; data-origin-width=&quot;2174&quot; data-origin-height=&quot;1228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이후 아래 명령어 실행 시 oracle19c 라는 이름의 도커 이미지가 생성된 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736683123056&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; docker images&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-12 오후 4.54.31.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgOXtG/btsLJB2c3uS/xEBsTNTCvdmVrtMTIDPDWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgOXtG/btsLJB2c3uS/xEBsTNTCvdmVrtMTIDPDWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgOXtG/btsLJB2c3uS/xEBsTNTCvdmVrtMTIDPDWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgOXtG%2FbtsLJB2c3uS%2FxEBsTNTCvdmVrtMTIDPDWK%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;1380&quot; height=&quot;88&quot; data-filename=&quot;스크린샷 2025-01-12 오후 4.54.31.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 도커 이미지를 통해 컨테이너 생성 및 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736683131905&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; mkdir -p ~/Desktop/dockerdatas/oracledata/oradata&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컨테이너를 종료하거나 재시작하더라고 데이터가 손실되지 않도록 컨테이너 생성 시 볼륨 마운트 설정해줄 폴더 생성하여주는 명령어&lt;/p&gt;
&lt;pre id=&quot;code_1736683504061&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; sudo chown -R 54321:54321 ~/Desktop/dockerdatas/oracledata/oradata&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;chown은 Change Ownership의 약자로 파일과 디렉토리의 소유자와 소유그룹(첫 번째가 소유자, 두 번째가 소유 그룹)을 변경해주기 위해 사용하는 명령어이다. 더불어 -R은 해당 디렉토리는 물론 하위의 모든 파일 및 디렉토리에도 적용함을 의미한다. 즉 해당 디렉토리에 대한 소유자와 소유그룹의 ID를 54321로 변경해준 것인데, 이는 도커 컨테이너 내부의 프로세스가 특정 파일에 접근할 때 사용자 ID와 그룹 ID 를 필요로 하는데 기본적으로 Oracle 도커 이미지의 경우에는 데이터 파일의 소유자 ID와 소유 그룹 ID를 54321로 갖고 있도록 하고 있다. 때문에 데이터 볼륨을 마운트 설정해주기 위해서는 해당 디렉토리가 컨테이너에서 사용하는 사용자ID/그룹ID와 일치하도록 설정해준 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1736683505063&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; Sudo chmod -R 777 ~/Desktop/dockerdatas/oracledata/oradata&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;chmod는 change mode의 약자로 디렉토리나 파일의 권한을 변경하여 주는 명령어이다. 컨테이너가 해당 파일에 대해 읽기/쓰기와 같은 작업을 원활하게 수행할 수 있도록 해당 디렉토리에 대해 모든 권한도 허용하여 주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;- 첫 번째 숫자 : 소유자 권한&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;- 두 번째 숫자 : 소유 그룹 권한&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;- 세 번째 숫자 : 기타 사용자 권한&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;4 (읽기) + 2 (쓰기) + 1 (실행) = 7&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;즉 모든 사용자에게 읽기, 쓰기, 실행의 권한을 부여함&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736685518569&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; docker run --name local-oracle -d -p 1521:1521 -e ORACLE_SID=ORCLDB -e ORACLE_PWD=1234 -e ORACLE_CHARACTERSET=AL32UTF8 -v /Users/mihee/desktop/dockerdatas/oracledata/oradata:/opt/oracle/oradata oracle19c:latest&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.814%; height: 252px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 30px;&quot;&gt;
&lt;td style=&quot;width: 33.9793%; height: 30px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;docker run&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.9509%; height: 30px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;컨테이너를 생성하고 실행&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.9793%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-d&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.9509%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;컨테이너를 백그라운드로 실행, 해당 옵션을 주지 않는 경우, 컨테이너가 생성 실행되는 동안 터미널에서 다른 작업이 불가능하다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.9793%; height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;--name [컨테이너명]&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.9509%; height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;해당 컨테이너 생성 또는 실행 시 컨테이너명&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 33.9793%; height: 37px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-p [호스트포트번호]:[컨테이너내부포트번호]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.9509%; height: 37px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;호스트(=로컬컴퓨터)의 포트와 컨테이너 내부의 포트를 매핑해줌&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;ex) -p 1521:1521 로컬컴퓨터의 1521포트로 접속 시 컨테이너 1521 포트로 접속 가능&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 94px;&quot;&gt;
&lt;td style=&quot;width: 33.9793%; height: 94px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-e [환경변수키]=[환경변수값]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.9509%; height: 94px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;환경변수 설정해준 것&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;ex)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-e ORACLE_SID=ORCLDB&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;ORACLE_SID는 오라클 데이터베이스의 식별자로 즉 ORCLDB를 데이터베이스명으로 사용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;ex) -e ORACLE_PWD=1234 오라클 관리자 계정(SYS, SYSTEM)으로 접속 시 비밀번호&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;ex) -e ORACLE_CHARACTERSET=AL32UTF8 데이터베이스 문자 설정,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;AL32UTF8&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 56px;&quot;&gt;
&lt;td style=&quot;width: 33.9793%; height: 56px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-v [호스트디렉토리]:[컨테이너디렉토리]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.9509%; height: 56px;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;볼륨마운트 설정을 위한 옵션으로, 컨테이너가 종료되어도 데이터를 영구적으로 보존할 수 있도록 로컬에 저장해두는 공간을 설정해두는 것이다. 즉 컨테이너 내부적으로 오라클 데이터 파일이 저장되는 디렉토리를 호스트의 디렉토리로 매핑하여 준 것이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1736767761492&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; docker exec -it local-oracle sqlplus sys as sysdba&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;local-oracle 컨테이너 내부의 터미널에 접속하여 관리자 계정으로 sqlplus 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이후 아래와 같이 비밀번호 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;gt; select&lt;/span&gt; instance_name, status &lt;span&gt;from&lt;/span&gt; v$instance; &lt;/b&gt;쿼리를 통해 데이터베이스 상태 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-13 오후 8.49.46.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nz17O/btsLMnoaKDs/sf6HN3WHqvazTfWcwT9QZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nz17O/btsLMnoaKDs/sf6HN3WHqvazTfWcwT9QZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nz17O/btsLMnoaKDs/sf6HN3WHqvazTfWcwT9QZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNz17O%2FbtsLMnoaKDs%2Fsf6HN3WHqvazTfWcwT9QZ0%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;1336&quot; height=&quot;588&quot; data-filename=&quot;스크린샷 2025-01-13 오후 8.49.46.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;+ DBeaver 접속 시&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-13 오후 8.51.46.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tSvdp/btsLMXbAUsv/WKcc27QwYJ5cDyGAzhPTvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tSvdp/btsLMXbAUsv/WKcc27QwYJ5cDyGAzhPTvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tSvdp/btsLMXbAUsv/WKcc27QwYJ5cDyGAzhPTvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtSvdp%2FbtsLMXbAUsv%2FWKcc27QwYJ5cDyGAzhPTvk%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;1852&quot; height=&quot;692&quot; data-filename=&quot;스크린샷 2025-01-13 오후 8.51.46.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;관련 에러&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;우선 docker run 했을 때 아래와 같이 에러난 경우&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0c0d0e; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #ee2323;&quot; href=&quot;https://stackoverflow.com/questions/72152446/warning-the-requested-images-platform-linux-amd64-does-not-match-the-detecte&quot;&gt;WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64)&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;해당 에러 발생하는 경우 docker 실행 시에 --platform linux/amd64 이런 식으로 옵션 추가해서 실행하라는 글이 많았는데 내 경우에는 해당 옵션을 붙여서 컨테이너를 생성하면 컨테이너가 생성되고 실행되는 것처럼 보여도 실질적으로 오라클 실행해보면 오라클 실행이 안 되었다. 이런 경고가 뜨는 이유는 말그대로 docker 이미지와 내 컴퓨터 사이의 플랫폼 아키텍처가 맞지 않아서 그런 것이였다. 도커는 linux/amd64 기반인데 내가 사용하는 mac의 경우 linux/arm64 기반이었기 때문이다. (m1, m2의 경우 arm 기반 프로세서이다)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;위 문제 해결을 위해 한 것&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;1. 맥 소프트웨어 업데이트&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;2. qemu 설치 (brew install qemu)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;3. 도커 삭제 후 재설치&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;// 위의 작업 이후에 글의 처음부터 다시 작업. (약간 이것저것 해보다가 성공한거라 뭐 때문에 성공했는지는 정확하지 않음...)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;** 더 알아볼 것 , qemu?, 멀티 아키텍처?, arm프로세서?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;참고:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;docker 설치 : &lt;a href=&quot;https://king-ja.tistory.com/107&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://king-ja.tistory.com/107&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;docker로 oracle 실행하는 방법 : &lt;a href=&quot;https://growupcoding.tistory.com/18&quot;&gt;https://growupcoding.tistory.com/18&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;qemu 관련 참고 : &lt;a href=&quot;https://jaejade.tistory.com/226?category=787339&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jaejade.tistory.com/226?category=787339&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타/docker</category>
      <category>docker</category>
      <category>oracle</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/254</guid>
      <comments>https://mihee0703.tistory.com/254#entry254comment</comments>
      <pubDate>Sun, 12 Jan 2025 18:43:33 +0900</pubDate>
    </item>
    <item>
      <title>[ DATABASE ] - Oracle에서 사용자 생성 및 테이블스페이스 생성</title>
      <link>https://mihee0703.tistory.com/253</link>
      <description>&lt;h2 style=&quot;text-align: left; box-shadow: 2px 3px 5px 0px #D8D8D8; madrin-left: 3px;&quot; data-ke-size=&quot;size26&quot;&gt;사용자 생성 및 테이블스페이스(TableSpace) 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. tabalespace 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736183530369&quot; class=&quot;sql&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// -&amp;gt; 기본 tablespace 생성 oracle 쿼리
CREATE TABLESPACE [테이블스페이스명] 
DATAFILE [파일경로] 
[옵션]

ex)
CREATE TABLESPACE myts 
DATAFILE 'C:\oracle\oradata\myts.dbf' 
SIZE 100M 
AUTOEXTEND ON NEXT 5M MAXSIZE 500M;

// tablespace 변경 시
ALTER DATABASE DATAFILE [경로] [변경사항]

ex) 
// tablespace의 데이터파일 크기 200MB로 확장
ALTER DATABASE DATAFILE 'C:\oracle\oradata\myts.dbf' RESIZE 200M;
// 해당 테이블스페이스 읽기 전용으로 상태 변경
ALTER TABLESPACE myts READ ONLY;

// -&amp;gt; tablespace 삭제 시 쿼리 
// 해당 tablespace는 물론 관련한 데이터 및 파일을 삭제한다.
DROP TABLESPACE myts INCLUDING CONTENTS AND DATAFILES;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div id=&quot;code_1736198398451&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;p style=&amp;quot;font-size: 17px; border-left: 4px solid #87A2FB
; padding-left:10px; color: black&amp;quot;&amp;gt;Tablespace&amp;lt;/p&amp;gt;&quot;&gt;
&lt;p style=&quot;font-size: 17px; border-left: 4px solid #87A2FB; padding-left: 10px; color: black;&quot; data-ke-size=&quot;size16&quot;&gt;Tablespace&lt;/p&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;oracle에서 데이터베이스 저장 공간을 논리적으로 나뉜 단위를 의미한다. (즉 oracle에서 모든 데이터는 tablespace에 저장되어 관리된다.)&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;tablespace는 물리적으로는 일종의 파일 단위로 존재한다.&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;백업이나 복구 등의 작업 단위가 된다.&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;tablespace는 기본적으로는 하나의 파일로 생성되지만, 하나의 tablespace가 여러 개의 데이터 파일로 구성되도록 할 수 있다.&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;데이터 파일의 크기 설정을 통해 tablespace의 크기를 구성할 수 있다.&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;성능을 위해 인덱스 등과 같은 부분만을 별도의 테이블스페이스를 통해 저장 관리하거나 대규모 데이터를 가진 테이블을 파티셔닝하여 다른 테이블스페이스에 저장 관리하여 접근 속도와 성능을 향상시킬 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;사용자마다 특정 tablespace를 할당함으로써 데이터 접근 권한을 제어할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;oralce은 설치 시에 기본적으로 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;(1) SYSTEM Tablespace (2) SYSAUX Tablespace (3) UNDO Tablespace (4) TEMP Tablespace (5) USERS Tablespace&lt;/b&gt;&lt;/span&gt; 를 가지고 있다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;oracle 설치 시 기본으로 생성되는 tablespace&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(1) SYSTEM Tablespace&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;oracle 데이터베이스의 주요한 메타데이터를 관리하는 테이블스페이스로, SYS, SYSTEM 스키마는 물론 초기화 정보 및 주요한 시스템 테이블들이 저장된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(2) SYSAUX Tablespace&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;SYSTEM 테이블스페이는를 보조하는 역할을 하며, 성능, 백업, 복구 등의 기능과 관련한 데이터를 포함하는 테이블스페이스이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(3) UNDO Tablespace&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;트랜잭션 롤백 및 데이터 복구를 위한 정보를 저장하는 테이블 스페이스이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(4) TEMP Tablespace&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;정렬 및 임시 작업 시에 데이터를 저장하는 테이블 스페이스이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(5) USERS Tablespace&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;일반 사용자 데이터를 저장 관리하는 테이블 스페이스이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;CREATE TABLESPACE myts DATAFILE 'C:\oracle\oradata\myts.dbf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE &lt;span&gt;500&lt;/span&gt;M; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;쿼리는 myts라는 tablespace을 생성하고 해당 테이블스페이스에 저장되는 데이터는 C:\oracle\oradata 폴더 하위에 myts.dbf 라는 데이터 파일에 저장, 해당 데이터 파일의 크기는 100MB로 설정, AUTOEXTEND ON 즉 데이터 파일의 자동 확장을 허용하여, 데이터 증가로 공간이 부족해지면 지정된 크기만큼 데이터 파일이 자동으로 확장되도록 옵션을 설정. NEXT 5M은 데이터 파일이 확장될 때 증가하는 크기의 단위이다.&amp;nbsp; 단 데이터 파일 크기의 무제한 확장을 막기 위해 해당 데이터 파일의 최대 크기는 500MB가 넘지 않도록 MAXSIZE&amp;nbsp;500M;설정한 것이다. &lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** oracle에서 스키마나 사용자 생성 시 에러 발생하는 경우 -&amp;gt;&amp;nbsp; C##을 붙여서 사용해야 하는 경우가 있는데 이때 &lt;span style=&quot;background-color: #666666;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ALTER SESSION SET &quot;_ORACLE_SCRIPT&quot;=true;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;쿼리를 통해 스키마나 사용자명 앞에 C##을 붙이지 않고도 생성할 수 있다. 현재 세션에서 _ORACLE_SCRIPT를 true로 설정한다는 것은 현 세션에서 생성하는 스키마를 시스템 정의 스키마처럼 생성되도록 해주는 쿼리이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;C##은 오라클 데이터베이스에서 공통사용자(Common User)와 로컬 사용자(Local User)를 구분하기 위해 사용하는 접두사로, 공통사용자인 경우에는 사용자명 앞에 C##을 붙여야 사용자 생성이 가능하다. 공통사용자는 CDB와 PDB 모두에서 유효하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 사용자 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736194875516&quot; class=&quot;sql&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// -&amp;gt; 기본 사용자 생성
CREATE USER [사용자명] IDENTIFIED BY [비밀번호];

ex) 
create user ora_user identified by 1234;

---

// -&amp;gt; tablespace 설정하여 사용자 생성
CREATE USER [사용자명] IDENTIFIED BY [비밀번호]

DEFAULT TABLESPACE [테이블스페이스명]

TEMPORARY TABLESPACE [임시테이블스페이스명];

ex) 
create user ora_user identified by 1234

default tablespace myts

temporary tablespace temp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Oracle에서는 사용자와 스키마가 동일하다. 즉 사용자를 생성하면 해당 사용자가 소유하는 스키마가 자동으로 생성되게 된다. 하나의 데이터베이스 안에는 여러 개의 스키마가 존재할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;아래의 두 번째 쿼리의 경우 사용자를 생성하는 동시에 해당 사용자가 사용할 기본 테이블스페이스를 myts로 설정한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 스키마 : Oracle에서 스키마는 특정 데이터베이스 사용자에 의해 소유되는 데이터베이스 객체의 집합을 의미하며, 여기에는 테이블, 뷰, 인덱스, 시퀀스, 프로시저, 트리거 등을 포함한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위의 쿼리 실행 시 데이터베이스 툴인 dbeaver를 통해 확인해 보면 아래와 같이 ora_user 라는 스키마가 생성된 것을 확인할 수 있으며, 해당 스키마의 사용자명은 ora_user, 비밀번호는 1234, 스키마가 저장되는 tablespace는 myts를 가지게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-07 오전 5.26.54.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IVNyX/btsLFYO5ohV/Qnu7vywl3pkg7IuohFez2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IVNyX/btsLFYO5ohV/Qnu7vywl3pkg7IuohFez2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IVNyX/btsLFYO5ohV/Qnu7vywl3pkg7IuohFez2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIVNyX%2FbtsLFYO5ohV%2FQnu7vywl3pkg7IuohFez2k%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;242&quot; height=&quot;599&quot; data-filename=&quot;스크린샷 2025-01-07 오전 5.26.54.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;956&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 권한 부여&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736195280131&quot; class=&quot;sql&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GRANT DBA TO [사용자명];

ex) grant dba to ora_user;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DATABASE</category>
      <category>oracle</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/253</guid>
      <comments>https://mihee0703.tistory.com/253#entry253comment</comments>
      <pubDate>Tue, 7 Jan 2025 06:18:26 +0900</pubDate>
    </item>
    <item>
      <title>[설정] - 환경변수와 사용자 변수 ?</title>
      <link>https://mihee0703.tistory.com/252</link>
      <description>&lt;h2 style=&quot;text-align: left; box-shadow: 2px 3px 5px 0px #D8D8D8; madrin-left: 3px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp; 환경변수와 사용자변수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;새로운 프로그램을 설치해주는 경우 이에 맞추어 환경 변수와 사용자 변수 설정을 추가해주어야 하는 경우가 있다. 예를 들면 자바를 설치 시 JAVA_HOME 이라는 환경변수를 함께 추가해주는 경우가 그러하다. 그 동안 그냥 구글에 검색 시 그냥 블로그에서 시키는 대로 생각없이 따라하면서 설치하고 환경변수를 추가해주었는데 왜 해주는 것인지 한 번 알아보았다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;code_1736167056221&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;p style=&amp;quot;font-size: 17px; border-left: 4px solid #87A2FB
; padding-left:10px; color: black&amp;quot;&amp;gt;환경변수 (System Variables)&amp;lt;/p&amp;gt;&quot;&gt;
&lt;p style=&quot;font-size: 17px; border-left: 4px solid #87A2FB; padding-left: 10px; color: black;&quot; data-ke-size=&quot;size16&quot;&gt;환경변수 (System Variables)&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;환경변수는 시스템 전체에 적용되는 것으로, 모든 사용자 계정과 프로그램에 환경변수로 설정된 것을 참조할 수 있다. 기본적인 시스템 설정과 관련한 경로, 파일 위치, 구성 정보 등을 저장한다. 일반적으로 운영체제 및 모든 사용자에게 공통적으로 적용되어야 할 필요가 있는 경우에 환경변수로 설정하여 준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;code_1736167385552&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;p style=&amp;quot;font-size: 17px; border-left: 4px solid #87A2FB
; padding-left:10px; color: black&amp;quot;&amp;gt;사용자변수 (User Variables)&amp;lt;/p&amp;gt;&quot;&gt;
&lt;p style=&quot;font-size: 17px; border-left: 4px solid #87A2FB; padding-left: 10px; color: black;&quot; data-ke-size=&quot;size16&quot;&gt;사용자변수 (User Variables)&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자 변수는 특정 사용자 계정에서만 사용하려는 경우에 적용하는 설정이다. 개별 사용자의 환경 설정이나 프로그램 실행에 필요한 정보를 설정해두는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로 사용자 변수가 환경변수보다 우선 순위가 높다. 때문에 사용자 계정의 Path 변수에 특정 경로를 추가하면 이는 시스템 변수의 Path 보다 먼저 참조된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** Path: 실행 파일 등에 대한 경로를 설정하여 어느 위치에서든 해당 실행 파일을 실행할 수 있도록 설정하여 주는 파일 경로이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Window 환경에서는 설정 창에서 환경 변수를 검색하여 환경 변수나 사용자 변수에 대한 설정을 해주는 것이 가능하며, Mac 을 사용하는 경우에는 시스템 변수의 경우 /etc/paths&amp;nbsp; 파일에, 사용자 변수의 경우 ~/.bash_profile을 통해 확인 또는 설정할 수 있다. Mac의 경우에는 셸 세션에서 직접 설정된 변수의 우선 순위가 가장 높고, 그 다음으로 ~/.zshrc 나 ~/.bash_profile을 통해 설정된 사용자 변수, 그 다음으로 etc/paths에 설정된 환경변수 순으로 우선 순위를 가진다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현재 셸 세션에서 설정된 변수란 터미널을 실행시키고, export JAVA_HOME=[경로] 와 같이 해당 세션에서 명령어를 통해 바로 설정한 변수를 의미한다. 아래를 이미지를 보면 처음에 JAVA_HOME 확인 시에는 사용자 변수로 설정되어 있는 값을 가져오지만, export JAVA_HOME = [새로운경로] 를 설정해준 후 JAVA_HOME을 확인한 이후에는 새롭게 설정한 JAVA_HOME의 값이 나오는 것을 확인할 수 있다. 하지만 이는 해당 창의 터미널에서만 유효하면 새로운 터미널 창을 실행시켜 JAVA_HOME을 확인해보면 처음과 같이 사용자 변수로 설정되어 있는 값을 가져온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** 해당 세션에서 적용되는 변수 설정해주는 명령어&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736182403742&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export var=[경로]
ex) JAVA_HOME=&quot;/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home&quot;

// 해당 세션 뿐만 아니라 사용자변수 설정에 영구적으로 반영하려는 경우는 아래의 명령어
source ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-07 오전 1.35.57.png&quot; data-origin-width=&quot;1750&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qj6aC/btsLDXRSn5c/RwzaTuyIRPBZyO8fUKFVgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qj6aC/btsLDXRSn5c/RwzaTuyIRPBZyO8fUKFVgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qj6aC/btsLDXRSn5c/RwzaTuyIRPBZyO8fUKFVgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqj6aC%2FbtsLDXRSn5c%2FRwzaTuyIRPBZyO8fUKFVgK%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;1750&quot; height=&quot;160&quot; data-filename=&quot;스크린샷 2025-01-07 오전 1.35.57.png&quot; data-origin-width=&quot;1750&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** Path에 설정되어 있는 경로 확인하는 명령어&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736182099132&quot; class=&quot;bash&quot; style=&quot;background-color: #29293d; border-radius: 20px;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo $PATH | tr ':' '\n'&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** 셸 (Shell) : 사용자와 컴퓨터 운영체제 간의 인터페이스를 제공하는 것으로, 명령어를 처리하는 프로그램이라 할 수 있다. 사용자가 명령어를 입력하면 Shell이 해당 명령어를 운영체제에 전달하고 실행 결과를 사용자에게 반환하여 준다. 그 중에서도 Bash와 Zsh는 Mac이나 Linux와 같은 유닉스 계열 운영체제에서 주로 사용되는 셸의 종류이다.&amp;nbsp; 터미널에서&amp;nbsp;echo $SHELL 실행 시&amp;nbsp; /bin/bash가 나오는 경우, Bash를, /bin/zsh가 나오는 경우 Zsh를 사용하고 있는 것임을 알 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** JAVA_HOME 등과 같이 특정 변수명으로 설정해주는 것과, Path에 경로를 추가해주는 것의 차이?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 JAVA_HOME과 같이 변수에 경로를 설정해 준 것은 Maven이나, Gradle 과 같은 툴 실행 시 사용될 JDK의 경로를 설정해준 것이라 할 수 있다. ex) JAVA_HOME : C:\Program Files\jdk-21.0.5&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Path에 추가해주는 것들은 CLI를 통해 프로그램 실행 시 전역에서 해당 명령어가 실행 가능하도록 해주는 설정이다. 때문에 일반적으로 실행 스크립트가 있는 bin 폴더를 기준으로 Path를 추가해준다. ex) %JAVA_HOME%\bin &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-- %JAVA_HOME%과 같이 %[변수명]% 을 통해 기존에 변수에 설정된 값을 가져올 수 있다. 즉 %JAVA_HOME%\bin 은 C:\Program Files\jdk-21.0.5\bin 과 같다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>세팅</category>
      <category>환경변수와 사용자변수</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/252</guid>
      <comments>https://mihee0703.tistory.com/252#entry252comment</comments>
      <pubDate>Mon, 6 Jan 2025 21:55:57 +0900</pubDate>
    </item>
    <item>
      <title>[ 설정 ] - 플러그인 디펜던시 차이?</title>
      <link>https://mihee0703.tistory.com/251</link>
      <description>&lt;div id=&quot;code_1735121083666&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;p style=&amp;quot;font-size: 17px; border-left: 4px solid #87A2FB
; padding-left:10px; color: black&amp;quot;&amp;gt;플러그인(plugin)과 디펜던시(dependency)의 차이?&amp;lt;/p&amp;gt;&quot;&gt;
&lt;p style=&quot;font-size: 17px; border-left: 4px solid #87A2FB; padding-left: 10px; color: black;&quot; data-ke-size=&quot;size16&quot;&gt;플러그인(plugin)과 디펜던시(dependency)의 차이?&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;플러그인(Plugin)?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;플러그인은 gradle을 통한 빌드 시에 기능이나 새로운 작업을 추가해주는 역할을 한다. 주로 빌드, 테스트, 배포와 같은 빌드 작업을 정의하고 설정을 자동화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) build.gradle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-26 오후 8.11.10.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eqcjv/btsLzc1HJ5u/vw0YGX9kOrUfVnkgwfw7hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eqcjv/btsLzc1HJ5u/vw0YGX9kOrUfVnkgwfw7hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eqcjv/btsLzc1HJ5u/vw0YGX9kOrUfVnkgwfw7hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEqcjv%2FbtsLzc1HJ5u%2Fvw0YGX9kOrUfVnkgwfw7hK%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;1350&quot; height=&quot;266&quot; data-filename=&quot;스크린샷 2024-12-26 오후 8.11.10.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;id(&quot;java&quot;)&lt;/u&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;compileJava, test, jar 등과 같은 작업을 자동으로 수행하도록 해주는 플러그인이다. (java의 경우 gradle 자체 내장 플러그인으로 버전을 명시해주지 않아도 된다. 외부 플러그인의 경우에는 반드시 버전을 명시하여 주어야 한다. )&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;id(&quot;org.springframework.boot&quot;)&lt;/u&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;bootRun, bootJar를 등의 작업을 자동화해주어, 최소한의 설정만으로 스프링 어플리케이션을 실행시킬 수 있도록 돕는 플러그인이다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;id(&quot;io.spring.dependency-management&quot;)&lt;/u&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;디펜던시를 관리하여 주는 플러그인이다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* jar란 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Java 애플리케이션이나 라이브러리를 JAR(Java Archive) 파일로 패키징하는 작업을 의미한다. 즉 Java 클래스 파일과 리소스 파일을 포함하는 압축 형식의 파일이다. 기본적으로 src/main/java 디렉토리 하위에 있는 java 소스 파일을 컴파일하여 .class 파일로, src/main/resource 디렉토리 하위의 파일들에 대해 jar로 만들어 build/libs에 생성한다. jar를 이용함으로써 Java 어플리케이션을 배포하거나, 라이브러리로써 활용이 가능하다. 즉 jar는 Java 환경에서 특별히 동작하도록 설계된 구조와 메타데이터를 포함하는 일종의 압축 파일이라 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* java -jar [jar 파일] &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 jar로 구성된 애플리케이션을 실행시켜 준다.&amp;nbsp; ex )java -jar ./board/build/libs/board-0.0.1-SNAPSHOT.jar&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** gradle은 java 뿐 아니라 Kotlin, Groovy 등의 다양한 프로젝트 언어를 지원한다. 때문에 플러그인 설정을 통해 다양한 언어를 지원할 수 있게 된다. 예를 들어 코틀린을 사용하는 경우 플러그인으로&amp;nbsp;id(&quot;org.jetbrains.kotlin.jvm&quot;)를 추가하면 코틀린 적용 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;플러그인 검색&quot; href=&quot;https://plugins.gradle.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;# &lt;/a&gt;&lt;a href=&quot;https://plugins.gradle.org/&quot;&gt;https://plugins.gradle.org/&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디펜던시(Dependency)?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트에서 사용하는 &lt;u&gt;외부 라이브러리를&lt;/u&gt; 의미한다. 아래와 같이 디펜던시를 추가하면 원격저장소에서 라이브러리를 다운받아와 준다. &lt;u&gt;플러그인이 빌드, 테스트, 배포 등 gradle 자체의 프로세스와 기능을 자동화하거나 확장해주는 역할이라면, 디펜던시의 경우 해당 프로젝트 내에서 사용되는 실제 기능이나 코드&lt;/u&gt;를 제공하여 주는 코드 모음이라 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a title=&quot;라이브러리 버전 관리 (feat. snapshot vs release)&quot; href=&quot;https://yooverd.tistory.com/19&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;# https://yooverd.tistory.com/19 (라이브러리 버전 관리 관련 설명 블로그)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;디펜던시를 추가할 때는 아래와 같이 implementation, testImplementation, runtimeOnly 등이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-28 오전 12.04.34.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsc7Rl/btsLAWYwwy4/F7jrbHR8fRmZpl2ZbxKfN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsc7Rl/btsLAWYwwy4/F7jrbHR8fRmZpl2ZbxKfN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsc7Rl/btsLAWYwwy4/F7jrbHR8fRmZpl2ZbxKfN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsc7Rl%2FbtsLAWYwwy4%2FF7jrbHR8fRmZpl2ZbxKfN1%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;1392&quot; height=&quot;358&quot; data-filename=&quot;스크린샷 2024-12-28 오전 12.04.34.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;implementation &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴파일과 런타임 모두에 사용되는 의존성 라이브러리 추가 시 사용, implementation으로 추가한 디펜던시의 경우 해당 모듈에서만 적용되고, 상위 모듈로 전파되지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;api &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;implementation과 유사하게 컴파일과 런타임 모두에 사용되는 의존성 라이브러리 추가 시 사용되지만, 차이점은 api를 통해 추가한 디펜던시의 경우 해당 모듈 뿐 아니라 상위 모듈에도 전파되어 사용 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;testImplementation &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트 실행 시 사용되는 의존성 라이브러리 추가 시&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;compileOnly&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 컴파일 시에만 필요한 의존성 라이브러리 추가 시&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;runtimeOnly &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JDBC나 로그 구현체 관련한 디펜던시 등 런타임 시에만 필요한 의존성 라이브러리 추가 시&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AnnotationProcessor &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px; list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Lombok과 같이 컴파일 시에 어노테이션 관련한 의존성 라이브러리 추가 시 (컴파일 시에 Lombok을 사용해 코드 생성, 런타임시에는 필요하지 않다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;build.gradle 설정 관련&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나 이상의 모듈로 구성된 프로젝트 구조를 갖춘 경우 기본적으로 &lt;u&gt;루트 프로젝트와 서브프로젝트&lt;/u&gt;라는 개념이 존재한다. 여러 모듈이 모인 가장 최상단이 루트 프로젝트가 되고, 그 안의 각각의 모듈이 하나의 서브프로젝트가 된다. 예를들어 아래의 구조를 보면 market이 루트 프로젝트가 되고, 그 안의 market-boot, market-controller&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;, market-domain&lt;/span&gt;, market-service 가 각각의 서브 프로젝트가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-28 오전 5.53.50.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7TPXm/btsLywz4XyL/jtjUoYUOwQqYlH3Kt73AjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7TPXm/btsLywz4XyL/jtjUoYUOwQqYlH3Kt73AjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7TPXm/btsLywz4XyL/jtjUoYUOwQqYlH3Kt73AjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7TPXm%2FbtsLywz4XyL%2FjtjUoYUOwQqYlH3Kt73AjK%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;372&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2024-12-28 오전 5.53.50.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;[ plugins ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이때에 build.gradle 설정 시에는 &lt;u&gt;공통적인 플러그인 설정은 plugins 스코프 안&lt;/u&gt;에, 모든 서브 프로젝트에 적용하려는 플러그인의 경우 &lt;u&gt;subprojects 스코프 안&lt;/u&gt;에 넣어준다. 또 한 가지 다른 점은 플러그인 적용 시에 subprojects에서 적용되는 플러그인은 &lt;u&gt;apply plugin: '[플러그인]'&lt;/u&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-28 오전 6.15.29.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VNzwM/btsLAyjaxhg/LGoct2JFvscnv0JZveN1Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VNzwM/btsLAyjaxhg/LGoct2JFvscnv0JZveN1Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VNzwM/btsLAyjaxhg/LGoct2JFvscnv0JZveN1Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVNzwM%2FbtsLAyjaxhg%2FLGoct2JFvscnv0JZveN1Kk%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;613&quot; height=&quot;332&quot; data-filename=&quot;스크린샷 2024-12-28 오전 6.15.29.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;또한 각각의 모듈은 모듈 내부의 build.gradle 파일을 통해 각 모듈에 독립적인 플러그인 설정도 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;[ ext ]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;ext의 경우 gradle에서 사용할 속성을 사용자가 추가적으로 정의하여 할 때 사용한다. 예를 들어 아래 build.gradle 설정에서는 ext { lombokVersion = '1.18.24'} 명시해줌으로서 lombok 버전을 전역적으로 관리하게 된다. 이를 통해 공통적인 속성 값에 대한 관리가 편리해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-28 오전 6.25.12.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/32RvD/btsLAEcA56x/Z6WuKA1lrT2RypeSMBfrk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/32RvD/btsLAEcA56x/Z6WuKA1lrT2RypeSMBfrk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/32RvD/btsLAEcA56x/Z6WuKA1lrT2RypeSMBfrk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F32RvD%2FbtsLAEcA56x%2FZ6WuKA1lrT2RypeSMBfrk1%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;616&quot; height=&quot;83&quot; data-filename=&quot;스크린샷 2024-12-28 오전 6.25.12.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;[ allprojects ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;루트 프로젝트와 서브 프로젝트 모두에서 공통적으로 적용되는 설정을 추가하려 할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;[ configurations ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;디펜던시 관련한 설정을 하려 할 때 사용한다. 위에서 디펜던시 부분에서 언급하였던 것처럼 implementation, compileOnly, runtimeOnly 등의 각각의 디펜던시 그룹별로 적용할 설정을 할 수 있고, configurations { all { .. } }을 통해 모든 의존성 그룹에 대해 적용하는 설정을 하는 것도 가능하다.&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-28 오전 6.30.52.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FuRbM/btsLBeSeWcA/t0NrI5TkiOrKnFQR0e1ti1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FuRbM/btsLBeSeWcA/t0NrI5TkiOrKnFQR0e1ti1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FuRbM/btsLBeSeWcA/t0NrI5TkiOrKnFQR0e1ti1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFuRbM%2FbtsLBeSeWcA%2Ft0NrI5TkiOrKnFQR0e1ti1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1136&quot; height=&quot;240&quot; data-filename=&quot;스크린샷 2024-12-28 오전 6.30.52.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;allprojects&lt;/u&gt; : 루트프로젝트와 서브프로젝트 모두에 적용&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;configurations&lt;/u&gt; : 의존성 관련한 설정을 하려는 부분&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;configurations&lt;/u&gt; { all {} } : 모든 의존성 그룹에 대해 설정 적용&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;resolutionStrategy&lt;/u&gt; : 의존성 전략 관련 설정 (버전이나 캐싱 설정 등)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;u&gt;resolutionStrategy.cacheChanginModulesFor&lt;/u&gt; : SNAPSHOT 버전의 디펜던시에 대한 캐싱 지속 시간 설정&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;u&gt;resolutionStrategy.cacheChanginModulesFor&lt;/u&gt;&lt;span&gt;&lt;u&gt; 0, 'seconds'&lt;/u&gt; : 캐싱 시간을 0초로 설정, 즉 gradle 빌드 실행 시에 원격 저장소에서 항상 최신 버전의 라이브러리를 가져온다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 14px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;u&gt;resolutionStrategy.cacheChanginModulesFor&lt;/u&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt; 1&lt;/span&gt;, ' hours'&lt;/u&gt;&lt;span&gt;&amp;nbsp; : 이과 같이 설정 시에는 1시간 동안 로컬캐시를 사용하다가, 이후에 원격저장소를 확인하여 버전이 업데이트 된 경우, 가장 최신 버전을 받아온다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;** &lt;a href=&quot;https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html &lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(resolutionStrategy 관련)&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;즉 &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;gradle이&lt;span&gt;&amp;nbsp;모든 프로젝트에 대해 추가된&amp;nbsp;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;SNAPSHOT 버전의 라이브러리에 대해 캐시하지 않고 원격 저장소에서 항상 최신 버전으로 가져옴. 해당 설정을 해주지 않으면 &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;SNAPSHOT 버전의 라이브러리는 기본적으로 24시간 캐싱되기 때문에, &lt;/span&gt;&amp;nbsp;추가적으로 개발이 진행되어 라이브러리가 업데이트 되어도 이전 버전의 라이브러리를 그대로 사용하게 된다. (반면 라이브러리 사용이 많은 프로젝트에서 매번 새로 라이브러리르 받아오면 빌드 속도가 저하될 수 있다.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;b&gt;SNAPSHOT&lt;/b&gt; : 기본적으로 지속적으로 업데이트가 발생할 가능성이 있는 개발 중인 디펜던시에 대해 &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;SNAPSHOT을 붙인다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;** &lt;b&gt;release&lt;/b&gt; : &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;SNAPSHOT과 반대로 1.0.0, 1.0.1 등과 같이 개발이 완료되어 정식으로 배포된 고정된 버전을 의미한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;[ dependencyManagement ]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;io.spring.dependency-management 플러그인과 함께 사용되어 의존성의 버전을 전역적으로 관리할 수 있게 도와주는 설정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-28 오전 7.42.26.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXd8XY/btsLB2jfJqY/9KQOYKBBvJC3AvbZHHAqqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXd8XY/btsLB2jfJqY/9KQOYKBBvJC3AvbZHHAqqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXd8XY/btsLB2jfJqY/9KQOYKBBvJC3AvbZHHAqqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXd8XY%2FbtsLB2jfJqY%2F9KQOYKBBvJC3AvbZHHAqqk%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;1206&quot; height=&quot;592&quot; data-filename=&quot;스크린샷 2024-12-28 오전 7.42.26.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;'io.spring.dependency-management' 플러그인은 maven에서 사용하는 BOM 기능을 gradle에서 사용 가능하도록 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* * BOM : 의존성 버전 목록을 정의한 파일.&amp;nbsp; 라이브러리들의 버전을 BOM 파일에 정의하여, 별도로 각각의 라이브러리에 버전을 설정하여 주지 않아도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 설정을 spring-boot-starter-web의 경우 버전을 명시해주지 않았지만, dependencyManagement 설정에 의해 BOM이 제공하여 주는 버전을 다운받게 된다. (모든 라이브러리에 대한 버전 정보를 가지고 있는 것은 아니기 때문에 BOM에 정의되지 않은 경우에는 별도로 라이브러리 버전을 명시해주어 관리해야 한다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉&amp;nbsp; dependencyManagement -&amp;gt; 디펜던시에 대한 버전을 spring-boot-dependencies BOM에서 가져와서 각각의 라이브러리 버전을 자동으로 설정해주는데, 이때 각 스프링부트 버전별로 라이브러리 버전도 달라지기 때문에 어떤 버전으로 가져올 지 설정해주어야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>JAVA/gradle</category>
      <category>build.gradle</category>
      <category>gradle</category>
      <category>plugin</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/251</guid>
      <comments>https://mihee0703.tistory.com/251#entry251comment</comments>
      <pubDate>Sat, 28 Dec 2024 00:03:32 +0900</pubDate>
    </item>
    <item>
      <title>[ Error ] Not registered via @EnableConfigurationProperties, marked as Spring component, or scanned via @ConfigurationPropertiesScan</title>
      <link>https://mihee0703.tistory.com/249</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Not&amp;nbsp;registered&amp;nbsp;via&amp;nbsp;@EnableConfigurationProperties,&amp;nbsp;marked&amp;nbsp;as&amp;nbsp;Spring&amp;nbsp;component,&amp;nbsp;or&amp;nbsp;scanned&amp;nbsp;via&amp;nbsp;@ConfigurationPropertiesScan&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;config 관련한 부분이 제대로 등록되지 않아서 발생하는 에러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈으로 등록해주는 클래스에&lt;b&gt; @Component, @Service&lt;/b&gt; 등이 있는지 확인하고, boot를 실행시키는 main 메서드가 있는 클래스에 &lt;b&gt;@ConfigurationPropertiesScan &lt;/b&gt;어노테이션이 추가되어 있는지 확인해주어야 한다.&lt;/p&gt;</description>
      <category>ERROR</category>
      <category>error</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/249</guid>
      <comments>https://mihee0703.tistory.com/249#entry249comment</comments>
      <pubDate>Mon, 20 May 2024 19:27:57 +0900</pubDate>
    </item>
    <item>
      <title>[ Java ] - QueryDSL이란 무엇인가? (+기본 세팅)</title>
      <link>https://mihee0703.tistory.com/248</link>
      <description>&lt;h2 style=&quot;text-align: left; box-shadow: 2px 3px 5px 0px #D8D8D8; madrin-left: 3px;&quot; data-ke-size=&quot;size26&quot;&gt;QueryDSL :Query Domain Specific Lanauage&lt;/h2&gt;
&lt;p style=&quot;font-size: 17px; border-left: 4px solid #87A2FB
; padding-left:10px; color: black&quot;&gt;QueryDSL이란 무엇인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QueryDSL은 자바 코드를 기반으로 하여 쿼리를 작성 할 수 있도록 도와주는 도구로 직관적이고 유연한 쿼리 작성을 가능하게하기 때문에, 복잡한 쿼리나 동적 쿼리 또는 여러 테이블 간의 조인을 통한 값 조회가 요구되는 쿼리 생성이 필요한 경우 등에 JPQL(=JPA Query Lanauage)과 함께 널리 사용되는 라이브러리입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 자바에서는 데이터베이스 관련 작업을 위해 기본적으로 jpaRepository가 사용되는데, jpaRepository는 자바에서 데이터베이스와 연동된 작업을 하기에 매우 편리하고 간단하지만, 단순 CRUD 위주의 작업을 벗어난 복잡한 쿼리나 혹은 동적 쿼리 또는 여러 테이블과 조인이 필요한 경우 등에는 jpaRepository 만으로는 작업에 어려움이 있어서 해당 작업이 필요한 경우 JPQL과 QueryDSL을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;** 동적쿼리&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;동적쿼리란 실행 시점에 쿼리의 형태가 변경될 수 있는 쿼리를 의미합니다. 예를 들어 mybatis로 작성된 아래의 쿼리를 보면, title과 sub_category에 대한 조건은 파라미터의 값이 존재하거나 같은 경우에만 조건으로 구현이 되고, title의 값이 존재하지 않거나, category의 값이 Daily가 아닌 경우에 쿼리의 조건은 DEL_YN으로만 하여 생성됩니다. 이와 같이 실행 시점에 들어오는 파라미터의 값들에 따라 구현되는 쿼리의 모양이 달라지는 쿼리를 동적쿼리라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-18 오후 2.48.15.png&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPZpKU/btsHuytp0xr/ouzZGpiM2c5VAvhvo7zzA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPZpKU/btsHuytp0xr/ouzZGpiM2c5VAvhvo7zzA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPZpKU/btsHuytp0xr/ouzZGpiM2c5VAvhvo7zzA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPZpKU%2FbtsHuytp0xr%2FouzZGpiM2c5VAvhvo7zzA1%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;1012&quot; height=&quot;610&quot; data-filename=&quot;스크린샷 2024-05-18 오후 2.48.15.png&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0; padding-bottom: 0px;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0; padding-bottom: 0px;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Q) JPQL보다 QueryDSL의 사용이 권장되는 이유?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QueryDSL은 엔티티 클래스를 기반으로 하여 작성된 코드를 통해 쿼리를 생성하기 때문에 코드의 가독성을 높여주고 쿼리 자체의 오타나 문법은 줄일 수 있도록 돕습니다. &lt;u&gt;예를 들어 &amp;ldquo;SELECT MAX(b.sortNo) FROM BOARD b where &lt;u&gt;b.category = [category]&amp;rdquo; 와 같은 쿼리는 JPQL에서 보통 아래와 같이 엔티티를 직접 참조하는 방식&lt;/u&gt;으로 사용되며&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-18 오후 1.25.03.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v5Pep/btsHs1cUMgn/TFSdBjB6UPE57j6im7UFjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v5Pep/btsHs1cUMgn/TFSdBjB6UPE57j6im7UFjK/img.png&quot; data-alt=&quot;JPQL을 사용한 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v5Pep/btsHs1cUMgn/TFSdBjB6UPE57j6im7UFjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv5Pep%2FbtsHs1cUMgn%2FTFSdBjB6UPE57j6im7UFjK%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;1396&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2024-05-18 오후 1.25.03.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JPQL을 사용한 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QueryDSL의 경우에는 위와 같은 코드를 아래와 같이 자바 코드를 이용하는 방식으로 작성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-18 오후 1.27.12.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHpfcu/btsHsKvEEV6/fvIhTn1kZclF7aReRoalh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHpfcu/btsHsKvEEV6/fvIhTn1kZclF7aReRoalh1/img.png&quot; data-alt=&quot;QueryDSL을 사용한 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHpfcu/btsHsKvEEV6/fvIhTn1kZclF7aReRoalh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHpfcu%2FbtsHsKvEEV6%2FfvIhTn1kZclF7aReRoalh1%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;1264&quot; height=&quot;302&quot; data-filename=&quot;스크린샷 2024-05-18 오후 1.27.12.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;QueryDSL을 사용한 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPQL과 QueryDSL이 구현된 방식을 보면 알 수 있듯이, JPQL의 경우 상대적으로 코드의 가독성이 떨어지고, 오타나 문법 오류 등을 찾기 어려우며, 컴파일 과정에서도 오타나 문법 오류를 걸러내지 못하여 런타임 즉 서버의 실행 과정에서 에러가 발생할 수 있습니다. 반면에 QueryDSL의 경우 도메인의 변경이 직접적으로 쿼리에 반영되고, ide가 코드 자동완성기능을 지원하여 주어 쿼리를 더욱 빠르고 안전하게 구현할 수 있도록 돕습니다. 특히나 QueryDSL을 사용한 경우에 컴파일 과정에서 쿼리에 문제가 있는 경우 이를 감지하기 때문에, 서버의 런타임 과정에서 문제가 발생할 가능성을 줄여줍니다. 더불어 가독성과 유지보수 측면에서도 QueryDSL이 JPQL 보다 많은 이점을 가지기 때문에 일반적으로 복잡한 쿼리나 동적쿼리의 구현이 필요한 경우에 JPQL보다는 QueryDSL의 사용이 권장됩니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 17px; border-left: 4px solid #87A2FB
; padding-left:10px; color: black&quot;&gt;QueryDSL 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QueryDSL은 엔티티로부터 생성된 Q클래스를 사용하여 쿼리를 구현함으로써 타입의 안정성을 보장합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 17px; border-left: 4px solid #87A2FB
; padding-left:10px; color: black&quot;&gt;QueryDSL 기본 세팅&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0; padding-bottom: 0px;&quot; data-ke-size=&quot;size16&quot;&gt;환경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle; margin-top: 0; padding-top: 0px;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Java 17&lt;/li&gt;
&lt;li&gt;IntelliJ IDEA 2023.1&lt;/li&gt;
&lt;li&gt;gradle&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. build.gradle 파일에 디펜던시 및 설정 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle에 아래의 디펜던시를 추가하여 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 기본적으로 jpa 와 관련한 설정은 되어있다고 가정하였습니다. (jpa 기본 설정 관련 참고 : &lt;a href=&quot;https://mihee0703.tistory.com/232&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mihee0703.tistory.com/232&lt;/a&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1716091964381&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    // querydsl 관련 설정
    // querydsl-jpa와 querydsl-core 반드시 필요
    implementation (&quot;com.querydsl:querydsl-jpa:${dependencyManagement.importedProperties['querydsl.version']}:jakarta&quot;)
    implementation(&quot;com.querydsl:querydsl-core&quot;)
    // querydsl 관련한 추가적인 기능을 제공하여 주는 라이브러리로 필수는 아님
    // implementation(&quot;com.querydsl:querydsl-collections&quot;)
    annotationProcessor &quot;com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta&quot;
    annotationProcessor &quot;jakarta.annotation:jakarta.annotation-api&quot;
    annotationProcessor &quot;jakarta.persistence:jakarta.persistence-api&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;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;- implementation(&quot;com.querydsl:querydsl-core&quot;)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;queryDSL의 핵심 모듈로, queryDSL을 사용하기 위한 가장 기본적인 기능을 제공하는 역할을 합니다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;- implementation (&quot;com.querydsl:querydsl-jpa:[version]:jakarta&quot;)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;gradle에서 사용되는 문법으로 적절한 버전의 값을 자동으로 설정하여 주는 기능을 제공합니다. 해당 디펜던시는 queryDSL JPA모듈의 의존성을 추가하는 역할을 합니다. 스프링부트 3.0 이후 버전인 경우에는 jakarta를 추가해주어야 합니다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;- annotationProcessor &quot;com.querydsl:querydsl-apt:[version]:jakarta&quot;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;해당 모듈은 엔티티 클래스를 기반으로 하여 Q클래스를 생성하기 위하여 사용되는 라이브러리입니다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;- annotationProcessor &quot;jakarta.annotation:jakarta.annotation-api&quot;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;jakarta에서 사용되는 annotation들을 처리해주기 위해 추가해준 것입니다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;- annotationProcessor &quot;jakarta.persistence:jakarta.persistence-api&quot;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;ompileJava를 실시하면 java.lang.NoClassDefFoundError: jakarta/persistence/Entity 에러가 발생하는데 이를 해결하기 위해 추가하여 줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7; text-align: left;&quot;&gt;** ${dependencyManagement.importedProperties['querydsl.version']}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;: gradle에서 사용되는 groovy 문법으로 dependencyManagement를 통해 querydsl의 version 값을 가져오는 것입니다. 기본적으로 dependencyManagement에 의해 기본적으로 버전을 관리하여 주는데, 버전 뒤에 추가적으로 jakarta나 jpa 등 추가적으로 붙은 것이 있는 경우에는 위와 같이 직접 버전 정보를 가져와서 설정해주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;build.gradle에 위와 같이 설정해준 후에 compileJava를 실행하면 src/main/generated 폴더가 생성되고 그 하위에 엔티티와 관련한 Q클래스 파일이 생성되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-19 오후 11.25.45.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zdevg/btsHtQvdXRZ/JzBJnZmlJdu3tl5XquHoPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zdevg/btsHtQvdXRZ/JzBJnZmlJdu3tl5XquHoPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zdevg/btsHtQvdXRZ/JzBJnZmlJdu3tl5XquHoPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzdevg%2FbtsHtQvdXRZ%2FJzBJnZmlJdu3tl5XquHoPk%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;615&quot; height=&quot;241&quot; data-filename=&quot;스크린샷 2024-05-19 오후 11.25.45.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&lt;a href=&quot;https://velog.io/@kimsundae/Gradle-SpringBoot-3.x-QueryDSL-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@kimsundae/Gradle-SpringBoot-3.x-QueryDSL-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/248</guid>
      <comments>https://mihee0703.tistory.com/248#entry248comment</comments>
      <pubDate>Sun, 19 May 2024 23:51:13 +0900</pubDate>
    </item>
    <item>
      <title>[ Error ] - 카프카 관련 에러</title>
      <link>https://mihee0703.tistory.com/247</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;에러 메시지&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Caused&amp;nbsp;by:&amp;nbsp;java.lang.IllegalStateException:&amp;nbsp;No&amp;nbsp;group.id&amp;nbsp;found&amp;nbsp;in&amp;nbsp;consumer&amp;nbsp;config,&amp;nbsp;container&amp;nbsp;properties,&amp;nbsp;or&amp;nbsp;@KafkaListener&amp;nbsp;annotation;&amp;nbsp;a&amp;nbsp;group.id&amp;nbsp;is&amp;nbsp;required&amp;nbsp;when&amp;nbsp;group&amp;nbsp;management&amp;nbsp;is&amp;nbsp;used.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 에러는 스프링 부트에서 카프카 컨슈머 사용 시 설정해주어야 하는 내용 중 group.id를 설정해주지 않아 발생한 에러이다. 이를 해결해주기 위해서는 application.yml에 아래와 같이 group.id 관련한 내용을 추가해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-01 오후 6.57.58.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r5XkN/btsCU0ajCPB/2Vb2Xh595LBOlr9r0xYGck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r5XkN/btsCU0ajCPB/2Vb2Xh595LBOlr9r0xYGck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r5XkN/btsCU0ajCPB/2Vb2Xh595LBOlr9r0xYGck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr5XkN%2FbtsCU0ajCPB%2F2Vb2Xh595LBOlr9r0xYGck%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;756&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2024-01-01 오후 6.57.58.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>ERROR</category>
      <category>kafka 에러</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/247</guid>
      <comments>https://mihee0703.tistory.com/247#entry247comment</comments>
      <pubDate>Mon, 1 Jan 2024 18:58:14 +0900</pubDate>
    </item>
    <item>
      <title>[ Next.js ] - 폰트 적용하는 법 (next/font)</title>
      <link>https://mihee0703.tistory.com/246</link>
      <description>&lt;h2 style=&quot;text-align: left; box-shadow: 2px 3px 5px 0px #D8D8D8; madrin-left: 3px;&quot; data-ke-size=&quot;size26&quot;&gt;폰트 적용하는 법 (next/font)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;* next13 버전 기준&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nextjs에서 프로젝트에 폰트를 적용하기 위해서는 next/font를 이용하는데, next/font는 모든 폰트 파일에 대해 자동으로 자체 호스팅 기능을 내장하고 있다. 자체 호스팅 기능을 제공한다는 것은 어플리케이션에서 사용되는 폰트 파일을 서버에 업로드하고, 해당 서버에서 자체적으로 폰트를 제공한다는 것을 의미한다. 이를 통해 본래 사용자가 웹 사이트를 방문할 때마다 폰트 파일을 외부 네트워크를 통해 다운로드하여 가져와 렌더링하던 과정을 생략할 수 있게 된다, 서버에서 자체적으로 호스팅된 폰트를 이용함으로써 폰트 파일을 최적으로 로드하는 것이 가능하고, 폰트를 불러오기 위해 외부 네트워크에 요청할 필요가 사라지기 때문에, 웹사이트의 성능과 보안상의 이점을 갖게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;즉 next/font는 폰트를 서버에 자체적으로 호스팅함으로써 외부 네트워크 요청을 제거하여 더욱 나은 성능과 보안상의 이점을 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1) next/font를 통한 이점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;외부에 호출할 필요 없이 자체적으로 내장된 폰트 파일을 사용하기 때문에, 로드 시간을 줄여준다.&lt;/li&gt;
&lt;li&gt;CDN(Content Delivery Network)을 통해 클꼴을 전 세계의 서버에 분산하여 지리적으로 떨어져있는 사이트 이용자의 경우에도 폰트 파일을 불러오는데 유리하다.&lt;/li&gt;
&lt;li&gt;서버 자체에 폰트 파일을 가지고 있기 때문에 크로스 브라우징 경험을 제공할 수 있다.&lt;/li&gt;
&lt;li&gt;외부 서버에 대한 요청을 제거하기 때문에 보안 상의 이점을 제공하여 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2) 적용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;next/font에는 기본적으로 구글 폰트인 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;next/font/google&lt;/span&gt;&lt;/b&gt;과 로컬 폰트인 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;next/font/local&lt;/span&gt;&lt;/b&gt;이 존재한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;next/font/google&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.17.32.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb7Wvv/btsBMVWsuv1/xGWiqmbPVtLb8IsRlq2kW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb7Wvv/btsBMVWsuv1/xGWiqmbPVtLb8IsRlq2kW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb7Wvv/btsBMVWsuv1/xGWiqmbPVtLb8IsRlq2kW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb7Wvv%2FbtsBMVWsuv1%2FxGWiqmbPVtLb8IsRlq2kW0%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;1044&quot; height=&quot;588&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.17.32.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.22.46.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pspkB/btsBQmzoCNg/nTkT5FM0g3agjkeCrrONA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pspkB/btsBQmzoCNg/nTkT5FM0g3agjkeCrrONA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pspkB/btsBQmzoCNg/nTkT5FM0g3agjkeCrrONA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpspkB%2FbtsBQmzoCNg%2FnTkT5FM0g3agjkeCrrONA1%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;824&quot; height=&quot;422&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.22.46.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 적용할 수 있다.&amp;nbsp; * 구글 폰트 &lt;a href=&quot;https://fonts.google.com/variablefonts&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://fonts.google.com/variablefonts&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 적용할 경우 한 가지 폰트만 전역적으로 적용되게 하는데, 태그벼롤 다르게 폰트를 적용하려는 경우에는 아래와 같이 적용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.41.36.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OO9k6/btsBTZX0cWk/SOqgtWa2fW4aclFkv25U11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OO9k6/btsBTZX0cWk/SOqgtWa2fW4aclFkv25U11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OO9k6/btsBTZX0cWk/SOqgtWa2fW4aclFkv25U11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOO9k6%2FbtsBTZX0cWk%2FSOqgtWa2fW4aclFkv25U11%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;1110&quot; height=&quot;412&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.41.36.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;적용하려는 폰트의 변수를 넣어준 후, 아래와 같이 global.css 파일에서 아래와 같이 설정해주면 된다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.25.59.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvYJwo/btsBUKzhjv0/u8BC3cuLZ9COkYjwy4Bqt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvYJwo/btsBUKzhjv0/u8BC3cuLZ9COkYjwy4Bqt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvYJwo/btsBUKzhjv0/u8BC3cuLZ9COkYjwy4Bqt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvYJwo%2FbtsBUKzhjv0%2Fu8BC3cuLZ9COkYjwy4Bqt1%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;760&quot; height=&quot;236&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.25.59.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이와 같이 설정해준 경우, p태그의 경우 폰트는 Roboto 폰트가 적용되며, h1태그의 폰트의 경우에는 PublicSans의 폰트가 적용된다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/optimizing/fonts#local-fonts&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nextjs.org/docs/app/building-your-application/optimizing/fonts#local-fonts&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript/Next.js</category>
      <category>next/font</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/246</guid>
      <comments>https://mihee0703.tistory.com/246#entry246comment</comments>
      <pubDate>Wed, 13 Dec 2023 00:34:53 +0900</pubDate>
    </item>
    <item>
      <title>[ Next.js ] - error (feat. Server Components)</title>
      <link>https://mihee0703.tistory.com/243</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-29 오후 9.17.57.png&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/du2T23/btsA7M6WJfM/SYGkwY3xW24k6wmAuIa9pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/du2T23/btsA7M6WJfM/SYGkwY3xW24k6wmAuIa9pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/du2T23/btsA7M6WJfM/SYGkwY3xW24k6wmAuIa9pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdu2T23%2FbtsA7M6WJfM%2FSYGkwY3xW24k6wmAuIa9pk%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;2504&quot; height=&quot;140&quot; data-filename=&quot;스크린샷 2023-11-29 오후 9.17.57.png&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You're&amp;nbsp;importing&amp;nbsp;a&amp;nbsp;component&amp;nbsp;that&amp;nbsp;needs&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;createContext.&lt;/u&gt;&lt;/span&gt;&amp;nbsp;It&amp;nbsp;only&amp;nbsp;works&amp;nbsp;in&amp;nbsp;a&amp;nbsp;Client&amp;nbsp;Component&amp;nbsp;but&amp;nbsp;none&amp;nbsp;of&amp;nbsp;its&amp;nbsp;parents&amp;nbsp;are&amp;nbsp;marked&amp;nbsp;with&amp;nbsp;&quot;use&amp;nbsp;client&quot;,&amp;nbsp;so&amp;nbsp;they're&amp;nbsp;Server&amp;nbsp;Components&amp;nbsp;by&amp;nbsp;default.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;원인&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js의 경우 기본적으로 Server Components가 사용되는데, 이는 SSR(Server Side Rendering)즉 서버에서 렌더링 작업을 수행합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 에러는 Server Components에서 createContext와 같은 Client Components에서 사용되는 기능을 사용하려 했기 때문에 발생한 에러이다. Server Components에서 Client Components에서 사용되는 기능을 사용하기 위해서는 해당 파일의 상단에 &quot;use client&quot;를 명시해줌으로써 해당 파일이 Server Components로 취급되지 않도록 하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 위의 에러를 해결하기 위해서는 아래와 같이 파일의 상단에 &quot;use client&quot; 라고 명시해주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-29 오후 10.36.23.png&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b83PeH/btsBcalb8Hd/EUn0AKb5QjcFWXXBSUaudK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b83PeH/btsBcalb8Hd/EUn0AKb5QjcFWXXBSUaudK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b83PeH/btsBcalb8Hd/EUn0AKb5QjcFWXXBSUaudK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb83PeH%2FbtsBcalb8Hd%2FEUn0AKb5QjcFWXXBSUaudK%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;688&quot; height=&quot;192&quot; data-filename=&quot;스크린샷 2023-11-29 오후 10.36.23.png&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Server Components&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server Components의 경우 서버에서 렌더링 작업을 수행합니다. Next.js의 경우 기본적으로 Server Components를 취하여 필요에 따라 Client Component를 사용할 수 있습니다. (즉 필요에 따라 클라이언트에서 렌더링되는 UI를 구현함을 의미합니다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;* Server Components에서 createContext, useState, useEffect와 같은 훅을 사용할 수 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client Componets를 사용하기 위해서는 위에서 언급한 것과 같이 &quot;use client&quot;를 파일 상단에 명시해주면 됩니다.&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; &quot;use client&quot;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;는 Server Components와 Client Components를 구분하는데 사용됩니다. &quot;use client&quot;를 파일에 정의해준 경우, 해당 파일은 물론, 해당 파일에 속한 하위컴포넌트와, import 로 가져와서 사용한 모듈들 역시도 Client Componets 로 취급됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #333333; text-align: left;&quot;&gt;* RSC Payload(React Server Component)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #333333; text-align: left;&quot;&gt;서버에서 렌더링 작업 후 클러이언트로 전달하는 렌더링 된 서버 컴포넌트 트리의 압축된 바이너리 표현을 의미합니다. 즉 사용자의 브라우저에 사이트 화면을 출력하기 위해 서버에서 전달하는 데이터를 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;Q) 사용자가 nextjs 기반의 사이트 방문 시 렌더링 과정?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;사용자가 사이트 방문 시 해당 페이지에 대한 사용자의 요청이 서버로 전송&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;-&amp;gt; 이후 서버에서 해당 페이지에 대한 데이터를 가져와 초기 렌더링을 수행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;-&amp;gt; 서버에서 렌더링 된 HTML, CSS, 자바스크립트 번들을 클라이언트(= 웹 브라우저=사용자)로 전송&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;(서버에서 렌더링 할 때에 Server Component로 지정된 경우에 대해서만 렌더링 작업을 수행합니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;* 데이터 처리 등 백엔드 소스에 가까운 작업은 Server Components로, 사용자와의 상호작용이 필요한 부분은 Client Components로 구분함으로써 어플리케이션의 성능과 사용자 경험을 향상 시킬 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- Server Components의 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;데이터 요청과 렌더링 모두 서버에서 이루어져 완전한 페이지가 사용자에게 출력되기 까지의 시간을 단축시켜 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Server Components에서 유리한 작업&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 요청&lt;/li&gt;
&lt;li&gt;백엔스 리소스에 접근&lt;/li&gt;
&lt;li&gt;엑세스 토큰, API 키 등 민감 정보를 사용하는 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Client Components에서 유리한 작업&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;useState, useEffect 등을 통한 상태 관리가 필요한 작업&lt;/li&gt;
&lt;li&gt;브라우저에서만 사용되는 API 작업이 요구되는 경우&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;&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;server components: &lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/rendering/server-components&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nextjs.org/docs/app/building-your-application/rendering/server-components&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;client components: &lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/rendering/client-components&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nextjs.org/docs/app/building-your-application/rendering/client-components&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript/Next.js</category>
      <author>algml0703</author>
      <guid isPermaLink="true">https://mihee0703.tistory.com/243</guid>
      <comments>https://mihee0703.tistory.com/243#entry243comment</comments>
      <pubDate>Wed, 29 Nov 2023 23:29:20 +0900</pubDate>
    </item>
  </channel>
</rss>