<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jjsana 님의 블로그</title>
    <link>https://jjsana.tistory.com/</link>
    <description>jjsana 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 3 Sep 2026 07:11:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jjsana</managingEditor>
    <item>
      <title>[MySQL 오류해결] ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'</title>
      <link>https://jjsana.tistory.com/1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;[ 첫번째 방법 ] - 소켓 파일 경로 추가&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ls -l /etc/my.cnf&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5d1cfb01-a101-4200-ba89-961c098e5b2f&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l /etc/mysql/my.cnf&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d473530f-f2c7-4476-8ac0-79e8df63c074&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l /opt/homebrew/etc/my.cnf&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ce250762-fb4d-482c-9b71-44f807df35c1&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l ~/.my.cnf&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8b41aa8a-5ec7-424a-8580-a262b86793e1&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 하나씩 명령어 쳐서 파일 위치 찾기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;sudo nano /opt/homebrew/etc/my.cnf -&amp;gt; 파일 위치 찾은 후 이렇게 명령어 친 후&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6411dea3-c207-4f9f-8421-5f297e38afad&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6c3c95e4-9a77-482e-97a7-4ca1793e293d&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# Default Homebrew MySQL server config&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3957ad8e-bf75-47a3-b721-591f01cf9ed6&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[mysqld]&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-57bec659-3717-4bfd-a408-bb44346f99b6&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# Only allow connections from localhost&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0dce597f-2805-4f1d-aa6e-35ffcc095d9e&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;bind-address = 127.0.0.1&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6e88a520-5f7b-44d4-830a-0a94a613eab8&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqlx-bind-address = 127.0.0.1&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0460fbb3-9902-4a9d-b819-5cd7f8804686&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-950fedfa-2d19-459d-a8b7-dfe2f8d18938&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# 소켓 파일 경로 추가&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-edcd07bf-d3e4-4fc9-93ff-0bee4359f011&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;socket=/tmp/mysql.sock&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2e80eeec-15bf-402a-a0ca-8738ebf0ae62&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 소켓 파일 경로 추가 해준 후 control+o(저장) 그다음 엔터 control+x(나가기) 그 다음 엔터&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3ca2a07e-6a2a-4788-a80f-6c35af5c6dc0&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 한 후&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c9acf91e-d372-4fbe-853c-b9ffd5c014ec&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-591bfa55-b4f5-408c-bf82-3579a225a20f&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew services restart mysql -&amp;gt; mysql 서버 재시작&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-019e0fbf-5004-472b-ab11-415b7c4fd752&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d855b70f-36e1-49f0-9b72-5a183d8dbf32&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls /tmp/mysql.sock -&amp;gt; 파일 생성됐는지 확인! (만약 생성이 안됐다면 두번째 해결방법으로,,)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-17ec3cd5-4801-4cdc-8b6f-3d5ad7cc1e1a&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d039af46-a490-452e-b2d1-d017cf1522be&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;rm -rf /opt/homebrew/var/mysql/* -&amp;gt; Mysql 서버 초기화&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-db492c19-e95f-4916-a3a6-fa3dad706747&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-982f87c0-697c-49d8-8786-e258d0cc8541&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqld_safe --skip-grant-tables &amp;amp; -&amp;gt; 서버 시작&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-08db35fe-1dcc-4a4c-b548-6aee17db4fba&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d5189179-cda6-4e98-88e6-add17fe72a68&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ps aux | grep mysql -&amp;gt; 상태확인 mysql 떴는지 잘 뜨면&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-35413fda-acdb-4e9a-98bd-1900cb5e55e5&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5de747a9-a577-438c-bde0-21cc62b54602&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls /tmp/mysql.sock -&amp;gt; 파일 있는지 확인&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1e9d21f4-c69a-4724-8919-e3d23cdafbf8&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-58ae471c-0feb-4325-b612-195934114705&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysql -u root -&amp;gt; 들어가서 확인&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5cb2eb8f-1063-4188-86d6-c6c753f50ae3&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1ef049a0-134d-4cf0-abde-8c5a23a773bf&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;비밀번호 설정하고 싶으면&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5d96fa3c-b745-4d51-8642-974ae953340c&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew services stop mysql&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f069dca7-c0a2-4068-968f-8db095af04af&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqld_safe --skip-grant-tables &amp;amp; -&amp;gt; 서버 잠깐 내리기&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-80cef784-5960-46fd-9b92-720c3d53fecb&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-62d46440-cd58-427a-ab4f-f5b96d31329d&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysql -u root 들어간 후&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3c1fd0ef-4901-4fb3-9577-018da52d2bce&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-286a91a7-0146-4b64-af12-7cddd7ece2ab&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;FLUSH PRIVILEGES;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-37eed9ff-2cb1-4a25-8988-ec10a7a2b17c&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ALTER USER 'root'@'localhost' IDENTIFIED BY '새로운비밀번호'; -&amp;gt; 비밀번호 설정&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b53abfdf-60c9-49ed-a516-04a8d1c934ff&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fc8cb9c7-0f9a-4dc1-8640-5ff86f6c052d&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqladmin -u root -p shutdown -&amp;gt; 서버 다시 내린 후&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-af1e1bd3-f0c7-4418-a04d-76d59d112cc7&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew services start mysql -&amp;gt; 재실행&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;[ 두번째 방법 ] - 위와 대부분 동일하지만 다른점은 brew를 그냥 아에 삭제하고 재설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew 삭제.. 꼭 mysql 계속 재설치 해도 어차피 안됐어서,, 깔끔하게 brew삭제해주세요,, 삭제하기 전 뭘 설치했었는지 list 확인하시구요,,, ㅠ&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bf690273-e846-4fa7-803f-81b8c9ad5119&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cf493fd8-231b-4f9c-8a40-9cb5b47bc740&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;/bin/bash -c &quot;$(curl -fsSL &lt;a href=&quot;https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)&quot;&gt;https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)&lt;/a&gt;&quot; -&amp;gt; brew 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9658b527-42ad-444e-8406-aef371402f95&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;rm -rf Homebrew/ -&amp;gt; 폴더 완전히 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b1c6d32b-be41-4a75-b215-53874dd8ffc3&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;/bin/bash -c &quot;$(curl -fsSL &lt;a href=&quot;https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quot;&gt;https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&lt;/a&gt;&quot; -&amp;gt; 재설치&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d5631a11-61b3-44ec-a549-38888723607d&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;출처 : &lt;a href=&quot;https://wonkang.tistory.com/21&quot;&gt;https://wonkang.tistory.com/21&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c873a89e-70c2-42bc-9a52-a97f81de2af6&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-37ecfa10-27bd-4f6d-9330-7189e14e0ea4&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew install mysql -&amp;gt; mysql 설치 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b443508e-6d51-4b27-9e2b-a6265111b233&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-00981270-b4a3-484c-a0a0-9d4ee363a5a2&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7fc28ad9-895b-4c82-896a-a8f17205a704&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;명령어 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-41114bd4-e033-49eb-ad28-9410005e7806&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l /etc/my.cnf&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5d1cfb01-a101-4200-ba89-961c098e5b2f&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l /etc/mysql/my.cnf&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d473530f-f2c7-4476-8ac0-79e8df63c074&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l /opt/homebrew/etc/my.cnf&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ce250762-fb4d-482c-9b71-44f807df35c1&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l ~/.my.cnf&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8b41aa8a-5ec7-424a-8580-a262b86793e1&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 파일 위치 찾기&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-29ac8949-b32f-42da-a8a6-f1d180fd5381&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6b304a53-addc-48a7-8ff1-c33a0634dccf&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; sudo nano /opt/homebrew/etc/my.cnf -&amp;gt; 파일 위치 찾은 후 이렇게 명령어 친 후 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6411dea3-c207-4f9f-8421-5f297e38afad&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6c3c95e4-9a77-482e-97a7-4ca1793e293d&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# Default Homebrew MySQL server config&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3957ad8e-bf75-47a3-b721-591f01cf9ed6&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[mysqld]&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-57bec659-3717-4bfd-a408-bb44346f99b6&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# Only allow connections from localhost&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0dce597f-2805-4f1d-aa6e-35ffcc095d9e&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;bind-address = 127.0.0.1&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6e88a520-5f7b-44d4-830a-0a94a613eab8&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqlx-bind-address = 127.0.0.1&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0460fbb3-9902-4a9d-b819-5cd7f8804686&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-950fedfa-2d19-459d-a8b7-dfe2f8d18938&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# 소켓 파일 경로 추가&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-edcd07bf-d3e4-4fc9-93ff-0bee4359f011&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;socket=/tmp/mysql.sock&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2e80eeec-15bf-402a-a0ca-8738ebf0ae62&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 소켓 파일 경로 추가 해준 후 control+o(저장) 그다음 엔터 control+x(나가기) 그 다음 엔터&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3ca2a07e-6a2a-4788-a80f-6c35af5c6dc0&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 한 후 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c9acf91e-d372-4fbe-853c-b9ffd5c014ec&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-591bfa55-b4f5-408c-bf82-3579a225a20f&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew services restart mysql -&amp;gt; mysql 서버 재시작&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-019e0fbf-5004-472b-ab11-415b7c4fd752&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d855b70f-36e1-49f0-9b72-5a183d8dbf32&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls /tmp/mysql.sock -&amp;gt; 파일 생성됐는지 확인 ! 만약 생성이 안됐다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-20e8ba55-3b32-4f5d-87e2-ca1c7ea88d89&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f5df00b2-6e7f-4f1a-b32d-7e8118248744&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;cd /opt/homebrew/var/mysql/ -&amp;gt; 어떤파일이 있는지 확인 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ad0344b0-832d-401b-9b05-4f333ed8f804&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls -l&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-17ec3cd5-4801-4cdc-8b6f-3d5ad7cc1e1a&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-d039af46-a490-452e-b2d1-d017cf1522be&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;rm -rf /opt/homebrew/var/mysql/* -&amp;gt; Mysql 서버 초기화&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-db492c19-e95f-4916-a3a6-fa3dad706747&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-982f87c0-697c-49d8-8786-e258d0cc8541&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqld_safe --skip-grant-tables &amp;amp; -&amp;gt; 서버 시작&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-08db35fe-1dcc-4a4c-b548-6aee17db4fba&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d5189179-cda6-4e98-88e6-add17fe72a68&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ps aux | grep mysql -&amp;gt; 상태확인 mysql 떴는지 잘 뜨면&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-35413fda-acdb-4e9a-98bd-1900cb5e55e5&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5de747a9-a577-438c-bde0-21cc62b54602&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ls /tmp/mysql.sock -&amp;gt; 파일 있는지 확인&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1e9d21f4-c69a-4724-8919-e3d23cdafbf8&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-58ae471c-0feb-4325-b612-195934114705&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysql -u root -&amp;gt; 들어가서 확인&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5cb2eb8f-1063-4188-86d6-c6c753f50ae3&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1ef049a0-134d-4cf0-abde-8c5a23a773bf&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;비밀번호 설정하고 싶으면 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5d96fa3c-b745-4d51-8642-974ae953340c&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew services stop mysql&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f069dca7-c0a2-4068-968f-8db095af04af&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqld_safe --skip-grant-tables &amp;amp; -&amp;gt; 서버 잠깐 내리기&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-80cef784-5960-46fd-9b92-720c3d53fecb&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-62d46440-cd58-427a-ab4f-f5b96d31329d&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysql -u root 들어간 후 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3c1fd0ef-4901-4fb3-9577-018da52d2bce&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-286a91a7-0146-4b64-af12-7cddd7ece2ab&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;FLUSH PRIVILEGES;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-37eed9ff-2cb1-4a25-8988-ec10a7a2b17c&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ALTER USER 'root'@'localhost' IDENTIFIED BY '새로운비밀번호'; -&amp;gt; 비밀번호 설정&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b53abfdf-60c9-49ed-a516-04a8d1c934ff&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fc8cb9c7-0f9a-4dc1-8640-5ff86f6c052d&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysqladmin -u root -p shutdown -&amp;gt; 서버 다시 내린 후 &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-af1e1bd3-f0c7-4418-a04d-76d59d112cc7&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;brew services start mysql -&amp;gt; 재실행&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-74dc0f2a-7ef8-4d4b-a67a-66aa7a215073&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-473fd7e4-702a-4c89-9c6c-6aa9e9460cda&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;mysql -u root -p 이렇게 들어간 후 설정한 비밀번호 입력하면 끝&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f2bdcb19-7f9b-43d1-951c-3f6429d5fe6c&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span&gt;이 블로그로인해 이 오류로 인해 더 이상 고통받는 사람이 없길 바라며,,,&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;011&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/011.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/011.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>오류</category>
      <author>jjsana</author>
      <guid isPermaLink="true">https://jjsana.tistory.com/1</guid>
      <comments>https://jjsana.tistory.com/1#entry1comment</comments>
      <pubDate>Wed, 12 Feb 2025 21:43:43 +0900</pubDate>
    </item>
    <item>
      <title>MSA</title>
      <link>https://jjsana.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ MSA란? ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 개의 독립적인 서비스로 분리하여 개발, 배포, 유지보수를 용이하게 하는 소프트웨어 아키텍처 스타일&lt;br /&gt;- 서비스 간의 통신은 주로 HTTP/HTTPS, 에시지 큐를 통해 이루어진다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 37.2093%; height: 72px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px; text-align: center;&quot;&gt;장점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px; text-align: center;&quot;&gt;기능을 추가하거나 수정 시 다른 서비스에 &lt;br /&gt;영향 주지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px; text-align: center;&quot;&gt;트래픽 증가의 경우 독립적으로 확장 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px; text-align: center;&quot;&gt;전체 애플리케이션을 다시 배포할 필요가 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;border-collapse: collapse; width: 37.0931%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; text-align: center; height: 20px;&quot;&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 100%; text-align: center; height: 40px;&quot;&gt;여러 서비스가 상호작용해야 하므로&amp;nbsp;&lt;br /&gt;시스템 복잡성이 증가하고 관리가 어려워 질 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; text-align: center; height: 20px;&quot;&gt;배포 및 모니터링이 복잡해지고 추가 도구가 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 100%; text-align: center; height: 40px;&quot;&gt;독립적인 DB를 가질 수 있어 데이터 일관성 유지 &lt;br /&gt;어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Spring Cloud ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀을 이루어 작업할 때 서로 협력할 수 있도록 도와주는 역할이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요기능 : 서비스 등록과 발견, API 게이트웨이, 부하 분산, 구성 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 서비스 디스커버리 (Eureka) ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 디스커버리 : 여러 개의 작은 프로그램들이 서로를 쉽게 찾을 수 있도록 도와주는 시스템&lt;br /&gt;Eureka : 마이크로서비스가 서로를 쉽게 찾도록 도와주는 서비스 디스커버리 도구 어떤 서비스를 호출하고 싶을 때, Eureka 가그 서비스의 주소를 알려주고,서비스가 다운되면, 그 서비스를 목록에서 제거해줍니다.&lt;br /&gt;헬스 체크 : Eureka에 문제가 생겼을 때 이를 해결해주는 방법이다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 장애감지 : 장애시 해당 인스턴스를 레지스트리에서 제거하여 다른 서비스의 접근을 차단해준다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;알림&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &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: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt; - 수동 개입&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;b&gt;[ 클라이언트 사이드 로드 밸런싱(FeignClient와 Ribbon) ]&lt;br /&gt;&amp;lt; Feign Client &amp;gt;&lt;/b&gt; &lt;br /&gt;- Feign은 선언적 HTTP 클라이언트로, RESTful API를 호출할 때 간편하게 사용할 수 있도록 도와주고, Feign을 사용하면 인터페이스를 정의하여 이를 통해 HTTP 요청을 쉽게 보낼 수 있다.&lt;br /&gt;- Eureka와&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;경우,&amp;nbsp;서비스의&amp;nbsp;주소를&amp;nbsp;자동으로&amp;nbsp;가져와서&amp;nbsp;로드&amp;nbsp;밸런싱을&amp;nbsp;수행한다.&lt;br /&gt;- 인터페이스에&amp;nbsp;어노테이션을&amp;nbsp;추가하여&amp;nbsp;REST&amp;nbsp;API를&amp;nbsp;쉽게&amp;nbsp;호출할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739203447194&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@FeignClient(name = &quot;service-name&quot;) // 호출할 서비스의 이름
public interface MyFeignClient {
    @GetMapping(&quot;/api/resource&quot;) // API 엔드포인트
    Resource getResource();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;b&gt;&amp;lt; Ribbon &amp;gt;&lt;/b&gt;&lt;br /&gt;- Ribbon은 클라이언트 사이드 로드 밸런서를 제공하는 라이브러리로, 여러 서버 인스턴스 중에서 적절한 서버를 선택하여 요청을 보낼 수 있도록 도와준다.&amp;nbsp;&lt;br /&gt;- Eureka와&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;경우,&amp;nbsp;서비스&amp;nbsp;인스턴스를&amp;nbsp;자동으로&amp;nbsp;감지하여&amp;nbsp;로드&amp;nbsp;밸런싱을&amp;nbsp;수행한다.&lt;br /&gt;- Round&amp;nbsp;Robin,&amp;nbsp;Random,&amp;nbsp;Weighted&amp;nbsp;Response&amp;nbsp;Time&amp;nbsp;등의&amp;nbsp;다양한&amp;nbsp;알고리즘을&amp;nbsp;지원&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739203461556&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule() {
        return new RoundRobinRule(); // 로드 밸런싱 전략 설정
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;lt; FeignClient와 Ribbon을 사용하려면 &amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739203705896&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1739203715012&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableFeignClients
public class MyServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyServiceApplication.class, args);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;[ 서킷 브레이커 ]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;시스템의&amp;nbsp;안정성을&amp;nbsp;높이기&amp;nbsp;위해&amp;nbsp;사용되는&amp;nbsp;패턴으로,&amp;nbsp;서비스&amp;nbsp;간의&amp;nbsp;호출이&amp;nbsp;실패할&amp;nbsp;경우&amp;nbsp;이를&amp;nbsp;감지하고,&amp;nbsp;일정&amp;nbsp;시간&amp;nbsp;동안&amp;nbsp;요청을&amp;nbsp;차단하는&amp;nbsp;역할&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;lt; 작동 방식 &amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;닫힘 상태 (Closed):&lt;/b&gt; 모든 요청이 정상적으로 처리되고 있다. 서버 A는 서버 B에 요청을 보낸다.&lt;br /&gt;&lt;b&gt;열림 상태 (Open):&lt;/b&gt; 서버 B가 여러 번 실패하면 서킷 브레이커가 작동하여 요청을 차단한다. 이 상태에서는 서버 A가 서버 B에 요청을 보내진 않고 대신, 즉시 오류 응답을 반환한다.&lt;br /&gt;&lt;b&gt;반복&amp;nbsp;상태&amp;nbsp;(Half-Open):&lt;/b&gt; 일정 시간이 지나면 서킷 브레이커가 다시 서버 B에 요청을 보내도록 시도하고 만약 요청이 성공하면 다시 닫힘 상태로 돌아가고, 실패하면 다시 열림 상태로 전환된다&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;lt; Resilience4j 설정 &amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739241532200&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
	implementation 'org.springframework.boot:spring-boot-starter-aop'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;vsion boot3 -&amp;gt; 3.x.x / boot2 -&amp;gt; 2.x.x&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;lt;&amp;nbsp; Resilience4j Dashboard 생성 설정 &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739242286766&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
	runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1739242335800&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  application:
    name: sample

server:
  port: 19090

resilience4j:
  circuitbreaker:
    configs:
      default:  # 기본 구성 이름
        registerHealthIndicator: true  # 애플리케이션의 헬스 체크에 서킷 브레이커 상태를 추가하여 모니터링 가능
        # 서킷 브레이커가 동작할 때 사용할 슬라이딩 윈도우의 타입을 설정
        # COUNT_BASED: 마지막 N번의 호출 결과를 기반으로 상태를 결정
        # TIME_BASED: 마지막 N초 동안의 호출 결과를 기반으로 상태를 결정
        slidingWindowType: COUNT_BASED  # 슬라이딩 윈도우의 타입을 호출 수 기반(COUNT_BASED)으로 설정
        # 슬라이딩 윈도우의 크기를 설정
        # COUNT_BASED일 경우: 최근 N번의 호출을 저장
        # TIME_BASED일 경우: 최근 N초 동안의 호출을 저장
        slidingWindowSize: 5  # 슬라이딩 윈도우의 크기를 5번의 호출로 설정
        minimumNumberOfCalls: 5  # 서킷 브레이커가 동작하기 위해 필요한 최소한의 호출 수를 5로 설정
        slowCallRateThreshold: 100  # 느린 호출의 비율이 이 임계값(100%)을 초과하면 서킷 브레이커가 동작
        slowCallDurationThreshold: 60000  # 느린 호출의 기준 시간(밀리초)으로, 60초 이상 걸리면 느린 호출로 간주
        failureRateThreshold: 50  # 실패율이 이 임계값(50%)을 초과하면 서킷 브레이커가 동작
        permittedNumberOfCallsInHalfOpenState: 3  # 서킷 브레이커가 Half-open 상태에서 허용하는 최대 호출 수를 3으로 설정
        # 서킷 브레이커가 Open 상태에서 Half-open 상태로 전환되기 전에 기다리는 시간
        waitDurationInOpenState: 20s  # Open 상태에서 Half-open 상태로 전환되기 전에 대기하는 시간을 20초로 설정

management:
  endpoints:
    web:
      exposure:
        include: prometheus
  prometheus:
    metrics:
      export:
        enabled: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;lt; Fallback &amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&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;pre id=&quot;code_1739241871873&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class ProductService {

    @CircuitBreaker(name = &quot;productService&quot;, fallbackMethod = &quot;fallbackGetProductDetails&quot;) // 여기부분
    public Product getProductDetails(String productId) {
        log.info(&quot;###Fetching product details for productId: {}&quot;, productId);
        if (&quot;111&quot;.equals(productId)) {
            log.warn(&quot;###Received empty body for productId: {}&quot;, productId);
            throw new RuntimeException(&quot;Empty response body&quot;);
        }
        return new Product(
            productId,
            &quot;Sample Product&quot;
        );
    }

    public Product fallbackGetProductDetails(String productId, Throwable t) { // 실패시 여기로 호출
        log.error(&quot;####Fallback triggered for productId: {} due to: {}&quot;, productId, t.getMessage());
        return new Product(
            productId,
            &quot;Fallback Product&quot;
        );
    }
   
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ API 게이트웨이 ]&lt;br /&gt;&lt;/b&gt;여러개의 애플리케이션이 서로 통신할 수 있도록 도와주는 중간 다리 역할이고, 사용자 요청을 작절한 서비스로 전달해주는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; Spring Cloud Gateway 설정 &amp;gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739244465553&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
	  implementation 'org.springframework.boot:spring-boot-starter-actuator'
	  implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
	  implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; Zuul &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Netflix에서 개발한 API Gateway로, 마이크로서비스 아키텍처에서 클라이언트와 여러 서비스 간의 통신을 관리하는 역할&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Tip TIme&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;size16&quot;&gt;// 열려있는 port 번호 확인&lt;br /&gt;&lt;br /&gt;lsef -i :원하는포트번호 -&amp;gt; terminal&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kill -9 PID&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 보안 구성 (OAuth2 + JWT)]&lt;br /&gt;&lt;/b&gt;안전한&amp;nbsp;인증&amp;nbsp;및&amp;nbsp;권한&amp;nbsp;부여&amp;nbsp;시스템을&amp;nbsp;구축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;lt; OAuth2 &amp;gt;&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OAuth2는&amp;nbsp;인증과&amp;nbsp;권한&amp;nbsp;부여를&amp;nbsp;위한&amp;nbsp;프로토콜&lt;br /&gt;- 클라이언트, 자원 소유자, 자원 서버, 인증 서버&lt;br /&gt;- 리소스 소유자 : 자원에 대한 접근 권한을 가지고 있는 사람 . 즉 구글 계정으로 앱에 로그인할 때, 그 사용자가 리소스 소유자&lt;br /&gt;- 클라이언트 : 리소스 소유자의 정보를 사용하고자 하는 애플리케이션 즉 소셜&amp;nbsp;미디어&amp;nbsp;앱이&amp;nbsp;사용자의&amp;nbsp;친구&amp;nbsp;목록에&amp;nbsp;접근하기&amp;nbsp;위해&amp;nbsp;OAuth2를&amp;nbsp;사용하여&amp;nbsp;인증을&amp;nbsp;요청하는&amp;nbsp;경우&lt;br /&gt;- 리소스 : &amp;nbsp;보호된 자원을 호스팅하고 있는 서버 즉 사용자의&amp;nbsp;사진이나&amp;nbsp;게시글을&amp;nbsp;제공하는&amp;nbsp;서버가&amp;nbsp;여기에&amp;nbsp;해당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인증 서버 : 클라이언트의 요청을 인증하고, 리소스 소유자에게 권한을 부여하는 서버 즉 인증&amp;nbsp;서버는&amp;nbsp;사용자&amp;nbsp;정보를&amp;nbsp;확인하고,&amp;nbsp;성공적으로&amp;nbsp;인증되면&amp;nbsp;클라이언트에게&amp;nbsp;접근&amp;nbsp;토큰을&amp;nbsp;발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; JWT &amp;gt;&lt;br /&gt;&lt;/b&gt;JSON Web Token 정보를 안전하게 전송하기 위한 개방형 표준&lt;br /&gt;- 헤더, 페이로드, 서명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 컨피그 서버 ]&lt;br /&gt;&lt;/b&gt;여러 서비스가 각기 다른 설정 파일을 가질 필요 없이, 하나의 중앙 서버에서 모든 설정을 관리&lt;/p&gt;
&lt;pre id=&quot;code_1739262811835&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	  implementation 'org.springframework.boot:spring-cloud-config-server' 
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1739263220929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# application.yml

spring:
  profiles:
    active: dev  
# dev (개발): 개발 환경에서 사용되는 설정입니다. 로깅 레벨을 DEBUG로 설정하거나, 데이터베이스를 인메모리 데이터베이스로 설정하는 등의 개발에 적합한 설정
# test (테스트) : 단위 테스트 및 통합 테스트를 위한 데이터베이스 설정이나 Mock 객체를 사용하는 설정
# prod (운영) : 성능 최적화 및 보안 강화를 위한 설정이 포함되며, 데이터베이스 연결 정보, API 키 등 중요한 정보가 포함
# staging (스테이징) : 운영 전에 최종 테스트를 수행하는 스테이징 환경에서 사용되는 설정
# local (로컬) : 개인 개발 환경에 맞춘 설정
# custom (사용자 정의):  특정 기능을 테스트하거나 특정 환경에 맞춘 설정&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1739264310116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableConfigServer // 이거 추가
public class ConfigApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConfigApplication.class, args);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;</description>
      <category>지식</category>
      <author>jjsana</author>
      <guid isPermaLink="true">https://jjsana.tistory.com/8</guid>
      <comments>https://jjsana.tistory.com/8#entry8comment</comments>
      <pubDate>Tue, 11 Feb 2025 18:21:41 +0900</pubDate>
    </item>
    <item>
      <title>JPA</title>
      <link>https://jjsana.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA는 2006년에 발표됐다&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 객체-관계 매핑의 필요성 : 데이터 표현 방식과 관계형 데이터베이스의 데이터 표현 방식 간의 불일치 문제를 해결할 필요가 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비영속성 - DB랑 연결안된 상태&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739159107129&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;User user = new User(1L, &quot;jj&quot;); // User는 비영속성 상태&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;영속성 - DB랑 연결된 상태&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739159254979&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;User user - new User(1L,&quot;jj&quot;); // 비영속성 상태

em.getTransaction().begin();

em.persist(user); // user는 이제 영속 상태&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;준영속성 - 준영속 상태의 객체는 JPA의 관리 하에 있지 않으며, 데이터베이스와의 연결이 끊어진 상태&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739159982826&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;User user = new User(1L, &quot;신동훈&quot;); //user 비영속 상태
em.getTransaction().begin();
em.persist(user); //user 영속 상태가 됨

em.detach(user); // 특정 엔티티만 준영속 상태로 전환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;삭제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739159943196&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;em.remove(member)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;변경감지&lt;/b&gt; : Entity의 변경사항을 DB에 자동으로 반영하는 기능을 변경 감지라고 한다.&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;플러시&lt;/b&gt; : 영속성 컨텍스트의 변경 내용을 DB에 반영 동기화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[ JPA 질문과 질문에 대한 답변 ]&amp;nbsp;&lt;br /&gt;‼️ 스스로 질문에 대해 답을 찾은거여서 틀린 부분이 있을 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;JPA와 Hibernate의 차이점은 무엇인가요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; JPA는 ORM을 위한 표준 API이고, Hibernate는 그 표준을 구현한 구체적인 프레임워크이다. JPA를&amp;nbsp;사용하여&amp;nbsp;Hibernate를&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;포함한 다양한 ORM 프레임워크를 활용&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Hibernate에서 Session과 Transaction의 역할은 무엇인가요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; &lt;span style=&quot;text-align: left;&quot;&gt;Session : 정보를 기억하고 그 정보를 주고받는 것이다.&lt;br /&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;gt; Transaction : 여러 작업을 안전하게 묶어서 처리하는 역할 모두 성공해야만 결과가 확정이고, 실패하면 다시 처음부터&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;b&gt;JPA&lt;/b&gt;에서 Entity의 Life Cycle은 어떻게 이루어지나요?&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;gt; 비영속, 영속, 준영속 , 삭제&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;JPA에서&amp;nbsp;Persist()&amp;nbsp;메서드는&amp;nbsp;무엇을&amp;nbsp;하는&amp;nbsp;메서드인가요?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;gt; 엔티티 저장 :&amp;nbsp; JPA 전달된 엔티티 객체를 DB에 저장합니다.&amp;nbsp;&lt;br /&gt;&amp;gt; 상태 전이 : 메서드&amp;nbsp;호출&amp;nbsp;후,&amp;nbsp;엔티티는&amp;nbsp;Transient&amp;nbsp;상태에서&amp;nbsp;Persistent&amp;nbsp;상태로&amp;nbsp;전환됩니다.&amp;nbsp;즉,&amp;nbsp;JPA가&amp;nbsp;해당&amp;nbsp;엔티티를&amp;nbsp;관리하게&amp;nbsp;되며,&amp;nbsp;데이터베이스와&amp;nbsp;연결&lt;br /&gt;&amp;gt; 플러시 : persist() 메서드는 호출 시점에 즉시 데이터베이스에 저장하지 않는다 JPA는 세션의 플러시(Flush) 시점에 데이터베이스에 반영&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;b&gt;JPA에서&amp;nbsp;Flush()&amp;nbsp;메서드는&amp;nbsp;무엇을&amp;nbsp;하는&amp;nbsp;메서드인가요?&lt;/b&gt;&lt;br /&gt;&amp;gt; 영속성 컨텍스트에 있는 변경 내용을 DB에 반영하는 역할을 해준다. 즉 flush()를 호출하면, 영속성 컨텍스트에 있는 모든 변경 사항(예: 새로 추가된 엔티티, 수정된 엔티티, 삭제된 엔티티 등)이 데이터베이스에 반영된다.&lt;br /&gt;&amp;gt; 명시적으로 호출하지 않아도, 트랜잭션이 커밋될 때 자동으로 호출된다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;JPA에서 Cascade Type을 지정하지 않으면 어떻게 될까요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; 기본적으로 CascadeType.ALL이 아닌 경우, 연관된 엔티티에 대한 작업이 자동으로 전파되지 않는다. 즉, 부모 엔티티에 대한 작업(예: persist, remove 등)이 자식 엔티티에 영향을 주지 않는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; ex) 설정하지 않으면 부모 엔티티를 설정했을 때 자식에 자동으로 되는게 아닌 수동으로 우리가 직접 해야한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #666666;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;JPA에서 Entity를 캐시하는 방법은 무엇인가요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; 1차 캐시 : DB에서 조회하지않고 갖고있는 캐시를 통해 조회하는것 만약 캐시에서&amp;nbsp;엔티티를&amp;nbsp;찾고,&amp;nbsp;없으면&amp;nbsp;데이터베이스에서&amp;nbsp;조회&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; 2차 캐시 : JPA의&amp;nbsp;기본&amp;nbsp;구현체인&amp;nbsp;Hibernate와&amp;nbsp;같은&amp;nbsp;ORM&amp;nbsp;프레임워크에서&amp;nbsp;지원하며,&amp;nbsp;성능을&amp;nbsp;향상시키기&amp;nbsp;위해&amp;nbsp;사용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;2차캐시는 따로 설정을 해야한다. &lt;u&gt;meven -&amp;gt; xml에 설정 gradle -&amp;gt; yml에 설정&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1739172405846&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 2차캐시 설정하는 방법(Gradle)

spring:
  jpa:
    properties:
	  javax:
        persistence:
          sharedCache:
            mode: ENABLE_SELECTIVE
            
      hibernate:
        generate_statistics: true
          format_sql: true
          
          cache:
            use_second_level_cache: true
            region:
              factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory         
logging:
  level:
    net:
      sf:
        ehcache: debug&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;8. &lt;b&gt;JPA에서 Dirty Checking이란 무엇인가요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;gt; JPA에서&amp;nbsp;Dirty&amp;nbsp;Checking은&amp;nbsp;엔티티의&amp;nbsp;상태가&amp;nbsp;변경되었는지를&amp;nbsp;감지하고,&amp;nbsp;이를&amp;nbsp;자동으로&amp;nbsp;데이터베이스에&amp;nbsp;반영하는&amp;nbsp;메커니즘을&amp;nbsp;의미&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 장점 : 편리함, 성능 최적화, 일관성 유지&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739173063455&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();

User user = entityManager.find(User.class, userId);
user.setName(&quot;홍길동&quot;); // 엔티티 상태 변경

// 트랜잭션 커밋 시 Dirty Checking이 작동하여 변경 사항을 데이터베이스에 반영
entityManager.getTransaction().commit();
entityManager.close();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 9. &lt;b&gt;JPA에서 Proxy란 무엇인가요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA에서 Proxy는 주로 엔티티의 지연 로딩(Lazy Loading)을 구현하기 위해 사용되는 기술이다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 10. &lt;b&gt;FetchType.LAZY 와 FetchType.EAGER 차이점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 138px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.9612%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특징&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.7054%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;FetchType.LAZY&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;FetchType.EAGER&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.9612%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로딩 시점&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.7054%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필요할때&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.9612%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;성능&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.7054%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;초기 로딩 성능 최적화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;초기 로딩 시간이 길어질 수 있음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 14.9612%; text-align: center; height: 40px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메모리 사용&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.7054%; text-align: center; height: 40px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메모리 절약&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 40px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;불필요한 데이터까지 로드될 수있어 메모리 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용증가&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.9612%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;N+1 문제&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.7054%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;발생할 수 있음 (그때마다 매번 꺼내야 해서 귀찮을 수 있다.)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;발생하지 않음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.9612%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 일관성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.7054%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1739173668160&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 사용예시

@OneToMany(fetch = FetchType.LAZY) or @OneToMany(fetch = FetchType.EAGER)
private List&amp;lt;Order&amp;gt; orders;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11. &lt;b&gt;JPA에서 Named Query란 무엇인가요?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;gt; 나중에 이게 뭐지? 할 수 있으니 이름과 이게 어떤 의미를 담는 쿼리인지 적어주는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739174117907&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
@NamedQuery(name = &quot;Student.findAll&quot;, query = &quot;SELECT s FROM Student s&quot;)
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    // getters and setters
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12. &lt;b&gt;JPA에서&amp;nbsp;Transaction의&amp;nbsp;기본&amp;nbsp;동작&amp;nbsp;방식은&amp;nbsp;무엇인가요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;gt; 데이터베이스에서 여러 작업을 하나의 묶음으로 처리하는 것입니다. 트랜잭션은 데이터의 일관성과 무결성을 유지하는 데 중요한 역할ㅇ을 한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; ACID 원칙&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - Atomicity (원자성): 모든 작업이 모두 성공하거나 모두 실패해고, 중간에 문제가 생기면 모든 작업이 취소된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - Consistency&amp;nbsp;(일관성):&amp;nbsp;트랜잭션이&amp;nbsp;끝난&amp;nbsp;후&amp;nbsp;데이터가&amp;nbsp;일관된&amp;nbsp;상태여야 한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - Isolation (격리성): 한 트랜잭션이 다른 트랜잭션에 영향을 주지 않아야 한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - Durability&amp;nbsp;(지속성):&amp;nbsp;트랜잭션이&amp;nbsp;성공적으로&amp;nbsp;완료되면&amp;nbsp;그&amp;nbsp;결과는&amp;nbsp;영구적으로&amp;nbsp;데이터베이스에&amp;nbsp;저장되어야&amp;nbsp;해요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739174573755&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class UserService {

    @Transactional // 이 메서드에서 트랜잭션 관리
    public void createUser() {
        User user = new User();
        user.setName(&quot;홍길동&quot;);

        // 데이터베이스에 사용자 추가
        entityManager.persist(user);

        // 다른 작업 수행 가능
        // ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; 트랜잭션&amp;nbsp;시작,&amp;nbsp;커밋,&amp;nbsp;롤백을&amp;nbsp;자동으로&amp;nbsp;관리하여&amp;nbsp;개발자가&amp;nbsp;수동으로&amp;nbsp;처리할&amp;nbsp;필요가&amp;nbsp;없도록&amp;nbsp;도와준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;13. &lt;b&gt;JPA에서 Inheritance(상속)란 무엇인가요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;gt; 객체 지향 프로그래밍의 개념을 데이터베이스 모델링에 적용하는 방법이다.&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;&amp;nbsp; &amp;nbsp;&amp;gt;&amp;nbsp; Single Table: 모든 데이터를 하나의 테이블에 저장&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;gt;&amp;nbsp; Table Per Class: 각 클래스마다 별도의 테이블을 생성&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Joined: 부모와 자식 클래스 각각의 테이블을 생성하고 조인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>지식</category>
      <author>jjsana</author>
      <guid isPermaLink="true">https://jjsana.tistory.com/6</guid>
      <comments>https://jjsana.tistory.com/6#entry6comment</comments>
      <pubDate>Mon, 10 Feb 2025 14:53:05 +0900</pubDate>
    </item>
  </channel>
</rss>