<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>괴발개발계발</title>
    <link>https://ryuwc.tistory.com/</link>
    <description>프로그래밍을 공부하는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 07:47:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>MC류짱</managingEditor>
    <image>
      <title>괴발개발계발</title>
      <url>https://tistory1.daumcdn.net/tistory/5491840/attach/dd2d8aa5c894449b9f32ee00c4f1b4b7</url>
      <link>https://ryuwc.tistory.com</link>
    </image>
    <item>
      <title>백준 2236 칩 만들기 (파이썬)</title>
      <link>https://ryuwc.tistory.com/248</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실버문제 잘 안올리라하는데 이 문제는 푼 사람이 많이 없어서 씀&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이 및 해설&lt;/h3&gt;
&lt;pre id=&quot;code_1695364443000&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;N, K = map(int, input().split())
tmp_nums = list(map(int, input().split()))
nums = []
for _ in range(N):
    nums.append([tmp_nums[_], _, 0])

sorted_nums = sorted(nums, key=lambda x: (-x[0], -x[1]))
rst = []

for k in range(K):
    if k &amp;lt; N:  # 전원선 수가 부품 수보다 클 수 있으므로 확인
        sorted_nums[k][2] = sorted_nums[k][1] + 1
        rst.append(sorted_nums[k][1] + 1)

# 연결된 전원선 출력
for r in rst:
    print(r)

# 남은 전원선 출력
for _ in range(K - len(rst)):
    print(0)

for num in nums:
    print(num[2])&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뭔가 문제가 좀 이상했음&lt;/li&gt;
&lt;li&gt;k가 N보다 크게 나올 수 있다는 것도 이상함(이것때매 좀 해매서 짜증났음)&lt;/li&gt;
&lt;li&gt;걍 제일 큰 값에 달아주면 자기 제곱이니까 그렇게 품&lt;/li&gt;
&lt;li&gt;출력도 뭐 오름차순 내림차순 이런 말도 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/248</guid>
      <comments>https://ryuwc.tistory.com/248#entry248comment</comments>
      <pubDate>Fri, 22 Sep 2023 15:36:30 +0900</pubDate>
    </item>
    <item>
      <title>백준 2346 풍선 터뜨리기 (파이썬)</title>
      <link>https://ryuwc.tistory.com/247</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 및 해설(주석)&lt;/h3&gt;
&lt;pre id=&quot;code_1688384420145&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys


def main():
    # 입력받기
    N = int(sys.stdin.readline().strip())
    tmp_nums = list(map(int, sys.stdin.readline().strip().split()))

    # 입력받은 수들을 인덱스와 함께 쌍으로 묶어 nums 리스트 생성
    nums = [(i, tmp_nums[i]) for i in range(N)]

    target_idx = 0  # 현재 타겟 인덱스 초기화
    rst = []  # 결과값을 담을 리스트 초기화

    for i in range(N):
        idx, num = nums.pop(target_idx)  # nums에서 타겟 인덱스에 해당하는 요소를 추출
        rst.append(idx)  # 인덱스 값을 결과 리스트에 추가

        # 타겟 인덱스를 새로 계산
        if nums:  # nums가 비어있지 않은 경우만 인덱스를 계산
            if num &amp;gt; 0:
                target_idx = (target_idx + num - 1) % len(nums)
            else:
                target_idx = (target_idx + num) % len(nums)

    # 결과값 출력
    for num in rst:
        print(num + 1, end=' ')


if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/247</guid>
      <comments>https://ryuwc.tistory.com/247#entry247comment</comments>
      <pubDate>Mon, 3 Jul 2023 20:40:40 +0900</pubDate>
    </item>
    <item>
      <title>백준 14889 스타트와 링크 (파이썬)</title>
      <link>https://ryuwc.tistory.com/161</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 및 해설(주석) - v1&lt;/h3&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import sys
from itertools import combinations

N = int(sys.stdin.readline())
skills = [list(map(int, sys.stdin.readline().strip().split())) for _ in range(N)]

nst = [i for i in range(1, N+1)]

rst = 9e9
# 조합 사용해서 풀기 N은 짝수이므로 일단 두 팀이 될 수 있는 모든 조합을 생성
candi_t1_all = list(combinations(nst, N//2))

# t1의 팀이 정해지면 t2는 그 외의 나머지 선수니까 구한 조합의 반만 사용해도 됨
for i in range(len(candi_t1_all)//2):
    t1 = candi_t1_all[i]
    t2 = [i for i in range(1, N+1) if i not in t1]
    tmp = 0
    t1_score = 0
    t2_score = 0

    # t1의 모든 스킬 더해주기
    for t1_man in t1:
        for t1_ano in t1:
            t1_score += skills[t1_man-1][t1_ano-1]

    # t2의 모든 스킬 더해주기
    for t2_man in t2:
        for t2_ano in t2:
            t2_score += skills[t2_man-1][t2_ano-1]

    # 두 팀의 능력치의 차이
    tmp = abs(t1_score - t2_score)
    rst = min(rst, tmp)

print(rst)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;후기&lt;/h3&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;일단 통과는 했는데, tmp를 구하는 과정을 두 팀의 능력치 더하는걸 한번에 해버리고 tmp가 rst보다 커지면,&lt;/li&gt;
&lt;li&gt;break를 걸어주어 가지를 칠 수는 있겠지만, 통과했으니 그냥 안하겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 - v2&lt;/h3&gt;
&lt;pre id=&quot;code_1684736359489&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

def solve(n, index, N, skill, visit, a_skill, b_skill, rst):
    if n == N//2:
        a_team = 0
        b_team = 0
        for i in range(N):
            if visit[i]:
                a_team += a_skill[i]
            else:
                b_team += b_skill[i]

        return min(abs(a_team - b_team), rst)

    for i in range(index, N):
        visit[i] = True
        rst = min(solve(n+1, i+1, N, skill, visit, a_skill, b_skill, rst), rst)
        visit[i] = False

    return rst

def main():
    N = int(sys.stdin.readline().strip())
    skill = [list(map(int, sys.stdin.readline().strip().split())) for _ in range(N)]

    visit = [0] * N

    a_skill = [sum(r) for r in skill]
    b_skill = [sum(c) for c in zip(*skill)]

    print(solve(0, 0, N, skill, visit, a_skill, b_skill, 9e9))


if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>백준</category>
      <category>스타트와 링크</category>
      <category>파이썬</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/161</guid>
      <comments>https://ryuwc.tistory.com/161#entry161comment</comments>
      <pubDate>Mon, 22 May 2023 15:19:25 +0900</pubDate>
    </item>
    <item>
      <title>백준 1021 회전하는 큐 (파이썬)</title>
      <link>https://ryuwc.tistory.com/246</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;pre id=&quot;code_1684727815875&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque


def main():
    N, M = map(int, sys.stdin.readline().strip().split())
    lst = list(map(int, sys.stdin.readline().strip().split()))

    Q = deque(range(1, N+1))

    rst = 0

    for num in lst:
        lst_len = len(Q)
        num_idx = Q.index(num)
        if num_idx &amp;lt;= (lst_len//2):
            while Q[0] != num:
                Q.append(Q.popleft())
                rst += 1
            Q.popleft()
        else:
            while Q[0] != num:
                Q.appendleft(Q.pop())
                rst += 1
            Q.popleft()

    print(rst)


if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/246</guid>
      <comments>https://ryuwc.tistory.com/246#entry246comment</comments>
      <pubDate>Mon, 22 May 2023 12:58:11 +0900</pubDate>
    </item>
    <item>
      <title>백준 1063 킹 (파이썬)</title>
      <link>https://ryuwc.tistory.com/245</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;쉬운 것 부터 알고리즘 다시 시작!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684153587234&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
# sys.stdin = open('input.txt', 'r')

move_map = {
    &quot;R&quot;: [0, 1],
    &quot;L&quot;: [0, -1],
    &quot;B&quot;: [1, 0],
    &quot;T&quot;: [-1, 0],
    &quot;RT&quot;: [-1, 1],
    &quot;LT&quot;: [-1, -1],
    &quot;RB&quot;: [1, 1],
    &quot;LB&quot;: [1, -1]
}

def move_chess(piece_r, piece_c, move):
    return piece_r + move_map[move][0], piece_c + move_map[move][1]

def is_valid_position(r, c):
    return 0 &amp;lt;= r &amp;lt; 8 and 0 &amp;lt;= c &amp;lt; 8

def main():
    king, stone, N = sys.stdin.readline().split()
    N = int(N)

    king_r = 8 - int(king[1])
    king_c = ord(king[0]) - 65

    stone_r = 8 - int(stone[1])
    stone_c = ord(stone[0]) - 65

    for _ in range(N):
        move = sys.stdin.readline().strip()
        tmp_king_r, tmp_king_c = move_chess(king_r, king_c, move)
        if tmp_king_r == stone_r and tmp_king_c == stone_c:
            tmp_stone_r, tmp_stone_c = move_chess(stone_r, stone_c, move)
            if is_valid_position(tmp_stone_r, tmp_stone_c):
                stone_r = tmp_stone_r
                stone_c = tmp_stone_c
            else:
                continue

        if is_valid_position(tmp_king_r, tmp_king_c):
            king_r = tmp_king_r
            king_c = tmp_king_c

    print(f'{chr(king_c+65)}{8-king_r}')
    print(f'{chr(stone_c+65)}{8-stone_r}')

if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/245</guid>
      <comments>https://ryuwc.tistory.com/245#entry245comment</comments>
      <pubDate>Mon, 15 May 2023 21:26:57 +0900</pubDate>
    </item>
    <item>
      <title>[스프링] S3 라이브러리 endpoint 에러</title>
      <link>https://ryuwc.tistory.com/244</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;S3 이미지 업로드를 위해&lt;/p&gt;
&lt;pre id=&quot;code_1682922847747&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;org.springframework.cloud:spring-cloud-starter-aws 라이브러리를 설치해주고 서버를 돌렸더니&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Caused&amp;nbsp;by:&amp;nbsp;java.net.SocketTimeoutException:&amp;nbsp;connect&amp;nbsp;timed&amp;nbsp;out&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;com.amazonaws.SdkClientException:&amp;nbsp;Failed&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;service&amp;nbsp;endpoint:&amp;nbsp;&lt;br /&gt;at&amp;nbsp;com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100)&amp;nbsp;~[aws-java-sdk-core-1.11.792.jar:na]&lt;br /&gt;at&amp;nbsp;com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70)&amp;nbsp;~[aws-java-sdk-core-1.11.792.jar:na]&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;대충 이런 endpoint에러가 났다.&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;구글링해보니 대충 로컬에서 ec2접근하려해서 나는 에러라고 하는데 ec2에서 돌리면 문제가 안된다고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 에러 해결하려면 인텔리제이의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 - 구성편집&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGG6O1/btsdlLirMYh/hKRfQdcCqVLbLb95wKijgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGG6O1/btsdlLirMYh/hKRfQdcCqVLbLb95wKijgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGG6O1/btsdlLirMYh/hKRfQdcCqVLbLb95wKijgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGG6O1%2FbtsdlLirMYh%2FhKRfQdcCqVLbLb95wKijgk%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;1287&quot; height=&quot;850&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vm 옵션 추가 해주고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lM9Uj/btsdzhggban/oHZnHbpDOuHWVs9INJlpq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lM9Uj/btsdzhggban/oHZnHbpDOuHWVs9INJlpq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lM9Uj/btsdzhggban/oHZnHbpDOuHWVs9INJlpq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlM9Uj%2Fbtsdzhggban%2FoHZnHbpDOuHWVs9INJlpq0%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;1298&quot; height=&quot;886&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1682923137842&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-Dcom.amazonaws.sdk.disableEc2Metadata=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #3f4350; text-align: left;&quot;&gt;입력해주면 된다.&lt;br /&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: #3f4350; text-align: left;&quot;&gt;그러면 이제 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #3f4350; text-align: left;&quot;&gt;EC2&amp;nbsp;Instance&amp;nbsp;Metadata&amp;nbsp;Service&amp;nbsp;is&amp;nbsp;disabled&lt;br /&gt;at&amp;nbsp;com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource&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: #3f4350; text-align: left;&quot;&gt;이런 에러 메세지가 뜨는데 기능상 문제 없고 꼴보기 싫으니 여기에 대한 에러메세지만 안뜨게 해주자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #3f4350; text-align: left;&quot;&gt;application.yml파일에&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682923289777&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;logging.level:
  org.hibernate.SQL: debug
#  org.hibernate.type: trace
  com:
    amazonaws:
      util:
        EC2MetadataUtils: error&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 된다.&lt;/p&gt;</description>
      <category>스프링</category>
      <category>EC2</category>
      <category>EndPoint</category>
      <category>s3</category>
      <category>스프링</category>
      <category>에러</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/244</guid>
      <comments>https://ryuwc.tistory.com/244#entry244comment</comments>
      <pubDate>Mon, 1 May 2023 15:39:18 +0900</pubDate>
    </item>
    <item>
      <title>[스프링] MySQL 8.0 Public Key Retrieval is not allowed 에러</title>
      <link>https://ryuwc.tistory.com/243</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;에러&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 계속 MySQL연동이 잘되다가 갑자기 &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: #343541; text-align: start;&quot;&gt;java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) ~[mysql-connector-j-8.0.33.jar:8.0.33]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #343541; text-align: start;&quot;&gt;이런 에러 발생&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #343541; text-align: start;&quot;&gt;&lt;br /&gt;해결&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;background-color: #171615; color: #efeeed;&quot;&gt;&lt;span style=&quot;color: #9380ff;&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #b4da82;&quot;&gt;: &lt;/span&gt;jdbc:mysql://localhost:3306/{스키마이름}?serverTimezone=Asia/Seoul&amp;amp;useSSL=false&amp;amp;tinyInt1isBit=false&amp;amp;allowPublicKeyRetrieval=true&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzi09T/btsddUzY60t/i8DaUWX6DCbct0t0FYVuL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzi09T/btsddUzY60t/i8DaUWX6DCbct0t0FYVuL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzi09T/btsddUzY60t/i8DaUWX6DCbct0t0FYVuL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdzi09T%2FbtsddUzY60t%2Fi8DaUWX6DCbct0t0FYVuL1%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;804&quot; height=&quot;686&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>스프링</category>
      <category>MySQL</category>
      <category>스프링</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/243</guid>
      <comments>https://ryuwc.tistory.com/243#entry243comment</comments>
      <pubDate>Sat, 29 Apr 2023 16:41:17 +0900</pubDate>
    </item>
    <item>
      <title>[스프링 부트] redis 초간단 사용법</title>
      <link>https://ryuwc.tistory.com/242</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;레디스 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/microsoftarchive/redis/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/microsoftarchive/redis/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682333151181&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; microsoftarchive/redis&quot; data-og-description=&quot;Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/microsoftarchive/redis/releases&quot; data-og-url=&quot;https://github.com/microsoftarchive/redis/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h5YXk/hySoumAgQf/L7nBKBOsmVG42psFFsIl41/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/microsoftarchive/redis/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/microsoftarchive/redis/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h5YXk/hySoumAgQf/L7nBKBOsmVG42psFFsIl41/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Releases &amp;middot; microsoftarchive/redis&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저는 3.2.100버전 설치했습니다.&lt;/li&gt;
&lt;li&gt;대충 next누르면 설치됨.&lt;/li&gt;
&lt;li&gt;설치 경로로 가서 redis-cli 실행하면&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpZ7Zj/btscjj9ccC9/zsDrPXwN2mMQ2MFJdWOIfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpZ7Zj/btscjj9ccC9/zsDrPXwN2mMQ2MFJdWOIfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpZ7Zj/btscjj9ccC9/zsDrPXwN2mMQ2MFJdWOIfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpZ7Zj%2Fbtscjj9ccC9%2FzsDrPXwN2mMQ2MFJdWOIfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;761&quot; height=&quot;411&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8LV3c/btscmLj6RCV/N2Xvk5gJrROxZy6bzkfmaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8LV3c/btscmLj6RCV/N2Xvk5gJrROxZy6bzkfmaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8LV3c/btscmLj6RCV/N2Xvk5gJrROxZy6bzkfmaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8LV3c%2FbtscmLj6RCV%2FN2Xvk5gJrROxZy6bzkfmaK%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;958&quot; height=&quot;498&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ping 입력하면 PONG으로 반응해줌 레디스가 돌아가고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;의존성 넣어주기&lt;/h3&gt;
&lt;pre id=&quot;code_1682333078454&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//    레디스
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'&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;application.yml&lt;/p&gt;
&lt;pre id=&quot;code_1682333358415&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  spring:
      redis:
        lettuce:
          pool:
            max-active: 10
            max-idle: 10
            min-idle: 2
        port: 6379
        host: 127.0.0.1
        password:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RedisConfig&lt;/h3&gt;
&lt;pre id=&quot;code_1682333389716&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package jpabook.jpashop.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Value(&quot;${spring.redis.host}&quot;)
    private String redisHost;

    @Value(&quot;${spring.redis.port}&quot;)
    private String redisPort;

    @Value(&quot;${spring.redis.password}&quot;)
    private String redisPassword;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisHost);
        redisStandaloneConfiguration.setPort(Integer.parseInt(redisPort));
        redisStandaloneConfiguration.setPassword(redisPassword);
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        return lettuceConnectionFactory;
    }

    @Bean
    public RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate() {
        RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate = new RedisTemplate&amp;lt;&amp;gt;();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레디스 연결 설정해주고&lt;/li&gt;
&lt;li&gt;앞으로 사용은 &lt;b&gt;RedisTemplate&lt;/b&gt;으로 할거임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RedisController&lt;/h3&gt;
&lt;pre id=&quot;code_1682333506422&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package jpabook.jpashop.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class RedisController {

    @Autowired
    private RedisTemplate&amp;lt;String, String&amp;gt; redisTemplate;

    @PostMapping(&quot;/redis&quot;)
    public ResponseEntity&amp;lt;?&amp;gt; addRedisKey() {
        ValueOperations&amp;lt;String, String&amp;gt; vop = redisTemplate.opsForValue();
        // 키: a, 값: apple
        vop.set(&quot;a&quot;, &quot;apple&quot;);

        // 키: b, 해쉬 키: banana, 값: 바나나, 해쉬 키: orange, 값: 오렌지
        vop.set(&quot;b&quot;, &quot;banana&quot;);
        vop.set(&quot;b:banana&quot;, &quot;바나나&quot;);
        vop.set(&quot;b:orange&quot;, &quot;오렌지&quot;);

        return new ResponseEntity&amp;lt;&amp;gt;(HttpStatus.CREATED);
    }

    @GetMapping(&quot;/redis&quot;)
    public ResponseEntity&amp;lt;?&amp;gt; getRedisKey() {
        ValueOperations&amp;lt;String, String&amp;gt; vop = redisTemplate.opsForValue();

        // 키: a, 값: apple
        String value = vop.get(&quot;a&quot;);

        // 키: b, 해쉬 키: banana, 값: 바나나, 해쉬 키: orange, 값: 오렌지
        String value2 = vop.get(&quot;b&quot;);
        String value3 = vop.get(&quot;b:banana&quot;);
        String value4 = vop.get(&quot;b:orange&quot;);

        List&amp;lt;String&amp;gt; list = List.of(value, value2, value3, value4);
        return new ResponseEntity&amp;lt;&amp;gt;(list, HttpStatus.OK);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 예시대로 a: apple도 되고,&lt;/li&gt;
&lt;li&gt;해시 자료구조를 사용해서 a: {bababa: 바나나, orange: 오렌지}도 가능함&lt;/li&gt;
&lt;li&gt;/redis로 POST요청 보내면 레디스에 저장되고&lt;/li&gt;
&lt;li&gt;GET요청은 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ChwaD/btscvZ9SOs1/M70k7uFVM04P5m3pZiKvo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ChwaD/btscvZ9SOs1/M70k7uFVM04P5m3pZiKvo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ChwaD/btscvZ9SOs1/M70k7uFVM04P5m3pZiKvo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FChwaD%2FbtscvZ9SOs1%2FM70k7uFVM04P5m3pZiKvo1%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;966&quot; height=&quot;502&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sik3N/btscwK5zO5H/7D28ttGM5cKLOaCHiiwiuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sik3N/btscwK5zO5H/7D28ttGM5cKLOaCHiiwiuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sik3N/btscwK5zO5H/7D28ttGM5cKLOaCHiiwiuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSik3N%2FbtscwK5zO5H%2F7D28ttGM5cKLOaCHiiwiuk%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;980&quot; height=&quot;583&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>스프링</category>
      <category>redis</category>
      <category>레디스</category>
      <category>스프링</category>
      <category>스프링 부트</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/242</guid>
      <comments>https://ryuwc.tistory.com/242#entry242comment</comments>
      <pubDate>Mon, 24 Apr 2023 20:02:06 +0900</pubDate>
    </item>
    <item>
      <title>[자바 orm 표준 jpa 프로그래밍] 코드 정리 - 3</title>
      <link>https://ryuwc.tistory.com/241</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;단방향 연관관계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MEMBER와 TEAM 테이블이 있음&lt;/li&gt;
&lt;li&gt;이때 관계는 1(팀):N(멤버) 임&lt;/li&gt;
&lt;li&gt;JPA를 이용해 테이블을 만들고 관계를 맺어줄 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681359692548&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Member
@Entity
public class Member {

    @Id
    @GeneratedValue
    @Column(name = &quot;MEMBER_ID&quot;)
    private Long id;

    @Column(name = &quot;USERNAME&quot;)
    private String username;

//    @Column(name = &quot;TEAM_ID&quot;)
//    private Long teamId;

    @ManyToOne
    @JoinColumn(name = &quot;TEAM_ID&quot;)
    private Team team;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 같이 멤버의 외래키에 @ManyToOne과 @JoinColumn 어노테이션을 사용해&lt;/li&gt;
&lt;li&gt;외래키를 지정해줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681359713425&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Team {

    @Id
    @GeneratedValue
    @Column(name = &quot;TEAM_ID&quot;)
    private Long id;
    private String name;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681359793129&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Team team = new Team();
team.setName(&quot;TeamA&quot;);
em.persist(team);

Member member = new Member();
member.setUsername(&quot;member1&quot;);
member.setTeam(team);
em.persist(member);

Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();

System.out.println(&quot;findTeam = &quot; + findTeam.getName());&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이렇게 지정해주면 위와 같이 setTeam에 그냥 team을 넣으면 TEAM_ID로 조인시켜서 저장하고 찾아준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;양방향 연관관계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 같이 되면 Member와 Team객체는 서로 알 방법이 객체지향스럽지 못하다.&lt;/li&gt;
&lt;li&gt;Member에서는 Team이란 필드가 있으니 쉽게 알 수 있지만, Team에서는 Member를 조회하려면&lt;/li&gt;
&lt;li&gt;객체지향스럽지 못하게 조회할 수 밖에 없다.&lt;/li&gt;
&lt;li&gt;테이블에서는 외래키를 이용해 양쪽에서 조인을 사용해 알 수 있다&lt;/li&gt;
&lt;li&gt;이를 해결하기 위해 아래와 같이 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1681366129862&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Team {

    @Id
    @GeneratedValue
    @Column(name = &quot;TEAM_ID&quot;)
    private Long id;
    private String name;

    @OneToMany(mappedBy = &quot;team&quot;)
    private List&amp;lt;Member&amp;gt; members = new ArrayList&amp;lt;&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 같이 팀에서 멤버를 조회할 수 있도록 리스트로 members라는 변수를 만들고&lt;/li&gt;
&lt;li&gt;@OneToMany(mappedBy = &quot;team&quot;)으로 어노테이션을 달아준다.&lt;/li&gt;
&lt;li&gt;이러면 아래와 같이 사용하여 조회할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1681366226958&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Member findMember = em.find(Member.class, member.getId());
List&amp;lt;Member&amp;gt; members = findMember.getTeam().getMembers();

for (Member member1 : members) {
    System.out.println(&quot;member1 = &quot; + member1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연관관계의 주인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 때, 누가 주인 역할을 하냐. 즉, Team과 Member 둘 다 서로의 값을 참조하고 있다.&lt;/li&gt;
&lt;li&gt;이 때 어떤 멤버가 다른 팀을 간다면, 어느 쪽을 수정해야 하나. 둘 다 수정해야 맞다.&lt;/li&gt;
&lt;li&gt;이 때 중요한게 연관관계의 주인이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주인은 N(외래키를 가지고있는 놈)으로 한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/241</guid>
      <comments>https://ryuwc.tistory.com/241#entry241comment</comments>
      <pubDate>Thu, 13 Apr 2023 17:44:36 +0900</pubDate>
    </item>
    <item>
      <title>[자바 orm 표준 jpa 프로그래밍] 코드 정리 - 2</title>
      <link>https://ryuwc.tistory.com/240</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;매핑 어노테이션&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zqbpE/btr9DIxrFyi/ntFeeu0Lo8Z3Foi4TQTzS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zqbpE/btr9DIxrFyi/ntFeeu0Lo8Z3Foi4TQTzS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zqbpE/btr9DIxrFyi/ntFeeu0Lo8Z3Foi4TQTzS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzqbpE%2Fbtr9DIxrFyi%2FntFeeu0Lo8Z3Foi4TQTzS0%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;657&quot; height=&quot;468&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1681300695710&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @Id
    private Long id;
    @Column(name = &quot;name&quot;)
    private String username;
    private Integer age;
    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob
    private String description;&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;@Column&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br3SBw/btr9SNXpQdt/QG6MMEmFQgXM6VJRJONppk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br3SBw/btr9SNXpQdt/QG6MMEmFQgXM6VJRJONppk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br3SBw/btr9SNXpQdt/QG6MMEmFQgXM6VJRJONppk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr3SBw%2Fbtr9SNXpQdt%2FQG6MMEmFQgXM6VJRJONppk%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;657&quot; height=&quot;487&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>스프링</category>
      <category>JPA</category>
      <category>스프링</category>
      <author>MC류짱</author>
      <guid isPermaLink="true">https://ryuwc.tistory.com/240</guid>
      <comments>https://ryuwc.tistory.com/240#entry240comment</comments>
      <pubDate>Wed, 12 Apr 2023 22:13:00 +0900</pubDate>
    </item>
  </channel>
</rss>