<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dyd1310</title>
    <link>https://dyd1310.tistory.com/</link>
    <description>it기술 블로그</description>
    <language>ko</language>
    <pubDate>Thu, 20 Aug 2026 14:44:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dyd1310</managingEditor>
    <image>
      <title>dyd1310</title>
      <url>https://tistory1.daumcdn.net/tistory/6650393/attach/b95e0d15b6b2400190f91bdb114bd997</url>
      <link>https://dyd1310.tistory.com</link>
    </image>
    <item>
      <title>BOJ14890-경사로-알고리즘 복습 3일차</title>
      <link>https://dyd1310.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14890&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/14890&lt;/a&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;board에 각 라인별로 경사로를 놓을수있는지 없는지 판별하는 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경사로의 높이는 1이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 라인별로 연속되는 숫자끼리 묶고 경사로의 크기대로 묶은 숫자들을 분할 시킨 후 규칙에 따라 덩어리를 제거하는 방식을 생각했다.&lt;/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;1. 테스트케이스에 맞춰 틀리는 케이스만 고치는 식으로 수정하다보니 정답처리받는데 많은 시간이 걸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 경사로의 길이가 1인 경우를 생각하지 못했다. 이미 경사로를 세운 땅의 연속된 길이를 1로 바꾸는 코드가 있었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복으로 경사로가 세우지는 문제가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 조건문을 너무 복잡하게 만들었었다. 각 단계에서 한덩어리씩 지워나가면 됐는데 어떤경우는 두덩어리를 지우고 하니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건식이 너무 복잡해졌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이 코드&lt;/p&gt;
&lt;pre id=&quot;code_1728873785310&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
아이디어
1. n*n개의 보드판에서 2n번 시행하면 됌.
2. 1행의 경사로를 판별한다면 1행에서 덩어리를 묶고 덩어리를 쪼개고 병합해나가는 과정 필요.
예시) L이 2이고 22223222222223 라는 길이 있다면
1단계(덩어리화). 2222 3 22222222 3
2단계(쪼개기). 22 22 3 2222 2222 3
3단계(쪼개기). 22 22 3 22 22 22 22 3
4단계(병합)
오른쪽에 같은 크기의 덩어리가 있다면 그 해당 차의 덩어리를 버림
다음것이 1 크다면 다음것만 남김.(리스트의 크기가 2라면 둘다 없앰)
다음것이 1 작으면 다음 덩어리의 크기를 봄. 그후 둘다없앰
22 22 3 22 22 22 22 3
22 3 22 22 22 22 3
3 22 22 22 22 3
22 22 22 3
22 22 3
22 3
'''

from collections import deque

N,L = map(int,input().split())
board = [list(map(int,input().split())) for _ in range(N)]


def countRight(start):
    chunk = deque()
    chunk.append((board[start][0],1))
    for i in range(1, N):
        c = chunk.pop()
        if c[0] == board[start][i]:
            chunk.append((c[0],c[1]+1))
        else:
            chunk.append(c)
            chunk.append((board[start][i],1))
    return chunk

def countDown(start):
    chunk = deque()
    chunk.append((board[0][start],1))
    for i in range(1, N):
        c = chunk.pop()
        if c[0] == board[i][start]:
            chunk.append((c[0],c[1]+1))
        else:
            chunk.append(c)
            chunk.append((board[i][start],1))
    return chunk


def divide(L,chunk):
    newChunk = []
    while chunk:
        c = chunk.popleft()
        divideResult = c[1]//L
        if divideResult &amp;gt;= 1:
            for _ in range(c[1]//L):
                newChunk.append((c[0],L))
        else:
            newChunk.append((c[0],1))
    return newChunk

def union(L,chunk):
    if len(chunk) == 1:
        return True
    count = len(chunk)-1
    while True:
        if count &amp;lt;= 0:
            if len(chunk) == 1:
                return True
        if chunk[0][0]+1 == chunk[1][0]:
            if chunk[0][1] == L:
                    chunk.pop(0)
                    count-=1
            else:
                return False
        elif chunk[0][0] == chunk[1][0]+1:
            if chunk[1][1] == L:
                    chunk.pop(0)
                    newChunk = chunk.pop(0)
                    chunk.insert(0,(newChunk[0],0))
                    count-=1
            else:
                return False
        elif chunk[0][0] == chunk[1][0]:
                chunk.pop(0)
                count-=1
        else:
            return False

def simulation():
    result = 0
    for i in range(N):
        if union(L,divide(L,countRight(i))):
            result += 1
        if union(L,divide(L,countDown(i))):
            result += 1
    print(result)

simulation()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 난이도에 비해 많은 시간을 할애한것같아 접근법이 잘못됐다고 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 다푼후 다른 사람의 풀이를 찾아봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1728874561680&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;백준 14890 경사로 삼성 SW역량테스트 (Python)&quot; data-og-description=&quot;백준 14890 경사로 문제 바로가기입력으로는 지도의 크기, 경사로의 길이, 높이가 들어가고 출력으로는 지나갈 수 있는 길의 개수가 되어야 한다.예시경사로는 낮은 칸에 놓으며, L개의 연속된 칸&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@seungjae/%EB%B0%B1%EC%A4%80-14890-%EA%B2%BD%EC%82%AC%EB%A1%9C-%EC%82%BC%EC%84%B1-SW%EC%97%AD%EB%9F%89%ED%85%8C%EC%8A%A4%ED%8A%B8-Python&quot; data-og-url=&quot;https://velog.io/@seungjae/백준-14890-경사로-삼성-SW역량테스트-Python&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dNs87J/hyXhON6mCF/0zlhNkUIeM6ixk096t4yVK/img.png?width=1463&amp;amp;height=538&amp;amp;face=0_0_1463_538,https://scrap.kakaocdn.net/dn/kreJS/hyXhN9t9JZ/kwiPUfThEvhMGnoKakfnU0/img.png?width=1463&amp;amp;height=538&amp;amp;face=0_0_1463_538,https://scrap.kakaocdn.net/dn/cJXP2l/hyXhQrCqrD/KPkotLclimaVYTfu3mezYK/img.jpg?width=1188&amp;amp;height=1080&amp;amp;face=0_0_1188_1080&quot;&gt;&lt;a href=&quot;https://velog.io/@seungjae/%EB%B0%B1%EC%A4%80-14890-%EA%B2%BD%EC%82%AC%EB%A1%9C-%EC%82%BC%EC%84%B1-SW%EC%97%AD%EB%9F%89%ED%85%8C%EC%8A%A4%ED%8A%B8-Python&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@seungjae/%EB%B0%B1%EC%A4%80-14890-%EA%B2%BD%EC%82%AC%EB%A1%9C-%EC%82%BC%EC%84%B1-SW%EC%97%AD%EB%9F%89%ED%85%8C%EC%8A%A4%ED%8A%B8-Python&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dNs87J/hyXhON6mCF/0zlhNkUIeM6ixk096t4yVK/img.png?width=1463&amp;amp;height=538&amp;amp;face=0_0_1463_538,https://scrap.kakaocdn.net/dn/kreJS/hyXhN9t9JZ/kwiPUfThEvhMGnoKakfnU0/img.png?width=1463&amp;amp;height=538&amp;amp;face=0_0_1463_538,https://scrap.kakaocdn.net/dn/cJXP2l/hyXhQrCqrD/KPkotLclimaVYTfu3mezYK/img.jpg?width=1188&amp;amp;height=1080&amp;amp;face=0_0_1188_1080');&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;백준 14890 경사로 삼성 SW역량테스트 (Python)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;백준 14890 경사로 문제 바로가기입력으로는 지도의 크기, 경사로의 길이, 높이가 들어가고 출력으로는 지나갈 수 있는 길의 개수가 되어야 한다.예시경사로는 낮은 칸에 놓으며, L개의 연속된 칸&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 블로그 글의 접근법이 가장 마음에 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 연속되는 수를 덩어리 지어 풀려고 했는데 이 글의 경우 각 라인에 따라 경사로를 체크하는 리스트를 만들었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라인의 왼쪽부터 직접 경사로가 필요하면 경사로를 추가하고 겹치거나 만들지못하면 예외처리하는 방식으로 코드를 작성했다.&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;</description>
      <category>알고리즘(python)</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/110</guid>
      <comments>https://dyd1310.tistory.com/110#entry110comment</comments>
      <pubDate>Mon, 14 Oct 2024 12:00:40 +0900</pubDate>
    </item>
    <item>
      <title>BOJ 12100 - 2048 - 알고리즘 복습 2일차</title>
      <link>https://dyd1310.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/12100&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/12100&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판을 상하좌우로 움직일때 숫자가 합쳐지는데 최대 5번 움직였을때 합쳐진 숫자의 최대값을 구하는 문제이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제를 풀기전 했던 생각&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽으로 기울였을때 숫자를 합치기 위해 배열의 오른쪽부터 합쳐야하는지 왼쪽부터 합쳐야하는지 따져보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽부터 합치는경우 나중에 결과가 달라지니 왼쪽부터 합쳐야할거같은데 여러 경우를 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 왼쪽숫자를 두고 오른쪽으로 이동하며 같은 수를 찾는 방식을 가장 먼저생각했는데 그러면 나중에 수를 배치할때의 방법이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안떠올라 옳은 접근방식이 아니란걸 알았다. 여러 방법들을 생각하다 큐에 넣고 연산을 한 후 배열에 다시 넣는 방법이 이상적임을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깨달았다.&lt;/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;h3 data-ke-size=&quot;size23&quot;&gt;겪은 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 한번 움직였을때 각 숫자는 1번만 합쳐질수있는데 이부분 고려하지 못해 틀렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 아래 코드에서 m은 깊은 복사를 잘했는데 마지막줄 board는 옅은복사로 m을 복사해 각 시행이 이루어질때마다 보드판이 초기화되지않았다.&lt;/p&gt;
&lt;pre id=&quot;code_1728812363892&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def simulate(level):
    global result
    global board
    if level == 5:
        maxValue = findMax(board)
        if maxValue &amp;gt; result:
            result = maxValue
        return

    m = [ b[:] for b in board]
    for d in direction:
        move(d,board)
        simulate(level+1)
        board = [ mm[:] for mm in m]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 아래의 코드에서 처음에 return max(list(max(m for m in M))) 을 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M&amp;nbsp;=&amp;nbsp;[[4,8,2,1,2],&amp;nbsp;[6,6,2,1,2],&amp;nbsp;[5,7,2,1,2]]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 있을때 첫번째 인덱스가 가장 큰 6이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return max(list(max(m) for m in M)) 이렇게 하거나 아래의 코드를 적어야 8이 나옴을 깨달았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하는데 가장 많은 시간을 할애했는데 리스트 컨프리핸션을 잘못쓰는것의 위험성을 깨달을수있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1728812455385&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def findMax(M):
    return max(map(max,M))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-10-13 at 6.51.22 PM.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wijXU/btsJ3akWyJU/9mcDQlioOo6SE94pC82p30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wijXU/btsJ3akWyJU/9mcDQlioOo6SE94pC82p30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wijXU/btsJ3akWyJU/9mcDQlioOo6SE94pC82p30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwijXU%2FbtsJ3akWyJU%2F9mcDQlioOo6SE94pC82p30%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;1448&quot; height=&quot;124&quot; data-filename=&quot;Screenshot 2024-10-13 at 6.51.22 PM.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1728811693234&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;&quot;&quot; 아이디어
1. 합치기
왼쪽으로 기울이는것을 생각하면 맨 왼쪽자리부터 합쳐진다.
왼쪽으로 기울일때 1행이 2 2 0 2 라고 가정하자.
이때 숫자들만 다 뽑는다.
2 2 2
그 후 1번째 자리와 2번째 자리가 일치하면 합친다.
합쳐지는 경우에는 그 다음 시행에도 1번째 자리와 2번째 자리가 일치하는지 확인한다.
2 4 4 같이 합쳐지지 않는 경우에는 인덱스를 한칸 옮겨 2번째 자리와 3번째 자리를
합친다.
숫자가 3개인 경우 2회 시행하면 모든 숫자가 합치는 과정을 겪으니 큐의 길이 - 1 번 시행한다.
시행이 끝난후 수의 개수 만큼 인덱스별로 배치한다.

2. 최대값 확인하기
4방향으로 5번 시행한다.
가지치기를 할 수 있는가?
한번 기울일때마다 최대 1번 합쳐질 수 있으니
5-N 번째 시행의 보드판의 최대값에 2^n 만큼 최대 값을 가질 수 있다.
하지만 매 시행마다 최대값을 확인하여 없어지는 경우의 수가 많지 않을거같고 최대값을
확인하는 비용이 꽤 커 그냥 모두 시행하는 방향을 목표로한다.
보드판 형태를 기억하는 방법도 이와 비슷해 모두 시행해보며 최대값을 기록하는 것이 중요할것같다.
&quot;&quot;&quot;

n = int(input())

board = [list(map(int,input().split(&quot; &quot;))) for _ in range(n)]

direction = ['U','D','L','R']

u = []

def export(r,direction,M):
    global u
    if direction == 'L':
        for i in range(n):
            if M[r][i] != 0:
                u.append(M[r][i])
                M[r][i] = 0
    elif direction == 'R':
        for i in range(n-1,-1,-1):
            if M[r][i] != 0:
                u.append(M[r][i])
                M[r][i] = 0
    elif direction == 'U':
        for i in range(n):
            if M[i][r] != 0:
                u.append(M[i][r])
                M[i][r] = 0
    elif direction == 'D':
        for i in range(n-1,-1,-1):
            if M[i][r] != 0:
                u.append(M[i][r])
                M[i][r] = 0

def union():
    if len(u) &amp;lt; 2:
        return
    s_index = 0
    e_index = 1
    count = len(u)-1
    while True:
        if count &amp;lt;= 0:
            break
        if u[s_index] == u[e_index]:
            u.pop(s_index)
            u[s_index] = u[s_index]*2
            count += -1
        s_index += 1
        e_index += 1
        count += -1

def send(r,direction,M):
    global u
    if direction == 'L':
        l = len(u)
        for i in range(l):
            v = u.pop(0)
            M[r][i] = v
    elif direction == 'R':
        l = len(u)
        for i in range(l):
            v = u.pop(0)
            M[r][-(i+1)] = v
    elif direction == 'U':
        l = len(u)
        for i in range(l):
            v = u.pop(0)
            M[i][r] = v
    elif direction == 'D':
        l = len(u)
        for i in range(l):
            v = u.pop(0)
            M[-(i+1)][r] = v

def move(direction, M):
    for i in range(n):
        export(i,direction,M)
        union()
        send(i,direction,M)

def findMax(M):
    return max(map(max,M))

result = 0
def simulate(level):
    global result
    global board
    if level == 5:
        maxValue = findMax(board)
        if maxValue &amp;gt; result:
            result = maxValue
        return

    m = [ b[:] for b in board]
    for d in direction:
        move(d,board)
        simulate(level+1)
        board = [ mm[:] for mm in m]

simulate(0)
print(result)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꽤나 빠르게 이쁜코드로 푼거같아 기분이 좋았다.&lt;/p&gt;</description>
      <category>알고리즘(python)</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/109</guid>
      <comments>https://dyd1310.tistory.com/109#entry109comment</comments>
      <pubDate>Sun, 13 Oct 2024 18:52:52 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘 탐색알고리즘 감잡기</title>
      <link>https://dyd1310.tistory.com/108</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;p data-ke-size=&quot;size16&quot;&gt;탐색알고리즘의 근본&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 대표적으로 브루트포스 , 백트래킹, bfs, dfs 가 있다.&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;1차원 배열로 결과들을 기록해나갈수있고(nQ, 배낭문제), 각 단계가 2차원 배열일수도 있다(2048, 구슬 탈출2).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이중 구슬 탈출2의 경우는 각 단계가 2차원 배열로 그려지지만 실제로 중요한것은 공의 위치이므로 공의 위치만을 저장하여 풀수도있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bfs는 최단경로, 최소 횟수에 유용하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백트래킹은 특정 조합을 찾는 경우, 특정 조합의 개수를 찾는경우에 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dfs는 거의 쓸일이 없고 있어도 bfs로 풀수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백트래킹&lt;/p&gt;
&lt;figure id=&quot;og_1728799231892&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Python] 백트래킹 (+ DFS와 차이)&quot; data-og-description=&quot;백트래킹이란?백트래킹이란 현재 상태에서 가능한 모든 경로를 따라 들어가 탐색하다, 원하는 값과 불일치하는 부분이 발생하면 더 이상 탐색을 진행하지 않고 전 단계로 돌아가는, 즉 이름 그&quot; data-og-host=&quot;veggie-garden.tistory.com&quot; data-og-source-url=&quot;https://veggie-garden.tistory.com/24&quot; data-og-url=&quot;https://veggie-garden.tistory.com/24&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/U1AiK/hyXeeAJv40/po5gu0DyhL39wctQag5ViK/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/fZ8b0/hyXhPMO7VI/KMS25aX9DjBVYWWVlEKP3K/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320&quot;&gt;&lt;a href=&quot;https://veggie-garden.tistory.com/24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://veggie-garden.tistory.com/24&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/U1AiK/hyXeeAJv40/po5gu0DyhL39wctQag5ViK/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/fZ8b0/hyXhPMO7VI/KMS25aX9DjBVYWWVlEKP3K/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320');&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;[Python] 백트래킹 (+ DFS와 차이)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;백트래킹이란?백트래킹이란 현재 상태에서 가능한 모든 경로를 따라 들어가 탐색하다, 원하는 값과 불일치하는 부분이 발생하면 더 이상 탐색을 진행하지 않고 전 단계로 돌아가는, 즉 이름 그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;veggie-garden.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 기억하는 백트래킹 문제를 생각해보면 외판원 순회, N-queens, 배당문제, 순열 문제등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떠한 조합을 찾을때 pruning을 하면서 특정 경우를 찾는다.&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 data-ke-size=&quot;size16&quot;&gt;리스트에 값을 넣고 재귀를 돌린다.&lt;br /&gt;가지치는 과정이 있고 데이터를 넣었으면 되돌리는 과정이 있거나 아니면 덮어씌우거나 무시할 수 있어야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1728800420449&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ans = []

def back(n):
    if n == 3: # 최대 깊이
        print(&quot; &quot;.join(map(str, ans))) # 1 2 3 이런 상태로 출력하기 위해
        return 
    for i in range(1, N+1):
        if i not in ans: # 가지치기
            ans.append(i) # 데이터를 넣었다면
            back(n+1) # 재귀 후
            ans.pop() # 데이터를 빼야함
                        
back(0)


ans = [0,0,0]

def pruning(n,x):
	for i in range(n):
    	if x in ans[i]:
        	return false
    return true
	
def back(n):
    if n == 3: # 최대 깊이
        print(&quot; &quot;.join(map(str, ans))) # 1 2 3 이런 상태로 출력하기 위해
        return 
    for i in range(1, N+1):
        if pruning(n,i): # 가지치기
            ans[n] = i # 가지치기를 n 이전 인덱스만 영향받게 만들고 덮어씌우기
            back(n+1) # 재귀
 
                        
back(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘(python)</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/108</guid>
      <comments>https://dyd1310.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 13 Oct 2024 15:43:51 +0900</pubDate>
    </item>
    <item>
      <title>BOJ-13460 구슬탈출2 - 알고리즘 복습 1일차</title>
      <link>https://dyd1310.tistory.com/107</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13460&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/13460&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-10-13 at 1.23.45 PM.png&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nF3Wl/btsJ2189n9N/oaCnKLcbzVpsZ7pFEpCPc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nF3Wl/btsJ2189n9N/oaCnKLcbzVpsZ7pFEpCPc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nF3Wl/btsJ2189n9N/oaCnKLcbzVpsZ7pFEpCPc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnF3Wl%2FbtsJ2189n9N%2FoaCnKLcbzVpsZ7pFEpCPc0%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;1484&quot; height=&quot;1012&quot; data-filename=&quot;Screenshot 2024-10-13 at 1.23.45 PM.png&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 목표&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판을 기울여가면서 빨간공만 빠뜨리기 위한 최소 시행 구하기 문제풀이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아이디어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 판에 크기에 해당하는 리스트를 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 각각 상하좌우로 공을 옮기는 메소드를 만듬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 완전탐색으로 모든 경우를 시행해봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;처음 코드 (실패)&lt;/h3&gt;
&lt;pre id=&quot;code_1728793576531&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
r,c = map(int, input().split(&quot; &quot;))
redLoc = [-1,-1]
blueLoc = [-1,-1]

board = [list(input()) for _ in range(r)]

def swap(loc1, loc2, M):
    ### loc1 과 loc2는 튜플
    temp = M[loc2[0]][loc2[1]]
    M[loc2[0]][loc2[1]] = M[loc1[0]][loc1[1]]
    M[loc1[0]][loc1[1]] = temp


def findBlock(loc,t, M):
    plus = 0
    result = [-1,-1]
    if t == 'L':
        for i in range(loc[1]-1,-1,-1):
            if M[loc[0]][i] == 'O' :
                return [-2, -2]
            if M[loc[0]][i] == 'B' or M[loc[0]][i] == 'R':
                plus = 1
            if M[loc[0]][i] == '#' :
                result[0] = loc[0]
                result[1] = i+1+plus
                break
    elif t == 'R':
        for i in range(loc[1]+1, c):
            if M[loc[0]][i] == '0' :
                return [-2, -2]
            if M[loc[0]][i] == 'B' or M[loc[0]][i] == 'R':
                plus = 1
            if M[loc[0]][i] == '#' :
                result[0] = loc[0]
                result[1] = i-1-plus
                break
    elif t == 'U':
        for i in range(loc[0]-1, -1, -1):
            if M[i][loc[1]] == '0' :
                return [-2, -2]
            if M[i][loc[1]] == 'B' or M[i][loc[1]] == 'R':
                plus = 1
            if M[i][loc[1]] == '#' :
                result[0] = i+1+plus
                result[1] = loc[1]
                break
    elif t == 'D':
        for i in range(loc[0]+1,r):
            if M[i][loc[1]] == '0' :
                return [-2, -2]
            if M[i][loc[1]] == 'B' or M[i][loc[1]] == 'R':
                plus = 1
            if M[i][loc[1]] == '#' :
                result[0] = i-1-plus
                result[1] = loc[1]
                break
    else:
        print(&quot;findBlock error&quot;)
        return (-1,-1)
    return result

def findBall():
    global redLoc
    global blueLoc
    count = 0
    for i in range(r):
        for j in range(c):
            if board[i][j] == &quot;R&quot;:
                redLoc = [i,j]
                count +=1
            if board[i][j] == &quot;B&quot;:
                blueLoc = [i,j]
                count +=1
            if count == 2:
                break

def move(redLoc, blueLoc,t,M):

    loc1 = findBlock(redLoc,t,M)
    swap(redLoc, loc1,M)
    redLoc = loc1

    loc2 = findBlock(blueLoc,t,M)
    swap(blueLoc, loc2,M)
    blueLoc = loc2

    if loc1 == [-2,-2] and loc2 == [-2,-2]:
        return -1

    if loc1 == [-2,-2]:
        return 1
    elif loc2 == [-2,-2]:
        return -1
    else:
        return 0


findBall()

mode = ['L','R','U','D']
minlevel = 10

def simul(level, result, M):

    global minlevel
    if result == 1:
        if level &amp;lt; minlevel:
            minlevel = level
    if result == -1 or level &amp;gt;= 2:
        return -1
    else:
        startRed = redLoc
        startBlue = blueLoc
        print(level)
        print(M)
        for t in mode:
            simul(level+1, move(startRed,startBlue,t,M), M)

simul(0,0,board)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복습 1일차라 구현에만 집중에서 처음 풀이를 작성했다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 각 경우의 수에서 보드의 상태를 어떻게 유지할건가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색 깊이가 0일 때의 보드의 상태와 상하좌우 움직였을때의 보드의 상태는 각각 다른데 이를 전역적으로 한 보드가지고 하기 어렵다는 것을 마지막에 알았다. 그렇다고 각 단계를 깊은 복사한다면 메모리가 감당이 안돼 풀이의 방향이 잘못됐다는것을 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 매개변수로 배열을 넘기면 옅은 복사가 되는 것을 저번 알고리즘 복습할때 가변, 불변을 공부했었는데 코드를 치는 중에 생각하는 것이 어려웠다. 이는 내가 적었던 글과 다른 글을 더 보면서 다시 복습했다.&lt;/p&gt;
&lt;figure id=&quot;og_1728794302148&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Python - 함수에 배열을 인자로 전달할 때&quot; data-og-description=&quot;함수에 배열을 전달할 때 무슨 일이 일어날까? 함수의 인자로 배열을 전달한 후에 배열에 5를 'append' 해보자. def append_item(arr_in_function): print('id : ', id(arr_in_function), 'before change in function : ',arr_in_func&quot; data-og-host=&quot;foramonth.tistory.com&quot; data-og-source-url=&quot;https://foramonth.tistory.com/18&quot; data-og-url=&quot;https://foramonth.tistory.com/18&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ue920/hyXhLjkP2a/U0q5e34HghppQ1zEXBmVHk/img.png?width=547&amp;amp;height=372&amp;amp;face=0_0_547_372,https://scrap.kakaocdn.net/dn/bEwcbW/hyXd88l8lQ/BTdSUaBuRUuiXQfhzbT6lk/img.png?width=547&amp;amp;height=372&amp;amp;face=0_0_547_372,https://scrap.kakaocdn.net/dn/jLtWU/hyXhT9wfpR/WTZ1fR462O0buGK7IX8SDk/img.png?width=1300&amp;amp;height=722&amp;amp;face=0_0_1300_722&quot;&gt;&lt;a href=&quot;https://foramonth.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://foramonth.tistory.com/18&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ue920/hyXhLjkP2a/U0q5e34HghppQ1zEXBmVHk/img.png?width=547&amp;amp;height=372&amp;amp;face=0_0_547_372,https://scrap.kakaocdn.net/dn/bEwcbW/hyXd88l8lQ/BTdSUaBuRUuiXQfhzbT6lk/img.png?width=547&amp;amp;height=372&amp;amp;face=0_0_547_372,https://scrap.kakaocdn.net/dn/jLtWU/hyXhT9wfpR/WTZ1fR462O0buGK7IX8SDk/img.png?width=1300&amp;amp;height=722&amp;amp;face=0_0_1300_722');&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;Python - 함수에 배열을 인자로 전달할 때&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;함수에 배열을 전달할 때 무슨 일이 일어날까? 함수의 인자로 배열을 전달한 후에 배열에 5를 'append' 해보자. def append_item(arr_in_function): print('id : ', id(arr_in_function), 'before change in function : ',arr_in_func&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;foramonth.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 빨간공의 위치와 파란공의 위치를 어떻게 관리할 것인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에 보드판을 보면서 공의 위치를 저장했는데 이후에 이를 어떻게 업데이트해야할지 감이 잡히지 않았다. 전역변수 하나로 두면 계속 그 후의 탐색과정에서 엉키게 되는데 이를 어떻게 제어해야할지 감이 잡히지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 2가지 어려움을 생각하며 풀이과정을 검색했고 가장 나에게 맞는 풀이법을 탐색했다.&lt;/p&gt;
&lt;figure id=&quot;og_1728794736994&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[백준(BOJ)] 13460번 : 구슬 탈출 2 - PYTHON[파이썬]&quot; data-og-description=&quot;https://www.acmicpc.net/problem/13460 13460번: 구슬 탈출 2 첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 &amp;le; N, M &amp;le; 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문&quot; data-og-host=&quot;tooo1.tistory.com&quot; data-og-source-url=&quot;https://tooo1.tistory.com/506&quot; data-og-url=&quot;https://tooo1.tistory.com/506&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5WOCY/hyXhY32E6q/DCwlLSaN1LZaPTrY1O8t9k/img.png?width=800&amp;amp;height=185&amp;amp;face=0_0_800_185,https://scrap.kakaocdn.net/dn/du5Rih/hyXhSisPaF/iZS5pK8bDcf1zPau1PHh31/img.png?width=800&amp;amp;height=185&amp;amp;face=0_0_800_185,https://scrap.kakaocdn.net/dn/bzWXK2/hyXhOAlQnM/5TfHzFZdeNPNCkj5r4lV0k/img.png?width=1733&amp;amp;height=1371&amp;amp;face=0_0_1733_1371&quot;&gt;&lt;a href=&quot;https://tooo1.tistory.com/506&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tooo1.tistory.com/506&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b5WOCY/hyXhY32E6q/DCwlLSaN1LZaPTrY1O8t9k/img.png?width=800&amp;amp;height=185&amp;amp;face=0_0_800_185,https://scrap.kakaocdn.net/dn/du5Rih/hyXhSisPaF/iZS5pK8bDcf1zPau1PHh31/img.png?width=800&amp;amp;height=185&amp;amp;face=0_0_800_185,https://scrap.kakaocdn.net/dn/bzWXK2/hyXhOAlQnM/5TfHzFZdeNPNCkj5r4lV0k/img.png?width=1733&amp;amp;height=1371&amp;amp;face=0_0_1733_1371');&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;[백준(BOJ)] 13460번 : 구슬 탈출 2 - PYTHON[파이썬]&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://www.acmicpc.net/problem/13460 13460번: 구슬 탈출 2 첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 &amp;le; N, M &amp;le; 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tooo1.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 풀이를 보면서 많은 것을 느낄 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 의문은 지도상에 구슬을 컨트롤하기보단 지도는 고정해두는 방식으로 두번째 의문은 큐와 방문을 저장해두는 배열로 해결하면 된다는 것을 알았다. 그리고 방향배열을 두고 움직일 인덱스를 찾는 함수에서 while문을 사용해 공을 옮길 위치를 찾는 로직이 인상깊었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 나는 공을 옮길 좌표를 구하는 함수를 정의할때 공이 목적지에 도착하면 [-2,-2] 를 줘서 추후 이걸로 성공 여부를 판별하려했는데 그럴 필요없이 그냥 좌표 그대로 마지막에 확인하는 것이 로직상 깔끔해진다는걸 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘에 꽤나 자신이 있었는데 알고리즘을 하지 않는 시간동안 많이 퇴화했음을 느꼈다.&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 data-ke-size=&quot;size16&quot;&gt;1. 보드판은 고정해둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 빨간 , 파란 공의 위치를 저장해두고 이 위치로 bfs, dfs, 백트래킹 같은 탐색 알고리즘을 적용한다.&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;*최단횟수를 구하기때문에 bfs가 유리하고 백트래킹을 적용하기엔 가지치기 기준이 명확하지 않아 bfs가 옳은 접근법이다.&lt;/p&gt;</description>
      <category>알고리즘(python)</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/107</guid>
      <comments>https://dyd1310.tistory.com/107#entry107comment</comments>
      <pubDate>Sun, 13 Oct 2024 14:11:37 +0900</pubDate>
    </item>
    <item>
      <title>topcit 기술영역 소프트웨어 공학 개요</title>
      <link>https://dyd1310.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;목표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 소프트웨어의 특성과 문제점을 설명할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 소프트웨어공학의 배경과 목적을 설명할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 소프트웨어 개발 프로세스 모델에 대해 설명할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심키워드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소프트웨어의 특성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소프트웨어 생명주기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 요구사항 분석, 설계, 구현, 테스팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소프트웨어 요구관리, 유지관리, 형상관리, 품질관리&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;1. 소프트웨어의 품질이 어떻게 평가되고 관리될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프로세스 모델이 어떻게 변화하여 왔을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 소프트웨어 공학이라는 학문은 어떠한 필요로 생겨났을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 소프트웨어 공학에서 다루는 개념은 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 공학의 정의 : &quot;소프트웨어의&lt;b&gt; 개발, 운용, 유지보수&lt;/b&gt; 등의 &lt;b&gt;생명주기 전반&lt;/b&gt;을 체계적이고 정량적으로 다루는 학문&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 공학의 4가지 중요요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방법 : 소프트웨어를 어떻게 개발할 것인가? -&amp;gt; 프로젝트 계획수립, 프로그램 구조, 알고리즘 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도구 : 어떤툴을 사용해 만들것인가? -&amp;gt; 요구 관리 도구, 모델링 도구, 형상관리 도구 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 절차 : 방법과 도구를 이용해서 어떻게 계획을 세우고 개발할 것인가? -&amp;gt; 결과물, 품질 보증, 개발 진행 순서 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사람 : 결국 이 요소들을 버무릴 인원이 필요하기때문에 4가지 요소 포함되어 있음.&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 data-ke-size=&quot;size16&quot;&gt;1. 타당성 검토 -&amp;gt; 이러한 필요가 있는데 이게 실제로 만들수있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 개발 계획 -&amp;gt; 이 프로그램을 만들기 위해선 이런 알고리즘이 필요하고 이런 툴이 필요하겠구나.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 요구사항 분석 -&amp;gt; 사용자입장에서 정확히 어떤 기능이 필요하지? 또 각 파트에 있어야할 정확한 기능이 무엇이지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 설계 -&amp;gt; 데이터베이스 엔티티, API 명세서 등 이렇게 맞춰놓으면 되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 구현 -&amp;gt; 이제 파트를 나눠서 실제 기능을 만들어보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 테스트 -&amp;gt; 예외처리 잘되어있나, 잘 동작하나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 운용 -&amp;gt;&amp;nbsp; 이제 서비스하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 유지보수 -&amp;gt; 다음 버전에는 뭘 추가하고 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생명주기 목적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로젝트 비용 산정과 개발 계획 수립, 기본 골격 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로젝트 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 개발을 시작할때 막막할 수 있는데 하나의 가이드라인이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/106</guid>
      <comments>https://dyd1310.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 19 Sep 2024 15:48:25 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 복습 2</title>
      <link>https://dyd1310.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이터러블? 이터레이터? 제네레이터?&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; for을 사용하는 자료형들, 리스트 , 딕셔너리, 셋을 떠올릴 수 있다.&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;이터레이터는 클래스에서 선언된 __next__() 함수나 내장함수 next()를 통해 원소를&amp;nbsp; 순차적으로 반환할 수 있는 객체들을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이터러블은 __iter()__를 통해 이터레이터를 반환할 수 있고 그후 반환받은 이터레이터의 next를 통해 순차적으로 내부요소를 반환할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1725258464002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list = [1,2,3,4]
type(list) # list
iter = iter(list)
type(iter) # list_iterator
next(iter) # 1
next(iter) # 2
next(iter) # 3
next(iter) # 4
next(iter) # StopIteration

iter2 = list.__iter__()
type(iter2) # list_iterator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 이터러블인 list 자료형을 이터레이터로 만들어 사용한 예제이다.&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;그리고 확장해서 for문을 사용할때 우리는 이터러블을 이용하는데 이때 내부적으로 받은 이터러블을 이용해 이터레이터를 생성한 후 next를 이용해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;StopIteration이 일어나기전까지&lt;/span&gt;&amp;nbsp;순회하는 것을 유추할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 클래스를 만들때 __iter__() 메소드를 내부적으로 만들지 않는다면 for문을 이용할수없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dir, hasattr 같은 내장함수로 객체에 __iter__이나 __next__ 가 정의되어있는지 확인할 수 있고 객체의 __iter__ 를 이용해 얻은 객체에 __next__ 가 정의되어있는지 확인해 있다면 이를 이용하는 방식으로 사용될 것이라고 생각했다. 여기서 c언어 배열처럼 그냥 인덱스로 반복문을 사용하지 않는 이유가 궁금했었는데 여러 컬렉션 타입, 시퀀스 타입 객체들을 포괄하여 동작시킬수있는 가장 효율적인 방식이고 여러 자료형들의 메모리가 모두 붙어있다는 보장이 없다는 것을 깨닫고 의문을 지울수있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제네레이터의 경우 이터레이터처럼 next로 동작한다. 다른 차이점이 있다면 yield를 통한 동작과정에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 이터레이터를 생각해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list = [1,2,3,4,5,6,7,8,9,10] 같이 이미 모든 값이 메모리에 올라가있는경우 이터레이터를 이용해 반복을 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 메모리에 모두 올라간 데이터만을 우리가 처리하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10만개의 수를 만들고 이를 모두 2씩 곱하는 연산을 수행하고 싶을때 미리 리스트를 만들어 메모리에 10만을 준비하여 연산하는 것 보다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 그때 수를 만들고 할당된 메모리에 이를 넣는 방식으로 수행할 수 있는 것이다. 이런 수행에 필요한 것이 제네레이터이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 준비할 필요없이 필요한 데이터만 준비하니 메모리를 효율적으로 사용할 수 있다.&lt;/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;제네레이터의 경우 필요한 데이터 한가지를 생성,반환하고 다음 호출까지 대기한다. 그리고 next가 일어날때 그다음 데이터를 생성, 반환하고 대기한다. 이와같이 필요한 하나하나씩 반환하고 다음으로 넘어가기때문에 메모리에 저장하는 과정이 따로 필요없게된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725426076556&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sum1 = sum([num ** 2 for num in range(1000000)])

sum2 = sum((num ** 2 for num in range(10000000)))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같은 경우 sum 매개변수가 메모리에 저장시킬 필요가 없으니 메모리를 위해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;리스트 컴프리핸션보다&amp;nbsp;&lt;/span&gt;제네레이터 컴프리핸션을 이용하는 것이 좋을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 메모리&lt;/p&gt;
&lt;pre id=&quot;code_1725426156578&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = list(range(100000))
a2 = list()

for i in a:
    a2.append(i*2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725426177093&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;temp = [x*2 for x in range(100000)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725426493235&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = list(range(100000))
a2 = map(lambda n: n*2, a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번&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;두 예시 중 append로 계속해서 메모리를 재할당 시키는 1번보단 이터러블을 이용한 2번 리스트 컴프리핸션이 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번같은 경우 map 함수가 내부적으로 c로 짜여있어 빠르게 동작하여 효율성이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;3.&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 data-ke-size=&quot;size16&quot;&gt;객체의 참조횟수만 세면 동작시킬수 있지 않을까? 라는 생각을 할 수 있다. 실제로도 참조횟수를 세면서 가비지 컬렉터가 동작한다. 해당 방식은 순환참조가 일어나는 경우 대응하지 못하는 단점이 있고 또 참조횟수를 관리하는것도 비용이 많이들수있다. 장점은 실시간으로 메모리를 해제할 수 있어 다른 방식들과 달리 프로그램이 멈추지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1725323343818&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#순환참조 예시
a = test() ## a의 참조횟수 1
b = test() ## b의 참조횟수 1
a.test = b ## b의 참조횟수 2
b.test = a ## a의 참조횟수 2

del a
del b

#객체가 사라졌는데 a와 b의 참조횟수는 모두 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 방식으로 살아있는 객체에서 참조할 수 있는 모든 곳을 마크하고 존재하는 모든 객체에 마크가 안되어있는 부분을 해제하는 마크앤 스윕방식도 있다. 해당 방법은 순환 참조문제 또한 해결할 수 있다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 경우 참조 횟수 기반 가비지 컬렉터와 세대별 가비지 컬렉터를 사용한다. 파이썬은 3세대로 객체를 관리하고 세대별 객체 개수를 넘으면 세대별 가비지 컬렉터가 동작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725326323428&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬 리스트 내부 구조&quot; data-og-description=&quot;C언어의 배열과 파이썬의 리스트는 같은 자료형이지만 파이썬의 리스트가 훨씬 사용하기 편리하다. 그 이유는 아래와 같다.&quot; data-og-host=&quot;seoyeonhwng.medium.com&quot; data-og-source-url=&quot;https://seoyeonhwng.medium.com/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-f04847b58286&quot; data-og-url=&quot;https://seoyeonhwng.medium.com/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-f04847b58286&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ck87Qq/hyWV30phRQ/bbunhEPHrz3W4DKnSe22Gk/img.png?width=1200&amp;amp;height=719&amp;amp;face=0_0_1200_719&quot;&gt;&lt;a href=&quot;https://seoyeonhwng.medium.com/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-f04847b58286&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://seoyeonhwng.medium.com/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-f04847b58286&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ck87Qq/hyWV30phRQ/bbunhEPHrz3W4DKnSe22Gk/img.png?width=1200&amp;amp;height=719&amp;amp;face=0_0_1200_719');&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;파이썬 리스트 내부 구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C언어의 배열과 파이썬의 리스트는 같은 자료형이지만 파이썬의 리스트가 훨씬 사용하기 편리하다. 그 이유는 아래와 같다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;seoyeonhwng.medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725259466435&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬 클린 코드 - 7장 (제너레이터)&quot; data-og-description=&quot;1. 제너레이터 만들기 제너레이터는 파이썬에서 고성능이면서도 메모리를 적게 사용하는 반복을 위한 방법이다. 제너레이터는 한 번에 하나씩 구성요소를 반환해주는 이터러블을 생성해주는 &quot; data-og-host=&quot;monsterkos.tistory.com&quot; data-og-source-url=&quot;https://monsterkos.tistory.com/42&quot; data-og-url=&quot;https://monsterkos.tistory.com/42&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwlw99/hyWVSqXrxm/I5Pl6apygUDJAwRiUspWQ0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/BvuLh/hyWZkTDw0t/PHeWgddyHM1Cnabz60npdK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://monsterkos.tistory.com/42&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://monsterkos.tistory.com/42&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwlw99/hyWVSqXrxm/I5Pl6apygUDJAwRiUspWQ0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/BvuLh/hyWZkTDw0t/PHeWgddyHM1Cnabz60npdK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;파이썬 클린 코드 - 7장 (제너레이터)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 제너레이터 만들기 제너레이터는 파이썬에서 고성능이면서도 메모리를 적게 사용하는 반복을 위한 방법이다. 제너레이터는 한 번에 하나씩 구성요소를 반환해주는 이터러블을 생성해주는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;monsterkos.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1725258745123&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬(python) - 이터레이터(Iterator)&quot; data-og-description=&quot;이터레이터(Iterator)란? 이터레이터는 순서대로 다음 값을 리턴할 수 있는 객체를 의미합니다. 자체적으로 내장하고 있는 next 메소드를 통해 다음 값을 가져올 수 있습니다. 여기서 '순서대로'라&quot; data-og-host=&quot;tibetsandfox.tistory.com&quot; data-og-source-url=&quot;https://tibetsandfox.tistory.com/27&quot; data-og-url=&quot;https://tibetsandfox.tistory.com/27&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kf68W/hyWVZXSHXh/8H26EIzrKbypwPKiJeiFIk/img.jpg?width=651&amp;amp;height=383&amp;amp;face=218_105_383_286,https://scrap.kakaocdn.net/dn/eVeCa/hyWV2mLH82/gkTBfNTDVjNh3prmIrZ6T1/img.jpg?width=651&amp;amp;height=383&amp;amp;face=218_105_383_286,https://scrap.kakaocdn.net/dn/MXzol/hyWV1VGyqb/wFfB51zbXDzfRutM4pKrpK/img.png?width=773&amp;amp;height=446&amp;amp;face=0_0_773_446&quot;&gt;&lt;a href=&quot;https://tibetsandfox.tistory.com/27&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tibetsandfox.tistory.com/27&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kf68W/hyWVZXSHXh/8H26EIzrKbypwPKiJeiFIk/img.jpg?width=651&amp;amp;height=383&amp;amp;face=218_105_383_286,https://scrap.kakaocdn.net/dn/eVeCa/hyWV2mLH82/gkTBfNTDVjNh3prmIrZ6T1/img.jpg?width=651&amp;amp;height=383&amp;amp;face=218_105_383_286,https://scrap.kakaocdn.net/dn/MXzol/hyWV1VGyqb/wFfB51zbXDzfRutM4pKrpK/img.png?width=773&amp;amp;height=446&amp;amp;face=0_0_773_446');&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;파이썬(python) - 이터레이터(Iterator)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이터레이터(Iterator)란? 이터레이터는 순서대로 다음 값을 리턴할 수 있는 객체를 의미합니다. 자체적으로 내장하고 있는 next 메소드를 통해 다음 값을 가져올 수 있습니다. 여기서 '순서대로'라&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tibetsandfox.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1725258778613&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;03) 제너레이터&quot; data-og-description=&quot;[TOC] ## 잘못된 일처리 방식 어떤 빵가게에서 제빵사가 빵을 굽고 점원이 이를 포장하고 있습니다. 제빵사는 빵가게 문을 열기 전까지 빵 100개를 만들어야 하는데 빵이&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/83132&quot; data-og-url=&quot;https://wikidocs.net/83132&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z2Xf2/hyWVWz4Qsw/VmkNSuktrkPU55JdYIdJx0/img.png?width=100&amp;amp;height=98&amp;amp;face=0_0_100_98&quot;&gt;&lt;a href=&quot;https://wikidocs.net/83132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/83132&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z2Xf2/hyWVWz4Qsw/VmkNSuktrkPU55JdYIdJx0/img.png?width=100&amp;amp;height=98&amp;amp;face=0_0_100_98');&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;03) 제너레이터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[TOC] ## 잘못된 일처리 방식 어떤 빵가게에서 제빵사가 빵을 굽고 점원이 이를 포장하고 있습니다. 제빵사는 빵가게 문을 열기 전까지 빵 100개를 만들어야 하는데 빵이&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725325279804&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Memory Management in Python (2) - Python 가비지 컬렉터&quot; data-og-description=&quot;https://www.honeybadger.io/blog/memory-management-in-python/ Memory Management in Python Understanding memory management is a superpower that will help you design memory-efficient applications and make it easier to debug memory issues. Join Rupesh Mishra f&quot; data-og-host=&quot;sysgongbu.tistory.com&quot; data-og-source-url=&quot;https://sysgongbu.tistory.com/209&quot; data-og-url=&quot;https://sysgongbu.tistory.com/209&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wprPj/hyWZhJtDcI/cWRPhSSNgmM5s8UKD1qmck/img.png?width=572&amp;amp;height=357&amp;amp;face=0_0_572_357,https://scrap.kakaocdn.net/dn/bj9Ztn/hyWVXlz6pt/czcjgHjxjNg8vMzsT4jm5K/img.png?width=572&amp;amp;height=357&amp;amp;face=0_0_572_357,https://scrap.kakaocdn.net/dn/jRoR9/hyWY77UJgr/vdytcYyKAPYfcxPuOh0Pr1/img.png?width=1134&amp;amp;height=601&amp;amp;face=0_0_1134_601&quot;&gt;&lt;a href=&quot;https://sysgongbu.tistory.com/209&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sysgongbu.tistory.com/209&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wprPj/hyWZhJtDcI/cWRPhSSNgmM5s8UKD1qmck/img.png?width=572&amp;amp;height=357&amp;amp;face=0_0_572_357,https://scrap.kakaocdn.net/dn/bj9Ztn/hyWVXlz6pt/czcjgHjxjNg8vMzsT4jm5K/img.png?width=572&amp;amp;height=357&amp;amp;face=0_0_572_357,https://scrap.kakaocdn.net/dn/jRoR9/hyWY77UJgr/vdytcYyKAPYfcxPuOh0Pr1/img.png?width=1134&amp;amp;height=601&amp;amp;face=0_0_1134_601');&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;Memory Management in Python (2) - Python 가비지 컬렉터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://www.honeybadger.io/blog/memory-management-in-python/ Memory Management in Python Understanding memory management is a superpower that will help you design memory-efficient applications and make it easier to debug memory issues. Join Rupesh Mishra f&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sysgongbu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725424213019&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Python] 반복자(Iterator), 제너레이터(Generator)에 대한 이해&quot; data-og-description=&quot;파이썬에는 원소를 받을 수 있는 다양한 자료구조가 있다. 특히 리스트, 딕셔너리 등은 여러 원소를 처리하는 대표적인 자료구조이다. 원소는 기본적으로 정적으로 만들어져서 반복 가능한 반&quot; data-og-host=&quot;cheony-y.tistory.com&quot; data-og-source-url=&quot;https://cheony-y.tistory.com/304&quot; data-og-url=&quot;https://cheony-y.tistory.com/304&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bH6MsS/hyWV2HmQVF/iPoR3VGvCfm350QvUKInsk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cElDSO/hyWZdgbwwY/fbW6LHZ4XsgDKUCYhzaXX0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://cheony-y.tistory.com/304&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cheony-y.tistory.com/304&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bH6MsS/hyWV2HmQVF/iPoR3VGvCfm350QvUKInsk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cElDSO/hyWZdgbwwY/fbW6LHZ4XsgDKUCYhzaXX0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Python] 반복자(Iterator), 제너레이터(Generator)에 대한 이해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬에는 원소를 받을 수 있는 다양한 자료구조가 있다. 특히 리스트, 딕셔너리 등은 여러 원소를 처리하는 대표적인 자료구조이다. 원소는 기본적으로 정적으로 만들어져서 반복 가능한 반&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cheony-y.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725424718768&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;10_메모리 관련&quot; data-og-description=&quot;##메모리 주소 알아내기 &amp;#96;&amp;#96;&amp;#96; &amp;gt;&amp;gt;&amp;gt; id(2) 4484212032 &amp;#96;&amp;#96;&amp;#96; 16진법으로 나타내면 다음과 같다. &amp;#96;&amp;#96;&amp;#96; &amp;gt;&amp;gt;&amp;gt; hex(id(2)) &amp;lsquo;0x10b47a&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/21057&quot; data-og-url=&quot;https://wikidocs.net/21057&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FWZ8B/hyWV1BHwed/Ifz2Hrt7hprCuo1g8qwMuk/img.png?width=88&amp;amp;height=129&amp;amp;face=0_0_88_129&quot;&gt;&lt;a href=&quot;https://wikidocs.net/21057&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/21057&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FWZ8B/hyWV1BHwed/Ifz2Hrt7hprCuo1g8qwMuk/img.png?width=88&amp;amp;height=129&amp;amp;face=0_0_88_129');&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;10_메모리 관련&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;##메모리 주소 알아내기 ``` &amp;gt;&amp;gt;&amp;gt; id(2) 4484212032 ``` 16진법으로 나타내면 다음과 같다. ``` &amp;gt;&amp;gt;&amp;gt; hex(id(2)) &amp;lsquo;0x10b47a&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘(python)</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/105</guid>
      <comments>https://dyd1310.tistory.com/105#entry105comment</comments>
      <pubDate>Mon, 2 Sep 2024 17:54:08 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 복습</title>
      <link>https://dyd1310.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp; 문자열 데이터 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 알고리즘에서&amp;nbsp; 문자열 처리에 굉장한 편의성을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 인덱싱과 슬라이싱, 문자의 합 연산, 반복 연산에 익숙해지는 것이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 문자열, 튜플, 리스트 자료형에서 가변(mutable)과 불변(immutable) 이라는 개념이 있다.&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;pre id=&quot;code_1725239349077&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = 1
addr1 = id(a)  
a += 1
addr2 = id(a)

print(addr1)
print(addr2)&lt;/code&gt;&lt;/pre&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;정수형은 immutable로 메모리에 할당된 데이터를 변경할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 1 이 임의의 공간에 배정되고 2가 쓰일 때 1이 배정된 공간에 2를 넣는 것이 아니라 새로운 공간에&amp;nbsp; 2를 넣고 변수 a 가 가리키는 주소를 2를 가리키도록 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-09-02 at 10.14.03 AM.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xjtKw/btsJorMAs0M/lirpubwrQnhz7hkyIqehF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xjtKw/btsJorMAs0M/lirpubwrQnhz7hkyIqehF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xjtKw/btsJorMAs0M/lirpubwrQnhz7hkyIqehF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxjtKw%2FbtsJorMAs0M%2FlirpubwrQnhz7hkyIqehF1%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;1588&quot; height=&quot;652&quot; data-filename=&quot;Screenshot 2024-09-02 at 10.14.03 AM.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 또한 immutable이다. 따라서&amp;nbsp; str = &quot;love&quot; 라는 변수에 str[1] = &quot;a&quot; 라는 코드로 &quot;lave&quot;를 변경할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 숫자처럼 새로운 공간에 &quot;lave&quot;가 생성되고 이미 생성되어있던 &quot;love&quot;는 가비지컬렉터로 제거하는 방식으로 동작할 수 있겠다는 생각을 했다. 하지만 이를 허용한다면 가변, 불변을 모르는 개발자가 사용했을때 메모리 누수가 매우 심해져서 이를 허용하는것이 바람직하게 느껴지진 않았고&amp;nbsp; 또 이렇게 동작시킬거면 불변과 가변을 나누지도 않았을 것 같다는 생각을 했다. 실제 실행결과&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;str[1] = &quot;a&quot;같은 코드로&lt;/span&gt; str을 변경하려할때 오류가 생기는 것을 확인할&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;리스트의 경우 가변이여서 list[1] = &quot;a&quot; 같은 코드로 이미 있던 데이터를 변경할 수 있다. 그리고 파이썬의 리스트의 경우 여러 자료형이 혼합되어 들어갈 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 깊은 복사, 옅은 복사&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;파이썬으로 알고리즘을 하다보면 다른 변수에 리스트를 복사하려는데 참조 주소가 같아 복사한곳에 데이터를 변경할 때 원본 데이터도 같이 변경되는 상황이 생긴다. 이는 리스트가 가변(mutable)이여서 옅은복사가 되어 생기는 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1725241846409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = 1
b = a

print(id(a))
print(id(b))
print(a is b) # true

b = 0
print(id(a))
print(id(b))
print(a is b) # false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불변의 경우는 기존 할당된 공간에 있는 1을 변경할 수 없어 새롭게 0을 임의의 공간에 두고 b는 0을 가리키도록 한다.&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;pre id=&quot;code_1725241978058&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import copy

a = [1,2,3,4]
b = copy.deepcopy(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 코드로 깊은 복사를 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.copy()로도 깊은 복사가 가능하긴한데 이방법으론 이차원 이상 리스트는 깊은 복사가 이루어지지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이밖에도 list() 로 생성할때 매개변수로 복사할 리스트를 넣어주는 방법과 리스트 슬라이싱을 활용하는 방법이있다.&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;이차원 이상 리스트는 왜 copy로 깊은복사가 이루어지지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 내부의 값이 리스트인 경우 가변이기 때문에 참조로 이들을 기억한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list = [[1,2,3,4],[1,2,3,4]] 가 있다면 ,&amp;nbsp; list[0]와 list[1] 모두 참조로 [1,2,3,4]를 기억하는데 copy를 하면 가장 바깥쪽 리스트는 새로운 공간에 배정되더라도 내부의 참조가 같아 제대로 이루어지지 않는것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 내부 객체 부터 깊은 복사를 하거나 내부는 불변인 튜플을 이용하여 깊은 복사를 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 깊은 복사의 경우 속도면에서 리스트 슬라이싱이 가장 빨라 리스트 슬라이싱을 사용하는 것을 권장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1725244978909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list = [[1,2,3,4],[5,6,7,8]]
list2 = [row[:] for row in list]

list = [[[1,2,3]
		,[4,5,6]
        ,[7,8,9]],
        [[1,2,3]
		,[4,5,6]
        ,[7,8,9]]]
 
list2 = [[ 1arr[:] for 1arr in 2arr] for 2arr in list]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘(python)</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/104</guid>
      <comments>https://dyd1310.tistory.com/104#entry104comment</comments>
      <pubDate>Mon, 2 Sep 2024 11:43:28 +0900</pubDate>
    </item>
    <item>
      <title>spring-boot-devtools 설정하기</title>
      <link>https://dyd1310.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 사용할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발과정에서 서버를 재시작없이 소스코드의 변경사항을 확인할 수 있다.&lt;/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;devtool 사용&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&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;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;spring.devtools.livereload.enabled=true
spring.devtools.restart.enabled=true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-29 at 3.17.31 AM.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XBErY/btsHFLz0urk/itNOjQ7zKCeOCmKGckFGU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XBErY/btsHFLz0urk/itNOjQ7zKCeOCmKGckFGU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XBErY/btsHFLz0urk/itNOjQ7zKCeOCmKGckFGU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXBErY%2FbtsHFLz0urk%2FitNOjQ7zKCeOCmKGckFGU0%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;141&quot; height=&quot;498&quot; data-filename=&quot;Screenshot 2024-05-29 at 3.17.31 AM.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setting &amp;gt; 빌드 실행 배포 &amp;gt; 컴파일러 &amp;gt; 프로젝트 자동 빌드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-29 at 3.15.45 AM.png&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc3rED/btsHGfAA5wq/ZhkKEQcpKkQSUukpKw5Btk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc3rED/btsHGfAA5wq/ZhkKEQcpKkQSUukpKw5Btk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc3rED/btsHGfAA5wq/ZhkKEQcpKkQSUukpKw5Btk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc3rED%2FbtsHGfAA5wq%2FZhkKEQcpKkQSUukpKw5Btk%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;1664&quot; height=&quot;942&quot; data-filename=&quot;Screenshot 2024-05-29 at 3.15.45 AM.png&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;setting &amp;gt;&lt;span&gt; 고급설정 &amp;gt; 컴파일러 &amp;gt; 개발된 애플리케이션 ...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-29 at 3.15.22 AM.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP6w9g/btsHEXAUeLc/vvNkbeickTr31DxWqLzVn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP6w9g/btsHEXAUeLc/vvNkbeickTr31DxWqLzVn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP6w9g/btsHEXAUeLc/vvNkbeickTr31DxWqLzVn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP6w9g%2FbtsHEXAUeLc%2FvvNkbeickTr31DxWqLzVn1%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;1566&quot; height=&quot;984&quot; data-filename=&quot;Screenshot 2024-05-29 at 3.15.22 AM.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/103</guid>
      <comments>https://dyd1310.tistory.com/103#entry103comment</comments>
      <pubDate>Wed, 29 May 2024 03:18:26 +0900</pubDate>
    </item>
    <item>
      <title>spring jpa</title>
      <link>https://dyd1310.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 공부한 내용 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Column -&amp;gt; 엔티티 필드명은 name인데 참조하는 테이블의 필드명은 user_name 일때 매핑할 수 있음. 제약조건을 걸 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@JoinColumn -&amp;gt; 연관관계 매핑시에 사용됨.(해당 필드가 외래키가 됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@OneToMany(mappedBy = &quot;&quot;) -&amp;gt; 양방향 관계일때 누가 외래키를 가져야하는지 정해야함. mappedBy를 통해 자신이 연관관계의 주인이 아닌 것을 표시. mappedBy에는 어떤 필드가 외래키를 가졌는지 명시해줘야함.&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;@Embedded , @Embedding -&amp;gt; VO를 만들고 entity 필드로 선언할때 이게 값타입임을 명시하기 위해 사용. VO에 선언된 필드들이 테이블에 그대로 적힘.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-20 at 5.33.03 PM.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oEI2Z/btsHv5ydslz/huAfdcnTn50dC9pcXSZLgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oEI2Z/btsHv5ydslz/huAfdcnTn50dC9pcXSZLgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oEI2Z/btsHv5ydslz/huAfdcnTn50dC9pcXSZLgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoEI2Z%2FbtsHv5ydslz%2FhuAfdcnTn50dC9pcXSZLgk%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;604&quot; height=&quot;896&quot; data-filename=&quot;Screenshot 2024-05-20 at 5.33.03 PM.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;@Enumerated(value &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #d73a49; text-align: left;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #6f42c1; text-align: left;&quot;&gt;EnumType&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #6f42c1; text-align: left;&quot;&gt;STRING&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;) : Enum은 순서대로 0, 1 ,2 이렇게 기본으로 저장되는데 중간에 한가지를 추가하면 순서가 밀려서 의도치 않은 결과가 나온다. 이를 방지하기위해 string으로 저장하는 옵션&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일대다 다대일 헷갈릴때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 (다 대 일) 팀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러명의 유저는 한 팀일수있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저에서 팀 (many to one)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀에서 유저 (one to many)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일의 입장에서 다를 관리해야하니 배열로 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다의&lt;span&gt; &lt;/span&gt;입장에선&lt;span&gt; &lt;/span&gt;연결관계만&lt;span&gt; &lt;/span&gt;알면되니&lt;span&gt; &lt;/span&gt;단일로&lt;span&gt; &lt;/span&gt;관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;연관관계에서 단방향이든 양방향이든 다대일은 일단 다쪽에서 외래키를 관리함. 일대일에서는 수정사항이 많은 쪽이 외래키를 관리하는게 유리함. 외래키가 있는 연관관계의 주인에서만 변경사항이 저장됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연관관계에서의 삭제 (외래키를 가진쪽(다, 연관관계의 주인, 자식)이 자식, 가지지 않은 쪽(일)이 부모)&lt;/h3&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;span&gt;&amp;nbsp;&lt;/span&gt;OnDeleteAction.CASCADE 이나 CascadeType.REMOVE 로 부모를 삭제할때 자식도 삭제되도록 만들거나 자식의 외래키의 Null 옵션을 허용해서 외래키를 Null로 만들어주고 삭제해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다대일 단방향 관계에선 일(부모)은 다(자식)에 대해 아무것도 모른다. 일을 삭제했을 때 양방향 관계라면 스프링이 일을 통해 부모로 가서 자식을 삭제해줄 수 있는데 단방향이기 때문에 일을 통해 부모로 갈 수가 없다. 이때 OnDeleteAction.CASCADE 와 CascadeType.REMOVE의 차이가 나타난다.(DB에서 외래키 무결성을 관리하도록 설정하고 싶다면 OnDeleteAction.CASCADE 다대일 단방향 관계의 상황에선 OnDeleteAction.CASCADE 로 DB가 자식을 삭제하도록 설정할 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@mincho920/ElectionPJTJPA-JPA%EC%9D%98-%EC%99%B8%EB%9E%98-%ED%82%A4-%EB%AC%B4%EA%B2%B0%EC%84%B1-Candidate-Entity%EC%97%90%EC%84%9C-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%A7%A4%ED%95%91%EC%9D%84-%ED%8F%AC%EA%B8%B0%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;ht&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716272915819&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ ElectionPJT/JPA] JPA의 외래 키 무결성 / Candidate Entity에서 양방향 매핑을 포기한 이유&quot; data-og-description=&quot;JPA에서 외래 키 무결성을 다루는 방법&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@mincho920/ElectionPJTJPA-JPA%EC%9D%98-%EC%99%B8%EB%9E%98-%ED%82%A4-%EB%AC%B4%EA%B2%B0%EC%84%B1-Candidate-Entity%EC%97%90%EC%84%9C-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%A7%A4%ED%95%91%EC%9D%84-%ED%8F%AC%EA%B8%B0%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot; data-og-url=&quot;https://velog.io/@mincho920/ElectionPJTJPA-JPA의-외래-키-무결성-Candidate-Entity에서-양방향-매핑을-포기한-이유&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgaDDS/hyV6byemOE/qVXAVNDIIzISYSpLqCC5b0/img.png?width=1166&amp;amp;height=240&amp;amp;face=0_0_1166_240,https://scrap.kakaocdn.net/dn/Y9y7x/hyV9VgdTgA/mmErdCnRmerK8Kb9YT25k0/img.png?width=1166&amp;amp;height=240&amp;amp;face=0_0_1166_240,https://scrap.kakaocdn.net/dn/co4qdB/hyV59tFqRz/qCyxDKfrb5RGVnIG07Ols1/img.png?width=1222&amp;amp;height=304&amp;amp;face=0_0_1222_304&quot;&gt;&lt;a href=&quot;https://velog.io/@mincho920/ElectionPJTJPA-JPA%EC%9D%98-%EC%99%B8%EB%9E%98-%ED%82%A4-%EB%AC%B4%EA%B2%B0%EC%84%B1-Candidate-Entity%EC%97%90%EC%84%9C-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%A7%A4%ED%95%91%EC%9D%84-%ED%8F%AC%EA%B8%B0%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@mincho920/ElectionPJTJPA-JPA%EC%9D%98-%EC%99%B8%EB%9E%98-%ED%82%A4-%EB%AC%B4%EA%B2%B0%EC%84%B1-Candidate-Entity%EC%97%90%EC%84%9C-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%A7%A4%ED%95%91%EC%9D%84-%ED%8F%AC%EA%B8%B0%ED%95%9C-%EC%9D%B4%EC%9C%A0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgaDDS/hyV6byemOE/qVXAVNDIIzISYSpLqCC5b0/img.png?width=1166&amp;amp;height=240&amp;amp;face=0_0_1166_240,https://scrap.kakaocdn.net/dn/Y9y7x/hyV9VgdTgA/mmErdCnRmerK8Kb9YT25k0/img.png?width=1166&amp;amp;height=240&amp;amp;face=0_0_1166_240,https://scrap.kakaocdn.net/dn/co4qdB/hyV59tFqRz/qCyxDKfrb5RGVnIG07Ols1/img.png?width=1222&amp;amp;height=304&amp;amp;face=0_0_1222_304');&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;[ ElectionPJT/JPA] JPA의 외래 키 무결성 / Candidate Entity에서 양방향 매핑을 포기한 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JPA에서 외래 키 무결성을 다루는 방법&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;gt; 무결성을위해 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; db에 따라 자동 인덱싱&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 생성 순서에 영향을 주기 때문에 테스트코드 작성이 어렵고 개발 편의가 중요하다면 인덱스만 쓰고 무결성을 포기하는 선택도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; null 을 허용하여 자식의 참조를 제거하는 선택을 할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; where로 인덱스 설정한 열을 대상으로 조건을 걸 때 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 설정한 열은 중복이 없을수록 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 데이터 변경이 자주일어나는 경우 비용이 늘어나니 그런&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 모든 데이터만 조회하는 경우 사용안함&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1716272854052&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MySQL] - 인덱스 (INDEX) 정리 (동작 방식, 생성, 삭제, 설계)&quot; data-og-description=&quot;인덱스란? 인덱스는 데이터베이스에서 데이터를 조회할 때 결과를 빠르게 추출하도록 도와주는 하나의 '데이터베이스 개체'입니다. 마치 사전의 '찾아보기'와 같은 역할을 한다고 생각하시면 &quot; data-og-host=&quot;rachel0115.tistory.com&quot; data-og-source-url=&quot;https://rachel0115.tistory.com/entry/MySQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-INDEX-%EC%A0%95%EB%A6%AC-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D-%EC%83%9D%EC%84%B1-%EC%82%AD%EC%A0%9C-%EC%84%A4%EA%B3%84&quot; data-og-url=&quot;https://rachel0115.tistory.com/entry/MySQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-INDEX-%EC%A0%95%EB%A6%AC-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D-%EC%83%9D%EC%84%B1-%EC%82%AD%EC%A0%9C-%EC%84%A4%EA%B3%84&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ccH3pA/hyV58ar4Cy/KZscu1tc9UCV5aTulYa29k/img.png?width=800&amp;amp;height=426&amp;amp;face=0_0_800_426,https://scrap.kakaocdn.net/dn/cc68O8/hyV59tFqec/DKGkrWQbVau0dEumqzKI10/img.png?width=800&amp;amp;height=426&amp;amp;face=0_0_800_426,https://scrap.kakaocdn.net/dn/DOHqV/hyV92fmiti/qbHMM7wRYErCLClXXKvfi0/img.png?width=750&amp;amp;height=399&amp;amp;face=0_0_750_399&quot;&gt;&lt;a href=&quot;https://rachel0115.tistory.com/entry/MySQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-INDEX-%EC%A0%95%EB%A6%AC-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D-%EC%83%9D%EC%84%B1-%EC%82%AD%EC%A0%9C-%EC%84%A4%EA%B3%84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rachel0115.tistory.com/entry/MySQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-INDEX-%EC%A0%95%EB%A6%AC-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D-%EC%83%9D%EC%84%B1-%EC%82%AD%EC%A0%9C-%EC%84%A4%EA%B3%84&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ccH3pA/hyV58ar4Cy/KZscu1tc9UCV5aTulYa29k/img.png?width=800&amp;amp;height=426&amp;amp;face=0_0_800_426,https://scrap.kakaocdn.net/dn/cc68O8/hyV59tFqec/DKGkrWQbVau0dEumqzKI10/img.png?width=800&amp;amp;height=426&amp;amp;face=0_0_800_426,https://scrap.kakaocdn.net/dn/DOHqV/hyV92fmiti/qbHMM7wRYErCLClXXKvfi0/img.png?width=750&amp;amp;height=399&amp;amp;face=0_0_750_399');&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;[MySQL] - 인덱스 (INDEX) 정리 (동작 방식, 생성, 삭제, 설계)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인덱스란? 인덱스는 데이터베이스에서 데이터를 조회할 때 결과를 빠르게 추출하도록 도와주는 하나의 '데이터베이스 개체'입니다. 마치 사전의 '찾아보기'와 같은 역할을 한다고 생각하시면&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rachel0115.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연관관계 엔티티 조회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인, 패치조인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch&amp;nbsp;join은&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;join은 일단 검색 엔티티 부르고 연관 엔티티 개수 만큼 쿼리를 따로 날러 불러옴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-21 at 4.11.43 PM.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfOEs/btsHvIRQiYH/NLDMn6Pjmhm4cZwW6M9cEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfOEs/btsHvIRQiYH/NLDMn6Pjmhm4cZwW6M9cEK/img.png&quot; data-alt=&quot;em.find&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfOEs/btsHvIRQiYH/NLDMn6Pjmhm4cZwW6M9cEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfOEs%2FbtsHvIRQiYH%2FNLDMn6Pjmhm4cZwW6M9cEK%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;474&quot; height=&quot;326&quot; data-filename=&quot;Screenshot 2024-05-21 at 4.11.43 PM.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;em.find&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 한번에 불러져야하는데 jpql로 그냥 select 하거나 select join 하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연관 엔티티 개수만큼 추가 sql이 생성됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBdXQp/btsHw5SDfOT/QkkAOvaFnfRKj2JbkDNjkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBdXQp/btsHw5SDfOT/QkkAOvaFnfRKj2JbkDNjkk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;726&quot; data-filename=&quot;Screenshot 2024-05-21 at 4.12.32 PM.png&quot; width=&quot;363&quot; height=&quot;338&quot; style=&quot;width: 44.4916%; margin-right: 10px;&quot; data-widthpercent=&quot;45.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBdXQp/btsHw5SDfOT/QkkAOvaFnfRKj2JbkDNjkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBdXQp%2FbtsHw5SDfOT%2FQkkAOvaFnfRKj2JbkDNjkk%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;780&quot; height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxF5X/btsHw7JHyqU/L6aiq8BvRlnjw3nmwhTPhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxF5X/btsHw7JHyqU/L6aiq8BvRlnjw3nmwhTPhK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;762&quot; data-filename=&quot;Screenshot 2024-05-21 at 4.13.50 PM.png&quot; style=&quot;width: 54.3456%;&quot; data-widthpercent=&quot;54.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxF5X/btsHw7JHyqU/L6aiq8BvRlnjw3nmwhTPhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuxF5X%2FbtsHw7JHyqU%2FL6aiq8BvRlnjw3nmwhTPhK%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;1000&quot; height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;좌: select e from Employee e , 우: select e from Employee e join e.department&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; A,B가 연관관계를 가질때 A를 검색하면 일반 조인은 inner join으로 A에 열만 조회하고 연관 엔티티는 따로 쿼리를 날리는데 패치조인은 A와B의 모든 열을 조회.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;! 단 패치조인 할때 2개 이상의 컬랙션 존재하면 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N+1 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 select나 join 할때 연관 엔티티 개수만큼 쿼리가 n개 만큼 더 날라가는 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지연 로딩으로 이 문제를 완화 시킬 수 있음. 지연로딩 설정하면 실제 연관 엔티티를 쓸때 쿼리가 날라감.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 연관 엔티티를 모두 조회하면 결국 n+1 번의 쿼리가 실행되는건 똑같음.&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: #777777; text-align: center;&quot;&gt;select d.name from Employee e join e.department d 만 하면 일반 조인을 하더라도 n+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;일반 조인으로 연관쿼리의 필드를 불러오는 jpql 쿼리를 작성한다면 n+1문제가 일어나지않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1716275289365&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JPA] @ManyToOne 연관 관계와 Select 쿼리&quot; data-og-description=&quot;JPA의 @ManyToOne JPA에서 엔티티 간의 다대일(N : 1) 연관 관계를 설정하기 위해서는 @ManyToOne 어노테이션을 사용하는데, 이 설정의 기본 페치 전략은 EAGER 즉, 즉시 로딩 전략으로 설정되어 있다. /** * (&quot; data-og-host=&quot;developer-youngjun.tistory.com&quot; data-og-source-url=&quot;https://developer-youngjun.tistory.com/21&quot; data-og-url=&quot;https://developer-youngjun.tistory.com/21&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/M0OL2/hyV6ehrWL7/2aslB4G4yGQm9ZTy4Bkd0k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/715pw/hyV9Yqud8s/dKgEkZfKZmGHsVCAaie9W0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/W6J8z/hyV59Hdo11/su1Hp6kieJ9LCl3t5jajs0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=459_275_527_350&quot;&gt;&lt;a href=&quot;https://developer-youngjun.tistory.com/21&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer-youngjun.tistory.com/21&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/M0OL2/hyV6ehrWL7/2aslB4G4yGQm9ZTy4Bkd0k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/715pw/hyV9Yqud8s/dKgEkZfKZmGHsVCAaie9W0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/W6J8z/hyV59Hdo11/su1Hp6kieJ9LCl3t5jajs0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=459_275_527_350');&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;[JPA] @ManyToOne 연관 관계와 Select 쿼리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JPA의 @ManyToOne JPA에서 엔티티 간의 다대일(N : 1) 연관 관계를 설정하기 위해서는 @ManyToOne 어노테이션을 사용하는데, 이 설정의 기본 페치 전략은 EAGER 즉, 즉시 로딩 전략으로 설정되어 있다. /** * (&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer-youngjun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연관관계(em.find , jpql) select test&lt;/p&gt;
&lt;figure id=&quot;og_1716275291684&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JPA] @ManyToOne 연관 관계와 Select 쿼리&quot; data-og-description=&quot;JPA의 @ManyToOne JPA에서 엔티티 간의 다대일(N : 1) 연관 관계를 설정하기 위해서는 @ManyToOne 어노테이션을 사용하는데, 이 설정의 기본 페치 전략은 EAGER 즉, 즉시 로딩 전략으로 설정되어 있다. /** * (&quot; data-og-host=&quot;developer-youngjun.tistory.com&quot; data-og-source-url=&quot;https://developer-youngjun.tistory.com/21&quot; data-og-url=&quot;https://developer-youngjun.tistory.com/21&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/M0OL2/hyV6ehrWL7/2aslB4G4yGQm9ZTy4Bkd0k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/715pw/hyV9Yqud8s/dKgEkZfKZmGHsVCAaie9W0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/W6J8z/hyV59Hdo11/su1Hp6kieJ9LCl3t5jajs0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=459_275_527_350&quot;&gt;&lt;a href=&quot;https://developer-youngjun.tistory.com/21&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer-youngjun.tistory.com/21&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/M0OL2/hyV6ehrWL7/2aslB4G4yGQm9ZTy4Bkd0k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/715pw/hyV9Yqud8s/dKgEkZfKZmGHsVCAaie9W0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/W6J8z/hyV59Hdo11/su1Hp6kieJ9LCl3t5jajs0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=459_275_527_350');&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;[JPA] @ManyToOne 연관 관계와 Select 쿼리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JPA의 @ManyToOne JPA에서 엔티티 간의 다대일(N : 1) 연관 관계를 설정하기 위해서는 @ManyToOne 어노테이션을 사용하는데, 이 설정의 기본 페치 전략은 EAGER 즉, 즉시 로딩 전략으로 설정되어 있다. /** * (&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer-youngjun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔티티 그대로 반환하는게 아닌 특정 열들을 조회하는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1716279296571&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Object[]&amp;gt; results = em.createQuery(&quot;SELECT w.nickname, b.id, b.content FROM Board b JOIN b.writer w&quot;).getResultList();

for (Object[] result : results) {
    String writerNickname = (String) result[0];
    Long boardId = (Long) result[1];
    String boardContent = (String) result[2];

    System.out.println(&quot;Writer Nickname: &quot; + writerNickname);
    System.out.println(&quot;Board ID: &quot; + boardId);
    System.out.println(&quot;Board Content: &quot; + boardContent);
}&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;List&amp;lt;Object&amp;gt;를 통해 반환됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jpql 의 순서대로 들어감. 만약 b.id, n.content 대신 b 를 넣으면 result[1]은 (Board)를 해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;엔티티 수정&lt;/h4&gt;
&lt;figure id=&quot;og_1716279986499&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JPA 영속성관리 공부의 기록&quot; data-og-description=&quot;공부의 기록 시리즈는 공유하고자 적는 글이 아닙니다. 공부할때 필기 하는 습관이 있고, 모르는 내용을 메모할 공간이 필요하기 때문에 적는 글입니다. 나중에 이 글을 잘 정제하고 편집해서 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@tjeong/JPA-%EC%98%81%EC%86%8D%EC%84%B1%EA%B4%80%EB%A6%AC-%EA%B3%B5%EB%B6%80%EC%9D%98-%EA%B8%B0%EB%A1%9D&quot; data-og-url=&quot;https://velog.io/@tjeong/JPA-영속성관리-공부의-기록&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cAazKt/hyV6iKTMFE/egYloDp3ptXTdyhjlX8VeK/img.png?width=1176&amp;amp;height=646&amp;amp;face=0_0_1176_646,https://scrap.kakaocdn.net/dn/dG3XMR/hyV9T3MNm0/HszSJ70XEb8KE9XFQnAf3K/img.png?width=1176&amp;amp;height=646&amp;amp;face=0_0_1176_646,https://scrap.kakaocdn.net/dn/FOMAu/hyV59mTaqQ/nyl1Gyh4soWYf4emqpojE0/img.png?width=1936&amp;amp;height=1132&amp;amp;face=0_0_1936_1132&quot;&gt;&lt;a href=&quot;https://velog.io/@tjeong/JPA-%EC%98%81%EC%86%8D%EC%84%B1%EA%B4%80%EB%A6%AC-%EA%B3%B5%EB%B6%80%EC%9D%98-%EA%B8%B0%EB%A1%9D&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@tjeong/JPA-%EC%98%81%EC%86%8D%EC%84%B1%EA%B4%80%EB%A6%AC-%EA%B3%B5%EB%B6%80%EC%9D%98-%EA%B8%B0%EB%A1%9D&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cAazKt/hyV6iKTMFE/egYloDp3ptXTdyhjlX8VeK/img.png?width=1176&amp;amp;height=646&amp;amp;face=0_0_1176_646,https://scrap.kakaocdn.net/dn/dG3XMR/hyV9T3MNm0/HszSJ70XEb8KE9XFQnAf3K/img.png?width=1176&amp;amp;height=646&amp;amp;face=0_0_1176_646,https://scrap.kakaocdn.net/dn/FOMAu/hyV59mTaqQ/nyl1Gyh4soWYf4emqpojE0/img.png?width=1936&amp;amp;height=1132&amp;amp;face=0_0_1936_1132');&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;JPA 영속성관리 공부의 기록&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;공부의 기록 시리즈는 공유하고자 적는 글이 아닙니다. 공부할때 필기 하는 습관이 있고, 모르는 내용을 메모할 공간이 필요하기 때문에 적는 글입니다. 나중에 이 글을 잘 정제하고 편집해서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속? 비영속? 준영속?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속은 em.persist로 영속성 컨택스트로 관리되는 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비영속과 준영속 차이는 id의 여부인데 jpa는 Id가 있으면 이미 영속상태였다가 빠져나온 준영속 상태로 인식한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속 -&amp;gt; 준영속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;em.detach&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속 -&amp;gt; 비영속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;em.remove&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;db -&amp;gt; 영속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;em.find&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비영속 -&amp;gt; 영속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;em.persist&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;변경감지는 영속상태에서 그냥 변경하면 초기 상태와 비교에 알아서 db에 저장해주는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병합은 준영속 상태에 객체를 em.merge 하면 기존의 객체에 덮어 씌우는 것이다.&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;병합시 필드의 값이 없다면 null인 상태로 덮어씌워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/102</guid>
      <comments>https://dyd1310.tistory.com/102#entry102comment</comments>
      <pubDate>Mon, 20 May 2024 17:36:12 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹소켓 및 STOMP</title>
      <link>https://dyd1310.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715922470968&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] STOMP를 이용한 실시간 채팅 및 채팅방 동적 생성&quot; data-og-description=&quot;프로젝트 속 구현한 실시간 채팅은 다음과 같이 동작한다.STOMP(Simple Text Oriented Message Protocol)는 기존 WebSocket 통신 방식을 좀 더 효율적으로, 조금 더 쉽게 다룰 수 있게 해주는 프로토콜이다.이 프&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ygy0102/Spring-Boot-STOMP%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%B1%84%ED%8C%85-%EB%B0%8F-%EC%B1%84%ED%8C%85%EB%B0%A9-%EB%8F%99%EC%A0%81-%EC%83%9D%EC%84%B1&quot; data-og-url=&quot;https://velog.io/@ygy0102/Spring-Boot-STOMP를-이용한-실시간-채팅-및-채팅방-동적-생성&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cFUiP0/hyV6aSGufe/K4eCGBkztGL0XPKrgrOhc1/img.png?width=1800&amp;amp;height=1200&amp;amp;face=0_0_1800_1200,https://scrap.kakaocdn.net/dn/bfpQ4q/hyV6lGIhAg/S2K2Qyg1a4M5xjcLOQXw6K/img.png?width=1800&amp;amp;height=1200&amp;amp;face=0_0_1800_1200,https://scrap.kakaocdn.net/dn/lM4yx/hyV57hlkX3/GGRHXcQgPmrvnkgrkzPYp0/img.png?width=1800&amp;amp;height=1200&amp;amp;face=0_0_1800_1200&quot;&gt;&lt;a href=&quot;https://velog.io/@ygy0102/Spring-Boot-STOMP%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%B1%84%ED%8C%85-%EB%B0%8F-%EC%B1%84%ED%8C%85%EB%B0%A9-%EB%8F%99%EC%A0%81-%EC%83%9D%EC%84%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ygy0102/Spring-Boot-STOMP%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%B1%84%ED%8C%85-%EB%B0%8F-%EC%B1%84%ED%8C%85%EB%B0%A9-%EB%8F%99%EC%A0%81-%EC%83%9D%EC%84%B1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cFUiP0/hyV6aSGufe/K4eCGBkztGL0XPKrgrOhc1/img.png?width=1800&amp;amp;height=1200&amp;amp;face=0_0_1800_1200,https://scrap.kakaocdn.net/dn/bfpQ4q/hyV6lGIhAg/S2K2Qyg1a4M5xjcLOQXw6K/img.png?width=1800&amp;amp;height=1200&amp;amp;face=0_0_1800_1200,https://scrap.kakaocdn.net/dn/lM4yx/hyV57hlkX3/GGRHXcQgPmrvnkgrkzPYp0/img.png?width=1800&amp;amp;height=1200&amp;amp;face=0_0_1800_1200');&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;[Spring Boot] STOMP를 이용한 실시간 채팅 및 채팅방 동적 생성&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 속 구현한 실시간 채팅은 다음과 같이 동작한다.STOMP(Simple Text Oriented Message Protocol)는 기존 WebSocket 통신 방식을 좀 더 효율적으로, 조금 더 쉽게 다룰 수 있게 해주는 프로토콜이다.이 프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 http 통신은 서버가 클라이언트의 상태를 기억하지 않고 단방향으로 진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 연결이 오면 연결을 맺고 응답을 받으면 연결을 끊어버린다.&amp;nbsp; (요청단위로 통신)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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 data-ke-size=&quot;size16&quot;&gt;http 와 웹소켓 통신은 주고받는 데이터 포멧이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 웹소켓 통신에서 핸드쉐이킹이 http 프로토콜 일어나긴 하지만 연결이 되고 여러 메세지를 주고받다보면&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 data-ke-size=&quot;size16&quot;&gt;socketJS, socket.io 라이브러리를 통해 웹소켓을 지원하지않는 환경에서 비슷한 효과를 얻을 수 있음.(자바스크립트 라이브러리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스프링 웹소켓&lt;/h4&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;1. 핸드쉐이킹할 경로와 이를 처리할 핸들러를 설정해야함.&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;기본 클래스(예시 : TextWebSocketHandler)를 상속받아 구현 받으면 됨)&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;주의할 점은 웹소켓은 세션을 컬랙션을 통해 관리하는데 이 세션은 우리가 아는 http 세션이 아니라 연결할때 생기는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 정보이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;cors 관련설정이나 라이브러리 관련 설정을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스프링 STOMP&lt;/h4&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;이걸 이해하기 위해 STOMP를 이해해야한다,&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;STOMP는 이벤트 기반으로 쉽게 메시지를 주고받는 프로토콜이다.&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;발신자가 topic 으로 메세지로 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신자는 topic 을 구독하고 발신자가 보낸 메시지를 받아볼 수 있음&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;stomp가 왜 필요하지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹소켓은 텍스트 혹은 바이너리만 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 개발할때 주고 받는 형식을 정해야하는데 파싱하는 로직도 필요할것이고 부가적인게 많이 생길 수 있다.&lt;/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;STOMP는 프레임이라는 형식을 교환한다,&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 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;- 구독자들은 topic A를 구독하고 있음.&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;방법 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발신자가 topic A에 메세지를 바로 보냄 -&amp;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;방법 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발신자가 app에 메세지담아서 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; app 경로에 있는 핸들러가 메세지에 부가적인&amp;nbsp; 행동(예로 이미지 압축)을 하고 정리해서 topic A로 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;STOMP 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 브로커가 어떤 경로로 가는 메세지 처리할건지 설정해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- prefix를 지정하면 해당 prefix가 붙은 메시지는 브로커가 처리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자주쓰이는 prefix : /queue&amp;nbsp; (1:1 통신 할 때) , /topic&amp;nbsp; (단체로 통신할 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 위의 방법2를 대비해 메세지 핸들러(부가적인 처리)로 라우팅할 prefix를 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- @Controller , @MessageMapping, @SendTo 를 통해  통신가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 핸드쉐이킹할 경로를 설정 (웹소켓과 다르게 따로 핸들러를 설정하지않음)&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; /app 을 메세지 핸들러(부가적인 처리)로 라우팅할 prefix를 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715945568407&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class GreetingController{

	@MessageMapping(&quot;hello&quot;)
	@SendTo(&quot;/topic/greeting&quot;)
	public Greeting greeting(HelloMessage message) throws Exception{
   		//HtmlUtils.htmlEscape 는 xss를 예방하기 위해 씀
		return new Greeting(
        	&quot;Hello&quot; + HtmlUtils.htmlEscape(message.getName()) + &quot;!&quot;
        );
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발신자가 /app/hello 에 메시지를 보내면 이름을 추출하고 hello를 붙어서 Greeting 객체로 만들어 /topic/greeting에 보냄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 브로커가 Greeting 객체를 /topic/greeting를 구독하는 구독자에게 메시지를 보내줌.&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 data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황 설명 : /add 가 핸드쉐이킹할 경로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. /add 로 socket 객체를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. socket을 통해 클라이언트 객체를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 클라이언트는 /topic/greeting 경로로 구독한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/101</guid>
      <comments>https://dyd1310.tistory.com/101#entry101comment</comments>
      <pubDate>Sun, 19 May 2024 02:17:25 +0900</pubDate>
    </item>
    <item>
      <title>xcode 시뮬레이터 더미데이터 삭제하기</title>
      <link>https://dyd1310.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 발생 : xcode 업데이트 후 시뮬레이터를 새로 까는데 도중에 실패함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리를 확인하는데 분명 도중에 실패했는데도 system data 에 해당하는 데이터 크기는 늘어나는 것을 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 해결 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 xcode &amp;gt; setting &amp;gt; location 에 적힌 경로에 들어가서 ls -alsh 로 파일 크기를 탐색했는데 크기가 큰 찾아지는 파일이 없었다.&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 data-ke-size=&quot;size16&quot;&gt;터미널에서 sudo find / -type f -size +6G 명령어 를 이용해 6기가 이상의 파일을 찾았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/Library/Developer/CoreSimulator/Cryptex/Images/Inbox&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;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/100</guid>
      <comments>https://dyd1310.tistory.com/100#entry100comment</comments>
      <pubDate>Fri, 17 May 2024 11:28:29 +0900</pubDate>
    </item>
    <item>
      <title>스프링 시큐리티 필터</title>
      <link>https://dyd1310.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시큐리티 필터 이론&lt;/p&gt;
&lt;figure id=&quot;og_1715757876189&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Security] Spring Security Filter Chain 에 대해&quot; data-og-description=&quot;안녕하세요 오늘은 Spring Security 에서 인증,인가 과정을 담당하는 Security Filter Chain 에 대해 알아보겠습니다.Security Filter Chain 이란 Spring Security 에서 제공하는 인증,인가를 위한 필터들의 모음입니&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@choidongkuen/Spring-Security-Spring-Security-Filter-Chain-%EC%97%90-%EB%8C%80%ED%95%B4&quot; data-og-url=&quot;https://velog.io/@choidongkuen/Spring-Security-Spring-Security-Filter-Chain-에-대해&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/P6kIY/hyV6hRgOGO/YSTBfVgmOjHrf2FXnQIc60/img.png?width=788&amp;amp;height=343&amp;amp;face=0_0_788_343,https://scrap.kakaocdn.net/dn/oY9zV/hyV2BDRwCt/31890ePaQ2pmlZ83lFKXrk/img.png?width=788&amp;amp;height=343&amp;amp;face=0_0_788_343,https://scrap.kakaocdn.net/dn/tHHZ8/hyV2wJjYWg/yyzB7B65SIxAgYKEs8wZi1/img.png?width=2742&amp;amp;height=1470&amp;amp;face=0_0_2742_1470&quot;&gt;&lt;a href=&quot;https://velog.io/@choidongkuen/Spring-Security-Spring-Security-Filter-Chain-%EC%97%90-%EB%8C%80%ED%95%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@choidongkuen/Spring-Security-Spring-Security-Filter-Chain-%EC%97%90-%EB%8C%80%ED%95%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/P6kIY/hyV6hRgOGO/YSTBfVgmOjHrf2FXnQIc60/img.png?width=788&amp;amp;height=343&amp;amp;face=0_0_788_343,https://scrap.kakaocdn.net/dn/oY9zV/hyV2BDRwCt/31890ePaQ2pmlZ83lFKXrk/img.png?width=788&amp;amp;height=343&amp;amp;face=0_0_788_343,https://scrap.kakaocdn.net/dn/tHHZ8/hyV2wJjYWg/yyzB7B65SIxAgYKEs8wZi1/img.png?width=2742&amp;amp;height=1470&amp;amp;face=0_0_2742_1470');&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;[Spring Security] Spring Security Filter Chain 에 대해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 오늘은 Spring Security 에서 인증,인가 과정을 담당하는 Security Filter Chain 에 대해 알아보겠습니다.Security Filter Chain 이란 Spring Security 에서 제공하는 인증,인가를 위한 필터들의 모음입니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 이전에 필터에 대해서&amp;nbsp; 공부했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FilterRegistrationBean 을 사용하여 필터를 등록했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 등록된 필터들은 여러 필터들이 모여 체인을 형성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서블릿 컨테이너가 요청 URI 경로를 보고 필터를 거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.02.38 PM.png&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vdfii/btsHquydcNx/C420kLt6iLOAqowklByr81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vdfii/btsHquydcNx/C420kLt6iLOAqowklByr81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vdfii/btsHquydcNx/C420kLt6iLOAqowklByr81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVdfii%2FbtsHquydcNx%2FC420kLt6iLOAqowklByr81%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;519&quot; height=&quot;618&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.02.38 PM.png&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 서블릿 필터중 delegatingFiilterProxy가 있고 해당 필터 내부에는 delegatingFiilterProxy의 작업을 위임받아 처리하는 FilterChainProxy가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 보통 securityConfig를 할때 등록되는 필터들은 이 filterChainProxy에 등록된다고 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.08.38 PM.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;1380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPqxbQ/btsHqx9wbeS/OAJ2YBaz0ebEYWEAsoIG81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPqxbQ/btsHqx9wbeS/OAJ2YBaz0ebEYWEAsoIG81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPqxbQ/btsHqx9wbeS/OAJ2YBaz0ebEYWEAsoIG81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPqxbQ%2FbtsHqx9wbeS%2FOAJ2YBaz0ebEYWEAsoIG81%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;660&quot; height=&quot;634&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.08.38 PM.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;1380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filterChainProxy의 필터 종류&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.11.37 PM.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WWDde/btsHqOQI6hY/kTskW0qymuaHansr2PU7j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WWDde/btsHqOQI6hY/kTskW0qymuaHansr2PU7j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WWDde/btsHqOQI6hY/kTskW0qymuaHansr2PU7j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWWDde%2FbtsHqOQI6hY%2FkTskW0qymuaHansr2PU7j1%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;1458&quot; height=&quot;792&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.11.37 PM.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 수많은 기본 필터들이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 config할때 UsernamePasswordAuthenticationFilter 앞에 커스텀한 jwt 필터를 추가할때가 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filterChainProxy을 알아야 어느 위치에 어떤 필터를 추가할지 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림에서 Spring Security 을 위한 설정 클래스임을 정의하기 위해 WebSecurityConfigurerAdapter라고 정의되어있지만 과거 방식이고&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception&lt;/code&gt;&lt;/pre&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 data-ke-size=&quot;size16&quot;&gt;1. Security Context 복원 혹은 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 사용자&amp;nbsp;이름과&amp;nbsp;비밀번호를&amp;nbsp;추출하여&amp;nbsp;UsernamePasswordAuthenticationToken&amp;nbsp;객체를&amp;nbsp;생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 인증 매니저가 토큰을 처리할 수 있는 인증 프로바이더를 찾고 토큰 처리를 위임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. userDetailService에서 회원 정보 로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. UsernamePasswordAuthenticationToken과 회원 정보를 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 성공시 Authentication 객체를 만들어 Security Context에 보관&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. HttpSession 의 Attribute에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Security Context&lt;span&gt;&amp;nbsp;저장&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;단순히 2가지 필터만 놓고 봤을때&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;&lt;span&gt;SecurityContextPersistenceFilter 시작 -&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;UsernamePasswordAuthenticationFilter 시작 -&amp;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;&lt;span&gt; 인증 객체 컨텍스트에 저장-&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;UsernamePasswordAuthenticationFilter 끝 -&amp;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;&lt;span&gt;컨텍스트 저장 -&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;SecurityContextPersistenceFilter 끝&amp;nbsp;&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;&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;Security Context? &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Authentication&lt;span&gt; ?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 로그인하면 필터링을 하면서 정보를 검증하고 성공하면 Authentication 객체를 만든다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 서버에서 전역적으로 접근 가능하도록 저장소에 이를 보관해야하고 이 저장소를 ThreadLocal에 저장시켜 전역적으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 가능하도록 만들어야한다. ThreadLocal을 가지는 객체가 Contextholder이고 인증 객체를 저장하는 것이 securityContext이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.29.38 PM.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dF1Bmv/btsHp32bYZI/kI7YoKvQGs3qUazVrj0ry1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dF1Bmv/btsHp32bYZI/kI7YoKvQGs3qUazVrj0ry1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dF1Bmv/btsHp32bYZI/kI7YoKvQGs3qUazVrj0ry1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdF1Bmv%2FbtsHp32bYZI%2FkI7YoKvQGs3qUazVrj0ry1%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;498&quot; height=&quot;480&quot; data-filename=&quot;Screenshot 2024-05-15 at 4.29.38 PM.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서는 2가지 필터만 놓고 봤지만 더 다양한 필터가 존재하고 더 다양한 로직((세션 관리, 페이지 생성, 로그아웃 ,&amp;nbsp; 캐시 등)이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SecurityContextPersistenceFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LogoutFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UsernamePasswordAuthenticationFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DefaultLoginPageGeneratingFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BasicAuthenticationFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RequestCacheAwareFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SecurityContextHolderAwareRequestFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AnonymousAuthenticationFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SessionManagementFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ExceptionTranslationFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FilterSecurityInterceptor&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;figure id=&quot;og_1716194262834&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Security] 로그인과 권한 설정&quot; data-og-description=&quot;주의 : Spring Security 5.7+ (Spring Boot 2.7+)부터는 WebSecurityConfigurer이 Deprecated 되었다. 2022.09.05 - [Spring/Security] - [Security] WebSecurityConfigurerAdapter Deprecated [Security] WebSecurityConfigurerAdapter Deprecated 버전 Java 11 S&quot; data-og-host=&quot;twer.tistory.com&quot; data-og-source-url=&quot;https://twer.tistory.com/entry/Security-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B3%BC-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95&quot; data-og-url=&quot;https://twer.tistory.com/entry/Security-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B3%BC-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2cYtz/hyV91HmcFy/Ky5PQQqr2ZlKzCjQDjxKd1/img.png?width=442&amp;amp;height=224&amp;amp;face=0_0_442_224,https://scrap.kakaocdn.net/dn/UYHyQ/hyV9MQWZTy/fb8ADUb0uM5SG6oKSF0i31/img.png?width=442&amp;amp;height=224&amp;amp;face=0_0_442_224,https://scrap.kakaocdn.net/dn/XATfT/hyV91US2S5/qIZv14lJhUHQodOt2Xw9K1/img.png?width=438&amp;amp;height=267&amp;amp;face=0_0_438_267&quot;&gt;&lt;a href=&quot;https://twer.tistory.com/entry/Security-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B3%BC-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://twer.tistory.com/entry/Security-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B3%BC-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2cYtz/hyV91HmcFy/Ky5PQQqr2ZlKzCjQDjxKd1/img.png?width=442&amp;amp;height=224&amp;amp;face=0_0_442_224,https://scrap.kakaocdn.net/dn/UYHyQ/hyV9MQWZTy/fb8ADUb0uM5SG6oKSF0i31/img.png?width=442&amp;amp;height=224&amp;amp;face=0_0_442_224,https://scrap.kakaocdn.net/dn/XATfT/hyV91US2S5/qIZv14lJhUHQodOt2Xw9K1/img.png?width=438&amp;amp;height=267&amp;amp;face=0_0_438_267');&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;[Security] 로그인과 권한 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주의 : Spring Security 5.7+ (Spring Boot 2.7+)부터는 WebSecurityConfigurer이 Deprecated 되었다. 2022.09.05 - [Spring/Security] - [Security] WebSecurityConfigurerAdapter Deprecated [Security] WebSecurityConfigurerAdapter Deprecated 버전 Java 11 S&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;twer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라가면 jwt 관련 내용 나옴&lt;/p&gt;
&lt;figure id=&quot;og_1716880960440&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Spring Security를 이용한 로그인 구현 (스프링부트 3.X 버전) [1] - 동작 원리 및 Config 설정&quot; data-og-description=&quot;스프링 부트 3.0 이상 버전의 시큐리티 사용법 및 바뀐 Config 작성법을 다루고 있습니다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dh1010a/Spring-Spring-Security%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-3.X-%EB%B2%84%EC%A0%84-1&quot; data-og-url=&quot;https://velog.io/@dh1010a/Spring-Spring-Security를-이용한-로그인-구현-스프링부트-3.X-버전-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cpRpv3/hyWdsykuRd/pi54Yvi6KpKno749TgQ8fK/img.png?width=698&amp;amp;height=377&amp;amp;face=0_0_698_377,https://scrap.kakaocdn.net/dn/cPdIZ5/hyWdiCuYe6/5D7nEk0JRhudxirhOnUv21/img.png?width=698&amp;amp;height=377&amp;amp;face=0_0_698_377,https://scrap.kakaocdn.net/dn/bJyEqy/hyWdd2fvWK/WRFBCiGEMPE434BGG78ILk/img.png?width=1042&amp;amp;height=612&amp;amp;face=0_0_1042_612&quot;&gt;&lt;a href=&quot;https://velog.io/@dh1010a/Spring-Spring-Security%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-3.X-%EB%B2%84%EC%A0%84-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dh1010a/Spring-Spring-Security%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-3.X-%EB%B2%84%EC%A0%84-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cpRpv3/hyWdsykuRd/pi54Yvi6KpKno749TgQ8fK/img.png?width=698&amp;amp;height=377&amp;amp;face=0_0_698_377,https://scrap.kakaocdn.net/dn/cPdIZ5/hyWdiCuYe6/5D7nEk0JRhudxirhOnUv21/img.png?width=698&amp;amp;height=377&amp;amp;face=0_0_698_377,https://scrap.kakaocdn.net/dn/bJyEqy/hyWdd2fvWK/WRFBCiGEMPE434BGG78ILk/img.png?width=1042&amp;amp;height=612&amp;amp;face=0_0_1042_612');&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;[Spring] Spring Security를 이용한 로그인 구현 (스프링부트 3.X 버전) [1] - 동작 원리 및 Config 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 부트 3.0 이상 버전의 시큐리티 사용법 및 바뀐 Config 작성법을 다루고 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/99</guid>
      <comments>https://dyd1310.tistory.com/99#entry99comment</comments>
      <pubDate>Wed, 15 May 2024 17:03:26 +0900</pubDate>
    </item>
    <item>
      <title>스프링 Aop</title>
      <link>https://dyd1310.tistory.com/98</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;p data-ke-size=&quot;size16&quot;&gt;AOP는 OOP를 보완하기 위해 나온 개념으로 관점 지향 프로그래밍을 말한다.&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;AOP를 정확히 이해하기 위해선 advise, joinPoint, pointcut을 이해하는것이 중요하다.&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;advise는 가로챈 메소드의 어느 시점에 시행되는가를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pointcut은 특정 어노테이션, 특정 url 패턴을 만족하는지 여부를 catch한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;joinPoint는 해당 메서드 이름, 파라미터 타입 및 값등을 조회할 수 있도록 만든다.&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;aop는 공통적으로 로깅, 트랜젝션 관리, 권한, 디코딩 인코딩, 이미지 압축 같은 부분에서 사용될 수 있다.&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/98</guid>
      <comments>https://dyd1310.tistory.com/98#entry98comment</comments>
      <pubDate>Tue, 14 May 2024 17:48:31 +0900</pubDate>
    </item>
    <item>
      <title>스프링 필터 vs 인터셉터</title>
      <link>https://dyd1310.tistory.com/97</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;필터&lt;/h3&gt;
&lt;figure id=&quot;og_1715666888940&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] 스프링 부트 필터 적용 (Filter)&quot; data-og-description=&quot;목차 1. 필터를 왜 쓰나요? 결론부터 말하면 공통부분을 따로 작성하여 중복 소스를 줄이고 소스 관리도 쉬워져 유지보수에 좋습니다. Spring (자바) 개발을 하다 보면 공통적으로 처리해야 할 부&quot; data-og-host=&quot;veneas.tistory.com&quot; data-og-source-url=&quot;https://veneas.tistory.com/entry/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%ED%95%84%ED%84%B0-%EC%A0%81%EC%9A%A9-Filter#1._%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0%EB%A5%BC_%EC%99%9C_%EC%93%B0%EB%82%98%EC%9A%94?&quot; data-og-url=&quot;https://veneas.tistory.com/entry/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%ED%95%84%ED%84%B0-%EC%A0%81%EC%9A%A9-Filter&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Y4IIr/hyV2AEMMId/QzQkdXUla5BN7jkuP7WmuK/img.png?width=800&amp;amp;height=340&amp;amp;face=0_0_800_340,https://scrap.kakaocdn.net/dn/y7oDb/hyV6k1lEkl/Vhq0GD31QDkknUfUydDQPk/img.png?width=1280&amp;amp;height=544&amp;amp;face=0_0_1280_544&quot;&gt;&lt;a href=&quot;https://veneas.tistory.com/entry/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%ED%95%84%ED%84%B0-%EC%A0%81%EC%9A%A9-Filter#1._%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0%EB%A5%BC_%EC%99%9C_%EC%93%B0%EB%82%98%EC%9A%94?&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://veneas.tistory.com/entry/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%ED%95%84%ED%84%B0-%EC%A0%81%EC%9A%A9-Filter#1._%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0%EB%A5%BC_%EC%99%9C_%EC%93%B0%EB%82%98%EC%9A%94?&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Y4IIr/hyV2AEMMId/QzQkdXUla5BN7jkuP7WmuK/img.png?width=800&amp;amp;height=340&amp;amp;face=0_0_800_340,https://scrap.kakaocdn.net/dn/y7oDb/hyV6k1lEkl/Vhq0GD31QDkknUfUydDQPk/img.png?width=1280&amp;amp;height=544&amp;amp;face=0_0_1280_544');&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;[Spring Boot] 스프링 부트 필터 적용 (Filter)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 1. 필터를 왜 쓰나요? 결론부터 말하면 공통부분을 따로 작성하여 중복 소스를 줄이고 소스 관리도 쉬워져 유지보수에 좋습니다. Spring (자바) 개발을 하다 보면 공통적으로 처리해야 할 부&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;veneas.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715668679952&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;spring - 스프링에서의 필터 개념 및 예제&quot; data-og-description=&quot;블로그에서 사용한 소스코드는 https://github.com/97e57e/BLOG 에서 보실 수 있습니다. Filter 란? 사실 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능입니다. 스프링 프레임워크&quot; data-og-host=&quot;gardeny.tistory.com&quot; data-og-source-url=&quot;https://gardeny.tistory.com/35&quot; data-og-url=&quot;https://gardeny.tistory.com/35&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yqj60/hyV6coIvlq/HkXKyoIn8EK8RgplJKWNoK/img.png?width=800&amp;amp;height=685&amp;amp;face=0_0_800_685,https://scrap.kakaocdn.net/dn/vh0tQ/hyV2D2A7P8/EcVtRHLdUK2jmq0MiM48K1/img.png?width=2492&amp;amp;height=624&amp;amp;face=0_0_2492_624&quot;&gt;&lt;a href=&quot;https://gardeny.tistory.com/35&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gardeny.tistory.com/35&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yqj60/hyV6coIvlq/HkXKyoIn8EK8RgplJKWNoK/img.png?width=800&amp;amp;height=685&amp;amp;face=0_0_800_685,https://scrap.kakaocdn.net/dn/vh0tQ/hyV2D2A7P8/EcVtRHLdUK2jmq0MiM48K1/img.png?width=2492&amp;amp;height=624&amp;amp;face=0_0_2492_624');&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;spring - 스프링에서의 필터 개념 및 예제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;블로그에서 사용한 소스코드는 https://github.com/97e57e/BLOG 에서 보실 수 있습니다. Filter 란? 사실 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능입니다. 스프링 프레임워크&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gardeny.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필터 적용시키기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Filter를 implements하는 필터 클래스를 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. FilterRegistrationBean에 필터를 넣어 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. FilterRegistrationBean에 필터링할 URL 패턴 혹은 순서를 set한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터 인터페이스는 3가지 메소드를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. init&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. doFilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. destroy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715667229154&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{
	//todo
    filterChain.doFilter(servletRequest, servletResponse);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분이 매우 중요한데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filterChain.doFilter를 통해 다음 필터, 혹은 컨트롤러의 메소드로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 request와 response를 넘겨줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request 헤더에 토큰을 추가하거나 body로 온 이미지를 압축하여 다시 넣어주는 등의 로직을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 dofilter가 끝난 후 response를 조작할 수도 있다.&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;필터 1 시작 -&amp;gt; 필터 2 시작 -&amp;gt; 컨트롤러 동작 -&amp;gt; 필터2 끝 -&amp;gt; 필터 1 끝&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;동작과정을 생각하며 request와 response를 제어하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필터 종류&lt;/h4&gt;
&lt;figure id=&quot;og_1715669835871&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring boot Filter&quot; data-og-description=&quot;일하면서 filter를 쓰게 되었는데 구글링하면서 급하게 쓰게 되니 개념들이 흩어져 있는 것 같아서 이 기회...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/fbfbf1/223021249026&quot; data-og-url=&quot;https://blog.naver.com/fbfbf1/223021249026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iscBq/hyV2A5SHoo/u48kSa6Hmk3ilziqaJ0kaK/img.png?width=743&amp;amp;height=509&amp;amp;face=0_0_743_509&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/fbfbf1/223021249026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/fbfbf1/223021249026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iscBq/hyV2A5SHoo/u48kSa6Hmk3ilziqaJ0kaK/img.png?width=743&amp;amp;height=509&amp;amp;face=0_0_743_509');&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;Spring boot Filter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일하면서 filter를 쓰게 되었는데 구글링하면서 급하게 쓰게 되니 개념들이 흩어져 있는 것 같아서 이 기회...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;OncePerRequestFilter로 요청을 한번만 처리하는게 어떠한 의미인지 위의 포스팅에 적절한 예시가 나와있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필터의 예외처리&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필터는 디스패처 서블릿 전에 동작하는데&lt;span&gt;&amp;nbsp;&lt;/span&gt;@ControllerAdvice, @ExceptionHandler 는 이를 잡아내지 못한다.&lt;/p&gt;
&lt;figure id=&quot;og_1715670119749&quot; style=&quot;color: #333333; text-align: start;&quot; contenteditable=&quot;false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yL7GV/hyV6iboa5D/jUAXWPC8JN9Uc8qKkd100k/img.jpg?width=820&amp;amp;height=442&amp;amp;face=0_0_820_442,https://scrap.kakaocdn.net/dn/lfSvN/hyV2tySrOb/d0btnNnO49b7Dc16bF5xUK/img.jpg?width=820&amp;amp;height=442&amp;amp;face=0_0_820_442,https://scrap.kakaocdn.net/dn/cqomYg/hyV2oEjfOq/TCkFIAFJknpJRmWQxK6st1/img.png?width=2000&amp;amp;height=398&amp;amp;face=0_0_2000_398&quot; data-og-url=&quot;https://velog.io/@kimdy0915/Spring-Security-Filter-예외처리는-어떻게-할까&quot; data-og-source-url=&quot;https://velog.io/@kimdy0915/Spring-Security-Filter-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%A0%EA%B9%8C&quot; data-og-host=&quot;velog.io&quot; data-og-description=&quot;  Spring Security 를 이용해서 토큰을 검증하고 인증된 사용자 정보를 담은 객체를 생성했다. 이 과정에서 토큰이 유효하지 않은 경우, 예외처리를 하려고 한다. 예외처리를 어떻게 할 수 있는지&quot; data-og-title=&quot;[Spring Security] Filter 예외처리는 어떻게 할까?&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://velog.io/@kimdy0915/Spring-Security-Filter-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%A0%EA%B9%8C&quot; data-source-url=&quot;https://velog.io/@kimdy0915/Spring-Security-Filter-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%A0%EA%B9%8C&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;[Spring Security] Filter 예외처리는 어떻게 할까?&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;  Spring Security 를 이용해서 토큰을 검증하고 인증된 사용자 정보를 담은 객체를 생성했다. 이 과정에서 토큰이 유효하지 않은 경우, 예외처리를 하려고 한다. 예외처리를 어떻게 할 수 있는지&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 필터 내부에서 예외처리를 해야한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;figure id=&quot;og_1715669335439&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 스프링 인터셉터(Interceptor)&quot; data-og-description=&quot;스프링 인터셉터(Interceptor)란? interceptor는 위 처럼 가로챈다는 뜻을 갖습니다. 즉, 스프링 interceptor란 요청을 가로채서 개발자가 원하는 동작을 추가하는 역할을 합니다. 왜 interceptor를 사용해야&quot; data-og-host=&quot;hstory0208.tistory.com&quot; data-og-source-url=&quot;https://hstory0208.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0Interceptor&quot; data-og-url=&quot;https://hstory0208.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0Interceptor&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HmdBp/hyV2woQ05b/jqBN2cfbQjakZiP5d5jIC0/img.png?width=382&amp;amp;height=196&amp;amp;face=0_0_382_196,https://scrap.kakaocdn.net/dn/F0kSt/hyV6kUz59e/MvrkElk8frVoP7ra8G77x0/img.png?width=382&amp;amp;height=196&amp;amp;face=0_0_382_196&quot;&gt;&lt;a href=&quot;https://hstory0208.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0Interceptor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hstory0208.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0Interceptor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HmdBp/hyV2woQ05b/jqBN2cfbQjakZiP5d5jIC0/img.png?width=382&amp;amp;height=196&amp;amp;face=0_0_382_196,https://scrap.kakaocdn.net/dn/F0kSt/hyV6kUz59e/MvrkElk8frVoP7ra8G77x0/img.png?width=382&amp;amp;height=196&amp;amp;face=0_0_382_196');&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;[Spring] 스프링 인터셉터(Interceptor)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 인터셉터(Interceptor)란? interceptor는 위 처럼 가로챈다는 뜻을 갖습니다. 즉, 스프링 interceptor란 요청을 가로채서 개발자가 원하는 동작을 추가하는 역할을 합니다. 왜 interceptor를 사용해야&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hstory0208.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715667557262&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1)&quot; data-og-description=&quot;Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보고자 &quot; data-og-host=&quot;mangkyu.tistory.com&quot; data-og-source-url=&quot;https://mangkyu.tistory.com/173&quot; data-og-url=&quot;https://mangkyu.tistory.com/173&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rkFt0/hyV6fMuqyI/d5Ko3ZWRm6vDb8WCCUTuXk/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/6O7vs/hyV6hct7Rq/fMSGoz1U2LfLFbOnbkkflk/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/bCZ0A3/hyV2EHbjVB/9mk1O7fUI3MkVIc0GKxLL1/img.png?width=2306&amp;amp;height=872&amp;amp;face=0_0_2306_872&quot;&gt;&lt;a href=&quot;https://mangkyu.tistory.com/173&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mangkyu.tistory.com/173&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rkFt0/hyV6fMuqyI/d5Ko3ZWRm6vDb8WCCUTuXk/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/6O7vs/hyV6hct7Rq/fMSGoz1U2LfLFbOnbkkflk/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/bCZ0A3/hyV2EHbjVB/9mk1O7fUI3MkVIc0GKxLL1/img.png?width=2306&amp;amp;height=872&amp;amp;face=0_0_2306_872');&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;[Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보고자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mangkyu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인터셉터 적용시키기&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. HandlerInterceptor를 implements하는 인터셉터 클래스를 구현&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. InterceptorRegistry에 커스텀 인터셉터를 넣어 생성&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;InterceptorRegistry에&lt;/span&gt; 필터링할 URL 패턴 혹은 순서를 set한다.&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;인터셉터같은 경우 fillterChain.doFillter로 다음 필터 혹은 컨트롤러로 넘어간 필터와 다르게 override한 함수의 반환값을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서를 제어한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true인 경우 다음 인터셉터 혹은 컨트롤러를 실행한다.&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;여기서 중요한점이 HttpServletRequest에서 body는 한번 읽으면 뒤에 읽을 수 없다. 레퍼나 여러 방식을 이용해 수정할 수 있다. 하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접적인 수정은 뒤에 예기치않은 결과를 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HttpServletRequest 참고&lt;/p&gt;
&lt;figure id=&quot;og_1715671187881&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[spring] 서블릿 컨테이너와 HttpServletRequest, HttpServletResponse 활용 방법&quot; data-og-description=&quot;  ✏️ 서블릿 컨테이너의 역할과 HttpServletRequest, HttpServletResponse를 사용하여 HTTP 요청/응답 메시지를 사용하는 기본적인 방법을 학습하고 정리한 포스팅입니다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@woply/spring-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-HttpServletRequest-HttpServletResponse-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EB%B2%95&quot; data-og-url=&quot;https://velog.io/@woply/spring-서블릿-컨테이너와-HttpServletRequest-HttpServletResponse-활용-방법&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zdfrx/hyV2Ef7p2B/07e9FkWc34KozZnSSQ7hpK/img.png?width=3529&amp;amp;height=1851&amp;amp;face=0_0_3529_1851,https://scrap.kakaocdn.net/dn/ejiAHH/hyV2oRRRqT/p9gei2Hq0xcMtwPiXvqARK/img.png?width=3529&amp;amp;height=1851&amp;amp;face=0_0_3529_1851,https://scrap.kakaocdn.net/dn/eGqpJB/hyV6coIYNr/5iFASJk0GHb3LfB7999L2k/img.png?width=3529&amp;amp;height=1851&amp;amp;face=0_0_3529_1851&quot;&gt;&lt;a href=&quot;https://velog.io/@woply/spring-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-HttpServletRequest-HttpServletResponse-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@woply/spring-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-HttpServletRequest-HttpServletResponse-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EB%B2%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zdfrx/hyV2Ef7p2B/07e9FkWc34KozZnSSQ7hpK/img.png?width=3529&amp;amp;height=1851&amp;amp;face=0_0_3529_1851,https://scrap.kakaocdn.net/dn/ejiAHH/hyV2oRRRqT/p9gei2Hq0xcMtwPiXvqARK/img.png?width=3529&amp;amp;height=1851&amp;amp;face=0_0_3529_1851,https://scrap.kakaocdn.net/dn/eGqpJB/hyV6coIYNr/5iFASJk0GHb3LfB7999L2k/img.png?width=3529&amp;amp;height=1851&amp;amp;face=0_0_3529_1851');&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;[spring] 서블릿 컨테이너와 HttpServletRequest, HttpServletResponse 활용 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  ✏️ 서블릿 컨테이너의 역할과 HttpServletRequest, HttpServletResponse를 사용하여 HTTP 요청/응답 메시지를 사용하는 기본적인 방법을 학습하고 정리한 포스팅입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/97</guid>
      <comments>https://dyd1310.tistory.com/97#entry97comment</comments>
      <pubDate>Tue, 14 May 2024 16:22:05 +0900</pubDate>
    </item>
    <item>
      <title>스프링 intellij 디버깅</title>
      <link>https://dyd1310.tistory.com/96</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-14 at 1.58.07 PM.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBEtDq/btsHpb6Roqw/w5lRoGz6ldiaWRxnYRkZa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBEtDq/btsHpb6Roqw/w5lRoGz6ldiaWRxnYRkZa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBEtDq/btsHpb6Roqw/w5lRoGz6ldiaWRxnYRkZa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBEtDq%2FbtsHpb6Roqw%2Fw5lRoGz6ldiaWRxnYRkZa1%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;576&quot; height=&quot;192&quot; data-filename=&quot;Screenshot 2024-05-14 at 1.58.07 PM.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 재개를 통해 다음 브레이크&amp;nbsp; 포인트로 이동할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스탭 오버를 통해 다음 줄로 넘어갈 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스탭 인투는 해당 코드라인의 내부로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IoC 와 라이브러리의 사용때문에 스탭 인투를 하다보면 예상치 못한 장소로 이동할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스탭 아웃은 진입한 함수내에서 해당 함수를 끝냄. 해당 함수에서 문제가 없을때 사용.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.00.07 PM.png&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnvP5d/btsHovSk0dB/UtSTK9kbdloWGH9Fk5Zivk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnvP5d/btsHovSk0dB/UtSTK9kbdloWGH9Fk5Zivk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnvP5d/btsHovSk0dB/UtSTK9kbdloWGH9Fk5Zivk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnvP5d%2FbtsHovSk0dB%2FUtSTK9kbdloWGH9Fk5Zivk%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;1338&quot; height=&quot;278&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.00.07 PM.png&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join 함수를 디버깅한다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 중복회원이 있어 validationDuplicationMember에서 에러가 난다고 생각하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;save를 실행하지 못하고 에러 핸들러쪽으로 이동하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러가 나는 경우 의도된 흐름과 다르게 흘러가기 때문에 validationDuplicationMember에도 중단점을 찍거나 스탭 인투로 진입해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스탭 오버를 사용하며 해당 함수가 에러가 없는지 확인해나가야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.20.24 PM.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM4cYy/btsHnVxbf3c/8T5ltOJgRKDfoVuFVswHUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM4cYy/btsHnVxbf3c/8T5ltOJgRKDfoVuFVswHUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM4cYy/btsHnVxbf3c/8T5ltOJgRKDfoVuFVswHUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM4cYy%2FbtsHnVxbf3c%2F8T5ltOJgRKDfoVuFVswHUK%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;1598&quot; height=&quot;492&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.20.24 PM.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에 디버깅 창을 보면 한눈에보기가 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;를 클릭해 확인 할 수 도 있겠지만 하나하나 보기가 번거롭다면 watch를 등록하여 내가 원하는 정보만 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드라인의 스코프에서 쓸수있는 모든 함수를 실행할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-14 at 1.56.41 PM.png&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFQ9JB/btsHoepCE04/vXlfKX88SZsXu79ldq8jAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFQ9JB/btsHoepCE04/vXlfKX88SZsXu79ldq8jAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFQ9JB/btsHoepCE04/vXlfKX88SZsXu79ldq8jAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFQ9JB%2FbtsHoepCE04%2FvXlfKX88SZsXu79ldq8jAK%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;1690&quot; height=&quot;608&quot; data-filename=&quot;Screenshot 2024-05-14 at 1.56.41 PM.png&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅을 하다보면 for의 반복 횟수가 많은 경우 확인하기 어려울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 경우 중단점 우클릭으로 조건을 걸어&amp;nbsp; 원하는 조건일때 멈춰 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.31.27 PM.png&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQkJg/btsHqteibrH/TeF2zKupQEgEMbjKNQLd4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQkJg/btsHqteibrH/TeF2zKupQEgEMbjKNQLd4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQkJg/btsHqteibrH/TeF2zKupQEgEMbjKNQLd4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQkJg%2FbtsHqteibrH%2FTeF2zKupQEgEMbjKNQLd4k%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;450&quot; height=&quot;592&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.31.27 PM.png&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.28.00 PM.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf3svK/btsHnX2RSy8/9KPWxIYV9F9k7RaokcAF00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf3svK/btsHnX2RSy8/9KPWxIYV9F9k7RaokcAF00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf3svK/btsHnX2RSy8/9KPWxIYV9F9k7RaokcAF00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf3svK%2FbtsHnX2RSy8%2F9KPWxIYV9F9k7RaokcAF00%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;525&quot; height=&quot;484&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.28.00 PM.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.32.03 PM.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;1514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brRGZC/btsHpzT2yNd/xkekCpneTbraNfPHaldXhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brRGZC/btsHpzT2yNd/xkekCpneTbraNfPHaldXhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brRGZC/btsHpzT2yNd/xkekCpneTbraNfPHaldXhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrRGZC%2FbtsHpzT2yNd%2FxkekCpneTbraNfPHaldXhk%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;492&quot; height=&quot;603&quot; data-filename=&quot;Screenshot 2024-05-14 at 2.32.03 PM.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;1514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러줄을 입력하고 싶으면 표현식 평가 &amp;gt; 펼치기 를 눌러 작성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/96</guid>
      <comments>https://dyd1310.tistory.com/96#entry96comment</comments>
      <pubDate>Tue, 14 May 2024 14:40:34 +0900</pubDate>
    </item>
    <item>
      <title>스프링 Process 617 is still running</title>
      <link>https://dyd1310.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/77003028/error-while-opening-intellij-idea-due-to-an-already-running-process&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/77003028/error-while-opening-intellij-idea-due-to-an-already-running-process&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715662168467&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Error while opening Intellij IDEA due to an already running process&quot; data-og-description=&quot;I am trying to open the Intellij IDEA on Mac, but it is showing the following error: Cannot connect to already running IDE instance. Exception: Process 464 is still I was able to open Intellij&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/77003028/error-while-opening-intellij-idea-due-to-an-already-running-process&quot; data-og-url=&quot;https://stackoverflow.com/questions/77003028/error-while-opening-intellij-idea-due-to-an-already-running-process&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHlQ6b/hyV6flpWOB/o6MEWnOyrW5hnp02X4hqkK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/77003028/error-while-opening-intellij-idea-due-to-an-already-running-process&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/77003028/error-while-opening-intellij-idea-due-to-an-already-running-process&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHlQ6b/hyV6flpWOB/o6MEWnOyrW5hnp02X4hqkK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;Error while opening Intellij IDEA due to an already running process&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I am trying to open the Intellij IDEA on Mac, but it is showing the following error: Cannot connect to already running IDE instance. Exception: Process 464 is still I was able to open Intellij&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1715662249097&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ~/Users/bagjeong-yong/Library/Application Support/JetBrains/IdeaIC2023.2

rm -rf .lock&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/95</guid>
      <comments>https://dyd1310.tistory.com/95#entry95comment</comments>
      <pubDate>Tue, 14 May 2024 13:50:51 +0900</pubDate>
    </item>
    <item>
      <title>스프링부트  스웨거3</title>
      <link>https://dyd1310.tistory.com/94</link>
      <description>&lt;figure id=&quot;og_1714451819076&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Swagger] Open API 3.0 Swagger v3 상세설정&quot; data-og-description=&quot;※ 실습 프로젝트는 Github에서 확인 할 수 있습니다.&quot; data-og-host=&quot;jeonyoungho.github.io&quot; data-og-source-url=&quot;https://jeonyoungho.github.io/posts/Open-API-3.0-Swagger-v3-%EC%83%81%EC%84%B8%EC%84%A4%EC%A0%95/&quot; data-og-url=&quot;https://jeonyoungho.github.io/posts/Open-API-3.0-Swagger-v3-%EC%83%81%EC%84%B8%EC%84%A4%EC%A0%95/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bczhl9/hyVVBXVssj/iRgrmnUS0kBOLA4ah3DoVK/img.png?width=2824&amp;amp;height=1160&amp;amp;face=0_0_2824_1160,https://scrap.kakaocdn.net/dn/bu0o46/hyVZjae7Ay/7fArYCyE3T1OF8bTCVaqPK/img.png?width=2032&amp;amp;height=1364&amp;amp;face=0_0_2032_1364,https://scrap.kakaocdn.net/dn/wQmbE/hyVZqAq3VC/sBfQCNHAuS5dcluk5K78k0/img.png?width=1956&amp;amp;height=1346&amp;amp;face=0_0_1956_1346&quot;&gt;&lt;a href=&quot;https://jeonyoungho.github.io/posts/Open-API-3.0-Swagger-v3-%EC%83%81%EC%84%B8%EC%84%A4%EC%A0%95/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jeonyoungho.github.io/posts/Open-API-3.0-Swagger-v3-%EC%83%81%EC%84%B8%EC%84%A4%EC%A0%95/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bczhl9/hyVVBXVssj/iRgrmnUS0kBOLA4ah3DoVK/img.png?width=2824&amp;amp;height=1160&amp;amp;face=0_0_2824_1160,https://scrap.kakaocdn.net/dn/bu0o46/hyVZjae7Ay/7fArYCyE3T1OF8bTCVaqPK/img.png?width=2032&amp;amp;height=1364&amp;amp;face=0_0_2032_1364,https://scrap.kakaocdn.net/dn/wQmbE/hyVZqAq3VC/sBfQCNHAuS5dcluk5K78k0/img.png?width=1956&amp;amp;height=1346&amp;amp;face=0_0_1956_1346');&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;[Swagger] Open API 3.0 Swagger v3 상세설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;※ 실습 프로젝트는 Github에서 확인 할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jeonyoungho.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스웨거3 어노테이션&lt;/p&gt;
&lt;figure id=&quot;og_1714451854643&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;OpenAPI 3 Library for spring-boot&quot; data-og-description=&quot;Library for OpenAPI 3 with spring boot projects. Is based on swagger-ui, to display the OpenAPI description.Generates automatically the OpenAPI file.&quot; data-og-host=&quot;springdoc.org&quot; data-og-source-url=&quot;https://springdoc.org/#properties&quot; data-og-url=&quot;http://springdoc.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x67mu/hyVVF65mhs/dK86ep0LBnWVKh2FQTkSXk/img.png?width=1762&amp;amp;height=816&amp;amp;face=0_0_1762_816,https://scrap.kakaocdn.net/dn/bgVB1j/hyVVBwREdF/kP8TzB15w4lSfU9mh8TCg0/img.png?width=1410&amp;amp;height=538&amp;amp;face=0_0_1410_538&quot;&gt;&lt;a href=&quot;https://springdoc.org/#properties&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://springdoc.org/#properties&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x67mu/hyVVF65mhs/dK86ep0LBnWVKh2FQTkSXk/img.png?width=1762&amp;amp;height=816&amp;amp;face=0_0_1762_816,https://scrap.kakaocdn.net/dn/bgVB1j/hyVVBwREdF/kP8TzB15w4lSfU9mh8TCg0/img.png?width=1410&amp;amp;height=538&amp;amp;face=0_0_1410_538');&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;OpenAPI 3 Library for spring-boot&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Library for OpenAPI 3 with spring boot projects. Is based on swagger-ui, to display the OpenAPI description.Generates automatically the OpenAPI file.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;springdoc.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;springdoc openAPI3 Swagger 공식문서&lt;/p&gt;
&lt;figure id=&quot;og_1714451923412&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] Springdoc 라이브러리를 통한 Swagger 적용&quot; data-og-description=&quot;목차 기본 환경 IntelliJ Ultimate 2022.3 Spring Boot 2.7.7 Kotlin 1.7.21(JDK 11) Springdoc Openapi UI 1.6.11 Springdoc은 무엇인가? 이전에 Spring Boot 프로젝트에 Swagger UI를 적용하는 포스트를 작성한 적이 있다. 해당 포&quot; data-og-host=&quot;colabear754.tistory.com&quot; data-og-source-url=&quot;https://colabear754.tistory.com/99&quot; data-og-url=&quot;https://colabear754.tistory.com/99&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bUHkgK/hyVZhDvyja/21J81KU5kmUX7gb5F6vFPK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/yLZhR/hyVZubLpoN/NxfD5KQJaS2FH2trdemLw1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/lhEgB/hyVVIvYO5l/tKnWFm5MQpibMCyEot89xK/img.png?width=1019&amp;amp;height=981&amp;amp;face=0_0_1019_981&quot;&gt;&lt;a href=&quot;https://colabear754.tistory.com/99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://colabear754.tistory.com/99&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bUHkgK/hyVZhDvyja/21J81KU5kmUX7gb5F6vFPK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/yLZhR/hyVZubLpoN/NxfD5KQJaS2FH2trdemLw1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/lhEgB/hyVVIvYO5l/tKnWFm5MQpibMCyEot89xK/img.png?width=1019&amp;amp;height=981&amp;amp;face=0_0_1019_981');&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;[Spring Boot] Springdoc 라이브러리를 통한 Swagger 적용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 기본 환경 IntelliJ Ultimate 2022.3 Spring Boot 2.7.7 Kotlin 1.7.21(JDK 11) Springdoc Openapi UI 1.6.11 Springdoc은 무엇인가? 이전에 Spring Boot 프로젝트에 Swagger UI를 적용하는 포스트를 작성한 적이 있다. 해당 포&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;colabear754.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;springdoc openAPI3 Swagger&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1714456504444&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Packy] Swagger @ApiResponses를 커스텀 어노테이션으로 대체하기&quot; data-og-description=&quot;1. @ApiResponses의 한계 Swagger에서 정상 응답값과 함께 에러 응답값도 명시해주어야 클라이언트 단에서도 에러 응답값에 대한 예외 처리를 할 수 있다. Swagger에서는 기본적으로 아래와 같이 @ApiRespon&quot; data-og-host=&quot;leeeeeyeon-dev.tistory.com&quot; data-og-source-url=&quot;https://leeeeeyeon-dev.tistory.com/92&quot; data-og-url=&quot;https://leeeeeyeon-dev.tistory.com/92&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TLVkR/hyVVyfRVf7/7G3CvI3wzhfyPgkCHzcQE0/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/4XkDB/hyVVH4V7KB/U5WWaJQZBb9lhAeQCK6kak/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/cfk0Yc/hyVVKgh3Ts/m9kUXdwRpACGkS9KRVKhnk/img.png?width=750&amp;amp;height=347&amp;amp;face=0_0_750_347&quot;&gt;&lt;a href=&quot;https://leeeeeyeon-dev.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leeeeeyeon-dev.tistory.com/92&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TLVkR/hyVVyfRVf7/7G3CvI3wzhfyPgkCHzcQE0/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/4XkDB/hyVVH4V7KB/U5WWaJQZBb9lhAeQCK6kak/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/cfk0Yc/hyVVKgh3Ts/m9kUXdwRpACGkS9KRVKhnk/img.png?width=750&amp;amp;height=347&amp;amp;face=0_0_750_347');&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;[Packy] Swagger @ApiResponses를 커스텀 어노테이션으로 대체하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. @ApiResponses의 한계 Swagger에서 정상 응답값과 함께 에러 응답값도 명시해주어야 클라이언트 단에서도 에러 응답값에 대한 예외 처리를 할 수 있다. Swagger에서는 기본적으로 아래와 같이 @ApiRespon&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leeeeeyeon-dev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ApiResponse 커스텀하기 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715673155388&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[스프링] spring swagger 같은 코드 여러 에러 응답 예시 만들기&quot; data-og-description=&quot;[스프링] error code 도메인 별 분리하기 두둥 프로젝트에서는 처리중에 에러가 발생할경우 RuntimeException 을 상속받은 DuDoongException 에서 다시 상속받아서 코드별 에러클래스를 만들고 있다. @Getter @A&quot; data-og-host=&quot;devnm.tistory.com&quot; data-og-source-url=&quot;https://devnm.tistory.com/29&quot; data-og-url=&quot;https://devnm.tistory.com/29&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bP2KDz/hyV2x86MsR/psOFLbG0GNi5gw1zU7W2n0/img.gif?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/rsw8I/hyV2v4xDGE/Li7isvLBgh1QVBeulVu4Dk/img.gif?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/iIK2h/hyV6jOUKIr/0mhj3Rlv8EG25wBm2xU2w1/img.jpg?width=1686&amp;amp;height=720&amp;amp;face=0_0_1686_720&quot;&gt;&lt;a href=&quot;https://devnm.tistory.com/29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devnm.tistory.com/29&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bP2KDz/hyV2x86MsR/psOFLbG0GNi5gw1zU7W2n0/img.gif?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/rsw8I/hyV2v4xDGE/Li7isvLBgh1QVBeulVu4Dk/img.gif?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/iIK2h/hyV6jOUKIr/0mhj3Rlv8EG25wBm2xU2w1/img.jpg?width=1686&amp;amp;height=720&amp;amp;face=0_0_1686_720');&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;[스프링] spring swagger 같은 코드 여러 에러 응답 예시 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[스프링] error code 도메인 별 분리하기 두둥 프로젝트에서는 처리중에 에러가 발생할경우 RuntimeException 을 상속받은 DuDoongException 에서 다시 상속받아서 코드별 에러클래스를 만들고 있다. @Getter @A&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devnm.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ApiResponse 커스텀하기 2&lt;/p&gt;
&lt;pre id=&quot;code_1715674054008&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ApiResponse(
               responseCode = &quot;200&quot;,
               description = &quot;이미 회원가입을 했던 유저인 경우&quot;,
               content = @Content(
                    schema = @Schema(implementation = ErrorResponseDTO.class))&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;스웨거에서는 각 메서드에 어노테이션을 읽어 api 명세서를 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위의 방법대로 api의 반환 타입을 설정하면 ErrorResponseDTO에 설정한 어노테이션에 따른 한가지 예시밖에 안나온다.&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 data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;error Enum을 정의함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 커스텀 어노테이션으로 런타임 시점에 어떠한 errorEnum 인지 정보를 받음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. public OperationCustomizer customize()을 통해 각 메소드에 어노테이션 정보를 필터링함. (우리가 미리 정의한 커스텀 어노테이션 확인하기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. errorEnum 데이터를 보고 ExampleHolder List를 구성함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ExampleHolder List로 mediaType 객체를 구성하고 content에 mediaType을 설정함. ApiResponse에 content로 추가함.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;customize()에서 반환하는 operation에서 .getResponse()로 ApiResponses 객체를 얻을 수 있는데 여기에 ApiResponse객체를 추가하면 예제가 추가됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀하기 위한 지식. 어노테이션과 리플랙션&lt;/p&gt;
&lt;figure id=&quot;og_1714463120269&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Reflection과 Annotation&quot; data-og-description=&quot;Reflection이란? 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법입니다. 기본적으로 제공하는 자바의 API이다. 자바의 Reflection은 클래스, 인터페이스, 메서드들을 찾을 수 있고, 객체를 생&quot; data-og-host=&quot;upperleaf.tistory.com&quot; data-og-source-url=&quot;https://upperleaf.tistory.com/2&quot; data-og-url=&quot;https://upperleaf.tistory.com/2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fsXBs/hyVZiCo75M/ZRDkXQKjbRjJtM5oqFLSnk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bDCYmD/hyVZemtTPD/gUv6ssImnKk5yVU5htznvK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://upperleaf.tistory.com/2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://upperleaf.tistory.com/2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fsXBs/hyVZiCo75M/ZRDkXQKjbRjJtM5oqFLSnk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bDCYmD/hyVZemtTPD/gUv6ssImnKk5yVU5htznvK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;Reflection과 Annotation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Reflection이란? 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법입니다. 기본적으로 제공하는 자바의 API이다. 자바의 Reflection은 클래스, 인터페이스, 메서드들을 찾을 수 있고, 객체를 생&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;upperleaf.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/94</guid>
      <comments>https://dyd1310.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 1 May 2024 16:40:52 +0900</pubDate>
    </item>
    <item>
      <title>스프링 실습 공부 계획</title>
      <link>https://dyd1310.tistory.com/93</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. JWT 토큰 및 스프링 시큐리티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 로깅(slf4j) 및 AOP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 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;4. 이벤트 기반 아키텍처(카프카, 데이터 베이스)&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;5. 테스팅&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;6. 캐시&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;7. 스케쥴러&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;8. 웹소켓, 롱풀링, SEE&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/93</guid>
      <comments>https://dyd1310.tistory.com/93#entry93comment</comments>
      <pubDate>Wed, 24 Apr 2024 23:18:03 +0900</pubDate>
    </item>
    <item>
      <title>종합설계프로젝트 도메인 주도 개발</title>
      <link>https://dyd1310.tistory.com/92</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;p data-ke-size=&quot;size16&quot;&gt;클라이언트 주요 도메인 나누기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 차량 (차량 정보 가져오기, 차량 마커 그리기 , 차량 부채꼴 그리기 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 발생원 (발생원 정보 가져오기 , 발생원 마커 그리기 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 악취 예측 (차량과 발생원을 이용한 악취 발생원 찾기 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지도 (차량과 발생원 객체 생성, 객체들을 지도에 시각화 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모달 (차량 정보 , 발생원 정보, 결과 정보를 표시하는 창 객체 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지도 컨트롤러(모드에 맞는 지도객체 생성 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Minimum Significant Value (최소감지값을 충족하는 성분만 반영 등)&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;1. 지도 컨트롤러.js가 지도 데이터 로드.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 지도.js는 모드에 따른 prototype 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 모드에 따른  지도 객체 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 차량.js 과 발생원.js 는 마커를 그리거나 부채꼴을 그리는 prototype을 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 지도.js 는 차량과 발생원 객체 생성 후 prototype을 이용하여 마커를 시각화함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 객체 생성 과정에서 msv에 만족하는 성분만 반영&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 악취 예측.js 에서 차량과 발생원 객체들을 통해 악취 발생원을 예측함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;7-1. 차량이 감지한 냄새 유형과 같은 발생원 객체 탐색 후 리스트화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;7-2. &lt;span style=&quot;color: #333333; text-align: start;&quot;&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;7-3. 거리 중 풍향과 풍속을 참고하여 발생원일 가능성이 높은 객체를 선별&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;7-4. 해당 객체중 차량이 탐지한 성분이 같은 발생원을 선별&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;8. 모달.js 에 차량 혹은 발생원 객체를 넘겨 결과를 시각화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1.&amp;nbsp; 차량 gps 정보 -&amp;gt; 차량 마커 생성에 사용됨&lt;/p&gt;
&lt;pre id=&quot;code_1712126815829&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  {
   &quot;list&quot;: [
    {
     &quot;gps_no&quot; : 1 ,
     &quot;machine_name : &quot;xx&quot;,
     &quot;Latitude&quot; : xx.544353,
     &quot;Longitude&quot; : xx.327673,
     &quot;gps_date&quot; : 2024-01-31 10:13:00
     },
    {
     &quot;gps_no&quot; : 2 ,
     &quot;machine_name : &quot;xx&quot;,
     &quot;Latitude&quot; : xx.544353,
     &quot;Longitude&quot; : xx.327673,
     &quot;gps_date&quot; : 2024-01-31 10:13:11
     }
    ]
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 차량 날씨 및 위치정보. 1과 동일한 목적에서 사용됨&lt;/p&gt;
&lt;pre id=&quot;code_1712126987763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  {
   &quot;list&quot;: [
    {
     &quot;si_idx&quot;: 2,
	 &quot;area&quot;: null,
	 &quot;ou_value&quot;: 0,
     &quot;machine_name&quot;: xx,
     &quot;Latitude&quot; : xx.544353,
     &quot;Longitude&quot;: xx.327673,
     &quot;humi&quot; : 0,
     &quot;temp&quot; : 0,
     &quot;directionWind&quot; : 0,
     &quot;sppedWind&quot; : 0,
     &quot;airPressure&quot; : 0,
     &quot;csv_filename&quot; : &quot;파일 이름&quot;,
     &quot;reg_date&quot; : 2024-01-31 10:13:00
     },
    {
     &quot;si_idx&quot;: 3,
	 &quot;area&quot;: null,
	 &quot;ou_value&quot;: 0,
     &quot;machine_name&quot;: &quot;S1&quot;,
     &quot;Latitude&quot; : xx.544353,
     &quot;Longitude&quot;: xx.327673,
     &quot;humi&quot; : 0,
     &quot;temp&quot; : 0,
     &quot;directionWind&quot; : 0,
     &quot;sppedWind&quot; : 0,
     &quot;airPressure&quot; : 0,
     &quot;csv_filename&quot; : &quot;파일 이름&quot;,
     &quot;reg_date&quot; : 2024-01-31 10:13:00
     }]}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 최소 감지값. 클라이언트에서 모든 리스트를 가져오고 이름에 맞는 성분을 선별해서 사용중. 악취 예측에 사용&lt;/p&gt;
&lt;pre id=&quot;code_1712127259187&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  {
   &quot;list&quot;: [
    {
      &quot;material&quot; : &quot;성분 이름&quot;;
      &quot;msv&quot; : xxx;
     },
    {
      &quot;material&quot; : &quot;성분 이름&quot;;
      &quot;msv&quot; : xxx;
     }
     ]
   }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 기관별 발생 성분, 기관 이름을 통해 기관이 발생하는 성분을 검색&lt;/p&gt;
&lt;pre id=&quot;code_1712127596337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  { &quot;list&quot; : [
    {
     &quot;customer&quot;: &quot;00공장&quot;,
     &quot;chemical_name&quot;: &quot;성분 이름&quot;,
     &quot;chemical_value&quot; : xxx.719
     },
    {
     &quot;customer&quot;: &quot;00공장&quot;,
     &quot;chemical_name&quot;: &quot;성분 이름&quot;,
     &quot;chemical_value&quot; : xxx.113
     }
  ]}&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;5. 기관별 냄새 유형, 기관이 발생하는 냄새 유형들을 검색&lt;/p&gt;
&lt;pre id=&quot;code_1712127951400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  { &quot;list&quot; : [
    {
     &quot;c_name&quot;: &quot;00공장&quot;,
     &quot;c_odor&quot;: &quot;00냄새&quot;,
     },
    {
     &quot;c_name&quot;: &quot;00공장&quot;,
     &quot;c_odor&quot;: &quot;00냄새&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;&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;6. 차량 검출 성분, csvfile name을 통해 차량이 관측한 성분을 검색&lt;/p&gt;
&lt;pre id=&quot;code_1712128014639&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   {
    &quot;list&quot;: [
     {
        &quot;chemical_name&quot;: &quot;성분 이름&quot;,
        &quot;chemical_value&quot;: 00.424
      },
     {
        &quot;chemical_name&quot;: &quot;성분 이름&quot;,
        &quot;chemical_value&quot;: 00.424
      }]
   }&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;7. 기관 위치 정보, 기관 마커를 생성하는데 사용&lt;/p&gt;
&lt;pre id=&quot;code_1712128107743&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{ &quot;list&quot; : [
   {
  &quot;lat&quot; = 00.5165000;
  &quot;lon&quot; = 00.3575444;
  &quot;p_index&quot; : 1,
  &quot;name&quot; : &quot;00공장&quot;
  &quot;poi&quot; : 0
   },
   {
  &quot;lat&quot; = 00.5005000;
  &quot;lon&quot; = 00.3075444;
  &quot;p_index&quot; : 2,
  &quot;name&quot; : &quot;00공장&quot;
  &quot;poi&quot; : 0
   }
  ]}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 가장 최근의 차량 날씨 및 위치정보. 정보 데이터&lt;/p&gt;
&lt;pre id=&quot;code_1712128163416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    {
     &quot;si_idx&quot;: 2,
     &quot;machine_name&quot;: xx,
     &quot;Latitude&quot; : xx.544353,
     &quot;Longitude&quot;: xx.327673,
     &quot;humi&quot; : 0,
     &quot;temp&quot; : 0,
     &quot;directionWind&quot; : 0,
     &quot;sppedWind&quot; : 0,
     &quot;airPressure&quot; : null,
     &quot;csv_filename&quot; : &quot;fadfas&quot;,
     &quot;reg_date&quot; : 2024-01-31 10:13:00
     }&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;9. 가장 최근의 차량 정보&lt;/p&gt;
&lt;pre id=&quot;code_1712128257787&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
      &quot;gps_no&quot; : 1 ,
      &quot;machine_name : &quot;S1&quot;,
      &quot;Latitude&quot; : 35.544353,
      &quot;Longitude&quot; : 129.327673,
      &quot;gps_date&quot; : 2024-01-31 10:13:00
}&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;10. 차량 관측 냄새 유형, 차량 관측 성분을 매개변수로 냄새 유형 및 강도를 반환해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1712129451405&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{[
{&quot;pred_smell_kind&quot;: &quot;악취 종류 이름&quot;},
 {&quot;pred_smell_strength&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;기존 테이블 설계의 문제점&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 제2 정규화 혹은 제3 정규화가 되어있지 않은 경우가 존재함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 테이블간 관계가 없음. (데이터 수정이 어려움)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 같은 기능을 하는 테이블이 존재함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 리스트를 받아 클라이언트에서 리스트를 처리하는 로직이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 모든 기관의 발생성분 데이터를 받아 특정 기관에 대한 발생성분 데이터로 전처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 모든 최소 감지값 리스트를 받아 특정이름의 최소 감지값 수치를 찾음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 필드명이 명확하지 않을때가 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 해결로 발생할 수 있는 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관계를 설정하면서 조회에 성능이 느려질 수 있음&lt;/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 data-ke-size=&quot;size16&quot;&gt;1. 데이터베이스 설계를 새롭게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이터 전처리를 서버가 하도록 설계한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 발생원 위치  테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 발생원 냄새 유형 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 발생원 성분 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 차량 위치 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 차량 악취 관측 정보 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 차량 기상 관측 정보 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 최소 감지값 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차량 관측 냄새 유형 및 강도 정보(10번 )도 필요하지만 이는 다른 서버를 통해 처리되어서 제외한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화학 성분 테이블 (Chemical Table):&lt;br /&gt;&amp;nbsp; - ChemicalId (Primary Key)&lt;br /&gt;&amp;nbsp; - ChemicalName&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;발생원 회원 테이블 (Source Table):&lt;br /&gt;&amp;nbsp; - SourceId (Primary Key)&lt;br /&gt;&amp;nbsp; - Name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Latitude&lt;br /&gt;&amp;nbsp; - Longitude&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;발생원 냄새 유형 테이블 (OdorType Table):&lt;br /&gt;&amp;nbsp; - OdorTypeId (Primary Key)&lt;br /&gt;&amp;nbsp; - SourceId (Foreign Key referencing Source Table)&lt;br /&gt;&amp;nbsp; - OdorType&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;발생원 성분 테이블 (SourceChemical Table):&lt;br /&gt;&amp;nbsp; - SourceChemicalId (Primary Key)&lt;br /&gt;&amp;nbsp; - SourceId (Foreign Key referencing Source Table)&lt;br /&gt;&amp;nbsp; - ChemicalId (Foreign Key referencing Chemical Table)&lt;br /&gt;&amp;nbsp; - ChemicalValue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;차량 테이블 (CarCategory Table):&lt;br /&gt;&amp;nbsp; - CarId (Primary Key)&lt;br /&gt;&amp;nbsp; - Category&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;차량 위치 테이블 (CarLocation Table):&lt;br /&gt;&amp;nbsp; - CarLocationId (Primary Key)&lt;br /&gt;&amp;nbsp; - CarId (Foreign Key referencing CarCategory Table)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;CarWeatherObservationId&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Foreign Key referencing CarWeather Table)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; - Latitude&lt;br /&gt;&amp;nbsp; - Longitude&lt;br /&gt;&amp;nbsp; - Date&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;차량 기상 정보 테이블 (CarWeather Table):&lt;br /&gt;&amp;nbsp; - CarWeatherObservationId (Primary Key)&lt;br /&gt;&amp;nbsp; - Humidity&lt;br /&gt;&amp;nbsp; - Temperature&lt;br /&gt;&amp;nbsp; - WindDirection&lt;br /&gt;&amp;nbsp; - WindSpeed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;차량 관측 정보 테이블 (CarChemicalObservation Table):&lt;br /&gt;&amp;nbsp; - CarChemicalObservationId (Primary Key)&lt;br /&gt;&amp;nbsp; - ChemicalId (Foreign Key referencing Chemical Table)&lt;br /&gt;&amp;nbsp; - ChemicalValue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - CarLocationId (Foreign Key referencing CarLocation Table)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;최소 감지값 테이블 (MinimumSignificantValue Table):&lt;br /&gt;&amp;nbsp; - MinimumSignificantValueId (Primary Key)&lt;br /&gt;&amp;nbsp; - ChemicalId (Foreign Key referencing Chemical Table)&lt;br /&gt;&amp;nbsp; - ChemicalValue&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;ERD설계 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-04-03 at 10.40.04 PM.png&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;1216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8sn1L/btsGl3uFYIt/kWKQDfRCw7qymNJp0Vckr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8sn1L/btsGl3uFYIt/kWKQDfRCw7qymNJp0Vckr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8sn1L/btsGl3uFYIt/kWKQDfRCw7qymNJp0Vckr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8sn1L%2FbtsGl3uFYIt%2FkWKQDfRCw7qymNJp0Vckr1%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;1822&quot; height=&quot;1216&quot; data-filename=&quot;Screenshot 2024-04-03 at 10.40.04 PM.png&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;1216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-04-03 at 7.56.07 PM.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTBI4x/btsGjXI8YM1/3rgAOyqOAP6WY3vbKB8Yfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTBI4x/btsGjXI8YM1/3rgAOyqOAP6WY3vbKB8Yfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTBI4x/btsGjXI8YM1/3rgAOyqOAP6WY3vbKB8Yfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTBI4x%2FbtsGjXI8YM1%2F3rgAOyqOAP6WY3vbKB8Yfk%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;406&quot; height=&quot;588&quot; data-filename=&quot;Screenshot 2024-04-03 at 7.56.07 PM.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공적으로 데이터베이스를 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;1. car_category_table 추적하는 차량 카테고리 등록&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. chemical_table에&amp;nbsp; 관리하는&amp;nbsp; 화학 성분 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. source_table에 관리하는 발생원 등록&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;minimum_significant_value_table 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 화학물질 이름을 chemical_table에 검색해 chemical_entity를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 화학성분id 와 수치값으로 minimum_significant_value_entity 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. minimum_significant_value_entity에 set으로 chemical_entity 값을 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. persist에 저장한다.&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;odor_type_table 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 발생원 이름을 source_table 에 검색해 source_entity를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 냄새유형으로 odor_type_entity 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. set으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;source_entity를 odor_type_entity에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. persist에 저장한다.&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;source_chemical_table 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. 발생원 이름을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;source_table 에 검색해 source entity를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 화학물질 이름을 chemical_table에 검색해 camical entity를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 화학 수치로 source_chemical_entity를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. set으로 두엔티티를 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. persist로 저장한다.&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;1. 차량의 기상정보를 통해 car_weather_entity를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;차량 카테고리를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;car_category_table에 검색해 car_entity를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 경도와 위도로 car_location_entity 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. set으로 1,2번의 엔티티를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;car_location_entity에 등록 후 persist로 저장한다.&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;5.&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;화학물질 이름을 chemical_table에 검색해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;chemical_entity&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;6.&amp;nbsp; 화학 수치로 car_chemical_observation_entity 생성 한다.&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;7.&amp;nbsp; set으로 car_location_entity를 car_chemical_observation_entity 에 등록한다.&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;8. 5~7을 모든 화학 물질이 등록될때까지 반복한다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. 차량 카테고리가 주어졌을 때 차량카테고리가 일치하는 car_Location_entity 리스트를 반환한다. (gps 노이즈 제거를 위해 이동거리에 따라 차량 데이터를 제거하면 좋음)&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;2. 모든 source_entity 리스트 반환.&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;3. minimum_significant_value_entity 리스트 반환&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;4. 가장 최근에 등록된 car_Location_entity 반환&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;1번 예시&lt;/p&gt;
&lt;pre id=&quot;code_1712151968056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;CarId&quot;: 1,
  &quot;CarObservationEntity&quot;: [
    {&quot;chemicalName&quot;: &quot;Chemical1&quot;, &quot;chemicalValue&quot;: 10},
    {&quot;chemicalName&quot;: &quot;Chemical2&quot;, &quot;chemicalValue&quot;: 20},
    {&quot;chemicalName&quot;: &quot;Chemical3&quot;, &quot;chemicalValue&quot;: 30}
  ],
  &quot;CarWeatherObservationEntity&quot;: {
    &quot;Humidity&quot;: 60,
    &quot;Temperature&quot;: 25,
    &quot;WindDirection&quot;: &quot;North&quot;,
    &quot;WindSpeed&quot;: 10
  },
  &quot;Latitude&quot;: xx.1234567,
  &quot;Longitude&quot;: xx.9876543,
  &quot;Date&quot;: &quot;2024-04-15 14:30:00&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 도메인 주도 개발&lt;/p&gt;
&lt;figure id=&quot;og_1712120269304&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[우테코] Domain Driven Development(도메인 주도 개발)이란?&quot; data-og-description=&quot;  인트로 이 글은 우테코 5기 코치 제이슨의 강의를 듣고, 깃짱이 작성한 글입니다.   레거시 코드 ✔️ 레거시 코드란? 레거시 코드란, 이해할 수 없고 수정하기도 힘든 코드를 지칭하는 속&quot; data-og-host=&quot;engineerinsight.tistory.com&quot; data-og-source-url=&quot;https://engineerinsight.tistory.com/256#google_vignette&quot; data-og-url=&quot;https://engineerinsight.tistory.com/256&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BnZy4/hyVJTwukd4/e7ajq5kq075wFILdCJctgK/img.png?width=534&amp;amp;height=392&amp;amp;face=0_0_534_392,https://scrap.kakaocdn.net/dn/bHTfok/hyVJZcqt8D/9kRwVJQoUdzaCrBeaoakUK/img.png?width=534&amp;amp;height=392&amp;amp;face=0_0_534_392,https://scrap.kakaocdn.net/dn/bc8GxI/hyVJTwuj9s/jyBwinHixhKNfG6rkdMrcK/img.png?width=687&amp;amp;height=511&amp;amp;face=0_0_687_511&quot;&gt;&lt;a href=&quot;https://engineerinsight.tistory.com/256#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engineerinsight.tistory.com/256#google_vignette&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BnZy4/hyVJTwukd4/e7ajq5kq075wFILdCJctgK/img.png?width=534&amp;amp;height=392&amp;amp;face=0_0_534_392,https://scrap.kakaocdn.net/dn/bHTfok/hyVJZcqt8D/9kRwVJQoUdzaCrBeaoakUK/img.png?width=534&amp;amp;height=392&amp;amp;face=0_0_534_392,https://scrap.kakaocdn.net/dn/bc8GxI/hyVJTwuj9s/jyBwinHixhKNfG6rkdMrcK/img.png?width=687&amp;amp;height=511&amp;amp;face=0_0_687_511');&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;[우테코] Domain Driven Development(도메인 주도 개발)이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  인트로 이 글은 우테코 5기 코치 제이슨의 강의를 듣고, 깃짱이 작성한 글입니다.   레거시 코드 ✔️ 레거시 코드란? 레거시 코드란, 이해할 수 없고 수정하기도 힘든 코드를 지칭하는 속&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engineerinsight.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자바스크립트 객체지향프로그래밍&lt;/p&gt;
&lt;figure id=&quot;og_1712120750225&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;객체 지향 프로그래밍 - Web 개발 학습하기 | MDN&quot; data-og-description=&quot;객체 지향 프로그래밍(OOP)은 Java 및 C++를 비롯한 많은 프로그래밍 언어의 기본이 되는 프로그래밍 패러다임입니다. 이 기사에서는 OOP의 기본 개념에 대한 개요를 제공합니다. 클래스와 인스턴스&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object-oriented_programming&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object-oriented_programming&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1oUJE/hyVGHxIP7q/SmL3fxMtjoaHBXi1KTgyJ1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object-oriented_programming&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object-oriented_programming&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1oUJE/hyVGHxIP7q/SmL3fxMtjoaHBXi1KTgyJ1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;객체 지향 프로그래밍 - Web 개발 학습하기 | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;객체 지향 프로그래밍(OOP)은 Java 및 C++를 비롯한 많은 프로그래밍 언어의 기본이 되는 프로그래밍 패러다임입니다. 이 기사에서는 OOP의 기본 개념에 대한 개요를 제공합니다. 클래스와 인스턴스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 자바스크립트 객체배열&lt;/p&gt;
&lt;figure id=&quot;og_1712123378980&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JavaScript 객체 배열 튜토리얼 - JS 배열 메서드를 사용해 객체를 생성, 업데이트 및 루프하는 방법&quot; data-og-description=&quot;저는 평균적으로 일주일에 18번 JSON 데이터로 작업합니다. 그럼에도 불구하고 JSON 데이터를 다룰 때마다 구체적인 메서드 사용법을 검색해야 합니다. 이럴 때마다 명쾌한 해답을 주는 안내서가 &quot; data-og-host=&quot;www.freecodecamp.org&quot; data-og-source-url=&quot;https://www.freecodecamp.org/korean/news/javascript-array-of-objects-tutorial/&quot; data-og-url=&quot;https://www.freecodecamp.org/korean/news/javascript-array-of-objects-tutorial/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bT40lZ/hyVGLmAl9D/BuoeDSvePH6fkr9HcCam8K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cuHkMr/hyVGDhO8g3/Z6kkhDNxjU3ybT9BLVMkck/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bNo0kT/hyVJTQPEnX/VpXEhlw1OJ8IwFgkTbxpE1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot;&gt;&lt;a href=&quot;https://www.freecodecamp.org/korean/news/javascript-array-of-objects-tutorial/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.freecodecamp.org/korean/news/javascript-array-of-objects-tutorial/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bT40lZ/hyVGLmAl9D/BuoeDSvePH6fkr9HcCam8K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cuHkMr/hyVGDhO8g3/Z6kkhDNxjU3ybT9BLVMkck/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bNo0kT/hyVJTQPEnX/VpXEhlw1OJ8IwFgkTbxpE1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720');&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;JavaScript 객체 배열 튜토리얼 - JS 배열 메서드를 사용해 객체를 생성, 업데이트 및 루프하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;저는 평균적으로 일주일에 18번 JSON 데이터로 작업합니다. 그럼에도 불구하고 JSON 데이터를 다룰 때마다 구체적인 메서드 사용법을 검색해야 합니다. 이럴 때마다 명쾌한 해답을 주는 안내서가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.freecodecamp.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 데이터베이스 정규화 및 식별 비식별 관계&lt;/p&gt;
&lt;figure id=&quot;og_1712129732491&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Database] 정규화(Normalization) 쉽게 이해하기&quot; data-og-description=&quot;지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz&quot; data-og-host=&quot;mangkyu.tistory.com&quot; data-og-source-url=&quot;https://mangkyu.tistory.com/110&quot; data-og-url=&quot;https://mangkyu.tistory.com/110&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fkYum/hyVGRmQ649/bvIKaxTlOkcytIEjDk9gYk/img.png?width=324&amp;amp;height=301&amp;amp;face=0_0_324_301,https://scrap.kakaocdn.net/dn/uwem2/hyVJ4EQzSm/17Cgqc4i5VogwUjDbvkz5K/img.png?width=324&amp;amp;height=301&amp;amp;face=0_0_324_301,https://scrap.kakaocdn.net/dn/be9u2z/hyVJRyHZGT/Ap60XN4jhVRGSkK61uCMU0/img.png?width=828&amp;amp;height=473&amp;amp;face=0_0_828_473&quot;&gt;&lt;a href=&quot;https://mangkyu.tistory.com/110&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mangkyu.tistory.com/110&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fkYum/hyVGRmQ649/bvIKaxTlOkcytIEjDk9gYk/img.png?width=324&amp;amp;height=301&amp;amp;face=0_0_324_301,https://scrap.kakaocdn.net/dn/uwem2/hyVJ4EQzSm/17Cgqc4i5VogwUjDbvkz5K/img.png?width=324&amp;amp;height=301&amp;amp;face=0_0_324_301,https://scrap.kakaocdn.net/dn/be9u2z/hyVJRyHZGT/Ap60XN4jhVRGSkK61uCMU0/img.png?width=828&amp;amp;height=473&amp;amp;face=0_0_828_473');&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;[Database] 정규화(Normalization) 쉽게 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mangkyu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1712130338948&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ Database ] 제 1정규화, 제 2정규화, 제 3정규화&quot; data-og-description=&quot;정규화란? 데이터베이스의 데이터들을 최대한 중복을 제거하여 이상 현상 ( Anomaly ) 을 방지하​기 위한 기술이다. ​ 여기서 말하는 이상현상은 세 가지가 있는데 간략하게 설명하면 다음과 같&quot; data-og-host=&quot;mjn5027.tistory.com&quot; data-og-source-url=&quot;https://mjn5027.tistory.com/46&quot; data-og-url=&quot;https://mjn5027.tistory.com/46&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5JxaU/hyVGJPRV1j/xC5MZa1tIJFKleVdymz6mK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/bXEjbO/hyVJV2b9JG/8Rsan7rympaGXtpijmcEk0/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/bn0pmR/hyVGR1rRN3/LGd4hEXNb8topu9RmL5kkK/img.jpg?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480&quot;&gt;&lt;a href=&quot;https://mjn5027.tistory.com/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mjn5027.tistory.com/46&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5JxaU/hyVGJPRV1j/xC5MZa1tIJFKleVdymz6mK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/bXEjbO/hyVJV2b9JG/8Rsan7rympaGXtpijmcEk0/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/bn0pmR/hyVGR1rRN3/LGd4hEXNb8topu9RmL5kkK/img.jpg?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480');&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;[ Database ] 제 1정규화, 제 2정규화, 제 3정규화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;정규화란? 데이터베이스의 데이터들을 최대한 중복을 제거하여 이상 현상 ( Anomaly ) 을 방지하​기 위한 기술이다. ​ 여기서 말하는 이상현상은 세 가지가 있는데 간략하게 설명하면 다음과 같&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mjn5027.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1712130885518&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;데이터베이스 식별관계와 비식별관계&quot; data-og-description=&quot;안녕하세요. 오늘은 데이터베이스 테이블간의 식별관계와 비식별관계에 대해서 간단하게 알아보겠습니다. 테이블간의 관계 설정 예를들어, 데이터베이스에서 유저테이블과 주문테이블간의 관&quot; data-og-host=&quot;ithub.tistory.com&quot; data-og-source-url=&quot;https://ithub.tistory.com/369&quot; data-og-url=&quot;https://ithub.tistory.com/369&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1qRuJ/hyVJ2ttrNx/ahykRzqXvEed6MNP0NBY6k/img.png?width=800&amp;amp;height=203&amp;amp;face=0_0_800_203,https://scrap.kakaocdn.net/dn/sArXm/hyVGHR3Yc8/92wILA4rzIU0EMbSuHjtkk/img.png?width=800&amp;amp;height=203&amp;amp;face=0_0_800_203,https://scrap.kakaocdn.net/dn/dtL7S2/hyVGJCl5Yy/ic5pP0QPslqsDp8NDto3b1/img.png?width=2048&amp;amp;height=2048&amp;amp;face=0_0_2048_2048&quot;&gt;&lt;a href=&quot;https://ithub.tistory.com/369&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ithub.tistory.com/369&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1qRuJ/hyVJ2ttrNx/ahykRzqXvEed6MNP0NBY6k/img.png?width=800&amp;amp;height=203&amp;amp;face=0_0_800_203,https://scrap.kakaocdn.net/dn/sArXm/hyVGHR3Yc8/92wILA4rzIU0EMbSuHjtkk/img.png?width=800&amp;amp;height=203&amp;amp;face=0_0_800_203,https://scrap.kakaocdn.net/dn/dtL7S2/hyVGJCl5Yy/ic5pP0QPslqsDp8NDto3b1/img.png?width=2048&amp;amp;height=2048&amp;amp;face=0_0_2048_2048');&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;데이터베이스 식별관계와 비식별관계&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 데이터베이스 테이블간의 식별관계와 비식별관계에 대해서 간단하게 알아보겠습니다. 테이블간의 관계 설정 예를들어, 데이터베이스에서 유저테이블과 주문테이블간의 관&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ithub.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 데이터베이스 ERD 설계&lt;/p&gt;
&lt;figure id=&quot;og_1712136965976&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MySQL] Workbench로 ERD 그리기&quot; data-og-description=&quot;Mysql을 사용하는 프로젝트를 할 경우 ERD 설계를 쉽게 도와주는 툴이 workbench 입니다. 새로운 ERD를 그리기 위해 File -&amp;gt; New Model를 선택하면 다음 화면을 볼 수 있습니다. 위의 Add Diagram을 선택하면 ERD&quot; data-og-host=&quot;sichan-dev.tistory.com&quot; data-og-source-url=&quot;https://sichan-dev.tistory.com/2&quot; data-og-url=&quot;https://sichan-dev.tistory.com/2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cndc6z/hyVJ0vGkcl/jkTgYB6KFCoc0O65URPad1/img.png?width=800&amp;amp;height=463&amp;amp;face=0_0_800_463,https://scrap.kakaocdn.net/dn/EgJ4C/hyVGS0nFUA/0Y2f5F7TfkHk3c7lDlUik1/img.png?width=800&amp;amp;height=463&amp;amp;face=0_0_800_463,https://scrap.kakaocdn.net/dn/ccTPjR/hyVGIXJqP9/j8wy5cy0Rg2xAdoi0czgwk/img.png?width=1127&amp;amp;height=698&amp;amp;face=0_0_1127_698&quot;&gt;&lt;a href=&quot;https://sichan-dev.tistory.com/2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sichan-dev.tistory.com/2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cndc6z/hyVJ0vGkcl/jkTgYB6KFCoc0O65URPad1/img.png?width=800&amp;amp;height=463&amp;amp;face=0_0_800_463,https://scrap.kakaocdn.net/dn/EgJ4C/hyVGS0nFUA/0Y2f5F7TfkHk3c7lDlUik1/img.png?width=800&amp;amp;height=463&amp;amp;face=0_0_800_463,https://scrap.kakaocdn.net/dn/ccTPjR/hyVGIXJqP9/j8wy5cy0Rg2xAdoi0czgwk/img.png?width=1127&amp;amp;height=698&amp;amp;face=0_0_1127_698');&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;[MySQL] Workbench로 ERD 그리기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Mysql을 사용하는 프로젝트를 할 경우 ERD 설계를 쉽게 도와주는 툴이 workbench 입니다. 새로운 ERD를 그리기 위해 File -&amp;gt; New Model를 선택하면 다음 화면을 볼 수 있습니다. 위의 Add Diagram을 선택하면 ERD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sichan-dev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 워크벤치 팅김 문제&lt;/p&gt;
&lt;figure id=&quot;og_1712137294330&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MySQL Workbench 설치 및 사용&quot; data-og-description=&quot;최신 버전은 M1 맥에서 호환이 제대로 되지 않는 문제가 있었다. 따라서 처음에는 8.0.25버전을 설치했었는데, EER Diagram을 생성하던 중 문제가 생겨서 혹시 버전 문제일까 싶어서 8.0.29버전으로 재&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@zero-black/MySQL-Workbench-%EC%84%A4%EC%B9%98&quot; data-og-url=&quot;https://velog.io/@zero-black/MySQL-Workbench-설치&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gUvtO/hyVGORdm7g/LboiciZ526XjTczfr7aaMk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/PzjwJ/hyVJ1nQcvV/XYWtXgdH3quVXA9ziDbIT0/img.png?width=1802&amp;amp;height=1202&amp;amp;face=0_0_1802_1202,https://scrap.kakaocdn.net/dn/e98Gy/hyVGD9X9xW/d1PzVyr5bNvztj3mqKgdPK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://velog.io/@zero-black/MySQL-Workbench-%EC%84%A4%EC%B9%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@zero-black/MySQL-Workbench-%EC%84%A4%EC%B9%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gUvtO/hyVGORdm7g/LboiciZ526XjTczfr7aaMk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/PzjwJ/hyVJ1nQcvV/XYWtXgdH3quVXA9ziDbIT0/img.png?width=1802&amp;amp;height=1202&amp;amp;face=0_0_1802_1202,https://scrap.kakaocdn.net/dn/e98Gy/hyVGD9X9xW/d1PzVyr5bNvztj3mqKgdPK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;MySQL Workbench 설치 및 사용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최신 버전은 M1 맥에서 호환이 제대로 되지 않는 문제가 있었다. 따라서 처음에는 8.0.25버전을 설치했었는데, EER Diagram을 생성하던 중 문제가 생겨서 혹시 버전 문제일까 싶어서 8.0.29버전으로 재&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. mybatis insert후 키 반환&lt;/p&gt;
&lt;figure id=&quot;og_1712144614495&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MyBatis/iBatis] 방금 INSERT 된 Key 가져오기&quot; data-og-description=&quot;여러 테이블에 insert를 해야되는데, 방금 insert 된 그 PK를 다른테이블에서 써야할 때... select를 해올수도 없고 그럴땐??? 1. MyBatis /* query */ id가 autoincrement인 PK일 경우, 여기서 insert 된 행의 id 값을 &quot; data-og-host=&quot;marobiana.tistory.com&quot; data-og-source-url=&quot;https://marobiana.tistory.com/23&quot; data-og-url=&quot;https://marobiana.tistory.com/23&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EH7Ce/hyVJU3kUYE/8s9dFR4opaQN0HZ1tDoQik/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/pQ8R0/hyVJ3sstYq/FYVJFdulNhzaPV7wOqCmL1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bXjSE7/hyVJUWyJGr/l4anqhRElvt43gGri6BNx0/img.jpg?width=3456&amp;amp;height=5184&amp;amp;face=0_0_3456_5184&quot;&gt;&lt;a href=&quot;https://marobiana.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://marobiana.tistory.com/23&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EH7Ce/hyVJU3kUYE/8s9dFR4opaQN0HZ1tDoQik/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/pQ8R0/hyVJ3sstYq/FYVJFdulNhzaPV7wOqCmL1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bXjSE7/hyVJUWyJGr/l4anqhRElvt43gGri6BNx0/img.jpg?width=3456&amp;amp;height=5184&amp;amp;face=0_0_3456_5184');&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;MyBatis/iBatis] 방금 INSERT 된 Key 가져오기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;여러 테이블에 insert를 해야되는데, 방금 insert 된 그 PK를 다른테이블에서 써야할 때... select를 해올수도 없고 그럴땐??? 1. MyBatis /* query */ id가 autoincrement인 PK일 경우, 여기서 insert 된 행의 id 값을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;marobiana.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 데이터베이스 조인&lt;/p&gt;
&lt;figure id=&quot;og_1712145287915&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Oracle] SQL 문법 JOIN 조인 예제 및 정리 (1) - INNER JOIN | OUTER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | 조인절&quot; data-og-description=&quot;실무에서 필수로 쓰이는 JOIN 절에 대해서 정리해보겠다. 이번 포스팅에서는 INNER 조인 OUTER 조인에 대해서 간략하게 알아보자.. INNER JOIN 이란? LEFT OUTER JOIN 이란? .. 매번 JOIN절은 공부할때마다 이&quot; data-og-host=&quot;cceeun.tistory.com&quot; data-og-source-url=&quot;https://cceeun.tistory.com/189&quot; data-og-url=&quot;https://cceeun.tistory.com/189&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pKz2s/hyVGGMp4H8/PCSCQk6Qok8C6Q8DnE7SV0/img.png?width=294&amp;amp;height=241&amp;amp;face=0_0_294_241,https://scrap.kakaocdn.net/dn/oNHdV/hyVJWz5utZ/c5pZvwXXk2RDTKbXFzelY0/img.png?width=294&amp;amp;height=241&amp;amp;face=0_0_294_241,https://scrap.kakaocdn.net/dn/Tf1lo/hyVJ6pbgTn/RSBmEkJvyP7ZkEtXOduWBK/img.png?width=294&amp;amp;height=241&amp;amp;face=0_0_294_241&quot;&gt;&lt;a href=&quot;https://cceeun.tistory.com/189&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cceeun.tistory.com/189&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pKz2s/hyVGGMp4H8/PCSCQk6Qok8C6Q8DnE7SV0/img.png?width=294&amp;amp;height=241&amp;amp;face=0_0_294_241,https://scrap.kakaocdn.net/dn/oNHdV/hyVJWz5utZ/c5pZvwXXk2RDTKbXFzelY0/img.png?width=294&amp;amp;height=241&amp;amp;face=0_0_294_241,https://scrap.kakaocdn.net/dn/Tf1lo/hyVJ6pbgTn/RSBmEkJvyP7ZkEtXOduWBK/img.png?width=294&amp;amp;height=241&amp;amp;face=0_0_294_241');&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;[Oracle] SQL 문법 JOIN 조인 예제 및 정리 (1) - INNER JOIN | OUTER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | 조인절&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 필수로 쓰이는 JOIN 절에 대해서 정리해보겠다. 이번 포스팅에서는 INNER 조인 OUTER 조인에 대해서 간략하게 알아보자.. INNER JOIN 이란? LEFT OUTER JOIN 이란? .. 매번 JOIN절은 공부할때마다 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cceeun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. myBatis 중첩 조인&lt;/p&gt;
&lt;figure id=&quot;og_1712146787138&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;mybatis resultMap 활용 - join&quot; data-og-description=&quot;개발을 하다보면, 두 개 이상의 테이블을 join하여 결과를 가져와야 하는 경우가 많다.일반적으로 하나의 테이블에 각 컬럼에 해당하는 vo(value object) 를 만들어 사용하는데, mybatis에서 하나의 쿼&quot; data-og-host=&quot;ssssssu12.tistory.com&quot; data-og-source-url=&quot;https://ssssssu12.tistory.com/4&quot; data-og-url=&quot;https://ssssssu12.tistory.com/4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c2M2C2/hyVJ2G6aY0/IYLO9tvQBHiHLlMkiVzpGK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gdFWm/hyVJSqWB7e/t2B1qgFt7TXc0LMclHzOq1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/h1Dut/hyVJUhY5ld/KKaZbxSyMPGBEgcWK2kKCk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://ssssssu12.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ssssssu12.tistory.com/4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c2M2C2/hyVJ2G6aY0/IYLO9tvQBHiHLlMkiVzpGK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gdFWm/hyVJSqWB7e/t2B1qgFt7TXc0LMclHzOq1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/h1Dut/hyVJUhY5ld/KKaZbxSyMPGBEgcWK2kKCk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&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;mybatis resultMap 활용 - join&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발을 하다보면, 두 개 이상의 테이블을 join하여 결과를 가져와야 하는 경우가 많다.일반적으로 하나의 테이블에 각 컬럼에 해당하는 vo(value object) 를 만들어 사용하는데, mybatis에서 하나의 쿼&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ssssssu12.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10.jpa&lt;/p&gt;
&lt;figure id=&quot;og_1712149409708&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JPA] 연관관계 매핑 기초 #2 (양방향 연관관계와 연관관계의 주인)&quot; data-og-description=&quot;이번 글에서는 에 대해 알아보겠습니다. 이 시리즈 글은 김영한 님의 강의, 책을 보고 적은 것임을 알려드립니다. (강추) 오타 및 피드백 환영합니다. 양방향 연관관계 이전 글에서는 회원에서 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@conatuseus/%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-%EA%B8%B0%EC%B4%88-2-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%99%80-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%9D%98-%EC%A3%BC%EC%9D%B8&quot; data-og-url=&quot;https://velog.io/@conatuseus/연관관계-매핑-기초-2-양방향-연관관계와-연관관계의-주인&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwNObx/hyVJR6D6PP/EOweLwkdKOukl8IidoxQGK/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/d5X6we/hyVJ7hlKWr/cz6xvrubKieLvF7vlQzh31/img.jpg?width=720&amp;amp;height=960&amp;amp;face=282_453_328_504&quot;&gt;&lt;a href=&quot;https://velog.io/@conatuseus/%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-%EA%B8%B0%EC%B4%88-2-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%99%80-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%9D%98-%EC%A3%BC%EC%9D%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@conatuseus/%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-%EA%B8%B0%EC%B4%88-2-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%99%80-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%9D%98-%EC%A3%BC%EC%9D%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwNObx/hyVJR6D6PP/EOweLwkdKOukl8IidoxQGK/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/d5X6we/hyVJ7hlKWr/cz6xvrubKieLvF7vlQzh31/img.jpg?width=720&amp;amp;height=960&amp;amp;face=282_453_328_504');&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;[JPA] 연관관계 매핑 기초 #2 (양방향 연관관계와 연관관계의 주인)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 에 대해 알아보겠습니다. 이 시리즈 글은 김영한 님의 강의, 책을 보고 적은 것임을 알려드립니다. (강추) 오타 및 피드백 환영합니다. 양방향 연관관계 이전 글에서는 회원에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1712149417239&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JPA] 다대다 N : N 관계 풀어내기 (중간 테이블 생성)&quot; data-og-description=&quot;JPA를 사용하는 프로젝트를 진행하면서 다대다 관계를 풀어내야할 일이 생겼다. 객체 지향언어에서는 2개의 컬렉션 객체로 다대다 관계를 표현 할 수 있지만, 관계형 데이터베이스는 정규화된 2&quot; data-og-host=&quot;rachel0115.tistory.com&quot; data-og-source-url=&quot;https://rachel0115.tistory.com/entry/JPA-%EB%8B%A4%EB%8C%80%EB%8B%A4-N-N-%EA%B4%80%EA%B3%84-%ED%92%80%EC%96%B4%EB%82%B4%EA%B8%B0-%EC%A4%91%EA%B0%84-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1&quot; data-og-url=&quot;https://rachel0115.tistory.com/entry/JPA-%EB%8B%A4%EB%8C%80%EB%8B%A4-N-N-%EA%B4%80%EA%B3%84-%ED%92%80%EC%96%B4%EB%82%B4%EA%B8%B0-%EC%A4%91%EA%B0%84-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PeTeK/hyVJ19fzKd/0tpyTAqlganLu5QC5pq2dk/img.png?width=348&amp;amp;height=500&amp;amp;face=0_0_348_500,https://scrap.kakaocdn.net/dn/i6dEb/hyVJZp3QN7/w1Oa7bpyCxAFObLkiAVRx1/img.png?width=348&amp;amp;height=500&amp;amp;face=0_0_348_500,https://scrap.kakaocdn.net/dn/k15d9/hyVJYxVcGD/wpWxAdDwogdyjmRYJhEwI1/img.png?width=998&amp;amp;height=322&amp;amp;face=0_0_998_322&quot;&gt;&lt;a href=&quot;https://rachel0115.tistory.com/entry/JPA-%EB%8B%A4%EB%8C%80%EB%8B%A4-N-N-%EA%B4%80%EA%B3%84-%ED%92%80%EC%96%B4%EB%82%B4%EA%B8%B0-%EC%A4%91%EA%B0%84-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rachel0115.tistory.com/entry/JPA-%EB%8B%A4%EB%8C%80%EB%8B%A4-N-N-%EA%B4%80%EA%B3%84-%ED%92%80%EC%96%B4%EB%82%B4%EA%B8%B0-%EC%A4%91%EA%B0%84-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PeTeK/hyVJ19fzKd/0tpyTAqlganLu5QC5pq2dk/img.png?width=348&amp;amp;height=500&amp;amp;face=0_0_348_500,https://scrap.kakaocdn.net/dn/i6dEb/hyVJZp3QN7/w1Oa7bpyCxAFObLkiAVRx1/img.png?width=348&amp;amp;height=500&amp;amp;face=0_0_348_500,https://scrap.kakaocdn.net/dn/k15d9/hyVJYxVcGD/wpWxAdDwogdyjmRYJhEwI1/img.png?width=998&amp;amp;height=322&amp;amp;face=0_0_998_322');&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;[JPA] 다대다 N : N 관계 풀어내기 (중간 테이블 생성)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JPA를 사용하는 프로젝트를 진행하면서 다대다 관계를 풀어내야할 일이 생겼다. 객체 지향언어에서는 2개의 컬렉션 객체로 다대다 관계를 표현 할 수 있지만, 관계형 데이터베이스는 정규화된 2&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rachel0115.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/92</guid>
      <comments>https://dyd1310.tistory.com/92#entry92comment</comments>
      <pubDate>Wed, 3 Apr 2024 19:56:45 +0900</pubDate>
    </item>
    <item>
      <title>swift 교재에 있는 실습 프로젝트 따라하기</title>
      <link>https://dyd1310.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1711679284097&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;GitHub - bjpublic/SweetSwiftUI: 스윗한 SwiftUI 실전 앱 구현하기&quot; data-og-description=&quot;스윗한 SwiftUI 실전 앱 구현하기. Contribute to bjpublic/SweetSwiftUI development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/bjpublic/SweetSwiftUI&quot; data-og-url=&quot;https://github.com/bjpublic/SweetSwiftUI&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bE67AA/hyVGJnngee/Qd7rBuCjCzRnQhWREfPkcK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/bjpublic/SweetSwiftUI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/bjpublic/SweetSwiftUI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bE67AA/hyVGJnngee/Qd7rBuCjCzRnQhWREfPkcK/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;GitHub - bjpublic/SweetSwiftUI: 스윗한 SwiftUI 실전 앱 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스윗한 SwiftUI 실전 앱 구현하기. Contribute to bjpublic/SweetSwiftUI development by creating an account on GitHub.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git clone 후&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-29 at 11.29.03 AM.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;1902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkE9NL/btsGbByQqql/sumiaFdu4zP13ID921LDR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkE9NL/btsGbByQqql/sumiaFdu4zP13ID921LDR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkE9NL/btsGbByQqql/sumiaFdu4zP13ID921LDR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkE9NL%2FbtsGbByQqql%2FsumiaFdu4zP13ID921LDR0%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;539&quot; height=&quot;549&quot; data-filename=&quot;Screenshot 2024-03-29 at 11.29.03 AM.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;1902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 버전으로 switch 하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UIKit과 swiftUI를 함께 쓰는 프로젝트임을 상기할것.&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;find -&amp;gt; find and replace in project&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-29 at 11.43.12 AM.png&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;1736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTJNOI/btsGc4GO8Dl/H46OivAegT7R7kzD8JIr7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTJNOI/btsGc4GO8Dl/H46OivAegT7R7kzD8JIr7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTJNOI/btsGc4GO8Dl/H46OivAegT7R7kzD8JIr7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTJNOI%2FbtsGc4GO8Dl%2FH46OivAegT7R7kzD8JIr7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;604&quot; data-filename=&quot;Screenshot 2024-03-29 at 11.43.12 AM.png&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;1736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/91</guid>
      <comments>https://dyd1310.tistory.com/91#entry91comment</comments>
      <pubDate>Wed, 3 Apr 2024 13:47:31 +0900</pubDate>
    </item>
    <item>
      <title>스프링 컨트롤러 객체 매핑</title>
      <link>https://dyd1310.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트 매퍼 원리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-12 at 4.54.18 PM.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvJQsp/btsFUEP2d8H/PLKinWdOTIHjOF62Ng9w11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvJQsp/btsFUEP2d8H/PLKinWdOTIHjOF62Ng9w11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvJQsp/btsFUEP2d8H/PLKinWdOTIHjOF62Ng9w11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvJQsp%2FbtsFUEP2d8H%2FPLKinWdOTIHjOF62Ng9w11%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;1574&quot; height=&quot;814&quot; data-filename=&quot;Screen Shot 2024-03-12 at 4.54.18 PM.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http 요청(json)을 메세지 컨버터가 자바 객체로 만들때 오브젝트 매핑을 이용하여 직렬화한다.&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;메시지 컨버터의 경우 HTTP 요청이나 응답의 본문(body)에 포함된 데이터를 읽는 역할을 맡는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 바디 형식에 따라 어떠한 오브젝트 매퍼를 선택할지 결정하고 이를 이용해 요청을 자바 객체로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 바디를 자바 객체로 바꾸는 역할을 하는 것이 오브젝트 매퍼이다.&lt;/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;아래의 블로그는 json string을 직접 자바객체로 만드는 예시 코드를 보인다.&lt;/p&gt;
&lt;figure id=&quot;og_1710829585659&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] ObjectMapper를 이용하여 JSON 파싱하기&quot; data-og-description=&quot;Jackson 라이브러리의 ObjectMapper 클래스를 이용하여 JSON을 파싱해봅시다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@zooneon/Java-ObjectMapper%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-JSON-%ED%8C%8C%EC%8B%B1%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@zooneon/Java-ObjectMapper를-이용하여-JSON-파싱하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cKpq4m/hyVDxNl5UE/8RdIUVYyxVnKVutFNut1bk/img.png?width=385&amp;amp;height=144&amp;amp;face=0_0_385_144,https://scrap.kakaocdn.net/dn/b5yGOg/hyVAK1SOK4/5euMTIn06Y0tD7GXwlR0i0/img.png?width=385&amp;amp;height=144&amp;amp;face=0_0_385_144,https://scrap.kakaocdn.net/dn/kkpaK/hyVDI2psaH/c9egZV8CW4UdZZ87YdZgf1/img.png?width=421&amp;amp;height=421&amp;amp;face=99_173_235_321&quot;&gt;&lt;a href=&quot;https://velog.io/@zooneon/Java-ObjectMapper%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-JSON-%ED%8C%8C%EC%8B%B1%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@zooneon/Java-ObjectMapper%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-JSON-%ED%8C%8C%EC%8B%B1%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cKpq4m/hyVDxNl5UE/8RdIUVYyxVnKVutFNut1bk/img.png?width=385&amp;amp;height=144&amp;amp;face=0_0_385_144,https://scrap.kakaocdn.net/dn/b5yGOg/hyVAK1SOK4/5euMTIn06Y0tD7GXwlR0i0/img.png?width=385&amp;amp;height=144&amp;amp;face=0_0_385_144,https://scrap.kakaocdn.net/dn/kkpaK/hyVDI2psaH/c9egZV8CW4UdZZ87YdZgf1/img.png?width=421&amp;amp;height=421&amp;amp;face=99_173_235_321');&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;[Java] ObjectMapper를 이용하여 JSON 파싱하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jackson 라이브러리의 ObjectMapper 클래스를 이용하여 JSON을 파싱해봅시다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 블로그는 오브젝트 매핑에 어떠한 설정을 할 수 있는지 소개한다.&lt;/p&gt;
&lt;figure id=&quot;og_1710829859448&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;ObjectMapper&quot; data-og-description=&quot;1. serialize/deserialize 이슈 EDA 기반에서 메세지들의 serialize/deserialize 는 특히 더 주의해야한다. 시스템들이 분산 되어 있기 때문이다. 예를 들어 아래 그림 System1 에서 serialize 하고 메세지를 발행하&quot; data-og-host=&quot;yangbongsoo.tistory.com&quot; data-og-source-url=&quot;https://yangbongsoo.tistory.com/75&quot; data-og-url=&quot;https://yangbongsoo.tistory.com/75&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chxrvO/hyVABKC6Ni/2NAJSsWIQ8AGRdIk05P0y1/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/8uZtt/hyVAz0mXTz/OGgbSioDknykq6r7fuLxr0/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/el4KWJ/hyVAAZfYfp/mSmWl3BJkpNdN0yGGqGnc0/img.png?width=2560&amp;amp;height=846&amp;amp;face=0_0_2560_846&quot;&gt;&lt;a href=&quot;https://yangbongsoo.tistory.com/75&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yangbongsoo.tistory.com/75&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chxrvO/hyVABKC6Ni/2NAJSsWIQ8AGRdIk05P0y1/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/8uZtt/hyVAz0mXTz/OGgbSioDknykq6r7fuLxr0/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/el4KWJ/hyVAAZfYfp/mSmWl3BJkpNdN0yGGqGnc0/img.png?width=2560&amp;amp;height=846&amp;amp;face=0_0_2560_846');&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;ObjectMapper&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. serialize/deserialize 이슈 EDA 기반에서 메세지들의 serialize/deserialize 는 특히 더 주의해야한다. 시스템들이 분산 되어 있기 때문이다. 예를 들어 아래 그림 System1 에서 serialize 하고 메세지를 발행하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yangbongsoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 오브젝트 매핑 전역 설정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜 json 직렬화 형식, 스네이프 케이스, 없는 필드 무시 등 새로운 오브젝트 매퍼를 생성하여 직접 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 2가지 옵션이 있다. 1번째는 직접 커스텀한 오브젝트 매퍼를 빈으로 등록하는 것이고 2번째는 메세지 컨버터에서 사용하는 기본 오브젝트 매퍼의 설정을 이어받은 후 추가로 설정하는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 블로그는 직접 serializer를 만들고 이를 오브젝트 매퍼에 등록하는 방법을 보여주고 있다.&lt;/p&gt;
&lt;figure id=&quot;og_1710830393976&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b03WDQ/hyVDs6lwRu/jxhSlNOKkkrSZmDD9rRRJ1/img.png?width=622&amp;amp;height=166&amp;amp;face=0_0_622_166,https://scrap.kakaocdn.net/dn/9EQhX/hyVDC8Yekf/L6EgL3Fc0iGTRwK8EAEi0K/img.png?width=622&amp;amp;height=166&amp;amp;face=0_0_622_166&quot; data-og-url=&quot;https://multifrontgarden.tistory.com/172&quot; data-og-source-url=&quot;https://multifrontgarden.tistory.com/172&quot; data-og-host=&quot;multifrontgarden.tistory.com&quot; data-og-description=&quot;1. JacksonAjax 통신을 할때는 Response Body에 데이터만 담아서 클라이언트로 전송하게된다. 이때 가장 많이 사용하는 포맷은 json 형태일텐데 자바 객체를 json 형태로 변환해주는 여러 라이브러리중 하&quot; data-og-title=&quot;jackson custom serializer, deserializer 만들기&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://multifrontgarden.tistory.com/172&quot; data-source-url=&quot;https://multifrontgarden.tistory.com/172&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b03WDQ/hyVDs6lwRu/jxhSlNOKkkrSZmDD9rRRJ1/img.png?width=622&amp;amp;height=166&amp;amp;face=0_0_622_166,https://scrap.kakaocdn.net/dn/9EQhX/hyVDC8Yekf/L6EgL3Fc0iGTRwK8EAEi0K/img.png?width=622&amp;amp;height=166&amp;amp;face=0_0_622_166');&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;jackson custom serializer, deserializer 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. JacksonAjax 통신을 할때는 Response Body에 데이터만 담아서 클라이언트로 전송하게된다. 이때 가장 많이 사용하는 포맷은 json 형태일텐데 자바 객체를 json 형태로 변환해주는 여러 라이브러리중 하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;multifrontgarden.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메세지 컨버터는 바디를 읽고 적절한 오브젝트 매퍼를 매칭시킨다고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;json에 있는 필드명과 우리가 매핑하려는 객체의 필드명과 일치하면 이를 객체에 옮겨 담아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 매핑하려는 객체가 또 다른 객체를 참조한다면? json depth가 깊어지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 필드가 아니라 특정 필드만을 json에 담기위해 serializer를 생성하여 우리가 원하는 대로 객체를 매핑 시킬 수 있다.&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;figure id=&quot;og_1710830267013&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;spring boot 에서 ObjectMapper 확장하기&quot; data-og-description=&quot;spring-boot-starter-web 을 이용해 웹서버 애플리케이션을 만들고 있다면 json 에 대한 핸들링은 jackson 을 이용하게 된다. 물론 jackson 외 다른 라이브러리를 이용하고 싶다면 변경할 수 있다. jackson 에서&quot; data-og-host=&quot;multifrontgarden.tistory.com&quot; data-og-source-url=&quot;https://multifrontgarden.tistory.com/m/300&quot; data-og-url=&quot;https://multifrontgarden.tistory.com/m/300&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ToSfo/hyVAIXiB96/AjOJrGb62Zmpwo2vOOvIJk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cmmLtq/hyVDGKiJxs/RGE8KdMnMa2jsKFrGsUrC1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://multifrontgarden.tistory.com/m/300&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://multifrontgarden.tistory.com/m/300&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ToSfo/hyVAIXiB96/AjOJrGb62Zmpwo2vOOvIJk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cmmLtq/hyVDGKiJxs/RGE8KdMnMa2jsKFrGsUrC1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;spring boot 에서 ObjectMapper 확장하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;spring-boot-starter-web 을 이용해 웹서버 애플리케이션을 만들고 있다면 json 에 대한 핸들링은 jackson 을 이용하게 된다. 물론 jackson 외 다른 라이브러리를 이용하고 싶다면 변경할 수 있다. jackson 에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;multifrontgarden.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710830744729&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

@Configuration
public class ObjectMapperCustomizerConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer objectMapperCustomizer() {
        return builder -&amp;gt; {
            // JDK 8 모듈 및 Java Time 모듈 추가
            builder.modules(new Jdk8Module(), new JavaTimeModule());
            // 날짜를 타임스탬프로 쓰지 않고 ISO-8601 형식으로 직렬화하도록 설정
            builder.featuresToDisable(
                SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
                SerializationFeature.FAIL_ON_EMPTY_BEANS
            );
            // 알 수 없는 속성이 있을 때 예외를 발생시키지 않고 무시하도록 설정
            builder.featuresToEnable(
                DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
            );
            // 속성 네이밍 전략을 스네이크 케이스로 설정
            builder.propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
        };
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 종합하여 예제 코드를 만들었다.&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/89</guid>
      <comments>https://dyd1310.tistory.com/89#entry89comment</comments>
      <pubDate>Tue, 19 Mar 2024 15:27:26 +0900</pubDate>
    </item>
    <item>
      <title>스프링 동작원리2</title>
      <link>https://dyd1310.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Argument Resolver&lt;/p&gt;
&lt;figure id=&quot;og_1710484195142&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;아규먼트 리졸버(Argument Resolver)&quot; data-og-description=&quot;아규먼트 리졸버(Argument Resolver)는 사용자가 컨트롤러의 메서드 인자값으로 임의의 값을 전달하려할 때 사용된다. 예를 들어, 세션에 저장되어 있는 값 중, 특정 이름의 값을 메서드 인자로 전달&quot; data-og-host=&quot;enai.tistory.com&quot; data-og-source-url=&quot;https://enai.tistory.com/31&quot; data-og-url=&quot;https://enai.tistory.com/31&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3KOnM/hyVynsfYVe/hEluB8ibp410GUn0y9jY01/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cpDj0x/hyVyheszEi/KqQ9I8ZFwkEVouQvoZl6nk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://enai.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://enai.tistory.com/31&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3KOnM/hyVynsfYVe/hEluB8ibp410GUn0y9jY01/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cpDj0x/hyVyheszEi/KqQ9I8ZFwkEVouQvoZl6nk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;아규먼트 리졸버(Argument Resolver)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;아규먼트 리졸버(Argument Resolver)는 사용자가 컨트롤러의 메서드 인자값으로 임의의 값을 전달하려할 때 사용된다. 예를 들어, 세션에 저장되어 있는 값 중, 특정 이름의 값을 메서드 인자로 전달&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;enai.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710484252180&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;스프링에서 Argument Resolver 사용하기&quot; data-og-description=&quot;컨트롤러에서 쿼리 스트링을 변수에 바인딩하려면 @RequestParam 을, 가변적인 경로를 변수에 바인딩하려면 @PathVariable 을, HTTP Body를 변수에 바인딩하려면 @RequestBody 를 사용해야한다. 하지만 HTTP Head&quot; data-og-host=&quot;hudi.blog&quot; data-og-source-url=&quot;https://hudi.blog/spring-argument-resolver/&quot; data-og-url=&quot;https://hudi.blog/spring-argument-resolver/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGwpHD/hyVAOaZz0f/h5auSCA9PdkAfFH4CjeP4K/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400&quot;&gt;&lt;a href=&quot;https://hudi.blog/spring-argument-resolver/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hudi.blog/spring-argument-resolver/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGwpHD/hyVAOaZz0f/h5auSCA9PdkAfFH4CjeP4K/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400');&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;스프링에서 Argument Resolver 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;컨트롤러에서 쿼리 스트링을 변수에 바인딩하려면 @RequestParam 을, 가변적인 경로를 변수에 바인딩하려면 @PathVariable 을, HTTP Body를 변수에 바인딩하려면 @RequestBody 를 사용해야한다. 하지만 HTTP Head&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hudi.blog&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710485804873&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring Argument Resovler | Carrey&amp;#96;s 기술블로그&quot; data-og-description=&quot;회사 업무 중에 이미 개발 된 API의 Controller에 요청을 보낸 Client의 IP 정보를 보내달라는 수정 사항이 들어 왔다. 처음에는 Javascript로 Client IP를 찾아서 Controller의 메소드의 Parameter로 보내야 하나..&quot; data-og-host=&quot;jaehun2841.github.io&quot; data-og-source-url=&quot;https://jaehun2841.github.io/2018/08/09/2018-08-10-spring-argument-resolver/&quot; data-og-url=&quot;https://jaehun2841.github.io/2018/08/09/2018-08-10-spring-argument-resolver/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wYuk6/hyVBLkFZ9g/2O3ZHCq6pbgKblieeVhUuK/img.png?width=1708&amp;amp;height=1044&amp;amp;face=0_0_1708_1044,https://scrap.kakaocdn.net/dn/de1luf/hyVyka9BqG/KWd8QqZm8dOegGkfreLI0K/img.png?width=1138&amp;amp;height=504&amp;amp;face=0_0_1138_504,https://scrap.kakaocdn.net/dn/LxIrn/hyVypwMYzi/X9N9kG4R5fcegG7RagScYk/img.jpg?width=701&amp;amp;height=386&amp;amp;face=0_0_701_386&quot;&gt;&lt;a href=&quot;https://jaehun2841.github.io/2018/08/09/2018-08-10-spring-argument-resolver/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jaehun2841.github.io/2018/08/09/2018-08-10-spring-argument-resolver/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wYuk6/hyVBLkFZ9g/2O3ZHCq6pbgKblieeVhUuK/img.png?width=1708&amp;amp;height=1044&amp;amp;face=0_0_1708_1044,https://scrap.kakaocdn.net/dn/de1luf/hyVyka9BqG/KWd8QqZm8dOegGkfreLI0K/img.png?width=1138&amp;amp;height=504&amp;amp;face=0_0_1138_504,https://scrap.kakaocdn.net/dn/LxIrn/hyVypwMYzi/X9N9kG4R5fcegG7RagScYk/img.jpg?width=701&amp;amp;height=386&amp;amp;face=0_0_701_386');&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;Spring Argument Resovler | Carrey`s 기술블로그&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;회사 업무 중에 이미 개발 된 API의 Controller에 요청을 보낸 Client의 IP 정보를 보내달라는 수정 사항이 들어 왔다. 처음에는 Javascript로 Client IP를 찾아서 Controller의 메소드의 Parameter로 보내야 하나..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jaehun2841.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 메세지 컨버터&lt;/p&gt;
&lt;figure id=&quot;og_1710485173994&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[6] 스프링 MVC (12) - HTTP 메시지 컨버터 원리 (+Argument Resolver / ReturnValue Handler)&quot; data-og-description=&quot;HTTP response로 뷰가 아닌 데이터를 담아서 보내는 경우viewResolver대신 HttpMessageConventer가 동작 (다양한 종류의 컨버터가 존재함)기본 문자 --&amp;gt; StringHttpMessageConverter가 처리기본 객체 --&amp;gt; Mappin&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-12-HTTP-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%BB%A8%EB%B2%84%ED%84%B0-%EC%9B%90%EB%A6%AC-Argument-Resolver-ReturnValue-Handler&quot; data-og-url=&quot;https://velog.io/@neity16/6-스프링-MVC-12-HTTP-메시지-컨버터-원리-Argument-Resolver-ReturnValue-Handler&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jLFtX/hyVBMYb4qt/F60ARSkzI5bzUg7iJk0vjk/img.jpg?width=859&amp;amp;height=380&amp;amp;face=0_0_859_380,https://scrap.kakaocdn.net/dn/cECBnV/hyVAIPm6Db/3uShEpKIzhXDlEigwg6QCK/img.jpg?width=859&amp;amp;height=380&amp;amp;face=0_0_859_380,https://scrap.kakaocdn.net/dn/bd7iAG/hyVxwpxtXo/9huTS2GojpCgNoa6yTjGw1/img.jpg?width=3024&amp;amp;height=4032&amp;amp;face=0_0_3024_4032&quot;&gt;&lt;a href=&quot;https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-12-HTTP-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%BB%A8%EB%B2%84%ED%84%B0-%EC%9B%90%EB%A6%AC-Argument-Resolver-ReturnValue-Handler&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-12-HTTP-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%BB%A8%EB%B2%84%ED%84%B0-%EC%9B%90%EB%A6%AC-Argument-Resolver-ReturnValue-Handler&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jLFtX/hyVBMYb4qt/F60ARSkzI5bzUg7iJk0vjk/img.jpg?width=859&amp;amp;height=380&amp;amp;face=0_0_859_380,https://scrap.kakaocdn.net/dn/cECBnV/hyVAIPm6Db/3uShEpKIzhXDlEigwg6QCK/img.jpg?width=859&amp;amp;height=380&amp;amp;face=0_0_859_380,https://scrap.kakaocdn.net/dn/bd7iAG/hyVxwpxtXo/9huTS2GojpCgNoa6yTjGw1/img.jpg?width=3024&amp;amp;height=4032&amp;amp;face=0_0_3024_4032');&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;[6] 스프링 MVC (12) - HTTP 메시지 컨버터 원리 (+Argument Resolver / ReturnValue Handler)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP response로 뷰가 아닌 데이터를 담아서 보내는 경우viewResolver대신 HttpMessageConventer가 동작 (다양한 종류의 컨버터가 존재함)기본 문자 --&amp;gt; StringHttpMessageConverter가 처리기본 객체 --&amp;gt; Mappin&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;returnValueHandler&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/88</guid>
      <comments>https://dyd1310.tistory.com/88#entry88comment</comments>
      <pubDate>Fri, 15 Mar 2024 15:00:22 +0900</pubDate>
    </item>
    <item>
      <title>스프링 modelAttribute 와 validation</title>
      <link>https://dyd1310.tistory.com/87</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715761478572&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;@RequestBody vs @ModelAttribute&quot; data-og-description=&quot;1. @RequestBody와 @ModelAttribute Controller.java @RequestBody와 @ModelAttribute는 클라이언트 측에서 보낸 데이터를 Java&amp;hellip;&quot; data-og-host=&quot;tecoble.techcourse.co.kr&quot; data-og-source-url=&quot;https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/&quot; data-og-url=&quot;https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kxOul/hyV2zF1Y41/1BNZobxkDITaVTxvSREsXk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dmpAvC/hyV6h4N8Wi/8K1GAKtIO3nScBSC4uF3F1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/QAJSk/hyV6fsoTFt/8whndfkURxfHrpDI01TTrK/img.png?width=1388&amp;amp;height=932&amp;amp;face=0_0_1388_932&quot;&gt;&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kxOul/hyV2zF1Y41/1BNZobxkDITaVTxvSREsXk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dmpAvC/hyV6h4N8Wi/8K1GAKtIO3nScBSC4uF3F1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/QAJSk/hyV6fsoTFt/8whndfkURxfHrpDI01TTrK/img.png?width=1388&amp;amp;height=932&amp;amp;face=0_0_1388_932');&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;@RequestBody vs @ModelAttribute&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. @RequestBody와 @ModelAttribute Controller.java @RequestBody와 @ModelAttribute는 클라이언트 측에서 보낸 데이터를 Java&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tecoble.techcourse.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710482353785&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] ResponseEntity란 무엇인가?&quot; data-og-description=&quot;먼저 REST API가 무엇인지는 아래 블로그를 먼저 잘 읽어보자. https://meetup.toast.com/posts/92 REST API 제대로 알고 사용하기 : TOAST Meetup REST API 제대로 알고 사용하기 meetup.toast.com 1. ResponseEntity란? Spring Fra&quot; data-og-host=&quot;devlog-wjdrbs96.tistory.com&quot; data-og-source-url=&quot;https://devlog-wjdrbs96.tistory.com/182&quot; data-og-url=&quot;https://devlog-wjdrbs96.tistory.com/182&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Aojpd/hyVBNpflQd/8aMvAzzjMM84PBXhKn3nd0/img.png?width=278&amp;amp;height=181&amp;amp;face=0_0_278_181,https://scrap.kakaocdn.net/dn/Ejaxj/hyVypQ7laX/ZHnPoxnzD9YFMKFYMEkJ00/img.png?width=278&amp;amp;height=181&amp;amp;face=0_0_278_181,https://scrap.kakaocdn.net/dn/epGvRD/hyVycEelKf/vRRaCsbPxyGCHyz1x55qXK/img.png?width=2748&amp;amp;height=354&amp;amp;face=0_0_2748_354&quot;&gt;&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/182&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devlog-wjdrbs96.tistory.com/182&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Aojpd/hyVBNpflQd/8aMvAzzjMM84PBXhKn3nd0/img.png?width=278&amp;amp;height=181&amp;amp;face=0_0_278_181,https://scrap.kakaocdn.net/dn/Ejaxj/hyVypQ7laX/ZHnPoxnzD9YFMKFYMEkJ00/img.png?width=278&amp;amp;height=181&amp;amp;face=0_0_278_181,https://scrap.kakaocdn.net/dn/epGvRD/hyVycEelKf/vRRaCsbPxyGCHyz1x55qXK/img.png?width=2748&amp;amp;height=354&amp;amp;face=0_0_2748_354');&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;[Spring Boot] ResponseEntity란 무엇인가?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;먼저 REST API가 무엇인지는 아래 블로그를 먼저 잘 읽어보자. https://meetup.toast.com/posts/92 REST API 제대로 알고 사용하기 : TOAST Meetup REST API 제대로 알고 사용하기 meetup.toast.com 1. ResponseEntity란? Spring Fra&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devlog-wjdrbs96.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1715761570631&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] Validation 적용하는 법 - BindingResult 적용하기&quot; data-og-description=&quot;spring boot 2.3 version 이상부터는 spring-boot-starter-web 의존성 내부에 있던 validation이 사라졌습니다.때문에 사용하시는 spring boot version이 2.3 이상이라면 validation 의존성을 따로 추가해주셔야&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@mooh2jj/Spring-Boot-Validation-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95&quot; data-og-url=&quot;https://velog.io/@mooh2jj/Spring-Boot-Validation-적용하는-법&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beQFHY/hyV2vjnk3e/O5d7PM5u4lpnCYcc1HM5t0/img.jpg?width=900&amp;amp;height=500&amp;amp;face=0_0_900_500,https://scrap.kakaocdn.net/dn/WcLFi/hyV6le4p1w/5YhXf3FJwiDk5SjDkjQyk0/img.jpg?width=900&amp;amp;height=500&amp;amp;face=0_0_900_500,https://scrap.kakaocdn.net/dn/cxbYxi/hyV2ArpBzc/HX90LUWZYjiQnOMrdsEj20/img.jpg?width=1440&amp;amp;height=1440&amp;amp;face=0_0_1440_1440&quot;&gt;&lt;a href=&quot;https://velog.io/@mooh2jj/Spring-Boot-Validation-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@mooh2jj/Spring-Boot-Validation-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beQFHY/hyV2vjnk3e/O5d7PM5u4lpnCYcc1HM5t0/img.jpg?width=900&amp;amp;height=500&amp;amp;face=0_0_900_500,https://scrap.kakaocdn.net/dn/WcLFi/hyV6le4p1w/5YhXf3FJwiDk5SjDkjQyk0/img.jpg?width=900&amp;amp;height=500&amp;amp;face=0_0_900_500,https://scrap.kakaocdn.net/dn/cxbYxi/hyV2ArpBzc/HX90LUWZYjiQnOMrdsEj20/img.jpg?width=1440&amp;amp;height=1440&amp;amp;face=0_0_1440_1440');&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;[Spring Boot] Validation 적용하는 법 - BindingResult 적용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;spring boot 2.3 version 이상부터는 spring-boot-starter-web 의존성 내부에 있던 validation이 사라졌습니다.때문에 사용하시는 spring boot version이 2.3 이상이라면 validation 의존성을 따로 추가해주셔야&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/87</guid>
      <comments>https://dyd1310.tistory.com/87#entry87comment</comments>
      <pubDate>Fri, 15 Mar 2024 15:00:07 +0900</pubDate>
    </item>
    <item>
      <title>스프링 propertis</title>
      <link>https://dyd1310.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프레임워크 구동 순서&lt;/p&gt;
&lt;figure id=&quot;og_1710486885543&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 스프링 프레임워크 구동 순서 (Java Config)&quot; data-og-description=&quot;직접 공부하며 정리한 내용이라 틀린 내용이 있을 수 있습니다! JavaConfig방식을 통해 스프링이 구동되는 순서를 알아보자. 먼저 xml설정일 때의 예로, 전체적인 그림을 보면 다음과 같다. 웹 어플&quot; data-og-host=&quot;jonyo.tistory.com&quot; data-og-source-url=&quot;https://jonyo.tistory.com/178&quot; data-og-url=&quot;https://jonyo.tistory.com/178&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HHTC4/hyVBLEYHJm/UvqACzv6AJpzHW7l2nVBH1/img.png?width=800&amp;amp;height=406&amp;amp;face=0_0_800_406,https://scrap.kakaocdn.net/dn/dF0xf2/hyVydwoYza/ZTxeklCQYqIfkedKA1qce1/img.png?width=800&amp;amp;height=406&amp;amp;face=0_0_800_406,https://scrap.kakaocdn.net/dn/c4h1P8/hyVAyF03Mb/oELAnkKDWlV1m5eNMMCvw0/img.png?width=1418&amp;amp;height=720&amp;amp;face=0_0_1418_720&quot;&gt;&lt;a href=&quot;https://jonyo.tistory.com/178&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jonyo.tistory.com/178&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HHTC4/hyVBLEYHJm/UvqACzv6AJpzHW7l2nVBH1/img.png?width=800&amp;amp;height=406&amp;amp;face=0_0_800_406,https://scrap.kakaocdn.net/dn/dF0xf2/hyVydwoYza/ZTxeklCQYqIfkedKA1qce1/img.png?width=800&amp;amp;height=406&amp;amp;face=0_0_800_406,https://scrap.kakaocdn.net/dn/c4h1P8/hyVAyF03Mb/oELAnkKDWlV1m5eNMMCvw0/img.png?width=1418&amp;amp;height=720&amp;amp;face=0_0_1418_720');&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;[Spring] 스프링 프레임워크 구동 순서 (Java Config)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;직접 공부하며 정리한 내용이라 틀린 내용이 있을 수 있습니다! JavaConfig방식을 통해 스프링이 구동되는 순서를 알아보자. 먼저 xml설정일 때의 예로, 전체적인 그림을 보면 다음과 같다. 웹 어플&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jonyo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로필 (환경별 설정파일)&lt;/p&gt;
&lt;figure id=&quot;og_1710479374044&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Spring System Properties 그리고 Spring Profiles에 대해&quot; data-og-description=&quot;업로드중..&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@choidongkuen/spring-Spring-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EB%82%98%EB%88%84%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@choidongkuen/spring-Spring-설정-파일-나누기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uk9cZ/hyVBEsix8T/PKpltH81WKZikIPupSubWk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/i6PWM/hyVBCnIwyA/D7dECiUkmjixWUGi8K0srK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/5UIIk/hyVBSqx8g2/NKxF1ZL3doRMsN3va6JwC1/img.jpg?width=2088&amp;amp;height=1348&amp;amp;face=0_0_2088_1348&quot;&gt;&lt;a href=&quot;https://velog.io/@choidongkuen/spring-Spring-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EB%82%98%EB%88%84%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@choidongkuen/spring-Spring-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EB%82%98%EB%88%84%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uk9cZ/hyVBEsix8T/PKpltH81WKZikIPupSubWk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/i6PWM/hyVBCnIwyA/D7dECiUkmjixWUGi8K0srK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/5UIIk/hyVBSqx8g2/NKxF1ZL3doRMsN3va6JwC1/img.jpg?width=2088&amp;amp;height=1348&amp;amp;face=0_0_2088_1348');&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;[Spring] Spring System Properties 그리고 Spring Profiles에 대해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;업로드중..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.배치 스케줄러&lt;/p&gt;
&lt;figure id=&quot;og_1710479774156&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] Spring Batch + scheduler 사용해 일정 주기로 실행 방법&quot; data-og-description=&quot;Spring Batch란? 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크다. 1. Gradle에 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-batch' implementation 'org.springframework.bo&quot; data-og-host=&quot;cocococo.tistory.com&quot; data-og-source-url=&quot;https://cocococo.tistory.com/entry/Spring-Boot-Spring-Batch-scheduler-%EC%82%AC%EC%9A%A9%ED%95%B4-%EC%9D%BC%EC%A0%95-%EC%A3%BC%EA%B8%B0%EB%A1%9C-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95&quot; data-og-url=&quot;https://cocococo.tistory.com/entry/Spring-Boot-Spring-Batch-scheduler-%EC%82%AC%EC%9A%A9%ED%95%B4-%EC%9D%BC%EC%A0%95-%EC%A3%BC%EA%B8%B0%EB%A1%9C-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hlTlC/hyVAC2Gg3Q/j4P4z6D1Gn87buScSUSjN1/img.png?width=726&amp;amp;height=306&amp;amp;face=0_0_726_306,https://scrap.kakaocdn.net/dn/b85ds2/hyVANQGwT0/wYkXPiKw84WWZ1hlkxEwPK/img.png?width=726&amp;amp;height=306&amp;amp;face=0_0_726_306,https://scrap.kakaocdn.net/dn/lGtp0/hyVymmvfZ2/JPXXiP5Y0dn4LEyb5zRum1/img.jpg?width=666&amp;amp;height=542&amp;amp;face=0_0_666_542&quot;&gt;&lt;a href=&quot;https://cocococo.tistory.com/entry/Spring-Boot-Spring-Batch-scheduler-%EC%82%AC%EC%9A%A9%ED%95%B4-%EC%9D%BC%EC%A0%95-%EC%A3%BC%EA%B8%B0%EB%A1%9C-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cocococo.tistory.com/entry/Spring-Boot-Spring-Batch-scheduler-%EC%82%AC%EC%9A%A9%ED%95%B4-%EC%9D%BC%EC%A0%95-%EC%A3%BC%EA%B8%B0%EB%A1%9C-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hlTlC/hyVAC2Gg3Q/j4P4z6D1Gn87buScSUSjN1/img.png?width=726&amp;amp;height=306&amp;amp;face=0_0_726_306,https://scrap.kakaocdn.net/dn/b85ds2/hyVANQGwT0/wYkXPiKw84WWZ1hlkxEwPK/img.png?width=726&amp;amp;height=306&amp;amp;face=0_0_726_306,https://scrap.kakaocdn.net/dn/lGtp0/hyVymmvfZ2/JPXXiP5Y0dn4LEyb5zRum1/img.jpg?width=666&amp;amp;height=542&amp;amp;face=0_0_666_542');&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;[Spring Boot] Spring Batch + scheduler 사용해 일정 주기로 실행 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Batch란? 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크다. 1. Gradle에 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-batch' implementation 'org.springframework.bo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cocococo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 로깅설정&lt;/p&gt;
&lt;figure id=&quot;og_1710479672824&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[스프링부트 (5)] Spring Boot 로그 설정(1) - Logback&quot; data-og-description=&quot;[스프링부트 (5)] Spring Boot Log 설정(1) - Logback 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 스프링 부트 Log 설정 - 로그백] 입니다. : -) 1. Logback 이란? 특징? - 자바 오픈소스 로깅 프레임워크, SLF4J의&quot; data-og-host=&quot;goddaehee.tistory.com&quot; data-og-source-url=&quot;https://goddaehee.tistory.com/206&quot; data-og-url=&quot;https://goddaehee.tistory.com/206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4nQxt/hyVACn42EB/65hVhODxPtPWHmzyQKAKJk/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/ctXAPR/hyVxukXurD/WEboeqRhFekAF3pc3U5uH0/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/lW7pQ/hyVBE6TV2X/ZTeKZGTmP7p8vL3GvASMW1/img.png?width=842&amp;amp;height=290&amp;amp;face=0_0_842_290&quot;&gt;&lt;a href=&quot;https://goddaehee.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goddaehee.tistory.com/206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4nQxt/hyVACn42EB/65hVhODxPtPWHmzyQKAKJk/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/ctXAPR/hyVxukXurD/WEboeqRhFekAF3pc3U5uH0/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/lW7pQ/hyVBE6TV2X/ZTeKZGTmP7p8vL3GvASMW1/img.png?width=842&amp;amp;height=290&amp;amp;face=0_0_842_290');&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;[스프링부트 (5)] Spring Boot 로그 설정(1) - Logback&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[스프링부트 (5)] Spring Boot Log 설정(1) - Logback 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 스프링 부트 Log 설정 - 로그백] 입니다. : -) 1. Logback 이란? 특징? - 자바 오픈소스 로깅 프레임워크, SLF4J의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;goddaehee.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 캐시 설정&lt;/p&gt;
&lt;figure id=&quot;og_1710479857363&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SpringBoot의 기본 Cache 사용하기&quot; data-og-description=&quot;개발을 하다보면 어라? 이 데이터 계속 똑같이 사용되고 업데이트 될 일이 없는데? 하는 것들이 보인다. 데이터 업데이트가 자주 이뤄지지도 않고 자주 호출되는 데이터인데 계속 DB에 가서 데이&quot; data-og-host=&quot;pamyferret.tistory.com&quot; data-og-source-url=&quot;https://pamyferret.tistory.com/8&quot; data-og-url=&quot;https://pamyferret.tistory.com/8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BYFYy/hyVxqphC2b/rX0ehDmLqgkVXb40kwVP5K/img.png?width=228&amp;amp;height=134&amp;amp;face=0_0_228_134,https://scrap.kakaocdn.net/dn/bd4G1f/hyVypXQ9gb/991T5zJyHGMK6K2HjBpe8k/img.png?width=228&amp;amp;height=134&amp;amp;face=0_0_228_134,https://scrap.kakaocdn.net/dn/fd8gT/hyVBEy3XxR/8kcFxk4PqyJ6f0NuHYlKf1/img.png?width=601&amp;amp;height=437&amp;amp;face=0_0_601_437&quot;&gt;&lt;a href=&quot;https://pamyferret.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pamyferret.tistory.com/8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BYFYy/hyVxqphC2b/rX0ehDmLqgkVXb40kwVP5K/img.png?width=228&amp;amp;height=134&amp;amp;face=0_0_228_134,https://scrap.kakaocdn.net/dn/bd4G1f/hyVypXQ9gb/991T5zJyHGMK6K2HjBpe8k/img.png?width=228&amp;amp;height=134&amp;amp;face=0_0_228_134,https://scrap.kakaocdn.net/dn/fd8gT/hyVBEy3XxR/8kcFxk4PqyJ6f0NuHYlKf1/img.png?width=601&amp;amp;height=437&amp;amp;face=0_0_601_437');&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;SpringBoot의 기본 Cache 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발을 하다보면 어라? 이 데이터 계속 똑같이 사용되고 업데이트 될 일이 없는데? 하는 것들이 보인다. 데이터 업데이트가 자주 이뤄지지도 않고 자주 호출되는 데이터인데 계속 DB에 가서 데이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pamyferret.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 보안설정&lt;/p&gt;
&lt;figure id=&quot;og_1710479896848&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Spring Security 설정 및 구현(Session)_Spring boot3.0.0 이상&quot; data-og-description=&quot;1. Spring Security 란? □ Spring Security란 Spring Security는 Spring 기반 애플리케이션의 보안(인증과 권한 등)을 담당하는 프레임 워크입니다. Spring Security는 인증과 권한에 대해 Filter 흐름에 따라 처&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@woosim34/Spring-Spring-Security-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EA%B5%AC%ED%98%84SessionSpring-boot3.0-%EC%9D%B4%EC%83%81&quot; data-og-url=&quot;https://velog.io/@woosim34/Spring-Spring-Security-설정-및-구현SessionSpring-boot3.0-이상&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cSIl0M/hyVBLSutES/Wd5zUc9rRNwUUgmwAgoYs0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/0am6l/hyVxyOo51d/cKfDN4NOn4dAqFSs2HtHGK/img.png?width=967&amp;amp;height=646&amp;amp;face=0_0_967_646,https://scrap.kakaocdn.net/dn/dDhY7j/hyVyiLeUyU/w4P3hDRJ2pojom8ihwf6Kk/img.png?width=880&amp;amp;height=392&amp;amp;face=0_0_880_392&quot;&gt;&lt;a href=&quot;https://velog.io/@woosim34/Spring-Spring-Security-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EA%B5%AC%ED%98%84SessionSpring-boot3.0-%EC%9D%B4%EC%83%81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@woosim34/Spring-Spring-Security-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EA%B5%AC%ED%98%84SessionSpring-boot3.0-%EC%9D%B4%EC%83%81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cSIl0M/hyVBLSutES/Wd5zUc9rRNwUUgmwAgoYs0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/0am6l/hyVxyOo51d/cKfDN4NOn4dAqFSs2HtHGK/img.png?width=967&amp;amp;height=646&amp;amp;face=0_0_967_646,https://scrap.kakaocdn.net/dn/dDhY7j/hyVyiLeUyU/w4P3hDRJ2pojom8ihwf6Kk/img.png?width=880&amp;amp;height=392&amp;amp;face=0_0_880_392');&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;[Spring] Spring Security 설정 및 구현(Session)_Spring boot3.0.0 이상&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Spring Security 란? □ Spring Security란 Spring Security는 Spring 기반 애플리케이션의 보안(인증과 권한 등)을 담당하는 프레임 워크입니다. Spring Security는 인증과 권한에 대해 Filter 흐름에 따라 처&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 트랜젝션 설정 및 사용&lt;/p&gt;
&lt;figure id=&quot;og_1710480191774&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Spring Boot에서 트랜잭션 사용하기&quot; data-og-description=&quot;일반적으로 하나의 비즈니스는 한 트랜잭션 내부에서 다룹니다. 비즈니스로직이 실행되는 도중 어떠한 이유로 메서드 실행이 중단된다면 지금껏 처리한 모든 쿼리가 롤백되어야 합니다. 체스 &quot; data-og-host=&quot;steadyjay.tistory.com&quot; data-og-source-url=&quot;https://steadyjay.tistory.com/33&quot; data-og-url=&quot;https://steadyjay.tistory.com/33&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cpZkUN/hyVykCff0k/yPp38U1V5U5vLrMe3OrEp0/img.png?width=410&amp;amp;height=264&amp;amp;face=0_0_410_264,https://scrap.kakaocdn.net/dn/ciV8VV/hyVBE6TZWN/KZmUXEyYklYRXnPqERhQi0/img.png?width=410&amp;amp;height=264&amp;amp;face=0_0_410_264,https://scrap.kakaocdn.net/dn/baeBNG/hyVycEd7w0/Qklg4vbP036xdNmMH2sth1/img.png?width=410&amp;amp;height=264&amp;amp;face=0_0_410_264&quot;&gt;&lt;a href=&quot;https://steadyjay.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://steadyjay.tistory.com/33&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cpZkUN/hyVykCff0k/yPp38U1V5U5vLrMe3OrEp0/img.png?width=410&amp;amp;height=264&amp;amp;face=0_0_410_264,https://scrap.kakaocdn.net/dn/ciV8VV/hyVBE6TZWN/KZmUXEyYklYRXnPqERhQi0/img.png?width=410&amp;amp;height=264&amp;amp;face=0_0_410_264,https://scrap.kakaocdn.net/dn/baeBNG/hyVycEd7w0/Qklg4vbP036xdNmMH2sth1/img.png?width=410&amp;amp;height=264&amp;amp;face=0_0_410_264');&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;[Spring] Spring Boot에서 트랜잭션 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 하나의 비즈니스는 한 트랜잭션 내부에서 다룹니다. 비즈니스로직이 실행되는 도중 어떠한 이유로 메서드 실행이 중단된다면 지금껏 처리한 모든 쿼리가 롤백되어야 합니다. 체스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;steadyjay.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 데이터베이스 설정 및 사용&lt;/p&gt;
&lt;figure id=&quot;og_1710480231324&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[스프링부트 (4)] Spring Boot DataBase 연동하기 (MariaDB, MyBatis, HikariCP)&quot; data-og-description=&quot;[스프링부트 (4)] 스프링부트 DB 연동 (MariaDB, MyBatis, HikariCP) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ SpringBoot DB 연동] 입니다. : ) 0. 들어가기 앞서 Spring Boot를 사용하면서 DB를연결하기 위해 JDB&quot; data-og-host=&quot;goddaehee.tistory.com&quot; data-og-source-url=&quot;https://goddaehee.tistory.com/205&quot; data-og-url=&quot;https://goddaehee.tistory.com/205&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hKLwg/hyVyfgDPXB/G0KupZk92ukHWtfcaXptI0/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/bgFNTZ/hyVybyAw8Q/2SsGi2iokhisvfcYmxNVkk/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/pu5ZJ/hyVxruZk4E/VXyhVOWMSNwqRbiyKJnMK1/img.png?width=1474&amp;amp;height=783&amp;amp;face=0_0_1474_783&quot;&gt;&lt;a href=&quot;https://goddaehee.tistory.com/205&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goddaehee.tistory.com/205&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hKLwg/hyVyfgDPXB/G0KupZk92ukHWtfcaXptI0/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/bgFNTZ/hyVybyAw8Q/2SsGi2iokhisvfcYmxNVkk/img.png?width=508&amp;amp;height=121&amp;amp;face=0_0_508_121,https://scrap.kakaocdn.net/dn/pu5ZJ/hyVxruZk4E/VXyhVOWMSNwqRbiyKJnMK1/img.png?width=1474&amp;amp;height=783&amp;amp;face=0_0_1474_783');&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;[스프링부트 (4)] Spring Boot DataBase 연동하기 (MariaDB, MyBatis, HikariCP)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[스프링부트 (4)] 스프링부트 DB 연동 (MariaDB, MyBatis, HikariCP) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ SpringBoot DB 연동] 입니다. : ) 0. 들어가기 앞서 Spring Boot를 사용하면서 DB를연결하기 위해 JDB&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;goddaehee.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/86</guid>
      <comments>https://dyd1310.tistory.com/86#entry86comment</comments>
      <pubDate>Fri, 15 Mar 2024 14:23:14 +0900</pubDate>
    </item>
    <item>
      <title>spring 동작 원리</title>
      <link>https://dyd1310.tistory.com/85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-12 at 4.34.57 PM.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tQnI6/btsFI3iy64U/oOrx9Ft7EStntIgkx2EDO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tQnI6/btsFI3iy64U/oOrx9Ft7EStntIgkx2EDO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tQnI6/btsFI3iy64U/oOrx9Ft7EStntIgkx2EDO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtQnI6%2FbtsFI3iy64U%2FoOrx9Ft7EStntIgkx2EDO1%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;1590&quot; height=&quot;1070&quot; data-filename=&quot;Screen Shot 2024-03-12 at 4.34.57 PM.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1070&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwdg3/btsFI4ICUF3/kiwWkxNV1QeuBOnXc95Hy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwdg3/btsFI4ICUF3/kiwWkxNV1QeuBOnXc95Hy1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;744&quot; data-filename=&quot;Screen Shot 2024-03-12 at 4.54.45 PM.png&quot; style=&quot;width: 52.1963%; margin-right: 10px;&quot; data-widthpercent=&quot;52.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwdg3/btsFI4ICUF3/kiwWkxNV1QeuBOnXc95Hy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuwdg3%2FbtsFI4ICUF3%2FkiwWkxNV1QeuBOnXc95Hy1%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;1610&quot; height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eKw3uf/btsFJHF70Qv/2aipsKWQBflS2balY3yjBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eKw3uf/btsFJHF70Qv/2aipsKWQBflS2balY3yjBK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;814&quot; data-filename=&quot;Screen Shot 2024-03-12 at 4.54.18 PM.png&quot; data-widthpercent=&quot;47.19&quot; style=&quot;width: 46.6409%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eKw3uf/btsFJHF70Qv/2aipsKWQBflS2balY3yjBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeKw3uf%2FbtsFJHF70Qv%2F2aipsKWQBflS2balY3yjBK%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;1574&quot; height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 동작 원리를 찾아보면 이를 설명하는 다양한 그림들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스패처 서블릿&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청을 처리하는 프론트 컨트롤러 역할을 맡고 뷰 리졸버 , 핸들러 매핑, 핸들러 어뎁터 등 여러 웹 MVC 구성요소와 상호작용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스패처 서블릿은 여러 필터 체인과 인터셉터를 가질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스패처 서블릿을 설정한다면 어떠한 구현체를 사용할 것인지, 특정 URL 매핑만 인식한다던지 설정할 수 있다.&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;figure id=&quot;og_1710310161593&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring MVC] Dispatcher Servlet, 핸들러 매핑, 핸들러 어댑터&quot; data-og-description=&quot;Spring MVC 구조를 학습하게 되었습니다. 스프링 MVC는 아래와 같은 흐름으로 진행됩니다. 처음엔 그림만 보면 이해하기 어렵다고 느낄텐데요. 차근차근 따라가면 흐름은 그렇게 어렵지 않습니다. D&quot; data-og-host=&quot;ksabs.tistory.com&quot; data-og-source-url=&quot;https://ksabs.tistory.com/250&quot; data-og-url=&quot;https://ksabs.tistory.com/250&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ossmU/hyVAGRcgXp/zQkBbvH5KZ0XAvQCx9Gwmk/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/od92k/hyVxtTu50a/Cr6krNRgVRX57mn8fboqJK/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/ba3H0A/hyVAApVjAn/VqweFvgCtklRkXjwqRtC8k/img.png?width=1664&amp;amp;height=530&amp;amp;face=0_0_1664_530&quot;&gt;&lt;a href=&quot;https://ksabs.tistory.com/250&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ksabs.tistory.com/250&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ossmU/hyVAGRcgXp/zQkBbvH5KZ0XAvQCx9Gwmk/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/od92k/hyVxtTu50a/Cr6krNRgVRX57mn8fboqJK/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/ba3H0A/hyVAApVjAn/VqweFvgCtklRkXjwqRtC8k/img.png?width=1664&amp;amp;height=530&amp;amp;face=0_0_1664_530');&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;[Spring MVC] Dispatcher Servlet, 핸들러 매핑, 핸들러 어댑터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring MVC 구조를 학습하게 되었습니다. 스프링 MVC는 아래와 같은 흐름으로 진행됩니다. 처음엔 그림만 보면 이해하기 어렵다고 느낄텐데요. 차근차근 따라가면 흐름은 그렇게 어렵지 않습니다. D&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ksabs.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1710230450261&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Hong]Spring에서 Handler&quot; data-og-description=&quot;스프링 MVC 형식으로 코드를 수정하던 중에 핸들러의 개념에 대해서 잘 모르는 것 같아서 찾아보고 정리해보고자 합니다..핸들러.. 그냥 직역하면 '처리하는 취급자' 이런느낌입니다. 스프링에서&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@hsgin11/HongSpring%EC%97%90%EC%84%9C-Handler&quot; data-og-url=&quot;https://velog.io/@hsgin11/HongSpring에서-Handler&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nabwl/hyVABa7Nu5/JcCoge4kfdzaRRqmJXgURK/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/dWZIdK/hyVxuSfWmy/ni7L8g2rAc4473AfVi3pn0/img.png?width=1920&amp;amp;height=1357&amp;amp;face=1218_384_1287_459&quot;&gt;&lt;a href=&quot;https://velog.io/@hsgin11/HongSpring%EC%97%90%EC%84%9C-Handler&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@hsgin11/HongSpring%EC%97%90%EC%84%9C-Handler&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nabwl/hyVABa7Nu5/JcCoge4kfdzaRRqmJXgURK/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/dWZIdK/hyVxuSfWmy/ni7L8g2rAc4473AfVi3pn0/img.png?width=1920&amp;amp;height=1357&amp;amp;face=1218_384_1287_459');&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;[Hong]Spring에서 Handler&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 MVC 형식으로 코드를 수정하던 중에 핸들러의 개념에 대해서 잘 모르는 것 같아서 찾아보고 정리해보고자 합니다..핸들러.. 그냥 직역하면 '처리하는 취급자' 이런느낌입니다. 스프링에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url 요청에 대해 어떠한 핸들러(컨트롤러)를 사용할지 설정할 수 있다. bean 이름 혹은 어노테이션 기반의 핸들러를 찾는다.&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 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 data-ke-size=&quot;size16&quot;&gt;어노테이션 기반으로 매핑하는 핸들러와 controller 인터페이스를 상속받은 핸들러, httpRequsetHandler 인터페이스를 상속받은 핸들러등 다양한 형태의 핸들러가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. controller 인터페이스를 상속받은 핸들러&lt;/p&gt;
&lt;pre id=&quot;code_1710310914052&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LegacyController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 요청 처리 로직을 여기에 구현합니다.
        String name = request.getParameter(&quot;name&quot;);
        String message = &quot;Hello, &quot; + (name != null ? name : &quot;Guest&quot;) + &quot;!&quot;;
        
        // ModelAndView를 사용하여 결과를 반환합니다.
        ModelAndView modelAndView = new ModelAndView(&quot;legacyView&quot;);
        modelAndView.addObject(&quot;message&quot;, message);
        return modelAndView;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예제는 controller 인터페이스를 상속 받은 핸들러이다.&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;span style=&quot;color: #666666; text-align: start;&quot;&gt;[src] &amp;gt; [main] &amp;gt; [webapp] &amp;gt; [WEB-INF] &amp;gt; web.xml&lt;span&gt;&amp;nbsp; 에 applicationContext.xml의 path가 설정되어있는데&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;applicationContext.xml에 아래의 코드를 추가하여 특정 요청에 대해 해당 핸들러가 동작하도록 설정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710311194317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;bean name=&quot;/legacy&quot; class=&quot;com.example.LegacyController&quot;/&amp;gt;&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;또한 AppConfig를 통해 설정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1710312329094&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;

import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {

    @Bean
    public LegacyController legacyController() {
        return new LegacyController();
    }

    @Bean
    public SimpleUrlHandlerMapping handlerMapping() {
        SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
        Map&amp;lt;String, Object&amp;gt; urlMap = new HashMap&amp;lt;&amp;gt;();
        urlMap.put(&quot;/lagacy&quot;, legacyController());
        handlerMapping.setUrlMap(urlMap);
        return handlerMapping;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러를 빈에 등록하고 handlerMapping을 통해 URL과 핸들러를 매핑한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. httpRequsetHandler 를 상속받은 핸들러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller 인터페이스를 구현한 핸들러와 설정방식은 비슷하지만 반환형에 대해 큰 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 핸들러 모두 handleRequest(HttpServletRequset request, HttpServletReponse response) 를 오버라이드하여 요청을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Controller같은 경우 ModelAndView를 반환하는 반면 HttpRequestHandler는 반환형이 void이다.&lt;/p&gt;
&lt;pre id=&quot;code_1710314539160&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.HttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyHttpRequestHandler implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 요청 처리 로직을 여기에 구현합니다.
        String name = request.getParameter(&quot;name&quot;);
        String message = &quot;Hello, &quot; + (name != null ? name : &quot;Guest&quot;) + &quot;!&quot;;
        
        // 응답을 생성합니다.
        response.setContentType(&quot;text/plain&quot;);
        response.getWriter().write(message);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드에서 response.getWriter().write(message) 부분에서 클라이언트에게 응답을 보낸다.&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;즉 두 핸들러의 차이는 Controller&amp;nbsp;인터페이스를&amp;nbsp;구현한&amp;nbsp;핸들러는&amp;nbsp;ModelAndView를&amp;nbsp;반환하여&amp;nbsp;스프링의&amp;nbsp;뷰&amp;nbsp;리졸버에&amp;nbsp;의해&amp;nbsp;뷰가&amp;nbsp;렌더링되는&amp;nbsp;방식으로&amp;nbsp;동작하는&amp;nbsp;반면,&amp;nbsp;HttpRequestHandler&amp;nbsp;인터페이스를&amp;nbsp;구현한&amp;nbsp;핸들러는&amp;nbsp;직접적으로&amp;nbsp;HTTP&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;HttpServletResponse같은 경우 extends 하고있는 ServletResponse 인터페이스에 getWriter가 정의되어있고 서블릿 컨테이너(톰켓)가 해당 인터페이스의 구현체를 제공한다.&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;HttpServletRequset, HttpServletResponse는 어디에서 생성되는 것일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러 매핑을 통해 httpRequestHandler를 상속받은 핸들러를 써야하는걸 알았다면 디스패처 서블릿이 HttpServletRequset, HttpServletResponse를 생성하게 된다.&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;3. 에러 컨트롤러&lt;/p&gt;
&lt;pre id=&quot;code_1710461783116&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Custom error
public class CustomValidationException extends RuntimeException {
    public CustomValidationException(String message) {
        super(message);
    }
}

// 유저 컨트롤러
@RestController
@RequestMapping(&quot;/users&quot;)
public class UserController {
    
    @Autowired
    private UserService userService;

    @PostMapping(&quot;/register&quot;)
    public ResponseEntity&amp;lt;String&amp;gt; registerUser(@Valid @RequestBody UserDTO userDTO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // 유효성 검사에 실패한 경우 에러 처리
            throw new ValidationException(&quot;Invalid user data&quot;);
        }
        
        userService.registerUser(userDTO);
        return ResponseEntity.ok(&quot;User registered successfully&quot;);
    }
}

// 에러 컨트롤러
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ValidationException.class)
    public ResponseEntity&amp;lt;String&amp;gt; handleValidationException(ValidationException ex) {
        // 유효성 검사 예외 처리 로직
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 컨트롤러는 프로그램 전역에서 발생한 에러(메모리 부족, 파일 포맷 오류, 데이터 베이스 연결 문제 , 외부 서비스 호출 실패 등)를 유형에 따라 전역적으로 처리하는 로직을 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 로직을 수행하고 있는 특정 컨트롤러에서 에러를 감지하여 해당 컨트롤러에 에러를 핸들링하는 코드를 작성하여 에러를 처리하기도 한다. 이 경우 에러 핸들러에 이 부분을 위임할 수 있다(위의 예시의 경우 유저 컨트롤러에서 로직을 작성하고 에러컨트롤러를 선언하지 않을 수도 있다.). 어느부분에서 예외가 발생했는지 반환하거나, 로깅을 수행한다거나 , 외부 서비스(AWS SNS 등)를 호출하는 로직 등을 추가할 수 있다. 또 로직이나 외부서비스 같은 경우는 AOP를 이용해 중복을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 에러같은 경우 표준화된 예외 클래스 외 명확한 의미 전달을 위해 사용한다. 상황에 따라 적절한 로직을 적용할 수 있도록 도와줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예제의 경우 유효성 검증 에러를 에러 컨트롤러에게 위임하는데 에러를 발생시키는 것은 많은 비용을 발생시킨다. 이러한 코드는 권장되는 형태는 아니고 에러 컨트롤러는 전역적인 예기치않은 오류를 처리하는데 사용하고, 유효성 검증 같은 경우는 해당 컨트롤러에서 처리하는게 비용 측면에서 적절하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 핸들러 인터셉터&lt;/p&gt;
&lt;pre id=&quot;code_1710462201151&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 컨트롤러 호출 전에 실행되는 코드
        return true; // true를 반환하면 핸들러 실행, false를 반환하면 핸들러 실행 취소
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 컨트롤러 호출 후, 뷰 렌더링 전에 실행되는 코드
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        // 뷰 렌더링 후 실행되는 코드 (예외가 발생한 경우에도 실행됨)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710462213812&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns(&quot;/specificControllerPath/**&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러의 실행 전(preHandle), 실행 후(postHandle), 요청 처리 완료 후(afterCompletion)에 각각의 함수가 수행된다.&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;preHandle: 권한 및 인증을 체크, 시작 시점 로직 및 로깅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postHandle: 데이터 추가(날짜), 캐시 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;afterCompletion: 리소스 해제, 완료 시점 로깅, 정보 수집(요청 수, 처리시간 응답 코드 등 수)&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;postHandle같은 경우 예외가 발생한 경우는 실행되지않고 afterCompletion의 경우 예외 여부와 관계없이 실행된다.&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;config를 통해 어느 범위에 컨트롤러에 대해 동작할건지 지정할 수 있고 프로젝트 구조에서는 따로 interceptor 디렉토리를 만들어 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710483148910&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1)&quot; data-og-description=&quot;Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보고자 &quot; data-og-host=&quot;mangkyu.tistory.com&quot; data-og-source-url=&quot;https://mangkyu.tistory.com/173&quot; data-og-url=&quot;https://mangkyu.tistory.com/173&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fLfP0/hyVxt0CTgU/d6tp1KekPP2166xinjbKMk/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/rZNGv/hyVAFZoRex/S6HnXIom0MK2k3ToS2IJu0/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/xr0mX/hyVyeIOSCZ/brHNwUBasegnE5Gc8nO6b1/img.png?width=2306&amp;amp;height=872&amp;amp;face=0_0_2306_872&quot;&gt;&lt;a href=&quot;https://mangkyu.tistory.com/173&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mangkyu.tistory.com/173&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fLfP0/hyVxt0CTgU/d6tp1KekPP2166xinjbKMk/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/rZNGv/hyVAFZoRex/S6HnXIom0MK2k3ToS2IJu0/img.png?width=800&amp;amp;height=205&amp;amp;face=0_0_800_205,https://scrap.kakaocdn.net/dn/xr0mX/hyVyeIOSCZ/brHNwUBasegnE5Gc8nO6b1/img.png?width=2306&amp;amp;height=872&amp;amp;face=0_0_2306_872');&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;[Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보고자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mangkyu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서블릿 컨테이너? 스프링 컨테이너?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-13 at 5.33.19 PM.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgEqkm/btsFMtAJ5Bn/DIDVO1mJNNy2Q03uoGxW00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgEqkm/btsFMtAJ5Bn/DIDVO1mJNNy2Q03uoGxW00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgEqkm/btsFMtAJ5Bn/DIDVO1mJNNy2Q03uoGxW00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgEqkm%2FbtsFMtAJ5Bn%2FDIDVO1mJNNy2Q03uoGxW00%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;1468&quot; height=&quot;884&quot; data-filename=&quot;Screenshot 2024-03-13 at 5.33.19 PM.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣은 서블릿 컨테이너이며, 생성된 서블릿 컨테이너는 여러 서블릿 인스턴스를 가지고 있습니다. 서블릿 인스턴스는 멀티 스레드 환경에서 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 요청 마다 하나의 스레드가 담당합니다.&amp;nbsp; 스레드를 생성할때 마다 메모리를 할당받아야 하는 비용이 발생합니다. 따라서 미리 정해진 개수의 스레드를 서블릿 컨테이너가 생성하고 이를 관리합니다(스레드 풀). 각 스레드는 서블릿 인스턴스를 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청을 처리하는데 데이터가 필요합니다. 스레드가 할당받은 메모리에 이러한 데이터를 세팅해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 스레드는 해당 요청을 처리하는 데 필요한 데이터(요청 파라미터, 세션 정보, 헤더 등)를 서블릿 컨테이너의 메모리에 저장합니다. 이러한 데이터를 바탕으로 디스패처 서블릿을 실행하여 요청을 적절한 핸들러(컨트롤러)에 매핑, 처리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서블릿&amp;nbsp;컨테이너는&amp;nbsp;클라이언트의&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;URL&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;서블릿과는&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;스프링 컨테이너는 각 빈을 관리합니다. 핸들러, 핸들러 매핑, 뷰 리졸버 등의 객체는 스프링 컨테이너에 의해 생성되고 관리됩니다. 이러한 빈들은 주로 상태를 갖지 않는 객체입니다. 각 쓰레드에 저장된 데이터는 스프링 컨테이너가 관리하는 빈들을 통해 처리되며, 이러한 빈들은 동시에 접근하여 읽기가 가능합니다. 빈과 서블릿 인스턴스 모두 일반적으로 싱글톤으로 관리됩니다. 이러한 원리로 스프링은 다중 처리가 동시에 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링부트에선 application.properties 파일을 통해 내장 톰켓을 설정을 변경할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710478993969&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server.port=8081
server.servlet.context-path=/myapp
server.servlet.session.timeout=30m
server.tomcat.connector.max-threads=200
server.tomcat.connector.accept-count=100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 시간과 최대 스레드 수 등 다양한 설정을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710318101773&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;ServletContainer와 SpringContainer는 무엇이 다른가?&quot; data-og-description=&quot;Controller 1개는 어떻게 수십 만개의 요청을 처리하는가&quot; data-og-host=&quot;sigridjin.medium.com&quot; data-og-source-url=&quot;https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5&quot; data-og-url=&quot;https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJSIDz/hyVAzR6cHo/wVB7Ib8oliz3hZNdQby8Ok/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500&quot;&gt;&lt;a href=&quot;https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJSIDz/hyVAzR6cHo/wVB7Ib8oliz3hZNdQby8Ok/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500');&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;ServletContainer와 SpringContainer는 무엇이 다른가?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Controller 1개는 어떻게 수십 만개의 요청을 처리하는가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sigridjin.medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1710312614089&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] Controller의 종류와 다양한 전략&quot; data-og-description=&quot;1. Controller의 종류 1) Servlet - javax.servlet.Servlet을 상속한 클래스를 컨트롤러로 사용한다. @Component(&amp;quot;/home&amp;quot;) // bean 이름을 이용한 핸들러 매핑 방식 이용 public class HomeServlet extends HttpServlet { protected void &quot; data-og-host=&quot;kimcoder.tistory.com&quot; data-og-source-url=&quot;https://kimcoder.tistory.com/481&quot; data-og-url=&quot;https://kimcoder.tistory.com/481&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blOAJi/hyVAI9kAlK/aUuvEPuSBXw9prrw5Yagjk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/7HHLc/hyVAJtC4bw/OcHTRGwwupxz4rCfCfHkM1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://kimcoder.tistory.com/481&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kimcoder.tistory.com/481&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blOAJi/hyVAI9kAlK/aUuvEPuSBXw9prrw5Yagjk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/7HHLc/hyVAJtC4bw/OcHTRGwwupxz4rCfCfHkM1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Spring] Controller의 종류와 다양한 전략&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Controller의 종류 1) Servlet - javax.servlet.Servlet을 상속한 클래스를 컨트롤러로 사용한다. @Component(&quot;/home&quot;) // bean 이름을 이용한 핸들러 매핑 방식 이용 public class HomeServlet extends HttpServlet { protected void&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kimcoder.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710314923821&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;HttpServletRequest, HttpServletResponse에 대한 이해&quot; data-og-description=&quot;WAS가 웹브라우져로부터 Servlet요청을 받으면 요청을 받을 때 전달 받은 정보를 HttpServletRequest객체를 생성하여 저장 웹브라우져에게 응답을 돌려줄 HttpServletResponse객체를 생성(빈 객체) 생성된 Http&quot; data-og-host=&quot;zester7.tistory.com&quot; data-og-source-url=&quot;https://zester7.tistory.com/33&quot; data-og-url=&quot;https://zester7.tistory.com/33&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Cwck7/hyVAK0nsPZ/OKGnOeN18ejii4HJjeMoj0/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/hcylh/hyVxtMK6FL/mkOP2BxJEiXft5lZYmRXO1/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/lygsp/hyVAC2lAF7/AlrvKjnEThwoDNyj3rjYiK/img.jpg?width=1104&amp;amp;height=394&amp;amp;face=0_0_1104_394&quot;&gt;&lt;a href=&quot;https://zester7.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zester7.tistory.com/33&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Cwck7/hyVAK0nsPZ/OKGnOeN18ejii4HJjeMoj0/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/hcylh/hyVxtMK6FL/mkOP2BxJEiXft5lZYmRXO1/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/lygsp/hyVAC2lAF7/AlrvKjnEThwoDNyj3rjYiK/img.jpg?width=1104&amp;amp;height=394&amp;amp;face=0_0_1104_394');&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;HttpServletRequest, HttpServletResponse에 대한 이해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WAS가 웹브라우져로부터 Servlet요청을 받으면 요청을 받을 때 전달 받은 정보를 HttpServletRequest객체를 생성하여 저장 웹브라우져에게 응답을 돌려줄 HttpServletResponse객체를 생성(빈 객체) 생성된 Http&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zester7.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710315953680&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JSP] 서블릿(Servlet)이란?&quot; data-og-description=&quot;1. Servlet(서블릿) 서블릿을 한 줄로 정의하자면 아래와 같습니다. 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해서, &quot; data-og-host=&quot;mangkyu.tistory.com&quot; data-og-source-url=&quot;https://mangkyu.tistory.com/14&quot; data-og-url=&quot;https://mangkyu.tistory.com/14&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eJ8c2/hyVxzMXFq0/xkFSEioxkbfXxQiJNpmW5k/img.png?width=800&amp;amp;height=287&amp;amp;face=0_0_800_287,https://scrap.kakaocdn.net/dn/eE3XA/hyVAGKr2Qn/BuUkuzz790tqhDWMSMkRj0/img.png?width=800&amp;amp;height=287&amp;amp;face=0_0_800_287,https://scrap.kakaocdn.net/dn/uKPGI/hyVxx9tvjl/faevXAEV8zZRRMUImNSz90/img.jpg?width=740&amp;amp;height=330&amp;amp;face=0_0_740_330&quot;&gt;&lt;a href=&quot;https://mangkyu.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mangkyu.tistory.com/14&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eJ8c2/hyVxzMXFq0/xkFSEioxkbfXxQiJNpmW5k/img.png?width=800&amp;amp;height=287&amp;amp;face=0_0_800_287,https://scrap.kakaocdn.net/dn/eE3XA/hyVAGKr2Qn/BuUkuzz790tqhDWMSMkRj0/img.png?width=800&amp;amp;height=287&amp;amp;face=0_0_800_287,https://scrap.kakaocdn.net/dn/uKPGI/hyVxx9tvjl/faevXAEV8zZRRMUImNSz90/img.jpg?width=740&amp;amp;height=330&amp;amp;face=0_0_740_330');&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;[JSP] 서블릿(Servlet)이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Servlet(서블릿) 서블릿을 한 줄로 정의하자면 아래와 같습니다. 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해서,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mangkyu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;figure id=&quot;og_1710151036913&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스프링 HTTP 메시지 컨버터&quot; data-og-description=&quot;HTTP 메시지 컨버터 뷰 템플릿으로 HTML을 생성해서 응답하지 않고, HTTP API처럼 JSON 데이터를 HTTP 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편리하다. HTTP 메시지 컨버터란? 요&quot; data-og-host=&quot;dev-monkey-dugi.tistory.com&quot; data-og-source-url=&quot;https://dev-monkey-dugi.tistory.com/125&quot; data-og-url=&quot;https://dev-monkey-dugi.tistory.com/125&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yCDyi/hyVxwCd33s/DIfck0m5ASCKuXq0K0Em2K/img.png?width=800&amp;amp;height=385&amp;amp;face=0_0_800_385,https://scrap.kakaocdn.net/dn/cCowuo/hyVxBDySZn/SlVkZu7hYKjV8xk2LVsQL0/img.png?width=800&amp;amp;height=385&amp;amp;face=0_0_800_385,https://scrap.kakaocdn.net/dn/6mRC3/hyVxrubmlB/mwxQswZvhGlZIvvETEn4k1/img.png?width=2444&amp;amp;height=1178&amp;amp;face=0_0_2444_1178&quot;&gt;&lt;a href=&quot;https://dev-monkey-dugi.tistory.com/125&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-monkey-dugi.tistory.com/125&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yCDyi/hyVxwCd33s/DIfck0m5ASCKuXq0K0Em2K/img.png?width=800&amp;amp;height=385&amp;amp;face=0_0_800_385,https://scrap.kakaocdn.net/dn/cCowuo/hyVxBDySZn/SlVkZu7hYKjV8xk2LVsQL0/img.png?width=800&amp;amp;height=385&amp;amp;face=0_0_800_385,https://scrap.kakaocdn.net/dn/6mRC3/hyVxrubmlB/mwxQswZvhGlZIvvETEn4k1/img.png?width=2444&amp;amp;height=1178&amp;amp;face=0_0_2444_1178');&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;스프링 HTTP 메시지 컨버터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 메시지 컨버터 뷰 템플릿으로 HTML을 생성해서 응답하지 않고, HTTP API처럼 JSON 데이터를 HTTP 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편리하다. HTTP 메시지 컨버터란? 요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-monkey-dugi.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resolver는 어떤 역할을 하는가&lt;/p&gt;
&lt;figure id=&quot;og_1710151048882&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Resolver란 무엇인가?&quot; data-og-description=&quot;HandlerMethodArgumentResolverArgument ResolverSpring에서 Resolver의 동작은 아래와 같은 과정으로 이루어진다.Client Request 요청Dispatcher Servlet에서 해당 요청 처리Client Request에 대&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@hsjung2015/Resolver%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; data-og-url=&quot;https://velog.io/@hsjung2015/Resolver란-무엇인가&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Msvjb/hyVxv4oW6L/2KPeRFS9ZV7Gm9FOcuTR50/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@hsjung2015/Resolver%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@hsjung2015/Resolver%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Msvjb/hyVxv4oW6L/2KPeRFS9ZV7Gm9FOcuTR50/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&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;Resolver란 무엇인가?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HandlerMethodArgumentResolverArgument ResolverSpring에서 Resolver의 동작은 아래와 같은 과정으로 이루어진다.Client Request 요청Dispatcher Servlet에서 해당 요청 처리Client Request에 대&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 메세지 컨버터를 선택할지 핸들러 어댑터가 content-type을 통해 결정하는데 어떤 content-type이 있는가?&lt;/p&gt;
&lt;figure id=&quot;og_1710151110354&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;HTTP: Content-Type 에 대해 알아보자 (application/json, application/x-www-form-urlencoded, multipart/form-data)&quot; data-og-description=&quot;웹 개발을 하게 되면 HTTP에 대해 조금 알아두는 것이 좋습니다. 그중에서 Content-Type에 대한 이해가 부족한 것 같아 정리를 해보았습니다. Content-Type Content-Type은 api 연동시에 보내는 자원을 명시하&quot; data-og-host=&quot;jw910911.tistory.com&quot; data-og-source-url=&quot;https://jw910911.tistory.com/117&quot; data-og-url=&quot;https://jw910911.tistory.com/117&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQzAxt/hyVxBp0Yzb/jOdyLpYVo67KNMx4e5LUK0/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/b91yB8/hyVxAdzepq/KyaZvsqRip2BsRPkYLNH8k/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/sPESF/hyVxEfWVyj/2rvtxOhXxbAXfPQpcw7lr1/img.png?width=1186&amp;amp;height=900&amp;amp;face=0_0_1186_900&quot;&gt;&lt;a href=&quot;https://jw910911.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jw910911.tistory.com/117&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQzAxt/hyVxBp0Yzb/jOdyLpYVo67KNMx4e5LUK0/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/b91yB8/hyVxAdzepq/KyaZvsqRip2BsRPkYLNH8k/img.png?width=800&amp;amp;height=607&amp;amp;face=0_0_800_607,https://scrap.kakaocdn.net/dn/sPESF/hyVxEfWVyj/2rvtxOhXxbAXfPQpcw7lr1/img.png?width=1186&amp;amp;height=900&amp;amp;face=0_0_1186_900');&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;HTTP: Content-Type 에 대해 알아보자 (application/json, application/x-www-form-urlencoded, multipart/form-data)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹 개발을 하게 되면 HTTP에 대해 조금 알아두는 것이 좋습니다. 그중에서 Content-Type에 대한 이해가 부족한 것 같아 정리를 해보았습니다. Content-Type Content-Type은 api 연동시에 보내는 자원을 명시하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jw910911.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form 태그는 어떠한 content-type을 지원할까?&lt;/p&gt;
&lt;figure id=&quot;og_1710153324277&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jtJ1B/hyVxDaiT03/1tTBBoFTgJZIwJbYL6nwwK/img.jpg?width=638&amp;amp;height=465&amp;amp;face=0_0_638_465,https://scrap.kakaocdn.net/dn/NFnsi/hyVxvDlBv9/dK3g28MYBH8nP36woUFq21/img.jpg?width=638&amp;amp;height=465&amp;amp;face=0_0_638_465,https://scrap.kakaocdn.net/dn/cdBpZL/hyVxuYIBKi/HIoFHPuwbCUHCKpy7voKSK/img.jpg?width=528&amp;amp;height=343&amp;amp;face=0_0_528_343&quot; data-og-url=&quot;https://wildeveloperetrain.tistory.com/304&quot; data-og-source-url=&quot;https://wildeveloperetrain.tistory.com/304&quot; data-og-host=&quot;wildeveloperetrain.tistory.com&quot; data-og-description=&quot;x-www-form-urlencoded와 multipart/form-data 차이점 //기존에 설정된 springdoc consumes default-consumes-media-type: multipart/form-data //변경된 설정 default-consumes-media-type: application/x-www-form-urlencoded 프로젝트 작업 중 동&quot; data-og-title=&quot;x-www-form-urlencoded 타입이란 (multipart/form-data와의 차이점)&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://wildeveloperetrain.tistory.com/304&quot; data-source-url=&quot;https://wildeveloperetrain.tistory.com/304&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jtJ1B/hyVxDaiT03/1tTBBoFTgJZIwJbYL6nwwK/img.jpg?width=638&amp;amp;height=465&amp;amp;face=0_0_638_465,https://scrap.kakaocdn.net/dn/NFnsi/hyVxvDlBv9/dK3g28MYBH8nP36woUFq21/img.jpg?width=638&amp;amp;height=465&amp;amp;face=0_0_638_465,https://scrap.kakaocdn.net/dn/cdBpZL/hyVxuYIBKi/HIoFHPuwbCUHCKpy7voKSK/img.jpg?width=528&amp;amp;height=343&amp;amp;face=0_0_528_343');&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;x-www-form-urlencoded 타입이란 (multipart/form-data와의 차이점)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;x-www-form-urlencoded와 multipart/form-data 차이점 //기존에 설정된 springdoc consumes default-consumes-media-type: multipart/form-data //변경된 설정 default-consumes-media-type: application/x-www-form-urlencoded 프로젝트 작업 중 동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wildeveloperetrain.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1710151288330&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩교육 티씨피스쿨&quot; data-og-description=&quot;4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등&quot; data-og-host=&quot;tcpschool.com&quot; data-og-source-url=&quot;https://www.tcpschool.com/html-tag-attrs/form-enctype&quot; data-og-url=&quot;http://tcpschool.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cwJdPn/hyVxt6zfIb/iSojkrraXuX8ZzJREXPk0K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://www.tcpschool.com/html-tag-attrs/form-enctype&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tcpschool.com/html-tag-attrs/form-enctype&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cwJdPn/hyVxt6zfIb/iSojkrraXuX8ZzJREXPk0K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;코딩교육 티씨피스쿨&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tcpschool.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object Mapper 커스텀&lt;/p&gt;
&lt;figure id=&quot;og_1710153027793&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;blog&quot; data-og-title=&quot;알고보면 만만한 Jackson Custom Serialization&quot; data-og-description=&quot;API 서버를 만들다보면 어떤 객체를 JSON으로 만들때, 특정 필드만 제외하거나 특정 필드의 이름을 바꿔야 하는 일이 생길 수 있다. 그 객체를 JSON으로 만들 때 특정 필드의 이름을 항상 바꾸려면 &quot; data-og-host=&quot;homoefficio.github.io&quot; data-og-source-url=&quot;https://homoefficio.github.io/2016/11/18/%EC%95%8C%EA%B3%A0%EB%B3%B4%EB%A9%B4-%EB%A7%8C%EB%A7%8C%ED%95%9C-Jackson-Custom-Serialization/&quot; data-og-url=&quot;http://homoefficio.github.io/2016/11/18/알고보면-만만한-Jackson-Custom-Serialization/index.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mSR77/hyVxtZOf2F/JlMC6KshYcYMkxzYeky9x0/img.png?width=858&amp;amp;height=605&amp;amp;face=0_0_858_605,https://scrap.kakaocdn.net/dn/dpDlZI/hyVxyGOHJN/95YJ4YkkiZ7QATPwgWNk71/img.jpg?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640,https://scrap.kakaocdn.net/dn/b9aKpC/hyVxu5vlco/yBV0xZtZWtLe8o6V4mKbs1/img.png?width=858&amp;amp;height=605&amp;amp;face=0_0_858_605&quot;&gt;&lt;a href=&quot;https://homoefficio.github.io/2016/11/18/%EC%95%8C%EA%B3%A0%EB%B3%B4%EB%A9%B4-%EB%A7%8C%EB%A7%8C%ED%95%9C-Jackson-Custom-Serialization/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://homoefficio.github.io/2016/11/18/%EC%95%8C%EA%B3%A0%EB%B3%B4%EB%A9%B4-%EB%A7%8C%EB%A7%8C%ED%95%9C-Jackson-Custom-Serialization/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mSR77/hyVxtZOf2F/JlMC6KshYcYMkxzYeky9x0/img.png?width=858&amp;amp;height=605&amp;amp;face=0_0_858_605,https://scrap.kakaocdn.net/dn/dpDlZI/hyVxyGOHJN/95YJ4YkkiZ7QATPwgWNk71/img.jpg?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640,https://scrap.kakaocdn.net/dn/b9aKpC/hyVxu5vlco/yBV0xZtZWtLe8o6V4mKbs1/img.png?width=858&amp;amp;height=605&amp;amp;face=0_0_858_605');&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;알고보면 만만한 Jackson Custom Serialization&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;API 서버를 만들다보면 어떤 객체를 JSON으로 만들때, 특정 필드만 제외하거나 특정 필드의 이름을 바꿔야 하는 일이 생길 수 있다. 그 객체를 JSON으로 만들 때 특정 필드의 이름을 항상 바꾸려면&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;homoefficio.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710218290998&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Jackson ObjectMapper 정리&quot; data-og-description=&quot;개요 Java 개발자라면 Jackson에서 제공하는 ObjectMapper와 자주 마주치게 됩니다. Java 클래스 내용을 확인하거나 내용물의 Parsing 과정에 필요한 커스터마이징이 존재하기 때문입니다. 물론 중요한 기&quot; data-og-host=&quot;interconnection.tistory.com&quot; data-og-source-url=&quot;https://interconnection.tistory.com/137&quot; data-og-url=&quot;https://interconnection.tistory.com/137&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CtaT6/hyVxtZ39HC/cRHYYpwPdNkVZKox5xdrck/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/k8Sx8/hyVxDIolBW/jOHHr7f3VdJTdbXWMlnXoK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://interconnection.tistory.com/137&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://interconnection.tistory.com/137&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CtaT6/hyVxtZ39HC/cRHYYpwPdNkVZKox5xdrck/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/k8Sx8/hyVxDIolBW/jOHHr7f3VdJTdbXWMlnXoK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;Jackson ObjectMapper 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요 Java 개발자라면 Jackson에서 제공하는 ObjectMapper와 자주 마주치게 됩니다. Java 클래스 내용을 확인하거나 내용물의 Parsing 과정에 필요한 커스터마이징이 존재하기 때문입니다. 물론 중요한 기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;interconnection.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; spring 동작 원리&lt;/p&gt;
&lt;figure id=&quot;og_1710228921721&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring MVC] Spring의 동작 원리&quot; data-og-description=&quot;Spring 이란? 경량 컨테이너로서 자바 객체를 직접 관리한다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다. 스프링은 Plain Old Java Object &quot; data-og-host=&quot;yenbook.tistory.com&quot; data-og-source-url=&quot;https://yenbook.tistory.com/6&quot; data-og-url=&quot;https://yenbook.tistory.com/6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RZy1P/hyVxr83oix/rwRKKbZmFHByuuiiAWRF2K/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/5SW14/hyVAJ738Yu/7Komsr16E9lqRawYEwzsgK/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/z9ref/hyVxBqjPgd/ZikcKUglfDD9mbzA3gyaGk/img.png?width=860&amp;amp;height=573&amp;amp;face=0_0_860_573&quot;&gt;&lt;a href=&quot;https://yenbook.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yenbook.tistory.com/6&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RZy1P/hyVxr83oix/rwRKKbZmFHByuuiiAWRF2K/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/5SW14/hyVAJ738Yu/7Komsr16E9lqRawYEwzsgK/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/z9ref/hyVxBqjPgd/ZikcKUglfDD9mbzA3gyaGk/img.png?width=860&amp;amp;height=573&amp;amp;face=0_0_860_573');&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;[Spring MVC] Spring의 동작 원리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring 이란? 경량 컨테이너로서 자바 객체를 직접 관리한다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다. 스프링은 Plain Old Java Object&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yenbook.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터셉터 ? 필터?&lt;/p&gt;
&lt;figure id=&quot;og_1710231210445&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Interceptor, 제대로 이해하기&quot; data-og-description=&quot;Interceptor는 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다. 스프링의 Intercepter의 이해와 사용법을 익히는 것이 본 포스팅의 목표입니다. ---------&quot; data-og-host=&quot;gngsn.tistory.com&quot; data-og-source-url=&quot;https://gngsn.tistory.com/153&quot; data-og-url=&quot;https://gngsn.tistory.com/153&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bC7pUH/hyVAC2bhbZ/c6EZksCL19zYTEvXiiQTO0/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/zuRZj/hyVAEeCsOc/lzLcvrj1fbZs8UEr4K4Cn0/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/Ybyes/hyVAMDI1vQ/mJI7a2bEamxOoaJlKzjet1/img.png?width=2862&amp;amp;height=1744&amp;amp;face=0_0_2862_1744&quot;&gt;&lt;a href=&quot;https://gngsn.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gngsn.tistory.com/153&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bC7pUH/hyVAC2bhbZ/c6EZksCL19zYTEvXiiQTO0/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/zuRZj/hyVAEeCsOc/lzLcvrj1fbZs8UEr4K4Cn0/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/Ybyes/hyVAMDI1vQ/mJI7a2bEamxOoaJlKzjet1/img.png?width=2862&amp;amp;height=1744&amp;amp;face=0_0_2862_1744');&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;Spring Interceptor, 제대로 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Interceptor는 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다. 스프링의 Intercepter의 이해와 사용법을 익히는 것이 본 포스팅의 목표입니다. ---------&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gngsn.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러 어뎁터? 핸들러 매핑?&lt;/p&gt;
&lt;figure id=&quot;og_1710318223912&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UBKti/hyVxpQXnTA/dgzkVRpzXIL4HkoDDO50bk/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/bzM9l8/hyVAKTrsfT/LRJhB66V5xVStkjl34Nmq1/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/cSZoKt/hyVxwCwXOd/BQ3RZAauPPojivvWKosLJ0/img.png?width=1664&amp;amp;height=530&amp;amp;face=0_0_1664_530&quot; data-og-url=&quot;https://ksabs.tistory.com/250&quot; data-og-source-url=&quot;https://ksabs.tistory.com/250&quot; data-og-host=&quot;ksabs.tistory.com&quot; data-og-description=&quot;Spring MVC 구조를 학습하게 되었습니다. 스프링 MVC는 아래와 같은 흐름으로 진행됩니다. 처음엔 그림만 보면 이해하기 어렵다고 느낄텐데요. 차근차근 따라가면 흐름은 그렇게 어렵지 않습니다. D&quot; data-og-title=&quot;[Spring MVC] Dispatcher Servlet, 핸들러 매핑, 핸들러 어댑터&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://ksabs.tistory.com/250&quot; data-source-url=&quot;https://ksabs.tistory.com/250&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UBKti/hyVxpQXnTA/dgzkVRpzXIL4HkoDDO50bk/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/bzM9l8/hyVAKTrsfT/LRJhB66V5xVStkjl34Nmq1/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/cSZoKt/hyVxwCwXOd/BQ3RZAauPPojivvWKosLJ0/img.png?width=1664&amp;amp;height=530&amp;amp;face=0_0_1664_530');&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;[Spring MVC] Dispatcher Servlet, 핸들러 매핑, 핸들러 어댑터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring MVC 구조를 학습하게 되었습니다. 스프링 MVC는 아래와 같은 흐름으로 진행됩니다. 처음엔 그림만 보면 이해하기 어렵다고 느낄텐데요. 차근차근 따라가면 흐름은 그렇게 어렵지 않습니다. D&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ksabs.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/85</guid>
      <comments>https://dyd1310.tistory.com/85#entry85comment</comments>
      <pubDate>Mon, 11 Mar 2024 19:35:30 +0900</pubDate>
    </item>
    <item>
      <title>spring boot MVC 패턴 연습하기</title>
      <link>https://dyd1310.tistory.com/84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710143268244&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.knu.demo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MVCController {

    @GetMapping(&quot;/&quot;)
    public String hello(){
        return &quot;home&quot;;
    }
    @GetMapping(&quot;/get&quot;)
    public String getStart(){
        return &quot;getInput&quot;;
    }

    @GetMapping(&quot;/post&quot;)
    public String postStart(){
        return &quot;postInput&quot;;
    }
    @GetMapping(&quot;/post2&quot;)
    public String APIpostStart(){
        return &quot;APIPostInput&quot;;
    }

    @GetMapping(&quot;/info&quot;)
    public String getResult(
            @RequestParam(&quot;name&quot;) String name,
            @RequestParam(&quot;id&quot;) String id,
            @RequestParam(&quot;department&quot;) String department,
            Model model){

        model.addAttribute(&quot;name&quot;,name);
        model.addAttribute(&quot;id&quot;,id);
        model.addAttribute(&quot;department&quot;,department);

        return &quot;getResult&quot;;
    }
    @PostMapping(&quot;/info&quot;)
    public String postResult(
            PostForm postForm,
            Model model){
        model.addAttribute(&quot;name&quot;,postForm.getName());
        model.addAttribute(&quot;id&quot;,postForm.getId());
        model.addAttribute(&quot;department&quot;,postForm.getDepartment());
        return &quot;postResult&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;View에 thymeleaf 템플릿 엔진을 이용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1710143331294&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;start&amp;lt;/title&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div th:text = &quot;'이름 : ' + ${name}&quot;&amp;gt; &amp;lt;/div&amp;gt;
&amp;lt;div th:text = &quot;'학번 : ' + ${id}&quot;&amp;gt; &amp;lt;/div&amp;gt;
&amp;lt;div th:text = &quot;'학과 : ' + ${department}&quot;&amp;gt; &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;위의 코드는 PostResult.html이다. (View)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller는 view에 model을 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;thymleaf는 model에 있는 내용들을 view에 전달하여 view를 완성하고 완성한 view를 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1710143498762&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;start&amp;lt;/title&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;form action=&quot;/info&quot; method=&quot;post&quot;&amp;gt;
    이름 : &amp;lt;input type=&quot;text&quot; name=&quot;name&quot;&amp;gt;&amp;lt;br&amp;gt;
    학번 : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;&amp;lt;br&amp;gt;
    학과 : &amp;lt;input type=&quot;text&quot; name=&quot;department&quot;&amp;gt;&amp;lt;br&amp;gt;
    &amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 /info로 요청을 보내는 postinput.html이다&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;post요청을 보낼때 request body에 name=&quot;&quot;&amp;amp;id=&quot;&quot;&amp;amp;department=&quot;&quot; 형식으로 서버에 post 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 스프링부트는 PostForm 형식으로 객체를 완성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 만들때 NoArgsConstructor로 객체를 생성하고 Setter를 통해 객체에 내용을 넣는다. (역 직렬화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Setter와 NoArgsConstructor가 정의되어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 post요청을 json 형식으로 보내도 @RequestBody를 통해 이러한 객체 매핑을 가능하도록 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;의문점 : Setter의 경우 객체가 변조될 가능성이 있는데 항상 Setter와 NoArgsConstructor를 써야하는 것인가??&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. DTO , VO, Entity를 따로 두어 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO를 통해 객체 매핑을 시키고 VO나 Entity로 다른 생성 패턴과 도메인 로직을 구현하여 문제를 해결할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-11 at 5.21.47 PM.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bitmVG/btsFGU6ZyMM/vtxSflr1WMvVOUEPjla2YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bitmVG/btsFGU6ZyMM/vtxSflr1WMvVOUEPjla2YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bitmVG/btsFGU6ZyMM/vtxSflr1WMvVOUEPjla2YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbitmVG%2FbtsFGU6ZyMM%2FvtxSflr1WMvVOUEPjla2YK%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;1182&quot; height=&quot;268&quot; data-filename=&quot;Screen Shot 2024-03-11 at 5.21.47 PM.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 DTO와 spring validation을 이용하여 DTO에 오는 값을 검증할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Jackson2HttpMessageConverter와 ObjectMapper에 대해 이해하고 설정을 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청이 오면 Jackson2HttpMessageConverter가 ObjectMapper를 통해 요청을 역직렬화 한다. 스프링부트가&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Jackson2HttpMessageConverter에 필요한 ObjectMapper에 대한 의존성을 주입해주는데 이러한 ObjectMapper를 설정하여 setter와 기본 생성자 없이 객체 매핑을 시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object Mapper는 필드명, getter, setter, 기본생성자를 통해 property를 찾는다.  이러한 property와 기본 생성자를 위임 어노테이션에 명시해주면 그 정보를 이용해 직렬화 , 역직렬화를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 위임 모듈이 존재하는데 이러한 위임 모듈은 위임 어노테이션에 설정할 정보를 자동으로 탐지해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메세지 컨버터를 어떻게 설정할까?&lt;/p&gt;
&lt;figure id=&quot;og_1710146500454&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;스프링부트 - @ResponseBody 커스터마이징 Jascskon Converter &amp;laquo; 구피개발일기&quot; data-og-description=&quot;스프링에서 @ResponseBody로 JSON 응답을 줄 때, Jackson Converter를 커스터마이징 하는 방법에 대해서 포스팅 합니다. 시작하며 API 서버를 만들때, 특정 객체를 JSON 객체로 바꾸어 응답을 줘야합니다. 스&quot; data-og-host=&quot;wckhg89.github.io&quot; data-og-source-url=&quot;https://wckhg89.github.io/archivers/messageconverter&quot; data-og-url=&quot;https://wckhg89.github.io/archivers/messageconverter&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gewMn/hyVxr8I826/STLvGyM1Kql24CbkqqfWQ0/img.jpg?width=409&amp;amp;height=1224&amp;amp;face=0_0_409_1224,https://scrap.kakaocdn.net/dn/kCl54/hyVxzZ00VS/4xNNeYqz6Js1yr1rvFD8l0/img.jpg?width=300&amp;amp;height=300&amp;amp;face=136_30_158_54&quot;&gt;&lt;a href=&quot;https://wckhg89.github.io/archivers/messageconverter&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wckhg89.github.io/archivers/messageconverter&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gewMn/hyVxr8I826/STLvGyM1Kql24CbkqqfWQ0/img.jpg?width=409&amp;amp;height=1224&amp;amp;face=0_0_409_1224,https://scrap.kakaocdn.net/dn/kCl54/hyVxzZ00VS/4xNNeYqz6Js1yr1rvFD8l0/img.jpg?width=300&amp;amp;height=300&amp;amp;face=136_30_158_54');&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;스프링부트 - @ResponseBody 커스터마이징 Jascskon Converter &amp;laquo; 구피개발일기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링에서 @ResponseBody로 JSON 응답을 줄 때, Jackson Converter를 커스터마이징 하는 방법에 대해서 포스팅 합니다. 시작하며 API 서버를 만들때, 특정 객체를 JSON 객체로 바꾸어 응답을 줘야합니다. 스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wckhg89.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setter와 기본 생성자가 있어야 직렬화, 역직렬화가 가능한데 우리가 쓰는 도메인은 변하면 안되는거 아닌가?&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710145334756&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;DTO와 VO 그리고 Entity의 차이&quot; data-og-description=&quot;본 포스팅은 우아한Tech에 올라온 라흐님의 발표영상 DTO vs VO 영상을 보고 정리한 포스팅이다. 넥스트 스텝에서 클린코드 과정을 이수하면서 DTO와 VO의 차이를 제대로 이해못하고 미션을 수행하&quot; data-og-host=&quot;youngjinmo.github.io&quot; data-og-source-url=&quot;https://youngjinmo.github.io/2021/04/dto-vo-entity/&quot; data-og-url=&quot;http://youngjinmo.github.io/2021/04/dto-vo-entity/index.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cwZPj6/hyVxx8Wzto/eTFWs6kdHkw4LnDBYi08aK/img.jpg?width=1024&amp;amp;height=555&amp;amp;face=0_0_1024_555,https://scrap.kakaocdn.net/dn/oW7Bl/hyVxsT6Xpz/gHhNcMF8B7KMc29LdJxxn1/img.jpg?width=1024&amp;amp;height=555&amp;amp;face=0_0_1024_555,https://scrap.kakaocdn.net/dn/FKk9a/hyVxw90ZNo/i12tnJND3fgOCgQMDqkaI1/img.png?width=2332&amp;amp;height=1444&amp;amp;face=0_0_2332_1444&quot;&gt;&lt;a href=&quot;https://youngjinmo.github.io/2021/04/dto-vo-entity/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngjinmo.github.io/2021/04/dto-vo-entity/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cwZPj6/hyVxx8Wzto/eTFWs6kdHkw4LnDBYi08aK/img.jpg?width=1024&amp;amp;height=555&amp;amp;face=0_0_1024_555,https://scrap.kakaocdn.net/dn/oW7Bl/hyVxsT6Xpz/gHhNcMF8B7KMc29LdJxxn1/img.jpg?width=1024&amp;amp;height=555&amp;amp;face=0_0_1024_555,https://scrap.kakaocdn.net/dn/FKk9a/hyVxw90ZNo/i12tnJND3fgOCgQMDqkaI1/img.png?width=2332&amp;amp;height=1444&amp;amp;face=0_0_2332_1444');&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;DTO와 VO 그리고 Entity의 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;본 포스팅은 우아한Tech에 올라온 라흐님의 발표영상 DTO vs VO 영상을 보고 정리한 포스팅이다. 넥스트 스텝에서 클린코드 과정을 이수하면서 DTO와 VO의 차이를 제대로 이해못하고 미션을 수행하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;youngjinmo.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 보내는 요청을 어떻게 검증할까?&lt;/p&gt;
&lt;figure id=&quot;og_1710076510345&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring Boot] Validation 적용, @Valid로 유효성 검사하기&quot; data-og-description=&quot;이전에는 spring-boot-starter-web 의존성 내부에 validation이 있었지만, spring boot 2.3 version 이상부터는 아예 모듈로 빠져 validation 의존성을 따로 추가해줘야 사용할 수 있다. 1. validation 의존성 추가 impleme&quot; data-og-host=&quot;dev-coco.tistory.com&quot; data-og-source-url=&quot;https://dev-coco.tistory.com/123&quot; data-og-url=&quot;https://dev-coco.tistory.com/123&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhAu7x/hyVxviIkCw/cuuY754PrWt9TWoJzwwhJ0/img.png?width=730&amp;amp;height=489&amp;amp;face=0_0_730_489,https://scrap.kakaocdn.net/dn/ckhzEX/hyVxvQyW75/aHdDz0OMIOBHdELP02Uro0/img.png?width=730&amp;amp;height=489&amp;amp;face=0_0_730_489,https://scrap.kakaocdn.net/dn/wrhG5/hyVxChPwCJ/EB7gvOb9NMm2VKh9NvsxK1/img.png?width=730&amp;amp;height=489&amp;amp;face=0_0_730_489&quot;&gt;&lt;a href=&quot;https://dev-coco.tistory.com/123&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-coco.tistory.com/123&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhAu7x/hyVxviIkCw/cuuY754PrWt9TWoJzwwhJ0/img.png?width=730&amp;amp;height=489&amp;amp;face=0_0_730_489,https://scrap.kakaocdn.net/dn/ckhzEX/hyVxvQyW75/aHdDz0OMIOBHdELP02Uro0/img.png?width=730&amp;amp;height=489&amp;amp;face=0_0_730_489,https://scrap.kakaocdn.net/dn/wrhG5/hyVxChPwCJ/EB7gvOb9NMm2VKh9NvsxK1/img.png?width=730&amp;amp;height=489&amp;amp;face=0_0_730_489');&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;[Spring Boot] Validation 적용, @Valid로 유효성 검사하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이전에는 spring-boot-starter-web 의존성 내부에 validation이 있었지만, spring boot 2.3 version 이상부터는 아예 모듈로 빠져 validation 의존성을 따로 추가해줘야 사용할 수 있다. 1. validation 의존성 추가 impleme&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-coco.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710077613842&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cCRrcE/hyVxDnvI6K/Z7qC9gWP2jdEAEhKvHrAy0/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262,https://scrap.kakaocdn.net/dn/YXjg8/hyVxssJ1oq/3uKQyKvxIiIND53B45aAD0/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262,https://scrap.kakaocdn.net/dn/cbYy8i/hyVxymdye0/u6xRlk1KQzFyBwdf4r2Cz0/img.png?width=768&amp;amp;height=500&amp;amp;face=513_86_648_233&quot; data-og-url=&quot;https://www.inflearn.com/questions/948350/notempty%EC%A0%81%EC%9A%A9-%EC%95%88%EB%90%98%EB%8A%94-%EC%98%A4%EB%A5%98&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/948350/notempty%EC%A0%81%EC%9A%A9-%EC%95%88%EB%90%98%EB%8A%94-%EC%98%A4%EB%A5%98&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-description=&quot;1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]'회원 등록' 강의 듣던 중 오류&quot; data-og-title=&quot;@NotEmpty적용 안되는 오류. - 인프런&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/948350/notempty%EC%A0%81%EC%9A%A9-%EC%95%88%EB%90%98%EB%8A%94-%EC%98%A4%EB%A5%98&quot; data-source-url=&quot;https://www.inflearn.com/questions/948350/notempty%EC%A0%81%EC%9A%A9-%EC%95%88%EB%90%98%EB%8A%94-%EC%98%A4%EB%A5%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cCRrcE/hyVxDnvI6K/Z7qC9gWP2jdEAEhKvHrAy0/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262,https://scrap.kakaocdn.net/dn/YXjg8/hyVxssJ1oq/3uKQyKvxIiIND53B45aAD0/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262,https://scrap.kakaocdn.net/dn/cbYy8i/hyVxymdye0/u6xRlk1KQzFyBwdf4r2Cz0/img.png?width=768&amp;amp;height=500&amp;amp;face=513_86_648_233');&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;@NotEmpty적용 안되는 오류. - 인프런&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]'회원 등록' 강의 듣던 중 오류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러에서 어떻게 json을 받을까?&lt;/p&gt;
&lt;figure id=&quot;og_1710146797162&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VPVkh/hyVxytcrkH/WU2dueisS2RrRYq31CZBHk/img.png?width=600&amp;amp;height=315&amp;amp;face=0_0_600_315,https://scrap.kakaocdn.net/dn/qQuKE/hyVxoRDRzw/UFuKKW8k85a7vzqDr4a8L0/img.png?width=600&amp;amp;height=315&amp;amp;face=0_0_600_315&quot; data-og-url=&quot;https://sudo-minz.tistory.com/159&quot; data-og-source-url=&quot;https://sudo-minz.tistory.com/159&quot; data-og-host=&quot;sudo-minz.tistory.com&quot; data-og-description=&quot;@RequestBody, @ResponseBody 어노테이션을 사용하여 컨트롤러에서 JSON 데이터를 주고받을 수 있다. api 요청 프로그램으로 사용한다면 Content-Type을 꼭 application/x-www-form-urlencoded 로 설정해주어야 한다. 1.&quot; data-og-title=&quot;[SpringBoot] 스프링 controller에서 json 받기 (@RequestBody, @ResponseBody 어노테이션 사용)&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://sudo-minz.tistory.com/159&quot; data-source-url=&quot;https://sudo-minz.tistory.com/159&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VPVkh/hyVxytcrkH/WU2dueisS2RrRYq31CZBHk/img.png?width=600&amp;amp;height=315&amp;amp;face=0_0_600_315,https://scrap.kakaocdn.net/dn/qQuKE/hyVxoRDRzw/UFuKKW8k85a7vzqDr4a8L0/img.png?width=600&amp;amp;height=315&amp;amp;face=0_0_600_315');&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;[SpringBoot] 스프링 controller에서 json 받기 (@RequestBody, @ResponseBody 어노테이션 사용)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;@RequestBody, @ResponseBody 어노테이션을 사용하여 컨트롤러에서 JSON 데이터를 주고받을 수 있다. api 요청 프로그램으로 사용한다면 Content-Type을 꼭 application/x-www-form-urlencoded 로 설정해주어야 한다. 1.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sudo-minz.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form 태그를 통한 요청은 어떤 형식으로 올까?&lt;/p&gt;
&lt;figure id=&quot;og_1710077616214&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cHKVR3/hyVxCIUvxp/bUk2uDx68ynpo2MxGhVqt0/img.png?width=207&amp;amp;height=287&amp;amp;face=0_0_207_287,https://scrap.kakaocdn.net/dn/b3mZPm/hyVxrtRM6O/F1Tqst9iCzs3idpNr4BPo1/img.png?width=207&amp;amp;height=287&amp;amp;face=0_0_207_287&quot; data-og-url=&quot;https://velog.io/@yh_lee/HttpServletRequest&quot; data-og-source-url=&quot;https://velog.io/@yh_lee/HttpServletRequest&quot; data-og-host=&quot;velog.io&quot; data-og-description=&quot;HTTP 요청 데이터 - GET, POST, BODY&quot; data-og-title=&quot;HTTP 요청 데이터 - GET, POST, BODY&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://velog.io/@yh_lee/HttpServletRequest&quot; data-source-url=&quot;https://velog.io/@yh_lee/HttpServletRequest&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cHKVR3/hyVxCIUvxp/bUk2uDx68ynpo2MxGhVqt0/img.png?width=207&amp;amp;height=287&amp;amp;face=0_0_207_287,https://scrap.kakaocdn.net/dn/b3mZPm/hyVxrtRM6O/F1Tqst9iCzs3idpNr4BPo1/img.png?width=207&amp;amp;height=287&amp;amp;face=0_0_207_287');&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;HTTP 요청 데이터 - GET, POST, BODY&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 요청 데이터 - GET, P&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OST, BODY&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 클라이언트에서 Json형식을 어떻게 서버에 보낼까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710076672857&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Json 데이터 전송하기 (application/json)&quot; data-og-description=&quot;Json 데이터 전송하기 (application/x-www-form-urlencoded, application/json) 클라이언트에서 서버로 데이터를 전송하려할 때, 데이터를 Json 포멧으로 만들어서 보내는 것이 일반적인 형태 중 하나입니다. 이 &quot; data-og-host=&quot;caileb.tistory.com&quot; data-og-source-url=&quot;https://caileb.tistory.com/192&quot; data-og-url=&quot;https://caileb.tistory.com/192&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g0TTT/hyVxBiVrsX/2fVmO0koSKLpEMzj0uBrjk/img.png?width=358&amp;amp;height=178&amp;amp;face=0_0_358_178,https://scrap.kakaocdn.net/dn/dnoMgU/hyVxwhCjhE/gzJpPJur94qfHx6kBiCdGk/img.png?width=358&amp;amp;height=178&amp;amp;face=0_0_358_178,https://scrap.kakaocdn.net/dn/eB9Us/hyVxC3dJZb/kgUf8PB4oFTsjaZDIzyyH1/img.png?width=873&amp;amp;height=266&amp;amp;face=0_0_873_266&quot;&gt;&lt;a href=&quot;https://caileb.tistory.com/192&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://caileb.tistory.com/192&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g0TTT/hyVxBiVrsX/2fVmO0koSKLpEMzj0uBrjk/img.png?width=358&amp;amp;height=178&amp;amp;face=0_0_358_178,https://scrap.kakaocdn.net/dn/dnoMgU/hyVxwhCjhE/gzJpPJur94qfHx6kBiCdGk/img.png?width=358&amp;amp;height=178&amp;amp;face=0_0_358_178,https://scrap.kakaocdn.net/dn/eB9Us/hyVxC3dJZb/kgUf8PB4oFTsjaZDIzyyH1/img.png?width=873&amp;amp;height=266&amp;amp;face=0_0_873_266');&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;Json 데이터 전송하기 (application/json)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Json 데이터 전송하기 (application/x-www-form-urlencoded, application/json) 클라이언트에서 서버로 데이터를 전송하려할 때, 데이터를 Json 포멧으로 만들어서 보내는 것이 일반적인 형태 중 하나입니다. 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;caileb.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710077392373&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Javascript] JSON stringify 사용법, parse 사용법(JSON과 메서드)&quot; data-og-description=&quot;JSON(JavaScript Object Notation)은 값이나 객체를 나타내주는 범용 포맷으로, RFC 4627 표준에 정의되어 있습니다. JSON은 본래 자바스크립트에서 사용할 목적으로 만들어진 포맷입니다. 그런데 라이브러&quot; data-og-host=&quot;sewonzzang.tistory.com&quot; data-og-source-url=&quot;https://sewonzzang.tistory.com/23&quot; data-og-url=&quot;https://sewonzzang.tistory.com/23&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/llR6t/hyVxqoaeLp/KNKt4rBhz1uAMpgQsC6LD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ct1vbN/hyVxxU9dxZ/sx5wls2rjXRbPJX3CHyNpK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/YRN02/hyVxBpHVAk/rwvbuGnK7NhGsgedwQ6ACK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://sewonzzang.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sewonzzang.tistory.com/23&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/llR6t/hyVxqoaeLp/KNKt4rBhz1uAMpgQsC6LD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ct1vbN/hyVxxU9dxZ/sx5wls2rjXRbPJX3CHyNpK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/YRN02/hyVxBpHVAk/rwvbuGnK7NhGsgedwQ6ACK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&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;[Javascript] JSON stringify 사용법, parse 사용법(JSON과 메서드)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JSON(JavaScript Object Notation)은 값이나 객체를 나타내주는 범용 포맷으로, RFC 4627 표준에 정의되어 있습니다. JSON은 본래 자바스크립트에서 사용할 목적으로 만들어진 포맷입니다. 그런데 라이브러&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sewonzzang.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710077467230&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JS에서 받은 데이터를 JSON으로 보내기&quot; data-og-description=&quot;HTML과 JS로 프론트엔드를 구성하였고, 여기서 받은 데이터를 spring으로 보내주려고 하는 과정이 있었다. 데이터를 입력하는 id값을 $('이런 변수를 토대로 합쳐셔 key:value값인 json형태를 만들어준&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@jeeho102/JS%EC%97%90%EC%84%9C-%EB%B0%9B%EC%9D%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-JSON%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%82%B4%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@jeeho102/JS에서-받은-데이터를-JSON으로-보내기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bqw6ZO/hyVxslZPyy/0xvK6APcqMekIKGd6x3hJ0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@jeeho102/JS%EC%97%90%EC%84%9C-%EB%B0%9B%EC%9D%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-JSON%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%82%B4%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@jeeho102/JS%EC%97%90%EC%84%9C-%EB%B0%9B%EC%9D%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-JSON%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%82%B4%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bqw6ZO/hyVxslZPyy/0xvK6APcqMekIKGd6x3hJ0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&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;JS에서 받은 데이터를 JSON으로 보내기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML과 JS로 프론트엔드를 구성하였고, 여기서 받은 데이터를 spring으로 보내주려고 하는 과정이 있었다. 데이터를 입력하는 id값을 $('이런 변수를 토대로 합쳐셔 key:value값인 json형태를 만들어준&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710133259877&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;GET &amp;amp; POST + JSON 주고 받기&quot; data-og-description=&quot;참고 https://eastflag.co.kr/fullstack/rest-with-nodejs/node-rest_get-post/ angular, react, vue 등의 최신프런트엔드로 풀스택 개발 백엔드는 spring boot, Node로 프런트엔드는 react, angular, vue 의 최신프런트엔드를 사용&quot; data-og-host=&quot;duckgugong.tistory.com&quot; data-og-source-url=&quot;https://duckgugong.tistory.com/223&quot; data-og-url=&quot;https://duckgugong.tistory.com/223&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c8YEET/hyVxx15PaO/xbCOX22wN8xtM8wNt3cILk/img.png?width=711&amp;amp;height=266&amp;amp;face=0_0_711_266,https://scrap.kakaocdn.net/dn/fYFEE/hyVxDBgxem/XkKV6ZyyYa2C10UI2Kf9vK/img.png?width=711&amp;amp;height=266&amp;amp;face=0_0_711_266,https://scrap.kakaocdn.net/dn/bTfNHo/hyVxtyDIks/QT7SxwbgUvFfEjpaGxkHY1/img.png?width=717&amp;amp;height=465&amp;amp;face=0_0_717_465&quot;&gt;&lt;a href=&quot;https://duckgugong.tistory.com/223&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://duckgugong.tistory.com/223&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c8YEET/hyVxx15PaO/xbCOX22wN8xtM8wNt3cILk/img.png?width=711&amp;amp;height=266&amp;amp;face=0_0_711_266,https://scrap.kakaocdn.net/dn/fYFEE/hyVxDBgxem/XkKV6ZyyYa2C10UI2Kf9vK/img.png?width=711&amp;amp;height=266&amp;amp;face=0_0_711_266,https://scrap.kakaocdn.net/dn/bTfNHo/hyVxtyDIks/QT7SxwbgUvFfEjpaGxkHY1/img.png?width=717&amp;amp;height=465&amp;amp;face=0_0_717_465');&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;GET &amp;amp; POST + JSON 주고 받기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;참고 https://eastflag.co.kr/fullstack/rest-with-nodejs/node-rest_get-post/ angular, react, vue 등의 최신프런트엔드로 풀스택 개발 백엔드는 spring boot, Node로 프런트엔드는 react, angular, vue 의 최신프런트엔드를 사용&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;duckgugong.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710133511377&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JavaScript에서 JSON 객체 배열 사용하기&quot; data-og-description=&quot;이 튜토리얼에서는 JSON 객체 배열에 대해 설명합니다.&quot; data-og-host=&quot;www.delftstack.com&quot; data-og-source-url=&quot;https://www.delftstack.com/ko/howto/javascript/javascript-json-array-of-objects/&quot; data-og-url=&quot;https://www.delftstack.com/ko/howto/javascript/javascript-json-array-of-objects/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c26iHk/hyVxtZHy08/erKe1XmIoE15KnhR0i4Bi1/img.jpg?width=960&amp;amp;height=540&amp;amp;face=0_0_960_540,https://scrap.kakaocdn.net/dn/cgLXxZ/hyVxzS9Ukp/9w2z4SQOFm1kIoGuPM9Me1/img.jpg?width=960&amp;amp;height=540&amp;amp;face=0_0_960_540&quot;&gt;&lt;a href=&quot;https://www.delftstack.com/ko/howto/javascript/javascript-json-array-of-objects/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.delftstack.com/ko/howto/javascript/javascript-json-array-of-objects/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c26iHk/hyVxtZHy08/erKe1XmIoE15KnhR0i4Bi1/img.jpg?width=960&amp;amp;height=540&amp;amp;face=0_0_960_540,https://scrap.kakaocdn.net/dn/cgLXxZ/hyVxzS9Ukp/9w2z4SQOFm1kIoGuPM9Me1/img.jpg?width=960&amp;amp;height=540&amp;amp;face=0_0_960_540');&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;JavaScript에서 JSON 객체 배열 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 튜토리얼에서는 JSON 객체 배열에 대해 설명합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.delftstack.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 원리로 직렬화 되는가?&lt;/p&gt;
&lt;figure id=&quot;og_1710134682325&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot; Jackson 데이터 바인딩 에러! (InvalidDefinitionException - No serializer found for class)&quot; data-og-description=&quot;JACKSON DATABINDING ERROR&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@maketheworldwise/Jackson-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%94%EC%9D%B8%EB%94%A9-%EC%97%90%EB%9F%AC-InvalidDefinitionException-No-serializer-found-for-class&quot; data-og-url=&quot;https://velog.io/@maketheworldwise/Jackson-데이터-바인딩-에러-InvalidDefinitionException-No-serializer-found-for-class&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QNWVN/hyVxBcmYRf/1I0bzqV4mKlkKckB876mKK/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/LBBzY/hyVxw9WRAw/sXanaD3BzOeIhQrQRRr56K/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/DGsCT/hyVxpJN8VB/6eYMt5GPlkTEg3QlkgTbr1/img.jpg?width=1125&amp;amp;height=932&amp;amp;face=335_288_688_672&quot;&gt;&lt;a href=&quot;https://velog.io/@maketheworldwise/Jackson-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%94%EC%9D%B8%EB%94%A9-%EC%97%90%EB%9F%AC-InvalidDefinitionException-No-serializer-found-for-class&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@maketheworldwise/Jackson-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%94%EC%9D%B8%EB%94%A9-%EC%97%90%EB%9F%AC-InvalidDefinitionException-No-serializer-found-for-class&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QNWVN/hyVxBcmYRf/1I0bzqV4mKlkKckB876mKK/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/LBBzY/hyVxw9WRAw/sXanaD3BzOeIhQrQRRr56K/img.gif?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/DGsCT/hyVxpJN8VB/6eYMt5GPlkTEg3QlkgTbr1/img.jpg?width=1125&amp;amp;height=932&amp;amp;face=335_288_688_672');&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; Jackson 데이터 바인딩 에러! (InvalidDefinitionException - No serializer found for class)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JACKSON DATABINDING ERROR&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;builder 패턴을 어떻게 효율적으로 쓸 수 있을까?&lt;/p&gt;
&lt;figure id=&quot;og_1710137309492&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;blog&quot; data-og-title=&quot;Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그&quot; data-og-description=&quot;Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그&quot; data-og-host=&quot;cheese10yun.github.io&quot; data-og-source-url=&quot;https://cheese10yun.github.io/spring-builder-pattern/&quot; data-og-url=&quot;https://cheese10yun.github.io/spring-builder-pattern/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://cheese10yun.github.io/spring-builder-pattern/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cheese10yun.github.io/spring-builder-pattern/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Builder 기반으로 객체를 안전하게 생성하는 방법 - Yun Blog | 기술 블로그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cheese10yun.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form 데이터를 처리하는 여러 방식&lt;/p&gt;
&lt;figure id=&quot;og_1710147289818&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Form 데이터 주고 받기 [Spring, HttpServletRequest]&quot; data-og-description=&quot;본 게시글은 Seoul wiz의 신입SW인력을 위한 실전 자바(Java) 스프링(Spring)을 참고하여 작성한 글입니다. Form태그, 즉 View의 데이터를 Server로 주고 받는 방식에 대해 알아보자. HttpServletReqest HttpServletRe&quot; data-og-host=&quot;howtolivelikehuman.tistory.com&quot; data-og-source-url=&quot;https://howtolivelikehuman.tistory.com/169&quot; data-og-url=&quot;https://howtolivelikehuman.tistory.com/169&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/I2gj4/hyVxpC5tJv/EKIAsgUKuKIMQLqxjhjax0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/XDG7M/hyVxq9RFfi/kG36xXjk3ekVCsdJ9Sai4k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/NTCnZ/hyVxCvFMgh/shqz3fetvgLXp0gSgNtuT0/img.png?width=1134&amp;amp;height=1134&amp;amp;face=0_0_1134_1134&quot;&gt;&lt;a href=&quot;https://howtolivelikehuman.tistory.com/169&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://howtolivelikehuman.tistory.com/169&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/I2gj4/hyVxpC5tJv/EKIAsgUKuKIMQLqxjhjax0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/XDG7M/hyVxq9RFfi/kG36xXjk3ekVCsdJ9Sai4k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/NTCnZ/hyVxCvFMgh/shqz3fetvgLXp0gSgNtuT0/img.png?width=1134&amp;amp;height=1134&amp;amp;face=0_0_1134_1134');&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;Form 데이터 주고 받기 [Spring, HttpServletRequest]&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;본 게시글은 Seoul wiz의 신입SW인력을 위한 실전 자바(Java) 스프링(Spring)을 참고하여 작성한 글입니다. Form태그, 즉 View의 데이터를 Server로 주고 받는 방식에 대해 알아보자. HttpServletReqest HttpServletRe&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;howtolivelikehuman.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL를 파라미터로 어떻게 사용하는가? (&lt;b&gt;&lt;i&gt;@PathVariable&lt;/i&gt;&lt;/b&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1710148315152&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MVC 어노테이션 정리&quot; data-og-description=&quot;필자는 최근에 spring 강의를 뒤져가며 공부를 다시 하고 있다. 그전에는 그냥 사용하기에 급급했기에 비슷한 어노테이션이 나오게 되면 차이점을 잘 몰랐다. 그렇기에 이렇게 정리를 하고자 한&quot; data-og-host=&quot;tech-monster.tistory.com&quot; data-og-source-url=&quot;https://tech-monster.tistory.com/108&quot; data-og-url=&quot;https://tech-monster.tistory.com/108&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biO0yk/hyVxwvtxDQ/3DU1TJ8MqsEtdIY3AWToZ1/img.png?width=511&amp;amp;height=684&amp;amp;face=0_0_511_684,https://scrap.kakaocdn.net/dn/crgyoW/hyVxrOqJeu/XGiIPpjI38KgkHyViN4wH0/img.png?width=511&amp;amp;height=684&amp;amp;face=0_0_511_684,https://scrap.kakaocdn.net/dn/IsJC3/hyVxBpZZAf/GyqOnaMBGVOnuXIOyf8hR1/img.png?width=511&amp;amp;height=684&amp;amp;face=0_0_511_684&quot;&gt;&lt;a href=&quot;https://tech-monster.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tech-monster.tistory.com/108&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biO0yk/hyVxwvtxDQ/3DU1TJ8MqsEtdIY3AWToZ1/img.png?width=511&amp;amp;height=684&amp;amp;face=0_0_511_684,https://scrap.kakaocdn.net/dn/crgyoW/hyVxrOqJeu/XGiIPpjI38KgkHyViN4wH0/img.png?width=511&amp;amp;height=684&amp;amp;face=0_0_511_684,https://scrap.kakaocdn.net/dn/IsJC3/hyVxBpZZAf/GyqOnaMBGVOnuXIOyf8hR1/img.png?width=511&amp;amp;height=684&amp;amp;face=0_0_511_684');&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;MVC 어노테이션 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;필자는 최근에 spring 강의를 뒤져가며 공부를 다시 하고 있다. 그전에는 그냥 사용하기에 급급했기에 비슷한 어노테이션이 나오게 되면 차이점을 잘 몰랐다. 그렇기에 이렇게 정리를 하고자 한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tech-monster.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/84</guid>
      <comments>https://dyd1310.tistory.com/84#entry84comment</comments>
      <pubDate>Mon, 11 Mar 2024 17:49:33 +0900</pubDate>
    </item>
    <item>
      <title>스프링부트 시작하기</title>
      <link>https://dyd1310.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;https://start.spring.io&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PEwAK/btsFFYnHKiy/BAKqVAKGAcPKiQDWZVMK21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PEwAK/btsFFYnHKiy/BAKqVAKGAcPKiQDWZVMK21/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;990&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.36.25 PM.png&quot; style=&quot;width: 60.2988%; margin-right: 10px;&quot; data-widthpercent=&quot;61.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PEwAK/btsFFYnHKiy/BAKqVAKGAcPKiQDWZVMK21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPEwAK%2FbtsFFYnHKiy%2FBAKqVAKGAcPKiQDWZVMK21%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;1328&quot; height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dp9YWS/btsFEK4PBvs/KxVtKxGkV4UacTKTsa5Ifk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dp9YWS/btsFEK4PBvs/KxVtKxGkV4UacTKTsa5Ifk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;1542&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.36.13 PM.png&quot; data-widthpercent=&quot;38.99&quot; style=&quot;width: 38.5384%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dp9YWS/btsFEK4PBvs/KxVtKxGkV4UacTKTsa5Ifk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdp9YWS%2FbtsFEK4PBvs%2FKxVtKxGkV4UacTKTsa5Ifk%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;1322&quot; height=&quot;1542&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradle을 통해 라이브러리 의존성을 확인할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.40.03 PM.png&quot; data-origin-width=&quot;2800&quot; data-origin-height=&quot;1228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XppJv/btsFEuUYxxL/hVzunKTgW5xP34VWY0vXSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XppJv/btsFEuUYxxL/hVzunKTgW5xP34VWY0vXSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XppJv/btsFEuUYxxL/hVzunKTgW5xP34VWY0vXSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXppJv%2FbtsFEuUYxxL%2FhVzunKTgW5xP34VWY0vXSK%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;2800&quot; height=&quot;1228&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.40.03 PM.png&quot; data-origin-width=&quot;2800&quot; data-origin-height=&quot;1228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드&lt;/p&gt;
&lt;pre id=&quot;code_1709966780591&quot; class=&quot;n1ql&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;./gradlew build
cd build/libs
java -jar start-0.0.1-SNAPSHOT.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 jar파일을 서버에 실행시켜 배포할 수 있음.&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;시작하기전 jdk 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로젝트 시작할때 jdk를 설정해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- file &amp;gt; 프로젝트 구조 탭을 통해 jdk 설정하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 2.25.09 PM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exUJvL/btsFOh0UriH/vCYguJH7VmQBRokKULbwCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exUJvL/btsFOh0UriH/vCYguJH7VmQBRokKULbwCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exUJvL/btsFOh0UriH/vCYguJH7VmQBRokKULbwCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FexUJvL%2FbtsFOh0UriH%2FvCYguJH7VmQBRokKULbwCK%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;1736&quot; height=&quot;772&quot; data-filename=&quot;Screenshot 2024-03-14 at 2.25.09 PM.png&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- command + , 단축키를 통해 jdk 설정하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 2.25.46 PM.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;1194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZyBw4/btsFNwc7cHA/KfRzqHkOlBfATcZKI5pcU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZyBw4/btsFNwc7cHA/KfRzqHkOlBfATcZKI5pcU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZyBw4/btsFNwc7cHA/KfRzqHkOlBfATcZKI5pcU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZyBw4%2FbtsFNwc7cHA%2FKfRzqHkOlBfATcZKI5pcU1%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;1934&quot; height=&quot;1194&quot; data-filename=&quot;Screenshot 2024-03-14 at 2.25.46 PM.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle에 설정된 sourceCompatibility와 동일한 jdk 버전이여야함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-03-14 at 2.27.26 PM.png&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CvUS5/btsFNxC6T5h/pi5Ay3jfyhlpmlxvFd6X3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CvUS5/btsFNxC6T5h/pi5Ay3jfyhlpmlxvFd6X3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CvUS5/btsFNxC6T5h/pi5Ay3jfyhlpmlxvFd6X3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCvUS5%2FbtsFNxC6T5h%2Fpi5Ay3jfyhlpmlxvFd6X3K%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;1518&quot; height=&quot;870&quot; data-filename=&quot;Screenshot 2024-03-14 at 2.27.26 PM.png&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 설정 후&amp;nbsp;이러한 오류가 생김&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-10 at 6.18.28 PM.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwQ9BX/btsFEv7y6Q8/QczAg26nm3zAdnqgOcrX6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwQ9BX/btsFEv7y6Q8/QczAg26nm3zAdnqgOcrX6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwQ9BX/btsFEv7y6Q8/QczAg26nm3zAdnqgOcrX6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwQ9BX%2FbtsFEv7y6Q8%2FQczAg26nm3zAdnqgOcrX6k%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;932&quot; height=&quot;446&quot; data-filename=&quot;Screen Shot 2024-03-10 at 6.18.28 PM.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openjdk 17가 설치되어있는데 오류가 생겨 다시 다운 받음.&lt;/p&gt;
&lt;pre id=&quot;code_1710062383709&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install openjdk@17
java --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-10 at 6.20.26 PM.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHEFbk/btsFD5uyK7I/KehLERjg39tUuWzZVl8Z7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHEFbk/btsFD5uyK7I/KehLERjg39tUuWzZVl8Z7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHEFbk/btsFD5uyK7I/KehLERjg39tUuWzZVl8Z7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHEFbk%2FbtsFD5uyK7I%2FKehLERjg39tUuWzZVl8Z7K%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;1140&quot; height=&quot;210&quot; data-filename=&quot;Screen Shot 2024-03-10 at 6.20.26 PM.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-10 at 6.20.54 PM.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R7Npl/btsFDA9pJ83/VedNMTvyQwJY19AwMRyo6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R7Npl/btsFDA9pJ83/VedNMTvyQwJY19AwMRyo6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R7Npl/btsFDA9pJ83/VedNMTvyQwJY19AwMRyo6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR7Npl%2FbtsFDA9pJ83%2FVedNMTvyQwJY19AwMRyo6K%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;493&quot; height=&quot;188&quot; data-filename=&quot;Screen Shot 2024-03-10 at 6.20.54 PM.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 후 다시실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 Failed to determine a suitable driver class 해당 오류 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710064164569&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Mac] Mac에서 java 17 버전 JDK 설치, java 버전 변경&quot; data-og-description=&quot;1. oracle java 다운로드 페이지에서 자신의 OS와 맞는 JDK를 다운 받는다 https://www.oracle.com/java/technologies/downloads/#jdk17-mac Download the Latest Java LTS Free Subscribe to Java SE and get the most comprehensive Java support avai&quot; data-og-host=&quot;jerryjerryjerry.tistory.com&quot; data-og-source-url=&quot;https://jerryjerryjerry.tistory.com/131&quot; data-og-url=&quot;https://jerryjerryjerry.tistory.com/131&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRiYAG/hyVxwu6nzj/GXoOpkTSQFAVsnuac8EG0K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bpGwwE/hyVxwBQEbo/mPXzZbtpMxkEk43Gc6Uq5K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cuo2WJ/hyVxquSIsb/rTpFfCk02HxJDMnfXE9Whk/img.png?width=2742&amp;amp;height=1436&amp;amp;face=0_0_2742_1436&quot;&gt;&lt;a href=&quot;https://jerryjerryjerry.tistory.com/131&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jerryjerryjerry.tistory.com/131&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRiYAG/hyVxwu6nzj/GXoOpkTSQFAVsnuac8EG0K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bpGwwE/hyVxwBQEbo/mPXzZbtpMxkEk43Gc6Uq5K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cuo2WJ/hyVxquSIsb/rTpFfCk02HxJDMnfXE9Whk/img.png?width=2742&amp;amp;height=1436&amp;amp;face=0_0_2742_1436');&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;[Mac] Mac에서 java 17 버전 JDK 설치, java 버전 변경&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. oracle java 다운로드 페이지에서 자신의 OS와 맞는 JDK를 다운 받는다 https://www.oracle.com/java/technologies/downloads/#jdk17-mac Download the Latest Java LTS Free Subscribe to Java SE and get the most comprehensive Java support avai&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jerryjerryjerry.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 오류는 의존성에서 JPA를 설정하고 data source를 설정안해서 생긴 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1710064713606&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;IntelliJ(인텔리제이) Spring Boot DevTools 적용&quot; data-og-description=&quot;안녕하세요, 오리엔탈 킴입니다. IntelliJ(인텔리제이) Spring Boot DevTools 적용하기 Spring Boot DevTools는 소스 변경이 발생할 때마다 빠르게 자동 빌드해줘서 바로바로 반영 결과를 확인할 수 있도록 도&quot; data-og-host=&quot;kim-oriental.tistory.com&quot; data-og-source-url=&quot;https://kim-oriental.tistory.com/8&quot; data-og-url=&quot;https://kim-oriental.tistory.com/8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GsPmS/hyVxwV9b60/w90IseCY8J9aJVUzg1rDKk/img.png?width=800&amp;amp;height=451&amp;amp;face=0_0_800_451,https://scrap.kakaocdn.net/dn/baM9fJ/hyVxsMYWFD/gnyUuzqSkeG9hcw9tjr7i0/img.png?width=800&amp;amp;height=451&amp;amp;face=0_0_800_451,https://scrap.kakaocdn.net/dn/3Nu2A/hyVxCvjHTQ/kZx9eT9aBmQBbCxyWtmBLK/img.png?width=979&amp;amp;height=553&amp;amp;face=0_0_979_553&quot;&gt;&lt;a href=&quot;https://kim-oriental.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kim-oriental.tistory.com/8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GsPmS/hyVxwV9b60/w90IseCY8J9aJVUzg1rDKk/img.png?width=800&amp;amp;height=451&amp;amp;face=0_0_800_451,https://scrap.kakaocdn.net/dn/baM9fJ/hyVxsMYWFD/gnyUuzqSkeG9hcw9tjr7i0/img.png?width=800&amp;amp;height=451&amp;amp;face=0_0_800_451,https://scrap.kakaocdn.net/dn/3Nu2A/hyVxCvjHTQ/kZx9eT9aBmQBbCxyWtmBLK/img.png?width=979&amp;amp;height=553&amp;amp;face=0_0_979_553');&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;IntelliJ(인텔리제이) Spring Boot DevTools 적용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 오리엔탈 킴입니다. IntelliJ(인텔리제이) Spring Boot DevTools 적용하기 Spring Boot DevTools는 소스 변경이 발생할 때마다 빠르게 자동 빌드해줘서 바로바로 반영 결과를 확인할 수 있도록 도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kim-oriental.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 작업을 위해 devtool을 의존성에 추가했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/83</guid>
      <comments>https://dyd1310.tistory.com/83#entry83comment</comments>
      <pubDate>Sat, 9 Mar 2024 15:47:00 +0900</pubDate>
    </item>
    <item>
      <title>종합 설계 프로젝트 초기세팅</title>
      <link>https://dyd1310.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;organization을 생성하여 server와 docs 레포지토리을 만들었다.&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;개인 레포지토리로 프로젝트를 운영할 수 있지만 issue, pullrequest 기능을 적극적으로 사용하고싶어 organization을 운영하기로 마음 었다.&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;그리고 readme 파일에 간단한 프로젝트 관련 정보를 적었다.&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;1. 이슈 템플릿 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- setting&amp;gt;general&amp;gt;Features&amp;gt;set up templates&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.46.14 PM.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkSqNV/btsFEKXZafq/rFltQRvQCCbpQm3TayyCu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkSqNV/btsFEKXZafq/rFltQRvQCCbpQm3TayyCu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkSqNV/btsFEKXZafq/rFltQRvQCCbpQm3TayyCu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkSqNV%2FbtsFEKXZafq%2FrFltQRvQCCbpQm3TayyCu1%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;540&quot; height=&quot;842&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.46.14 PM.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- add templates 에서 원하는 유형 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.46.52 PM.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UiZqg/btsFE1StDBE/uPWXXnPpfXS2jWpvVaPvK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UiZqg/btsFE1StDBE/uPWXXnPpfXS2jWpvVaPvK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UiZqg/btsFE1StDBE/uPWXXnPpfXS2jWpvVaPvK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUiZqg%2FbtsFE1StDBE%2FuPWXXnPpfXS2jWpvVaPvK0%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;322&quot; height=&quot;500&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.46.52 PM.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- preview and edit로 작성을 시작한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.47.31 PM.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eojulF/btsFGD4pa8f/OBEoaJ1rMmP3yJmufRdHvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eojulF/btsFGD4pa8f/OBEoaJ1rMmP3yJmufRdHvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eojulF/btsFGD4pa8f/OBEoaJ1rMmP3yJmufRdHvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeojulF%2FbtsFGD4pa8f%2FOBEoaJ1rMmP3yJmufRdHvk%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;530&quot; height=&quot;186&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.47.31 PM.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마크다운 문법을 활용하여 템플릿을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.49.18 PM.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3i5N4/btsFGSUyJ5t/ECWlm3EakRXAwJR8FFyBP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3i5N4/btsFGSUyJ5t/ECWlm3EakRXAwJR8FFyBP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3i5N4/btsFGSUyJ5t/ECWlm3EakRXAwJR8FFyBP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3i5N4%2FbtsFGSUyJ5t%2FECWlm3EakRXAwJR8FFyBP0%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;543&quot; height=&quot;886&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.49.18 PM.png&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 커밋 템플릿과 풀리퀘스트 템플릿 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 예시에선 fullrequest와 merge하는 과정을 설명하기위해 직접 fork하여 예시를 보이겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하기전 issue를 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUdgFx/btsFHq4zKZL/38k77cOvjPBB9N4Cktyqc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUdgFx/btsFHq4zKZL/38k77cOvjPBB9N4Cktyqc1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;1014&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.57.46 PM.png&quot; width=&quot;509&quot; style=&quot;width: 44.6973%; margin-right: 10px;&quot; data-widthpercent=&quot;45.22&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUdgFx/btsFHq4zKZL/38k77cOvjPBB9N4Cktyqc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUdgFx%2FbtsFHq4zKZL%2F38k77cOvjPBB9N4Cktyqc1%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;1074&quot; height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmIlBj/btsFEMVOMp1/EojETUpsdtGz6KfGjD3V21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmIlBj/btsFEMVOMp1/EojETUpsdtGz6KfGjD3V21/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;820&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.58.02 PM.png&quot; style=&quot;width: 54.1399%;&quot; data-widthpercent=&quot;54.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmIlBj/btsFEMVOMp1/EojETUpsdtGz6KfGjD3V21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmIlBj%2FbtsFEMVOMp1%2FEojETUpsdtGz6KfGjD3V21%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;1052&quot; height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 full request를 위해 fork한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.58.28 PM.png&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JQF4h/btsFFX3mApH/mZ7rp6IzRWG7S17dROijUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JQF4h/btsFFX3mApH/mZ7rp6IzRWG7S17dROijUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JQF4h/btsFFX3mApH/mZ7rp6IzRWG7S17dROijUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJQF4h%2FbtsFFX3mApH%2FmZ7rp6IzRWG7S17dROijUK%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;1644&quot; height=&quot;176&quot; data-filename=&quot;Screen Shot 2024-03-09 at 1.58.28 PM.png&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후의 로직들&lt;/p&gt;
&lt;pre id=&quot;code_1709960888218&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git clone https://github.com/dyd131001/project-docs.git
cd project-docs
git remote add knu https://github.com/knu-project/project-docs.git
git branch init/add_templetes
git switch init/add_templetes
# commit 템플릿 작성
vi .gitmessage.txt
git config --system commit.template .gitmessage.txt
cd .github
vi PULL_REQUEST_TEMPLATE.md
cd ..
vi .gitignore
git add .
git commit
git push origin init/add_templetes
# 오류 발생
git config --list
# remote 주소 확인
git remote set-url https://github.com/dyd131001/project-docs.git
git push origin init/add_templetes
# 토큰 생성 후 복붙
# 성공
# fullrequest 요청 후 병합 완료
git pull knu
git switch develop
git branch -D init/add_templetes&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;commit은 해당 내용으로 작성했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.19.03 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FKPgj/btsFHtUxjV9/JqHXC99C4Z3fKdst6xkd91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FKPgj/btsFHtUxjV9/JqHXC99C4Z3fKdst6xkd91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FKPgj/btsFHtUxjV9/JqHXC99C4Z3fKdst6xkd91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFKPgj%2FbtsFHtUxjV9%2FJqHXC99C4Z3fKdst6xkd91%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;1352&quot; height=&quot;442&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.19.03 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 푸쉬하려고 했는데 계속 403 에러가 발생했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.21.13 PM.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deU1YA/btsFFkdGs3A/Zb8jKy7CAcHtAlZ6LIjr21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deU1YA/btsFFkdGs3A/Zb8jKy7CAcHtAlZ6LIjr21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deU1YA/btsFFkdGs3A/Zb8jKy7CAcHtAlZ6LIjr21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeU1YA%2FbtsFFkdGs3A%2FZb8jKy7CAcHtAlZ6LIjr21%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;494&quot; height=&quot;34&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.21.13 PM.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 remote 경로를 바꾼 후 토큰을 생성하여 해결했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.22.13 PM.png&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lTQZh/btsFDFvUlE1/7GFcWj0rlzYqxXkgQ4boK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lTQZh/btsFDFvUlE1/7GFcWj0rlzYqxXkgQ4boK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lTQZh/btsFDFvUlE1/7GFcWj0rlzYqxXkgQ4boK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlTQZh%2FbtsFDFvUlE1%2F7GFcWj0rlzYqxXkgQ4boK1%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;645&quot; height=&quot;884&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.22.13 PM.png&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 브랜치에 잘 push된걸 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.23.36 PM.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJWMQ/btsFEigkHjS/7zfg9Eq8PAuSVQXSCmQKV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJWMQ/btsFEigkHjS/7zfg9Eq8PAuSVQXSCmQKV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJWMQ/btsFEigkHjS/7zfg9Eq8PAuSVQXSCmQKV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuJWMQ%2FbtsFEigkHjS%2F7zfg9Eq8PAuSVQXSCmQKV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;1296&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.23.36 PM.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;1296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gitignore에 .DS_Store를 기입하지않아 .DS_Store이 생겨 이걸 삭제해야했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709962376355&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rm .DS_Store
vi .gitignore
git commit -m &quot;delete: DS_Store&quot;
git push origin init/add_templetes&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;잘 수정됐고 위의 Compare &amp;amp; pull request를 클릭하여 pull request 한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.33.42 PM.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bedqF5/btsFDB74yyI/nAnZ1wvya9k9TpbtkvA7xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bedqF5/btsFDB74yyI/nAnZ1wvya9k9TpbtkvA7xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bedqF5/btsFDB74yyI/nAnZ1wvya9k9TpbtkvA7xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbedqF5%2FbtsFDB74yyI%2FnAnZ1wvya9k9TpbtkvA7xK%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;480&quot; height=&quot;469&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.33.42 PM.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.34.45 PM.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcJjC/btsFFkY5iSQ/XPkTyjWJVk52Vn6uGhCGg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcJjC/btsFFkY5iSQ/XPkTyjWJVk52Vn6uGhCGg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcJjC/btsFFkY5iSQ/XPkTyjWJVk52Vn6uGhCGg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmcJjC%2FbtsFFkY5iSQ%2FXPkTyjWJVk52Vn6uGhCGg1%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;1646&quot; height=&quot;274&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.34.45 PM.png&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;base repository와 base를 잘 선택해야하는데 초기세팅이 main에 모두 적용되길 원해 develop 이 아닌 main으로 base를 설정하고 pull request를 보냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.38.44 PM.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;1204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tIeNP/btsFHqpYubL/7uPU865Gmr0kUaBYdUnlS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tIeNP/btsFHqpYubL/7uPU865Gmr0kUaBYdUnlS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tIeNP/btsFHqpYubL/7uPU865Gmr0kUaBYdUnlS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIeNP%2FbtsFHqpYubL%2F7uPU865Gmr0kUaBYdUnlS0%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;562&quot; height=&quot;1204&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.38.44 PM.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;1204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 readme 파일을 수정해야한다는 걸 생각하고 고친다.&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;readme 파일을 다음과 같이 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.50.28 PM.png&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhPIjO/btsFEMBvu4f/SHAJycVfBA3xHpmkS7KtS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhPIjO/btsFEMBvu4f/SHAJycVfBA3xHpmkS7KtS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhPIjO/btsFEMBvu4f/SHAJycVfBA3xHpmkS7KtS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhPIjO%2FbtsFEMBvu4f%2FSHAJycVfBA3xHpmkS7KtS1%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;2080&quot; height=&quot;350&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.50.28 PM.png&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 github에 빈폴더같은 경우 올라가지 않다는 것을 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 readme 파일을 commit한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709963629533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 빈폴더 마다 gitkeep 추가
cd tech-manual
touch .gitkeep

# init/add_templetes의 readme를 수정해서 버전을 맞춰야한다.
git pull origin init/add_templetes
git add .
 git commit -m &quot;feat: add docs&quot;
 git push origin init/add_templetes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 추가된것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.57.31 PM.png&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bItyYj/btsFEiHrksK/VFJZ17FKoPjkMOFWj8cD00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bItyYj/btsFEiHrksK/VFJZ17FKoPjkMOFWj8cD00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bItyYj/btsFEiHrksK/VFJZ17FKoPjkMOFWj8cD00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbItyYj%2FbtsFEiHrksK%2FVFJZ17FKoPjkMOFWj8cD00%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;656&quot; height=&quot;720&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.57.31 PM.png&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 organization에서 full request를 확인 후 병합한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.58.22 PM.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6hGK1/btsFGTzboMx/VYAwCbjKpQqOH5gmn0OkE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6hGK1/btsFGTzboMx/VYAwCbjKpQqOH5gmn0OkE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6hGK1/btsFGTzboMx/VYAwCbjKpQqOH5gmn0OkE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6hGK1%2FbtsFGTzboMx%2FVYAwCbjKpQqOH5gmn0OkE1%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;411&quot; height=&quot;115&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.58.22 PM.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.59.13 PM.png&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FNVVV/btsFD4bdtVZ/0sHtKNGkz7mimuDQnc8Plk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FNVVV/btsFD4bdtVZ/0sHtKNGkz7mimuDQnc8Plk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FNVVV/btsFD4bdtVZ/0sHtKNGkz7mimuDQnc8Plk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFNVVV%2FbtsFD4bdtVZ%2F0sHtKNGkz7mimuDQnc8Plk%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;516&quot; height=&quot;696&quot; data-filename=&quot;Screen Shot 2024-03-09 at 2.59.13 PM.png&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.01.28 PM.png&quot; data-origin-width=&quot;2174&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLstDR/btsFEvzxEUz/HgRxE892mYrpJ4OyCtP0wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLstDR/btsFEvzxEUz/HgRxE892mYrpJ4OyCtP0wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLstDR/btsFEvzxEUz/HgRxE892mYrpJ4OyCtP0wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLstDR%2FbtsFEvzxEUz%2FHgRxE892mYrpJ4OyCtP0wK%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;591&quot; height=&quot;486&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.01.28 PM.png&quot; data-origin-width=&quot;2174&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.01.39 PM.png&quot; data-origin-width=&quot;2216&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AevIr/btsFD43hGMJ/Syk7qcUPFrvVGp1jylrAgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AevIr/btsFD43hGMJ/Syk7qcUPFrvVGp1jylrAgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AevIr/btsFD43hGMJ/Syk7qcUPFrvVGp1jylrAgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAevIr%2FbtsFD43hGMJ%2FSyk7qcUPFrvVGp1jylrAgK%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;548&quot; height=&quot;854&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.01.39 PM.png&quot; data-origin-width=&quot;2216&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.01.55 PM.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;1460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1SiUN/btsFFnO0qSw/HWkrxrIZZwCNHKo8PBQauk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1SiUN/btsFFnO0qSw/HWkrxrIZZwCNHKo8PBQauk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1SiUN/btsFFnO0qSw/HWkrxrIZZwCNHKo8PBQauk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1SiUN%2FbtsFFnO0qSw%2FHWkrxrIZZwCNHKo8PBQauk%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;584&quot; height=&quot;1460&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.01.55 PM.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;1460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fullrequest와 issue가 닫히고 성공적으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main에 병합된걸 볼 수 있다.&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;organization 에 develop 브랜치를 만들기위해 원본 저장소를 clone하고 다음과 같은명령어를 수행했다.&lt;/p&gt;
&lt;pre id=&quot;code_1709965098245&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch develop

git checkout develop

git push origin develop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.04.21 PM.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y2XP4/btsFFljnipp/SoylBT174sBVHk4kEmFoC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y2XP4/btsFFljnipp/SoylBT174sBVHk4kEmFoC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y2XP4/btsFFljnipp/SoylBT174sBVHk4kEmFoC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy2XP4%2FbtsFFljnipp%2FSoylBT174sBVHk4kEmFoC0%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;1104&quot; height=&quot;148&quot; data-filename=&quot;Screen Shot 2024-03-09 at 3.04.21 PM.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 fork한 레포지토리의 작업 브랜치를 삭제하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/82</guid>
      <comments>https://dyd1310.tistory.com/82#entry82comment</comments>
      <pubDate>Sat, 9 Mar 2024 15:05:31 +0900</pubDate>
    </item>
    <item>
      <title>Swift-UI 소개</title>
      <link>https://dyd1310.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;swift 기반 UI 플레임워크&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;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본기 다지기 예제&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1709867836761&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;GitHub - bjpublic/SweetSwiftUIExamples: 스윗한 SwiftUI 기본기 다지기&quot; data-og-description=&quot;스윗한 SwiftUI 기본기 다지기. Contribute to bjpublic/SweetSwiftUIExamples development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/bjpublic/SweetSwiftUIExamples&quot; data-og-url=&quot;https://github.com/bjpublic/SweetSwiftUIExamples&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mICW4/hyVxy0fePc/jjeijLTgdvkf8hUTEL1Mak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/bjpublic/SweetSwiftUIExamples&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/bjpublic/SweetSwiftUIExamples&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mICW4/hyVxy0fePc/jjeijLTgdvkf8hUTEL1Mak/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;GitHub - bjpublic/SweetSwiftUIExamples: 스윗한 SwiftUI 기본기 다지기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스윗한 SwiftUI 기본기 다지기. Contribute to bjpublic/SweetSwiftUIExamples development by creating an account on GitHub.&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;figure id=&quot;og_1709867860804&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bn6Tlo/hyVus1EOBm/k0rgzFgOg9TzaUvHrnXGW1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot; data-og-url=&quot;https://github.com/giftbott/SweetSwiftUIExamples&quot; data-og-source-url=&quot;https://github.com/giftbott/SweetSwiftUIExamples&quot; data-og-host=&quot;github.com&quot; data-og-description=&quot;스윗한 SwiftUI 기본기 다지기. Contribute to giftbott/SweetSwiftUIExamples development by creating an account on GitHub.&quot; data-og-title=&quot;GitHub - giftbott/SweetSwiftUIExamples: 스윗한 SwiftUI 기본기 다지기&quot; data-og-type=&quot;object&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://github.com/giftbott/SweetSwiftUIExamples&quot; data-source-url=&quot;https://github.com/giftbott/SweetSwiftUIExamples&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bn6Tlo/hyVus1EOBm/k0rgzFgOg9TzaUvHrnXGW1/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;GitHub - giftbott/SweetSwiftUIExamples: 스윗한 SwiftUI 기본기 다지기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스윗한 SwiftUI 기본기 다지기. Contribute to giftbott/SweetSwiftUIExamples development by creating an account on GitHub.&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;/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;/p&gt;
&lt;div&gt;
&lt;figure id=&quot;og_1709867855939&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;GitHub - giftbott/SweetSwiftUI: 스윗한 SwiftUI 실전 앱 구현하기&quot; data-og-description=&quot;스윗한 SwiftUI 실전 앱 구현하기. Contribute to giftbott/SweetSwiftUI development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/giftbott/SweetSwiftUI&quot; data-og-url=&quot;https://github.com/giftbott/SweetSwiftUI&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/clcYax/hyVulVNaHL/1lc1UabjKtyQ6eYY8Va1NK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/giftbott/SweetSwiftUI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/giftbott/SweetSwiftUI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/clcYax/hyVulVNaHL/1lc1UabjKtyQ6eYY8Va1NK/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;GitHub - giftbott/SweetSwiftUI: 스윗한 SwiftUI 실전 앱 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스윗한 SwiftUI 실전 앱 구현하기. Contribute to giftbott/SweetSwiftUI development by creating an account on GitHub.&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;figure id=&quot;og_1709867854287&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;GitHub - bjpublic/SweetSwiftUI: 스윗한 SwiftUI 실전 앱 구현하기&quot; data-og-description=&quot;스윗한 SwiftUI 실전 앱 구현하기. Contribute to bjpublic/SweetSwiftUI development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/bjpublic/SweetSwiftUI&quot; data-og-url=&quot;https://github.com/bjpublic/SweetSwiftUI&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bg9PW1/hyVxD1xQFy/u4FJ7qnGW7awBvtlieLkEK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/bjpublic/SweetSwiftUI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/bjpublic/SweetSwiftUI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bg9PW1/hyVxD1xQFy/u4FJ7qnGW7awBvtlieLkEK/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;GitHub - bjpublic/SweetSwiftUI: 스윗한 SwiftUI 실전 앱 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스윗한 SwiftUI 실전 앱 구현하기. Contribute to bjpublic/SweetSwiftUI development by creating an account on GitHub.&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;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;1. 시뮬레이터를 실행시키지 않고 프리뷰를 통해 작업 중인 코드의 결과물을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 선언형 방식(좌측 명령형 , 우측 선언형 방식)&lt;/p&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vS489/btsFDBzf2Cn/8hnRon5AKLSOCcIAhvDsk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vS489/btsFDBzf2Cn/8hnRon5AKLSOCcIAhvDsk1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;504&quot; data-filename=&quot;Screen Shot 2024-03-08 at 12.26.32 PM.png&quot; style=&quot;width: 43.9388%; margin-right: 10px;&quot; data-widthpercent=&quot;44.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vS489/btsFDBzf2Cn/8hnRon5AKLSOCcIAhvDsk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvS489%2FbtsFDBzf2Cn%2F8hnRon5AKLSOCcIAhvDsk1%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;1140&quot; height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E8cSn/btsFFmOMIJW/kh4BoEQ4xBkAIHPpLWIrj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8cSn/btsFFmOMIJW/kh4BoEQ4xBkAIHPpLWIrj0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;276&quot; data-filename=&quot;Screen Shot 2024-03-08 at 12.26.38 PM.png&quot; style=&quot;width: 54.8984%;&quot; data-widthpercent=&quot;55.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8cSn/btsFFmOMIJW/kh4BoEQ4xBkAIHPpLWIrj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8cSn%2FbtsFFmOMIJW%2Fkh4BoEQ4xBkAIHPpLWIrj0%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;780&quot; height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;3. 모든 애플 플랫폼 지원&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 뷰의 조합과 분릴가 간단함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 많은 기능이 자동으로 수행됌 (애니메이션, 화면 전환, 뷰 배치)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 뷰 프로토콜 (자바로 따지면 인터페이스) 를 통해 공통적인 작업이 간단하게 수행됌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 데이터가 변경되는 즉시 UI가 갱신됌.&lt;/p&gt;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/81</guid>
      <comments>https://dyd1310.tistory.com/81#entry81comment</comments>
      <pubDate>Fri, 8 Mar 2024 12:26:08 +0900</pubDate>
    </item>
    <item>
      <title>swift 클래스</title>
      <link>https://dyd1310.tistory.com/80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class Rectangle {&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 data-ke-size=&quot;size16&quot;&gt;var a = Rectangle()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문법을 통해 객체를 생성하지 않는다. 자바와 다르게 new를 사용하지않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 생성할 때 var 를 사용했는데 let을 사용해도 되고 선언했을떄의 차이는 변수, 상수의 차이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스파일의 단위와 클래스 정의 단위가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 하나의 클래스를 여러 소스파일에 작성할 수 있고 여러 클래스를 하나의 소스파일에 작성할 수 있다.&lt;/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;2가지 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 저장 프로퍼티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 계산 프로퍼티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709865293126&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;class Person {
 let thisYear = 2024
 var birthYear = 0
 var age: Int {
 	get{
    	return thisYear - birthYear
   	}
    set{
    	birthYear = thisYear - newValue
    }     	
 }
}&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;해당 예제에서 thisYear과 birthYear은 저장 프로퍼티로 값을 저장하는 역할을 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;age같은경우 newValue에 따라 birthYear을 초기화시켜주는 역할을 하는 계산 프로퍼티이다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-08 at 11.39.59 AM.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3QvUv/btsFCZG0Sar/JoNvTj0d0Mxv1eUslEzPI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3QvUv/btsFCZG0Sar/JoNvTj0d0Mxv1eUslEzPI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3QvUv/btsFCZG0Sar/JoNvTj0d0Mxv1eUslEzPI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3QvUv%2FbtsFCZG0Sar%2FJoNvTj0d0Mxv1eUslEzPI0%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;521&quot; height=&quot;304&quot; data-filename=&quot;Screen Shot 2024-03-08 at 11.39.59 AM.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&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;1. set같은경우 생략하여 읽기전용으로 만들수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 원래 set( newValue )인데 set내부에서 newValue를 사용한다면 생략가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. set( newValue )에 newValue말고 다른 이름을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 계산 프로퍼티에는 자료형 추론이 안돼 get이 반환하는 자료형과 같은 자료형을 명시해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. set을 생략하는 경우 get를 안써도 상관없고 return도 생략할 수 있다.(계산프로퍼티에 자료형을 명시하기때문에 가능하다)&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;self 포인터로 객체 자신을 참조할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;func으로 정의할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 멤버? 인스턴스 멤버?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static을 사용하는 경우 타입 멤버,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static이 없는 경우 인스턴스 멤버가 된다.&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;static을 사용하는 타입멤버는 해당 객체에 인스턴스 멤버를 접근할 수 없고&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 data-ke-size=&quot;size16&quot;&gt;저장 프로퍼티같은 경우 willSet 과 didSet으로 저장 프로퍼티의 값 변경 이후 특정 동작을 취하도록 만들수있다.&lt;/p&gt;
&lt;pre id=&quot;code_1709867073833&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Rectangle{
var height = 0 {
	willSet{
    print(&quot;변경예정 : \(newValue)&quot;)
    }
    didSet{
    print(&quot;변경후 : \(oldValue)&quot;)
    }
}
}

var rect = Rectangle()
rect.height = 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-08 at 12.07.24 PM.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AvUEf/btsFB5ub3Xw/meFMRfD13RSnh6M31ueTBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AvUEf/btsFB5ub3Xw/meFMRfD13RSnh6M31ueTBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AvUEf/btsFB5ub3Xw/meFMRfD13RSnh6M31ueTBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAvUEf%2FbtsFB5ub3Xw%2FmeFMRfD13RSnh6M31ueTBK%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;392&quot; height=&quot;116&quot; data-filename=&quot;Screen Shot 2024-03-08 at 12.07.24 PM.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 결과가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로퍼티 늦은 초기화&lt;/p&gt;
&lt;pre id=&quot;code_1709867403019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person {
	var phone = Phone()
}
class Phone{
	var number : String
    init(){
    	print(&quot;객체생성&quot;)
        number = &quot;010-1234-5678&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 코드가 있을때&amp;nbsp; Person 객체를 생성하면 Phone 객체가 함께 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 lazy 키워드를 사용하면 Person객체에서 Phone 프로퍼티를 사용하는 시점에 Phone 객체가 생성되도록 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709867527437&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person{
	lazy var phone = Phone()
}
let john = Person()
john.phone&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/80</guid>
      <comments>https://dyd1310.tistory.com/80#entry80comment</comments>
      <pubDate>Fri, 8 Mar 2024 12:12:11 +0900</pubDate>
    </item>
    <item>
      <title>swift 기본 코드 작성 방법</title>
      <link>https://dyd1310.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 프레임 워크들만 import를 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 다른 소스 코드같은경우 include/import를 하지 않는다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 변수는 var를 사용하고 타입 추론이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상수같은 경우 let을 사용한다.&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;val i = 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 val:Int 로 변수 추론을 사용하지않고 선언할 수 있다.&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 data-ke-size=&quot;size16&quot;&gt;이미 타입이 정해진 변수에 다른 타입으로 변경하는 경우 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 타입과 연산하여도 에러가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동초기화는 없고 초기화전 사용하면 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이항 연산자와 단항 연산자가 있다.&lt;/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;단항연산자는 -i 를 할때 부호를 반대로 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 이항 연산에서 1+2 와 1 + 2 는 가능하지만 1 +2 는 불가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;== 값이 같은지&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;nil 연산자 ??가 있다&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;nil 란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단은 자바 optional&amp;lt;T&amp;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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-08 at 11.00.05 AM.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mpT6e/btsFAwswWee/Ck0x5bgMJosPJyOiWiGfJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mpT6e/btsFAwswWee/Ck0x5bgMJosPJyOiWiGfJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mpT6e/btsFAwswWee/Ck0x5bgMJosPJyOiWiGfJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmpT6e%2FbtsFAwswWee%2FCk0x5bgMJosPJyOiWiGfJK%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;614&quot; height=&quot;326&quot; data-filename=&quot;Screen Shot 2024-03-08 at 11.00.05 AM.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int 와 uint의 차이는 정수와 자연수차이이고 int와 uint는 비트에 따라 Int8 Int16 Int32 Int64로 나뉜다.&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 data-ke-size=&quot;size16&quot;&gt;타입 변환에 실패하는 경우 nil을 반환한다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-08 at 11.16.00 AM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SfKGe/btsFCwryVi8/YimfnzVTszKKl2NoG8OAL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SfKGe/btsFCwryVi8/YimfnzVTszKKl2NoG8OAL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SfKGe/btsFCwryVi8/YimfnzVTszKKl2NoG8OAL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSfKGe%2FbtsFCwryVi8%2FYimfnzVTszKKl2NoG8OAL0%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;618&quot; height=&quot;233&quot; data-filename=&quot;Screen Shot 2024-03-08 at 11.16.00 AM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입선언과 다른 타입의 값을 대입할 경우 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜덤함수의 경우 arc4random이 있는데 반환형이 UInt32 임을 주의해야한다.&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;타입정보를 확인하기 위해 type(of: 변수) 를 사용할 수 있다.&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;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/79</guid>
      <comments>https://dyd1310.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 8 Mar 2024 11:24:05 +0900</pubDate>
    </item>
    <item>
      <title>swift 개발환경</title>
      <link>https://dyd1310.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x code - swift와 sdk를 포함하고있음.&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;object C vs swift (좌 : object c , 우 : swift )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIELeI/btsFBMBzuWo/XDvhYv7mfKuvWrK3Aul1R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIELeI/btsFBMBzuWo/XDvhYv7mfKuvWrK3Aul1R1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;416&quot; data-filename=&quot;Screen Shot 2024-03-08 at 9.44.39 AM.png&quot; style=&quot;width: 48.8171%; margin-right: 10px;&quot; data-widthpercent=&quot;49.39&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIELeI/btsFBMBzuWo/XDvhYv7mfKuvWrK3Aul1R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIELeI%2FbtsFBMBzuWo%2FXDvhYv7mfKuvWrK3Aul1R1%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;814&quot; height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTTrq/btsFAERpeid/pEbjsB7Yuvvb2OiGNuNS60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTTrq/btsFAERpeid/pEbjsB7Yuvvb2OiGNuNS60/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;404&quot; data-filename=&quot;Screen Shot 2024-03-08 at 9.44.43 AM.png&quot; style=&quot;width: 50.0201%;&quot; data-widthpercent=&quot;50.61&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTTrq/btsFAERpeid/pEbjsB7Yuvvb2OiGNuNS60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTTrq%2FbtsFAERpeid%2FpEbjsB7Yuvvb2OiGNuNS60%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;810&quot; height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;swift는 4가지 환경으로 작업할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-08 at 9.45.27 AM.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blWGdx/btsFCZGYHMc/QVQl1VlncaHo6RURCIyoa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blWGdx/btsFCZGYHMc/QVQl1VlncaHo6RURCIyoa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blWGdx/btsFCZGYHMc/QVQl1VlncaHo6RURCIyoa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblWGdx%2FbtsFCZGYHMc%2FQVQl1VlncaHo6RURCIyoa1%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;427&quot; height=&quot;460&quot; data-filename=&quot;Screen Shot 2024-03-08 at 9.45.27 AM.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/78</guid>
      <comments>https://dyd1310.tistory.com/78#entry78comment</comments>
      <pubDate>Fri, 8 Mar 2024 10:46:09 +0900</pubDate>
    </item>
    <item>
      <title>swift 레퍼런스</title>
      <link>https://dyd1310.tistory.com/77</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스윗한 SwiftUI, 이봉원, 비제이퍼블릭, 2020&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- (핵심만 골라 배우는) SwiftUI 기반의 iOS 프로그래밍(개정증보판), 닐 스미스 지음, 황반석 옮김, Jpub, 2023&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;figure id=&quot;og_1709857358880&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;| T아카데미 온라인강의&quot; data-og-description=&quot; &quot; data-og-host=&quot;tacademy.skplanet.com&quot; data-og-source-url=&quot;https://tacademy.skplanet.com/live/player/listCategory.action&quot; data-og-url=&quot;https://tacademy.skplanet.com/live/player/listCategory.action&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DZTAy/hyVupDRwSF/ylfYgwsOYdMUMzsDfGjl9K/img.jpg?width=440&amp;amp;height=506&amp;amp;face=0_0_440_506,https://scrap.kakaocdn.net/dn/WYWeH/hyVxrUjEZA/gboiQvPkGKJyLxlEXSK03K/img.jpg?width=220&amp;amp;height=253&amp;amp;face=0_0_220_253,https://scrap.kakaocdn.net/dn/c2LCUt/hyVxvPXd0R/OFBpMIrneVby9dBSQuv950/img.jpg?width=220&amp;amp;height=253&amp;amp;face=0_0_220_253&quot;&gt;&lt;a href=&quot;https://tacademy.skplanet.com/live/player/listCategory.action&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tacademy.skplanet.com/live/player/listCategory.action&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DZTAy/hyVupDRwSF/ylfYgwsOYdMUMzsDfGjl9K/img.jpg?width=440&amp;amp;height=506&amp;amp;face=0_0_440_506,https://scrap.kakaocdn.net/dn/WYWeH/hyVxrUjEZA/gboiQvPkGKJyLxlEXSK03K/img.jpg?width=220&amp;amp;height=253&amp;amp;face=0_0_220_253,https://scrap.kakaocdn.net/dn/c2LCUt/hyVxvPXd0R/OFBpMIrneVby9dBSQuv950/img.jpg?width=220&amp;amp;height=253&amp;amp;face=0_0_220_253');&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;| T아카데미 온라인강의&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tacademy.skplanet.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1709857609970&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Swift 프로그래밍 | T아카데미&quot; data-og-description=&quot;T아카데미 온라인 강의 - Swift 프로그래밍 (총20강) https://tacademy.skplanet.com [과정 소개] &amp;bull; 애플에서 새로운 프로그래밍 언어로 발표한 Swift의 특징과 활용하는 방법을 알아본다. &amp;bull; Swift를 이용해서&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/playlist?list=PL9mhQYIlKEheAkAxX53qlTjjWK93Xd2pf&quot; data-og-url=&quot;http://www.youtube.com/playlist?list=PL9mhQYIlKEheAkAxX53qlTjjWK93Xd2pf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/T0oLh/hyVxxtsQmZ/Gj0B1rctCYvxNjLEJU14AK/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/bvgCFe/hyVxzdKy5o/dVA1Vzj4o1pxkfsOkFJZS1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/MZ0VA/hyVxvJbEVq/8CkofPT3OKlHSkAj7EKOH1/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/oiij8/hyVuokET1O/m7R6Dpg1IOjXM1Rkq1qZA0/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188&quot;&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL9mhQYIlKEheAkAxX53qlTjjWK93Xd2pf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/playlist?list=PL9mhQYIlKEheAkAxX53qlTjjWK93Xd2pf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/T0oLh/hyVxxtsQmZ/Gj0B1rctCYvxNjLEJU14AK/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/bvgCFe/hyVxzdKy5o/dVA1Vzj4o1pxkfsOkFJZS1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/MZ0VA/hyVxvJbEVq/8CkofPT3OKlHSkAj7EKOH1/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/oiij8/hyVuokET1O/m7R6Dpg1IOjXM1Rkq1qZA0/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188');&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;Swift 프로그래밍 | T아카데미&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;T아카데미 온라인 강의 - Swift 프로그래밍 (총20강) https://tacademy.skplanet.com [과정 소개] &amp;bull; 애플에서 새로운 프로그래밍 언어로 발표한 Swift의 특징과 활용하는 방법을 알아본다. &amp;bull; Swift를 이용해서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1709857875369&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CS193p - Developing Apps for iOS&quot; data-og-description=&quot;Welcome to the website of&amp;nbsp;Stanford University's CS193p (Developing Applications for iOS using SwiftUI). You'll find materials from past iterations of the course here, including the most recent quarter: Spring 2023. For more, check out the About page.&quot; data-og-host=&quot;cs193p.sites.stanford.edu&quot; data-og-source-url=&quot;https://cs193p.sites.stanford.edu/&quot; data-og-url=&quot;https://cs193p.sites.stanford.edu/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fFvBG/hyVuf2lbRi/R7BrhsKxwOj5js4lFnuUKk/img.jpg?width=3000&amp;amp;height=1500&amp;amp;face=0_0_3000_1500&quot;&gt;&lt;a href=&quot;https://cs193p.sites.stanford.edu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cs193p.sites.stanford.edu/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fFvBG/hyVuf2lbRi/R7BrhsKxwOj5js4lFnuUKk/img.jpg?width=3000&amp;amp;height=1500&amp;amp;face=0_0_3000_1500');&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;CS193p - Developing Apps for iOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Welcome to the website of&amp;nbsp;Stanford University's CS193p (Developing Applications for iOS using SwiftUI). You'll find materials from past iterations of the course here, including the most recent quarter: Spring 2023. For more, check out the About page.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cs193p.sites.stanford.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1709857875382&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CS193P Spring 2021&quot; data-og-description=&quot; &quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/playlist?list=PLpGHT1n4-mAsxuRxVPv7kj4-dQYoC3VVu&quot; data-og-url=&quot;http://www.youtube.com/playlist?list=PLpGHT1n4-mAsxuRxVPv7kj4-dQYoC3VVu&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blpFvJ/hyVxCnZOVt/ALVFQfwOtEXVxBKnX5ySIK/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OiHnO/hyVum8aXro/izmwuQK5qX42NXpuSoxeK0/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/GgCIb/hyVxopLF9X/gOwdXZWz2rIAA3IvgZqrL1/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/lSDK6/hyVul2u1kC/l7ZZ0V1gKGbsgnoiUZPth1/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188&quot;&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLpGHT1n4-mAsxuRxVPv7kj4-dQYoC3VVu&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/playlist?list=PLpGHT1n4-mAsxuRxVPv7kj4-dQYoC3VVu&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blpFvJ/hyVxCnZOVt/ALVFQfwOtEXVxBKnX5ySIK/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OiHnO/hyVum8aXro/izmwuQK5qX42NXpuSoxeK0/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/GgCIb/hyVxopLF9X/gOwdXZWz2rIAA3IvgZqrL1/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/lSDK6/hyVul2u1kC/l7ZZ0V1gKGbsgnoiUZPth1/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188');&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;CS193P Spring 2021&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1709857903332&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Swift.org&quot; data-og-description=&quot;Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.&quot; data-og-host=&quot;www.swift.org&quot; data-og-source-url=&quot;https://www.swift.org/&quot; data-og-url=&quot;https://swift.org&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bF5YIB/hyVuqisyEC/RKIV0IBYkrwFPDSid6k76k/img.png?width=180&amp;amp;height=180&amp;amp;face=0_0_180_180&quot;&gt;&lt;a href=&quot;https://www.swift.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.swift.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bF5YIB/hyVuqisyEC/RKIV0IBYkrwFPDSid6k76k/img.png?width=180&amp;amp;height=180&amp;amp;face=0_0_180_180');&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;Swift.org&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.swift.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/77</guid>
      <comments>https://dyd1310.tistory.com/77#entry77comment</comments>
      <pubDate>Fri, 8 Mar 2024 09:27:27 +0900</pubDate>
    </item>
    <item>
      <title>쇼핑몰 만들기(설계)</title>
      <link>https://dyd1310.tistory.com/76</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 서비스 선정 배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 스프링부트 , 하이버네이트 학습이 목적 -&amp;gt; 여러 데이터를 다룰 수 있는 주제를 선정 (사용자 주소, 상품 카테고리 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 참고자료가 많은 주제 선정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2 요구사항 정의서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 일반 사용자, 등록 브랜드, 사이트 관리자별 요구사항 정의서 작성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-02-21 at 5.53.30 PM.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4XsTc/btsE95gKpe5/DXH0BDTSVjeKTIwrkPUUBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4XsTc/btsE95gKpe5/DXH0BDTSVjeKTIwrkPUUBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4XsTc/btsE95gKpe5/DXH0BDTSVjeKTIwrkPUUBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4XsTc%2FbtsE95gKpe5%2FDXH0BDTSVjeKTIwrkPUUBk%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;1096&quot; height=&quot;1108&quot; data-filename=&quot;Screen Shot 2024-02-21 at 5.53.30 PM.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구매 회원 페이지 -&amp;gt; 판매 회원 페이지 -&amp;gt; 관리용 페이지 순으로 페이지를 만들 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계에 따라 요구사항 정의서는 추후 수정할 예정이고 각 기능별로 github 이슈에 올려서 git-flow 방식으로 개발할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. ERD, UML (ERD Cloud)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKIRef/btsFygO6Pnk/5KQtXGuBWQjIAFeajCwU4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKIRef/btsFygO6Pnk/5KQtXGuBWQjIAFeajCwU4K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;1178&quot; data-filename=&quot;Screen Shot 2024-03-04 at 11.46.26 PM.png&quot; style=&quot;width: 35.7613%; margin-right: 10px;&quot; data-widthpercent=&quot;36.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKIRef/btsFygO6Pnk/5KQtXGuBWQjIAFeajCwU4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKIRef%2FbtsFygO6Pnk%2F5KQtXGuBWQjIAFeajCwU4K%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;1144&quot; height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5HzQm/btsFydrkA3h/L0X6Xt9U0ti0h2StiH9QxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5HzQm/btsFydrkA3h/L0X6Xt9U0ti0h2StiH9QxK/img.png&quot; data-filename=&quot;Screen Shot 2024-03-04 at 11.45.40 PM.png&quot; data-origin-height=&quot;1442&quot; data-origin-width=&quot;2470&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.0759%;&quot; data-widthpercent=&quot;63.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5HzQm/btsFydrkA3h/L0X6Xt9U0ti0h2StiH9QxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5HzQm%2FbtsFydrkA3h%2FL0X6Xt9U0ti0h2StiH9QxK%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;2470&quot; height=&quot;1442&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UML은 처음 요구사항 정의서를 참고하여 간단하게 설계했다. ERD를 설계할때는 누가 외래키를 가질 것인지, 또 더 많은 비지니스 로직을 수행하기위해 어떠한 테이블이 더필요한지 생각하며 UML를 참고하여 보완했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 테이블의 세부적인 컬럼은 적지않고 관계에 치중해서 작성했다. 다만 각 테이블이 어떤 로직을 위해 필요한지 생각했고 아래에 이를 적었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 요구사항 정의서에는 없지만 적립금, 쿠폰, 개별 환불, 멤버쉽 기능을 추후 구현할 생각으로 환불 내역, 환불 상세, 적립금, 멤버쉽 , 회원 쿠폰 , 쿠폰 테이블을 추가했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;작성 고려사항&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;- 구매 회원, 카카오 회원, 일반회원 테이블&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 구매 회원같은 경우 로그인 방식에 따라 테이블이 필요한 정보가 다를것이라고 판단했다. 소셜 로그인같은 경우 토큰을 보관해야할 것이고 일반 회원같은 경우 따로 비밀번호가 있으니 슈퍼-서브 타입으로 작성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 회원 쿠폰 , 구매회원, 쿠폰&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠폰 테이블에 쿠폰을 발행하고 회원 쿠폰 테이블에서 구매회원Id와 쿠폰id를 보관하여 다대다 관계를 풀어냈다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 멤버쉽, 구매회원&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 테이블을 만들지 않는다면 멤버쉽같은 경우 적립률이나 할인률을 결정할텐데 회원의 멤버쉽이 달라질때 적립률이나 할인률도 같이 수정해야한다. (제3 정규화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 찜, 장바구니, 구매 회원(2번과 동일)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구매 회원 id와 상품 id를 외래키로 각각 추가한다. 구매 회원을 기준으로 조회하면 어떤 상품을 담았는지 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 구매 회원, 기본 배송지&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;- 주문, 주문상품, 상품, 배송&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;- 주문상품, 배송현황, 판매회원&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문상품같은 경우 판매회원과 연결되어 판매회원으로 빠르게 조회할 수 있게 만들었다. 배송지같은 경우 주문에 따라 공통이지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 상품에 따라 책임지는 주체가 달라 주문 상품별로 배송 현황을 가지도록 설계했다. 배송 현황은 송장 번호를 판매자가 등록하면 이를 토대로 배송 조회를 하여 상태를 저장한다. 송장번호는 매 주문 상품마다 업데이트해야하므로 따로 빼서 주문 상품에 대한 부하를 줄였다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 주문 , 결제 , 결제 타입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문별로 결제 내역을 기록한다. 또 결제타입을 구분해 추후 결제 타입별 적립금 , 할인률이 달라져도 수정이 용이하도록 설계했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 주문, 환불내역, 환불상세, 주문 상품&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문 상품은 주문 시점 상품 가격을 저장하고 있다. 한 주문에 대해 환불이 있을수도, 있지 않을수도 있기때문에 환불내역 테이블을 1대1로 연관관계로 생성한다. 있다면 환불을 하면서 생기는 간단한 정보를 환불 내역에 적고 환불 상세는 어떠한 주문 상품에 대해 발생했는지. 환불 내역과 1대다 연관관계를 맺으며 개별 환불이 가능하도록 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 주문 , 적립금&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번의 주문에 대해 적립금 사용과 적립 두가지 기능이 적립 내역에 변화를 줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 핵심은 적립금에 적립 금액과, 유효 금액, 만료일 컬럼을 추가하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적립된 경우 적급 금액과 유효 금액을 기록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용에 경우 회원에 따른 유효 금액의 합으로 사용 가능 여부를 산정하고 사용 가능한 경우 만료일이 가장 빠른 적립금부터 사용 금액이 0이 될때까지 유효금액을 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 상품, 상품 카테고리, 카테고리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 상품은 여러 카테고리를 가질수있고 한 카테고리에는 여러 상품이 있다. 다대다 관계를 상품카테고리를 통해 해결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 카테고리같은 경우 상의 , 아우터 처럼 상위 카테고리와 하위 카테고리를 나뉠 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이경우 A001002 같은 카테고리 코드를 만들어서 like를 이용하여 상위 카테고리에 포함되는 모든 하위 카테고리를 검색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 상품, 상품 정보, 상품이미지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품정보 같은 경우 슈퍼-서브 타입으로 타입에 따라 다른 형식으로 데이터를 보관한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품 이미지 같은 경우 한 상품에 여러장이 들어갈 수 있으니 따로 테이블을 분리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 상품, 주문 상품, 리뷰&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번의 주문으로 여러 상품을 담을 수 있다. 주문상품번호 1개마다 해당 상품의 리뷰를 달 수 있도록 리뷰와 주문 상품을 1대1로 매핑하고 리뷰와 상품은 일대다로 매핑한다.&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;h4 data-ke-size=&quot;size20&quot;&gt;- 문의사항, 상품 문의, 고객 문의, 주문 상품, 판매회원&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문의사항이 운영 관련인지, 상품 관련인지 슈퍼-서브 타입으로 구분한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문의 사항에는 어떤 구매회원의 문의인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품 문의일 경우 구매 회원이 가진 주문상품에 있는 상품 번호와 동일한 상품 문의만 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판매 회원은 여러 테이블을 걸쳐 상품 문의를 확인할 수 있겠지만 조회 성능 향상을 위해 상품 문의와도 관계를 맺는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 문의사항 상세, 문의사항 , 문의사항 이미지&lt;/h4&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 메뉴목록, IA 작성 (whimsical, draw.io)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-05 at 5.07.03 PM.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;1492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqe7C9/btsFyvshMla/XfK3jaJR0eENXFpqGrqiB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqe7C9/btsFyvshMla/XfK3jaJR0eENXFpqGrqiB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqe7C9/btsFyvshMla/XfK3jaJR0eENXFpqGrqiB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqe7C9%2FbtsFyvshMla%2FXfK3jaJR0eENXFpqGrqiB1%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;1720&quot; height=&quot;1492&quot; data-filename=&quot;Screen Shot 2024-03-05 at 5.07.03 PM.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;1492&quot;/&gt;&lt;/span&gt;&lt;/figure&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;메인 페이지에서 분화되는 버튼들은 제품조회(진열된 상품을 클릭했을때의 페이지)를 제외하고 네비게이션 바로 관리할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;span&gt;와이어프레임&lt;/span&gt; &lt;span&gt;작성&lt;/span&gt;(figma)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2024-03-05 at 6.29.46 PM.png&quot; data-origin-width=&quot;2170&quot; data-origin-height=&quot;1342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1A2DF/btsFqZO4bdM/IJBEUgf62MxTKxLzKttBek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1A2DF/btsFqZO4bdM/IJBEUgf62MxTKxLzKttBek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1A2DF/btsFqZO4bdM/IJBEUgf62MxTKxLzKttBek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1A2DF%2FbtsFqZO4bdM%2FIJBEUgf62MxTKxLzKttBek%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;2170&quot; height=&quot;1342&quot; data-filename=&quot;Screen Shot 2024-03-05 at 6.29.46 PM.png&quot; data-origin-width=&quot;2170&quot; data-origin-height=&quot;1342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인페이지 , 로그인, 회원가입, 장바구니, 아이디/비밀번호 찾기 페이지의 와이어프레임을 작성했는데 이번 프로젝트는 api의 이해, 스프링 프레임워크 , jpa 학습이 목적이라 이 부분은 번거로워 생략하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이미 작성한 와이어 프레임까지 기능구현이 완료된다면 그 후의 페이지는 또 다시 작성할 것이다.&lt;/p&gt;</description>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/76</guid>
      <comments>https://dyd1310.tistory.com/76#entry76comment</comments>
      <pubDate>Wed, 21 Feb 2024 17:55:03 +0900</pubDate>
    </item>
    <item>
      <title>프로젝트 설계과정 의문사항 사이트 url</title>
      <link>https://dyd1310.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Q : 데이터베이스 서버와 WAS 서버를 나누는 이유는 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1708431855577&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[서버구축] 단일 서버와 데이터베이스 서버의 분리가 왜 필요할까&quot; data-og-description=&quot;일반적으로 단일 서버로 운영하거나 아니면 데이터베이스 서버를 분리하여 사용하는 경우가 많습니다. 그렇다면 이 둘의 차이점은 무엇이고 언제 그리고 왜 이렇게 사용하는지 알아보려고 하&quot; data-og-host=&quot;webisfree.com&quot; data-og-source-url=&quot;https://webisfree.com/2020-05-07/%5B%EC%84%9C%EB%B2%84%EA%B5%AC%EC%B6%95%5D-%EB%8B%A8%EC%9D%BC-%EC%84%9C%EB%B2%84%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%9C%EB%B2%84%EC%9D%98-%EB%B6%84%EB%A6%AC%EA%B0%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C&quot; data-og-url=&quot;https://webisfree.com/2020-05-07/[서버구축]-단일-서버와-데이터베이스-서버의-분리가-왜-필요할까&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TEyDg/hyVmUiPqIs/Si9niNLs3RWZKAKIrHMw00/img.jpg?width=480&amp;amp;height=230&amp;amp;face=0_0_480_230,https://scrap.kakaocdn.net/dn/bSPsyX/hyVmT5jToh/FALjsykBuMqrjaB7vQSUik/img.jpg?width=480&amp;amp;height=230&amp;amp;face=0_0_480_230,https://scrap.kakaocdn.net/dn/bMUpLt/hyVm04o9tn/bG6EpLKRDxMVIYvbyJkOZk/img.jpg?width=480&amp;amp;height=230&amp;amp;face=0_0_480_230&quot;&gt;&lt;a href=&quot;https://webisfree.com/2020-05-07/%5B%EC%84%9C%EB%B2%84%EA%B5%AC%EC%B6%95%5D-%EB%8B%A8%EC%9D%BC-%EC%84%9C%EB%B2%84%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%9C%EB%B2%84%EC%9D%98-%EB%B6%84%EB%A6%AC%EA%B0%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://webisfree.com/2020-05-07/%5B%EC%84%9C%EB%B2%84%EA%B5%AC%EC%B6%95%5D-%EB%8B%A8%EC%9D%BC-%EC%84%9C%EB%B2%84%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%9C%EB%B2%84%EC%9D%98-%EB%B6%84%EB%A6%AC%EA%B0%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TEyDg/hyVmUiPqIs/Si9niNLs3RWZKAKIrHMw00/img.jpg?width=480&amp;amp;height=230&amp;amp;face=0_0_480_230,https://scrap.kakaocdn.net/dn/bSPsyX/hyVmT5jToh/FALjsykBuMqrjaB7vQSUik/img.jpg?width=480&amp;amp;height=230&amp;amp;face=0_0_480_230,https://scrap.kakaocdn.net/dn/bMUpLt/hyVm04o9tn/bG6EpLKRDxMVIYvbyJkOZk/img.jpg?width=480&amp;amp;height=230&amp;amp;face=0_0_480_230');&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;[서버구축] 단일 서버와 데이터베이스 서버의 분리가 왜 필요할까&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 단일 서버로 운영하거나 아니면 데이터베이스 서버를 분리하여 사용하는 경우가 많습니다. 그렇다면 이 둘의 차이점은 무엇이고 언제 그리고 왜 이렇게 사용하는지 알아보려고 하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;webisfree.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1708431952069&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;서버분리, WEB 서버,WAS 서버, 단일서버, DB서버 분리,웹 서버 분리,DB서버 Replication, Load balancing&quot; data-og-description=&quot;WEB 서버 사용자 HTTP 요청을 받아 HTML 문서와 같은 정적 컨텐츠를 반환하는 SW 엔진 HTTP 프로토콜을 통해 읽힐 수 있는 문서다. 정적 컨텐츠를 서비스하는 SW 로는 다양하고 복잡한 정보 처리에 한&quot; data-og-host=&quot;dotherealthing.tistory.com&quot; data-og-source-url=&quot;https://dotherealthing.tistory.com/19&quot; data-og-url=&quot;https://dotherealthing.tistory.com/19&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e4lIf/hyVmRGrZ5p/LNx0VEi1yXHobRJ7iFkSPk/img.png?width=667&amp;amp;height=310&amp;amp;face=0_0_667_310,https://scrap.kakaocdn.net/dn/s8am3/hyVm4lt3zx/7UNlarUJggiLpC1klc3NQK/img.png?width=667&amp;amp;height=310&amp;amp;face=0_0_667_310,https://scrap.kakaocdn.net/dn/bCzid6/hyVmQOhLwA/c798d2b2KsSzNI90q31x1K/img.png?width=836&amp;amp;height=525&amp;amp;face=0_0_836_525&quot;&gt;&lt;a href=&quot;https://dotherealthing.tistory.com/19&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dotherealthing.tistory.com/19&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e4lIf/hyVmRGrZ5p/LNx0VEi1yXHobRJ7iFkSPk/img.png?width=667&amp;amp;height=310&amp;amp;face=0_0_667_310,https://scrap.kakaocdn.net/dn/s8am3/hyVm4lt3zx/7UNlarUJggiLpC1klc3NQK/img.png?width=667&amp;amp;height=310&amp;amp;face=0_0_667_310,https://scrap.kakaocdn.net/dn/bCzid6/hyVmQOhLwA/c798d2b2KsSzNI90q31x1K/img.png?width=836&amp;amp;height=525&amp;amp;face=0_0_836_525');&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;서버분리, WEB 서버,WAS 서버, 단일서버, DB서버 분리,웹 서버 분리,DB서버 Replication, Load balancing&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WEB 서버 사용자 HTTP 요청을 받아 HTML 문서와 같은 정적 컨텐츠를 반환하는 SW 엔진 HTTP 프로토콜을 통해 읽힐 수 있는 문서다. 정적 컨텐츠를 서비스하는 SW 로는 다양하고 복잡한 정보 처리에 한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dotherealthing.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;Q : 기능적인 면말고 협업차원에서 개발 서버, 테스트 서버, 운영 서버로 나누는 이유는 무엇일까?&lt;/p&gt;
&lt;figure id=&quot;og_1708432103210&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Server] 로컬서버, 개발서버, 스테이징서버, 운영서버 란?&quot; data-og-description=&quot;로컬 서버(Local Server)는 개발자들이 처음으로 실행시키는 서버라고 할 수 잇다.흔히 말하는 http://local:8080 또는 https://localhost:8080 으로 접속하여 우리가 개발하는 화면들을 볼 수 있다.이 로컬 서&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ryucherry/Server-%EB%A1%9C%EC%BB%AC%EC%84%9C%EB%B2%84-%EA%B0%9C%EB%B0%9C%EC%84%9C%EB%B2%84-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%95%EC%84%9C%EB%B2%84-%EC%9A%B4%EC%98%81%EC%84%9C%EB%B2%84-%EB%9E%80&quot; data-og-url=&quot;https://velog.io/@ryucherry/Server-로컬서버-개발서버-스테이징서버-운영서버-란&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yobUr/hyVmTdap9L/MOKmRwwBF9BsyjjZdsFpQk/img.png?width=1051&amp;amp;height=607&amp;amp;face=0_0_1051_607,https://scrap.kakaocdn.net/dn/FOuJN/hyVmXfzLuh/mvG746feS0rOglzlZlFLEK/img.png?width=1051&amp;amp;height=607&amp;amp;face=0_0_1051_607,https://scrap.kakaocdn.net/dn/djSxhd/hyVm3Un8li/deysGBjed6CCtW68SfCZT0/img.png?width=1051&amp;amp;height=607&amp;amp;face=0_0_1051_607&quot;&gt;&lt;a href=&quot;https://velog.io/@ryucherry/Server-%EB%A1%9C%EC%BB%AC%EC%84%9C%EB%B2%84-%EA%B0%9C%EB%B0%9C%EC%84%9C%EB%B2%84-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%95%EC%84%9C%EB%B2%84-%EC%9A%B4%EC%98%81%EC%84%9C%EB%B2%84-%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ryucherry/Server-%EB%A1%9C%EC%BB%AC%EC%84%9C%EB%B2%84-%EA%B0%9C%EB%B0%9C%EC%84%9C%EB%B2%84-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%95%EC%84%9C%EB%B2%84-%EC%9A%B4%EC%98%81%EC%84%9C%EB%B2%84-%EB%9E%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yobUr/hyVmTdap9L/MOKmRwwBF9BsyjjZdsFpQk/img.png?width=1051&amp;amp;height=607&amp;amp;face=0_0_1051_607,https://scrap.kakaocdn.net/dn/FOuJN/hyVmXfzLuh/mvG746feS0rOglzlZlFLEK/img.png?width=1051&amp;amp;height=607&amp;amp;face=0_0_1051_607,https://scrap.kakaocdn.net/dn/djSxhd/hyVm3Un8li/deysGBjed6CCtW68SfCZT0/img.png?width=1051&amp;amp;height=607&amp;amp;face=0_0_1051_607');&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;[Server] 로컬서버, 개발서버, 스테이징서버, 운영서버 란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;로컬 서버(Local Server)는 개발자들이 처음으로 실행시키는 서버라고 할 수 잇다.흔히 말하는 http://local:8080 또는 https://localhost:8080 으로 접속하여 우리가 개발하는 화면들을 볼 수 있다.이 로컬 서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(각 서버별 정의)&lt;/p&gt;
&lt;figure id=&quot;og_1708434463101&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;개발자 머피의 법칙 | 우아한형제들 기술블로그&quot; data-og-description=&quot;{{item.name}} 안녕하세요, 우아한형제들 광고시스템팀의 손권남입니다. 이 글은 기술적인 내용도 아니고 우아한형제들 회사에 관한 이야기도 아닌, 순전히 저의 개인적인 경험을 다룹니다. 매우 &quot; data-og-host=&quot;techblog.woowahan.com&quot; data-og-source-url=&quot;https://techblog.woowahan.com/2645/&quot; data-og-url=&quot;https://techblog.woowahan.com/2645/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g5TLg/hyVmSrOH9t/WJEwBO5RAhDn1xyUJIlxX0/img.jpg?width=1640&amp;amp;height=856&amp;amp;face=0_0_1640_856,https://scrap.kakaocdn.net/dn/2jvKc/hyVm0J3jFn/HS2K0UEVuJ4ZQUZ2UTBXpk/img.jpg?width=1640&amp;amp;height=856&amp;amp;face=0_0_1640_856&quot;&gt;&lt;a href=&quot;https://techblog.woowahan.com/2645/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://techblog.woowahan.com/2645/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g5TLg/hyVmSrOH9t/WJEwBO5RAhDn1xyUJIlxX0/img.jpg?width=1640&amp;amp;height=856&amp;amp;face=0_0_1640_856,https://scrap.kakaocdn.net/dn/2jvKc/hyVm0J3jFn/HS2K0UEVuJ4ZQUZ2UTBXpk/img.jpg?width=1640&amp;amp;height=856&amp;amp;face=0_0_1640_856');&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;개발자 머피의 법칙 | 우아한형제들 기술블로그&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;{{item.name}} 안녕하세요, 우아한형제들 광고시스템팀의 손권남입니다. 이 글은 기술적인 내용도 아니고 우아한형제들 회사에 관한 이야기도 아닌, 순전히 저의 개인적인 경험을 다룹니다. 매우&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;techblog.woowahan.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발서버에서 운영서버 DB를 변경하는 DDL를 날려 서비스 운영에 차질이 생길수도 있고 운영서버 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;Q: 엔티티 설계시 카테고리 같은 경우 대분류, 소분류가 있는데 각각 테이블을 만들어야하는 것일까?&lt;/p&gt;
&lt;figure id=&quot;og_1708535833988&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JPA] 자기 자신과 연관관계를 갖는 엔티티&quot; data-og-description=&quot;[JPA] 자기 자신과 연관관계를 갖는 엔티티&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@hwan2da/JPA-%EC%9E%90%EA%B8%B0-%EC%9E%90%EC%8B%A0%EA%B3%BC-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EB%A5%BC-%EA%B0%96%EB%8A%94-%EC%97%94%ED%8B%B0%ED%8B%B0&quot; data-og-url=&quot;https://velog.io/@hwan2da/JPA-자기-자신과-연관관계를-갖는-엔티티&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bO4XMo/hyVmYeSZ7w/ZKWg2YHiMLPJOSQ3GXlpF0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@hwan2da/JPA-%EC%9E%90%EA%B8%B0-%EC%9E%90%EC%8B%A0%EA%B3%BC-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EB%A5%BC-%EA%B0%96%EB%8A%94-%EC%97%94%ED%8B%B0%ED%8B%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@hwan2da/JPA-%EC%9E%90%EA%B8%B0-%EC%9E%90%EC%8B%A0%EA%B3%BC-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EB%A5%BC-%EA%B0%96%EB%8A%94-%EC%97%94%ED%8B%B0%ED%8B%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bO4XMo/hyVmYeSZ7w/ZKWg2YHiMLPJOSQ3GXlpF0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&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;[JPA] 자기 자신과 연관관계를 갖는 엔티티&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[JPA] 자기 자신과 연관관계를 갖는 엔티티&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1708535998213&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;엔티티 조회 질문 - 인프런&quot; data-og-description=&quot;강사님, 안녕하세요.카테고리와 같은 제가 개발 중인 엔티티 조회탐색에 관해 질문이 있습니다.현재, 저는 쇼핑몰처럼 카테고리와 제품으로 나누어진 구조의 엔티티를 개발하고 있습니다.다음&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/45866/%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%A1%B0%ED%9A%8C-%EC%A7%88%EB%AC%B8&quot; data-og-url=&quot;https://www.inflearn.com/questions/45866/%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%A1%B0%ED%9A%8C-%EC%A7%88%EB%AC%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gBx4A/hyVqkm3Viy/6KPg2CVKKDz5XAbxa5X0ok/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jujJm/hyVqj9wIe8/6nu51AWECtfPSTBkpnSgyK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jcSGA/hyVqiitKmH/wDcmqFHS9xvuLW7ExT83Bk/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/45866/%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%A1%B0%ED%9A%8C-%EC%A7%88%EB%AC%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/questions/45866/%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%A1%B0%ED%9A%8C-%EC%A7%88%EB%AC%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gBx4A/hyVqkm3Viy/6KPg2CVKKDz5XAbxa5X0ok/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jujJm/hyVqj9wIe8/6nu51AWECtfPSTBkpnSgyK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jcSGA/hyVqiitKmH/wDcmqFHS9xvuLW7ExT83Bk/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500');&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;엔티티 조회 질문 - 인프런&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;강사님, 안녕하세요.카테고리와 같은 제가 개발 중인 엔티티 조회탐색에 관해 질문이 있습니다.현재, 저는 쇼핑몰처럼 카테고리와 제품으로 나누어진 구조의 엔티티를 개발하고 있습니다.다음&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기 자신과 연관관계를 맺어 조회할 수 있고 depth별 코드를 만들어 like를 통해 한번에 검색하는방법을 활용할 수 있다.&lt;/p&gt;</description>
      <category>ㅓ</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/75</guid>
      <comments>https://dyd1310.tistory.com/75#entry75comment</comments>
      <pubDate>Tue, 20 Feb 2024 23:04:31 +0900</pubDate>
    </item>
    <item>
      <title>공부 계획</title>
      <link>https://dyd1310.tistory.com/74</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;p data-ke-size=&quot;size16&quot;&gt;제대로된 프로젝트 기획하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로젝트 계획&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 기능 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 유지보수, 리팩토링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 성능 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로젝트 계획&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 운영 서버, 테스트 서버, 개발 서버 나누기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버별 세팅&lt;/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;2. 기능 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스프링부트 , 하이버네이트를 사용하여 웹서버 구축 (모노리틱 구조로 시작해서 MSA로 어떻게 바꿀 수 있을까?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클린코드를 위한 규칙 정리(코딩 컨벤션)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체지향 프로그래밍 , DDD&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;3. 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- github action, 젠킨스, 도커를 이용하여 운영서버에 배포 자동화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로깅, 모니터링, 로깅&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 테스트, 유지보수, 리팩토링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 운영하면서 생길수 있는 경우 테스트해보기(다중 요청, 여러 클라이언트가 접속하는 상황을 어떻게 테스트 할것인가?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이러한 오류를 유지보수, 리팩토링&lt;/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;5. 성능 개선&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;</description>
      <category>기타</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/74</guid>
      <comments>https://dyd1310.tistory.com/74#entry74comment</comments>
      <pubDate>Tue, 20 Feb 2024 19:13:23 +0900</pubDate>
    </item>
    <item>
      <title>(수치해석학) 행렬 계산 최적화</title>
      <link>https://dyd1310.tistory.com/73</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우스 소거법 룰&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;interchange two equation (행 변환)&lt;/li&gt;
&lt;li&gt;multiply a nonzero contant a to a equation (0이 아닌행 곱하기)&lt;/li&gt;
&lt;li&gt;addtion of a nonzero multiple of one equation to another equation (0이 아닌 행의 곱으로 다른 행 0 만들기)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3가지를 통해 가우스 소거법을 시행할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKxDIy/btsCnIu2vv9/X5JYgkUQp6k6LeOClNo3Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKxDIy/btsCnIu2vv9/X5JYgkUQp6k6LeOClNo3Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKxDIy/btsCnIu2vv9/X5JYgkUQp6k6LeOClNo3Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKxDIy%2FbtsCnIu2vv9%2FX5JYgkUQp6k6LeOClNo3Nk%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;599&quot; height=&quot;468&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전진 소거법과 후진 대입의 반복&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0uYDP/btsCk30Pk8n/kbJthlpgQjXa40KSHZKDK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0uYDP/btsCk30Pk8n/kbJthlpgQjXa40KSHZKDK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0uYDP/btsCk30Pk8n/kbJthlpgQjXa40KSHZKDK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0uYDP%2FbtsCk30Pk8n%2FkbJthlpgQjXa40KSHZKDK0%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;525&quot; height=&quot;203&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1행의 x1배 + 2행의 x2배 + 3행의 x3배의 합.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6oU1Y/btsCnI2VdVc/IzPL1ZtPGMDzz8M8Ymh8Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6oU1Y/btsCnI2VdVc/IzPL1ZtPGMDzz8M8Ymh8Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6oU1Y/btsCnI2VdVc/IzPL1ZtPGMDzz8M8Ymh8Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6oU1Y%2FbtsCnI2VdVc%2FIzPL1ZtPGMDzz8M8Ymh8Pk%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;352&quot; height=&quot;106&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chmSSo/btsCpPNqFKg/V4Pgo1HxwKK6XbhMgT5np1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chmSSo/btsCpPNqFKg/V4Pgo1HxwKK6XbhMgT5np1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chmSSo/btsCpPNqFKg/V4Pgo1HxwKK6XbhMgT5np1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchmSSo%2FbtsCpPNqFKg%2FV4Pgo1HxwKK6XbhMgT5np1%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;194&quot; height=&quot;112&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E(2) - m21*E(1) =&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XR8I8/btsColsMBvm/0k0tOqf6rgpo0wlsuKnD61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XR8I8/btsColsMBvm/0k0tOqf6rgpo0wlsuKnD61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XR8I8/btsColsMBvm/0k0tOqf6rgpo0wlsuKnD61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXR8I8%2FbtsColsMBvm%2F0k0tOqf6rgpo0wlsuKnD61%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;268&quot; height=&quot;54&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AlPqn/btsCo7njWjP/VvTNrXF1Fgn2CRFCyQIwx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AlPqn/btsCo7njWjP/VvTNrXF1Fgn2CRFCyQIwx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AlPqn/btsCo7njWjP/VvTNrXF1Fgn2CRFCyQIwx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAlPqn%2FbtsCo7njWjP%2FVvTNrXF1Fgn2CRFCyQIwx0%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;474&quot; height=&quot;98&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6MV2z/btsCnHwaiO9/8TNvNKeYle5FlO2CnWquf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6MV2z/btsCnHwaiO9/8TNvNKeYle5FlO2CnWquf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6MV2z/btsCnHwaiO9/8TNvNKeYle5FlO2CnWquf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6MV2z%2FbtsCnHwaiO9%2F8TNvNKeYle5FlO2CnWquf0%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;622&quot; height=&quot;84&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후진 대입법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baJZIR/btsCjZEAPhx/MH91julE5ngN5Ky9gjYuV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baJZIR/btsCjZEAPhx/MH91julE5ngN5Ky9gjYuV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baJZIR/btsCjZEAPhx/MH91julE5ngN5Ky9gjYuV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaJZIR%2FbtsCjZEAPhx%2FMH91julE5ngN5Ky9gjYuV1%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;416&quot; height=&quot;310&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 공학적으로 이를 구현하면 O(n^3) 이 나온다. i , j , k 필요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FfW2y/btsCl03Ju44/RJLQSFSvLwDhxxdNeOwRrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FfW2y/btsCl03Ju44/RJLQSFSvLwDhxxdNeOwRrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FfW2y/btsCl03Ju44/RJLQSFSvLwDhxxdNeOwRrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFfW2y%2FbtsCl03Ju44%2FRJLQSFSvLwDhxxdNeOwRrk%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;492&quot; height=&quot;655&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용해보기&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOH1Wx/btsCoGKdjQb/HQHlG4SkL3nkgK5MxpAoGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOH1Wx/btsCoGKdjQb/HQHlG4SkL3nkgK5MxpAoGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOH1Wx/btsCoGKdjQb/HQHlG4SkL3nkgK5MxpAoGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOH1Wx%2FbtsCoGKdjQb%2FHQHlG4SkL3nkgK5MxpAoGk%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;626&quot; height=&quot;375&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;partial pivoting&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방정식을 풀기위해 우린 10진법 컴퓨터로 부동 소수점을 사용해서 방정식을 푼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/moUco/btsCnIolaFQ/6DVUmqBYw0QMjn0gPnLQh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/moUco/btsCnIolaFQ/6DVUmqBYw0QMjn0gPnLQh0/img.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;198&quot; data-is-animation=&quot;false&quot; style=&quot;width: 38.6231%; margin-right: 10px;&quot; data-widthpercent=&quot;39.08&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/moUco/btsCnIolaFQ/6DVUmqBYw0QMjn0gPnLQh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmoUco%2FbtsCnIolaFQ%2F6DVUmqBYw0QMjn0gPnLQh0%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;418&quot; height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nGlbo/btsCpNhK9o3/H2QKzGRso6zSQwTjVBgwe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nGlbo/btsCpNhK9o3/H2QKzGRso6zSQwTjVBgwe0/img.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;206&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.2141%;&quot; data-widthpercent=&quot;60.92&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nGlbo/btsCpNhK9o3/H2QKzGRso6zSQwTjVBgwe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnGlbo%2FbtsCpNhK9o3%2FH2QKzGRso6zSQwTjVBgwe0%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;678&quot; height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&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;문제는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvSg8F/btsCpdOyWNX/xS9aVjM9cDwxKjKofR1iO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvSg8F/btsCpdOyWNX/xS9aVjM9cDwxKjKofR1iO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvSg8F/btsCpdOyWNX/xS9aVjM9cDwxKjKofR1iO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvSg8F%2FbtsCpdOyWNX%2FxS9aVjM9cDwxKjKofR1iO0%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;571&quot; height=&quot;454&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대각성분이 계산상은 0이어야하는데 부동소수점 방식의 한계로 완전한 0이 아닐 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 rounding error를 방지해야한다. 단순한 방법은 2행과 3행을 바꿔 전진 소거를 진행하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 m32 가 0.0001/1.667이 나오고 원래 나와야할 해에서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVvdC2/btsCnL6kUhe/ecOPkKxa60AnXqbDTkzVV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVvdC2/btsCnL6kUhe/ecOPkKxa60AnXqbDTkzVV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVvdC2/btsCnL6kUhe/ecOPkKxa60AnXqbDTkzVV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVvdC2%2FbtsCnL6kUhe%2FecOPkKxa60AnXqbDTkzVV1%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;670&quot; height=&quot;90&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mczxv/btsCoES8FvJ/7axuMjO3FQjRBK8mC1Raa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mczxv/btsCoES8FvJ/7axuMjO3FQjRBK8mC1Raa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mczxv/btsCoES8FvJ/7axuMjO3FQjRBK8mC1Raa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmczxv%2FbtsCoES8FvJ%2F7axuMjO3FQjRBK8mC1Raa1%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;780&quot; height=&quot;88&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 오차가 생기게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식을 수식화 해보자(부분 피벗팅:pivot element로 0과 가까운 계수를 피하는 방법)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bavmw2/btsCoAXylHX/iVjmLKzuDqWbZGKEGSt490/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bavmw2/btsCoAXylHX/iVjmLKzuDqWbZGKEGSt490/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bavmw2/btsCoAXylHX/iVjmLKzuDqWbZGKEGSt490/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbavmw2%2FbtsCoAXylHX%2FiVjmLKzuDqWbZGKEGSt490%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;308&quot; height=&quot;106&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대각 akk 을 k~n까지의 행중 k열의 값이 가장 큰 행과 교환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c와 새로운 akk가 같아지도록 만든다. 이때 akk 를 pivot element라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&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;AX = I&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서 3*3행렬 X가 A의 역행렬이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8NxG3/btsCkrne71T/R07CCJEsYdrOeayZmGVDKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8NxG3/btsCkrne71T/R07CCJEsYdrOeayZmGVDKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8NxG3/btsCkrne71T/R07CCJEsYdrOeayZmGVDKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8NxG3%2FbtsCkrne71T%2FR07CCJEsYdrOeayZmGVDKK%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;648&quot; height=&quot;144&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 식에서 I를 1개의 열 씩 나눈다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MELly/btsCjVoGgnh/3ViVXQmPlg6kT7oJKks3l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MELly/btsCjVoGgnh/3ViVXQmPlg6kT7oJKks3l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MELly/btsCjVoGgnh/3ViVXQmPlg6kT7oJKks3l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMELly%2FbtsCjVoGgnh%2F3ViVXQmPlg6kT7oJKks3l0%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;606&quot; height=&quot;144&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QWxU6/btsCktemu6E/vQTjlCsefZ3vPvKqkZmfuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QWxU6/btsCktemu6E/vQTjlCsefZ3vPvKqkZmfuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QWxU6/btsCktemu6E/vQTjlCsefZ3vPvKqkZmfuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQWxU6%2FbtsCktemu6E%2FvQTjlCsefZ3vPvKqkZmfuk%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;444&quot; height=&quot;124&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 3*3 결과 행렬의 1번째 열행렬은&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmU07/btsCkoYtdEl/nSG5Wep6UZHfGf2SlEM2k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmU07/btsCkoYtdEl/nSG5Wep6UZHfGf2SlEM2k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmU07/btsCkoYtdEl/nSG5Wep6UZHfGf2SlEM2k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmU07%2FbtsCkoYtdEl%2FnSG5Wep6UZHfGf2SlEM2k0%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;478&quot; height=&quot;152&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 식을 만족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ax = [1 0 0]^t&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 결과를 만족하는 벡터 x는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역행렬의 1열을 의미하게 된다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHCM8/btsCpgdo7rg/gv172gOHppbi0vYtgf4ywk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHCM8/btsCpgdo7rg/gv172gOHppbi0vYtgf4ywk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHCM8/btsCpgdo7rg/gv172gOHppbi0vYtgf4ywk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHCM8%2FbtsCpgdo7rg%2Fgv172gOHppbi0vYtgf4ywk%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;470&quot; height=&quot;64&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 만족하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[x.1 , x.2, x.3 ]이 A의 역행렬이 된다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwPJu3/btsClY5YsAp/fjRKCxMWwntfeCXVtnFbdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwPJu3/btsClY5YsAp/fjRKCxMWwntfeCXVtnFbdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwPJu3/btsClY5YsAp/fjRKCxMWwntfeCXVtnFbdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwPJu3%2FbtsClY5YsAp%2FfjRKCxMWwntfeCXVtnFbdk%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;312&quot; height=&quot;152&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[x1 x2 -x3 ;x1 2x2 -2x3 ; -2x1 x2 x3] 행렬 A로 생각하자.&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;A = I이고 여기서 가우스 소거법을 이용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[x1 x2 -x3 ; 0 x2 -x3 ; 0 0 2x3] = [1 0 0 ; -1 1 0 ; 5 -3 1] 를 구한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JeUWd/btsCj3fOJx9/49eh0mB7kgfmxClA6Q8T01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JeUWd/btsCj3fOJx9/49eh0mB7kgfmxClA6Q8T01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JeUWd/btsCj3fOJx9/49eh0mB7kgfmxClA6Q8T01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJeUWd%2FbtsCj3fOJx9%2F49eh0mB7kgfmxClA6Q8T01%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;430&quot; height=&quot;142&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxpyXs/btsCpc9VFAG/HkqEAkPX0rTuhdKREzlTn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxpyXs/btsCpc9VFAG/HkqEAkPX0rTuhdKREzlTn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxpyXs/btsCpc9VFAG/HkqEAkPX0rTuhdKREzlTn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxpyXs%2FbtsCpc9VFAG%2FHkqEAkPX0rTuhdKREzlTn1%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;158&quot; height=&quot;108&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;70&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CSEqH/btsCk9fyLj9/K1Y5Yc8UIPzG6Bpvuz72xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CSEqH/btsCk9fyLj9/K1Y5Yc8UIPzG6Bpvuz72xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CSEqH/btsCk9fyLj9/K1Y5Yc8UIPzG6Bpvuz72xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCSEqH%2FbtsCk9fyLj9%2FK1Y5Yc8UIPzG6Bpvuz72xk%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;70&quot; height=&quot;118&quot; data-origin-width=&quot;70&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두부분을 따로 떼서 본다.(Ax = b꼴로 보자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 식을 만족하는 x는 A의 역행렬의 첫번째 열이 된다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SEg9P/btsCnGRzeB1/PzlG7ve1738GkFlgKKpwU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SEg9P/btsCnGRzeB1/PzlG7ve1738GkFlgKKpwU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SEg9P/btsCnGRzeB1/PzlG7ve1738GkFlgKKpwU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSEg9P%2FbtsCnGRzeB1%2FPzlG7ve1738GkFlgKKpwU1%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;158&quot; height=&quot;108&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;58&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XMW2m/btsCoxfvZ2x/FcKxhLSWeaAEvzp001m4YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XMW2m/btsCoxfvZ2x/FcKxhLSWeaAEvzp001m4YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XMW2m/btsCoxfvZ2x/FcKxhLSWeaAEvzp001m4YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXMW2m%2FbtsCoxfvZ2x%2FFcKxhLSWeaAEvzp001m4YK%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;58&quot; height=&quot;104&quot; data-origin-width=&quot;58&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두부분을 따로 떼서 본다.(Ax = b꼴로 보자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위 식을 만족하는 x는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;A의 역행렬의 두번째 열이 된다.&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;또 기존 A를 I를 만든다면 역행렬이 구해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D5MyZ/btsClaZRim4/bDJGg8akMOcYI4f2kxhUYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D5MyZ/btsClaZRim4/bDJGg8akMOcYI4f2kxhUYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D5MyZ/btsClaZRim4/bDJGg8akMOcYI4f2kxhUYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD5MyZ%2FbtsClaZRim4%2FbDJGg8akMOcYI4f2kxhUYK%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;330&quot; height=&quot;318&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첨가행렬을 이용한 역행렬 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우스 조르단 소거법을 활용한 역행렬 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/agnes0129/203468722&quot;&gt;https://blog.naver.com/agnes0129/203468722&lt;/a&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;기본행렬의 역행렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://angeloyeo.github.io/2021/06/15/elementary_square_matrices.html&quot;&gt;https://angeloyeo.github.io/2021/06/15/elementary_square_matrices.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우스 조르단 소거법을 활용하여 역행렬을 구하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E[A I] = [EA EI] 가 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E가 A^-1라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[I A^-1]가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Operation count&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U는 상 삼각행렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;g를 우항 벡터로 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시그마 공식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/biomath2k/221847659166&quot;&gt;https://m.blog.naver.com/biomath2k/221847659166&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HdKWG/btsCkpJNcP0/1hpKSGf3LjYqgYkWqADua1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HdKWG/btsCkpJNcP0/1hpKSGf3LjYqgYkWqADua1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HdKWG/btsCkpJNcP0/1hpKSGf3LjYqgYkWqADua1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHdKWG%2FbtsCkpJNcP0%2F1hpKSGf3LjYqgYkWqADua1%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;628&quot; height=&quot;306&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step 1에 대해 생각해보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1 2 3; 1 4 4;1 5 6]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2행과 3행에 1행을 빼야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 행의 첫열은 어짜피 0이 되니까 무시하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 행의 2열 3열을 빼줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2^2 의 빼기가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 막빼면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곱하기의 경우 각 행을 뺄때 2행은 1행 요소에 m21을 곱한걸 빼야하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3행은 그 결과에 m31를 곱한걸 빼야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4번의 곱하기가 발생한다.&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;m21을 구하기 위해 a21/a11&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m31을 구하기 위해 a31/a11&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번의 나누기가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step2도 동일한 방식으로 계산할 수 있고 step2를 통해 상 삼각행렬을 얻을수있어 계산이 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 시그마 연산을 통해&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpoRk/btsCnMqD6lI/JK1e2KjzoRgoAfKwbOxKzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpoRk/btsCnMqD6lI/JK1e2KjzoRgoAfKwbOxKzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpoRk/btsCnMqD6lI/JK1e2KjzoRgoAfKwbOxKzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlpoRk%2FbtsCnMqD6lI%2FJK1e2KjzoRgoAfKwbOxKzk%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;670&quot; height=&quot;70&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 이끌어낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시그마 (k-1)^2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시그마 (k-1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulMqX/btsCoC16ebg/82kkbCdpPorKlGeykdUQlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulMqX/btsCoC16ebg/82kkbCdpPorKlGeykdUQlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulMqX/btsCoC16ebg/82kkbCdpPorKlGeykdUQlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FulMqX%2FbtsCoC16ebg%2F82kkbCdpPorKlGeykdUQlk%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;728&quot; height=&quot;176&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더하기 빼기 연산 횟수 AS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곱하기 나누기 연산 횟수 MD&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;결과항 b-&amp;gt;g에 대한 연산 횟수를 계산하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 행렬은 2번의 행빼기 , 각 행에 대한 열빼기로 제곱연산했는데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과같은 경우 행연산만해주면 되니 step1에서 n-1의 연산이 발생&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;곱하기 경우도 각 행을 뺄때 m21 과 m31을 한번씩 곱하면 되니 n-1의 연산 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나누기 같은 경우 행렬 연산에서 m21과 m31을 구하니 결과에선 신경쓸게 없어 0번 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/detubP/btsCk3T4dox/76iLqOoxABuAxMSnYV2kKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/detubP/btsCk3T4dox/76iLqOoxABuAxMSnYV2kKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/detubP/btsCk3T4dox/76iLqOoxABuAxMSnYV2kKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdetubP%2FbtsCk3T4dox%2F76iLqOoxABuAxMSnYV2kKk%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;696&quot; height=&quot;204&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 유도할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 후진 대입법을 생각해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nr21M/btsCoyeoyZ0/XMbckaMsovMVRxhamkKKTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nr21M/btsCoyeoyZ0/XMbckaMsovMVRxhamkKKTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nr21M/btsCoyeoyZ0/XMbckaMsovMVRxhamkKKTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNr21M%2FbtsCoyeoyZ0%2FXMbckaMsovMVRxhamkKKTk%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;668&quot; height=&quot;158&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xn을 구하기 위해 계수 unn을 나눠야해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번의 나누기 발생&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;xn-1을 구하기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;un-1 * xn-1 + un-1n xn = gn-1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;un-1*xn-1 = gn-1 - un-1n*xn 한번의 빼기가 발생 , xn을 곱해야하니 1번의 곱하기 발생&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xn-1&lt;span&gt;&amp;nbsp; &lt;/span&gt;=&lt;span&gt;&amp;nbsp; &lt;/span&gt;gn-1 - un-1n*xn / un-1 , xn-1을 구하기 위해 1번의 나누기가 발생한다.&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;step2도 이렇게 구할 수 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blZ7Hu/btsCpN9TWzZ/k0lafek6Mgx51v606UlKiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blZ7Hu/btsCpN9TWzZ/k0lafek6Mgx51v606UlKiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blZ7Hu/btsCpN9TWzZ/k0lafek6Mgx51v606UlKiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblZ7Hu%2FbtsCpN9TWzZ%2Fk0lafek6Mgx51v606UlKiK%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;582&quot; height=&quot;170&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 유도할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 종합해서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4vgi3/btsCoiiyirP/uyWTu4KDhkKFLbXzpplpRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4vgi3/btsCoiiyirP/uyWTu4KDhkKFLbXzpplpRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4vgi3/btsCoiiyirP/uyWTu4KDhkKFLbXzpplpRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4vgi3%2FbtsCoiiyirP%2FuyWTu4KDhkKFLbXzpplpRK%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;692&quot; height=&quot;322&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 유도할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 왜 중요한가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 A-&amp;gt;U로 변환이 완료된 상태라면 n^2만으로 해를 구할 수 있다.&lt;span&gt;&amp;nbsp;&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;A^-1b 를 구해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A^-1을 안다고 가정할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ax = b&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A^-1Ax = A^-1b&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x = A^-1b&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해 x를 구하면 n^3번의 곱하기가 발생한다. (행렬곱의 cost)&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;U를 구해놓았다면 n^2의 곱하기를 통해 해를 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b가 n*n행렬이라고 가정한다면 A^tb는 n^3으로 풀리고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U를 구해놓은 경우도 n* n^2으로 동일한 계산량으로 풀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjIzSO/btsCow1YwKI/UvIYqK0KxSDe3u0aMIhSH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjIzSO/btsCow1YwKI/UvIYqK0KxSDe3u0aMIhSH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjIzSO/btsCow1YwKI/UvIYqK0KxSDe3u0aMIhSH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjIzSO%2FbtsCow1YwKI%2FUvIYqK0KxSDe3u0aMIhSH1%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;502&quot; height=&quot;118&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNY2WS/btsCo4Yr2AC/OM8KAfKOAEjdMWAp52u3T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNY2WS/btsCo4Yr2AC/OM8KAfKOAEjdMWAp52u3T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNY2WS/btsCo4Yr2AC/OM8KAfKOAEjdMWAp52u3T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNY2WS%2FbtsCo4Yr2AC%2FOM8KAfKOAEjdMWAp52u3T1%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;497&quot; height=&quot;177&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vubf3/btsCnFkSRAE/VTPd67oPXCCu8tKSt8X5NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vubf3/btsCnFkSRAE/VTPd67oPXCCu8tKSt8X5NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vubf3/btsCnFkSRAE/VTPd67oPXCCu8tKSt8X5NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVubf3%2FbtsCnFkSRAE%2FVTPd67oPXCCu8tKSt8X5NK%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;432&quot; height=&quot;112&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWtWSe/btsCoEr215b/MefLoGo1FS6JbJyX6V1KtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWtWSe/btsCoEr215b/MefLoGo1FS6JbJyX6V1KtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWtWSe/btsCoEr215b/MefLoGo1FS6JbJyX6V1KtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWtWSe%2FbtsCoEr215b%2FMefLoGo1FS6JbJyX6V1KtK%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;461&quot; height=&quot;126&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AHWsJ/btsCoDGI1L7/kyOIFZ3uO35v14yzyR9wzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AHWsJ/btsCoDGI1L7/kyOIFZ3uO35v14yzyR9wzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AHWsJ/btsCoDGI1L7/kyOIFZ3uO35v14yzyR9wzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAHWsJ%2FbtsCoDGI1L7%2FkyOIFZ3uO35v14yzyR9wzk%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;474&quot; height=&quot;112&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림으로 이해하는게 더 빠름&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJYkEy/btsCol7mJWi/RePxYBJmkgTU21wnJ5vkok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJYkEy/btsCol7mJWi/RePxYBJmkgTU21wnJ5vkok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJYkEy/btsCol7mJWi/RePxYBJmkgTU21wnJ5vkok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJYkEy%2FbtsCol7mJWi%2FRePxYBJmkgTU21wnJ5vkok%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;625&quot; height=&quot;374&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LU분해&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;해결된 선형 시스템의 계수 행렬은 2개의 삼각행렬로 나타낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우스 소거법의 6.42~6.45과정을 통해 Ux = g 로 나타낼 수 있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XWQ3K/btsCk7vo1Ll/N41SrzdakxKh4SIe6LBkV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XWQ3K/btsCk7vo1Ll/N41SrzdakxKh4SIe6LBkV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XWQ3K/btsCk7vo1Ll/N41SrzdakxKh4SIe6LBkV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXWQ3K%2FbtsCk7vo1Ll%2FN41SrzdakxKh4SIe6LBkV1%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;294&quot; height=&quot;106&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fk5OH/btsCpMiRQYf/zwlLgaXypOnjtmhmzfa0kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fk5OH/btsCpMiRQYf/zwlLgaXypOnjtmhmzfa0kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fk5OH/btsCpMiRQYf/zwlLgaXypOnjtmhmzfa0kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFk5OH%2FbtsCpMiRQYf%2FzwlLgaXypOnjtmhmzfa0kK%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;404&quot; height=&quot;194&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 L은 Multipliers이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y6LdB/btsCksGtiN4/299BJHBbzcE258RfxZQXkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y6LdB/btsCksGtiN4/299BJHBbzcE258RfxZQXkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y6LdB/btsCksGtiN4/299BJHBbzcE258RfxZQXkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY6LdB%2FbtsCksGtiN4%2F299BJHBbzcE258RfxZQXkk%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;400&quot; height=&quot;226&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LU = A&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1행을 살펴보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;u11&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m21u11&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m31u11&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;hellip;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 되는걸 알 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해보면 U를 만들때 m을 a11에 곱해서 substrct했던걸 생각하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m21u11 = a21&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m31u11 = a31&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LU분해를 실제 적용해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NB7ve/btsCpLK1j8p/bNWka2aKBG68gwn7jE28P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NB7ve/btsCpLK1j8p/bNWka2aKBG68gwn7jE28P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NB7ve/btsCpLK1j8p/bNWka2aKBG68gwn7jE28P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNB7ve%2FbtsCpLK1j8p%2FbNWka2aKBG68gwn7jE28P0%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;390&quot; height=&quot;176&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfD1jF/btsClX61Zav/kDe1MEraxg5tuqj8KkMV60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfD1jF/btsClX61Zav/kDe1MEraxg5tuqj8KkMV60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfD1jF/btsClX61Zav/kDe1MEraxg5tuqj8KkMV60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfD1jF%2FbtsClX61Zav%2FkDe1MEraxg5tuqj8KkMV60%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;690&quot; height=&quot;226&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p7jyz/btsCovILo7p/1RikKJP8mafJRT7y4qXTd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p7jyz/btsCovILo7p/1RikKJP8mafJRT7y4qXTd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p7jyz/btsCovILo7p/1RikKJP8mafJRT7y4qXTd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp7jyz%2FbtsCovILo7p%2F1RikKJP8mafJRT7y4qXTd0%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;266&quot; height=&quot;60&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L에서 a1부터 대입하여 g를 빠르게 구할 수 있다. (b-&amp;gt;g 로 변환 )&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HTB17/btsCo5C3Phr/oB2wrQbkDE3gv7Qs1o9Yi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HTB17/btsCo5C3Phr/oB2wrQbkDE3gv7Qs1o9Yi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HTB17/btsCo5C3Phr/oB2wrQbkDE3gv7Qs1o9Yi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHTB17%2FbtsCo5C3Phr%2FoB2wrQbkDE3gv7Qs1o9Yi0%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;450&quot; height=&quot;132&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pPJ2v/btsCjXGMXhF/VEe3V0lChXHBBmIB14uxdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pPJ2v/btsCjXGMXhF/VEe3V0lChXHBBmIB14uxdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pPJ2v/btsCjXGMXhF/VEe3V0lChXHBBmIB14uxdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpPJ2v%2FbtsCjXGMXhF%2FVEe3V0lChXHBBmIB14uxdk%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;254&quot; height=&quot;78&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ux = g (g-&amp;gt;x로 변환)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 항부터 대입하여 x를 빠르게 구할수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pt0pI/btsCpAiu1tn/bw8jILzJ0kJa9LVv65HWYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pt0pI/btsCpAiu1tn/bw8jILzJ0kJa9LVv65HWYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pt0pI/btsCpAiu1tn/bw8jILzJ0kJa9LVv65HWYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPt0pI%2FbtsCpAiu1tn%2Fbw8jILzJ0kJa9LVv65HWYK%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;582&quot; height=&quot;170&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qOCpd/btsCk9NopCI/GzGEppZlS901sRfmicF3sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qOCpd/btsCk9NopCI/GzGEppZlS901sRfmicF3sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qOCpd/btsCk9NopCI/GzGEppZlS901sRfmicF3sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqOCpd%2FbtsCk9NopCI%2FGzGEppZlS901sRfmicF3sK%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;252&quot; height=&quot;76&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compact variannts of gaussian elimination (콤팩트 변형)&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;LU분해를 공식화 하자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IffNk/btsCnLebRIG/3fkBUAv8chSY0PaxBGeL2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IffNk/btsCnLebRIG/3fkBUAv8chSY0PaxBGeL2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IffNk/btsCnLebRIG/3fkBUAv8chSY0PaxBGeL2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIffNk%2FbtsCnLebRIG%2F3fkBUAv8chSY0PaxBGeL2k%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;579&quot; height=&quot;102&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&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;ex) a11 = 1*u11 + 0*0 + 0*0&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj8KEV/btsCoCVnPTL/gaQkEjVptF2Je1GkTO3lk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj8KEV/btsCoCVnPTL/gaQkEjVptF2Je1GkTO3lk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj8KEV/btsCoCVnPTL/gaQkEjVptF2Je1GkTO3lk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj8KEV%2FbtsCoCVnPTL%2FgaQkEjVptF2Je1GkTO3lk1%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;524&quot; height=&quot;234&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 doolittle&amp;rsquo;s method (두리틀 방식)이라고 한다. (LU분해하는 다른 방법은 가우스 소거법)&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;두리틀 방식과 LU 분해는 연산 속도는 같은데 큰 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 rounding errors 를 줄일 수 있다. (조금의 비용증가가 있음)&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;만약 우리가 single precision(float)으로 값을 저장했다면 double pricision을 사용했을때 오차를 훨신 줄일수 있다. 따라서 double pricision으로 곱하고, 합한 후 single precision으로 값을 반환한다면 single precision을 쓸때보다 더 적은 에러를 가질 수 있게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우스 소거법은 2/3n^3 , 두리틀은 n^2 만큼 오차를 줄일수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또다른 문제 : 메모리는 어떻게 줄일까?&lt;span&gt;&amp;nbsp;&lt;/span&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;mik 가 있다면 i&amp;gt;k 에대해 A(i,k) 에 두고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uij가 있다면 i&amp;lt;=j 에 대해 A(i,j) 에 두면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tridiagonal system&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;계수행렬 A가 특이한 형태를 가질때 가우시안 소거법을 단순하게 만드는게 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ax = f&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u9tmH/btsCnJOcjap/2K4LKuKYrTjyExkkKKeWC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u9tmH/btsCnJOcjap/2K4LKuKYrTjyExkkKKeWC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u9tmH/btsCnJOcjap/2K4LKuKYrTjyExkkKKeWC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu9tmH%2FbtsCnJOcjap%2F2K4LKuKYrTjyExkkKKeWC0%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;584&quot; height=&quot;288&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근사같은 수 분석 분야에서 tridiagonal system이 자주 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실 문제에서도 이걸 쓰는데 우리는 스플라인 보간법이 이러한 예시였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 왜 단순화가 되는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mij가 대부분 0이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 U의 대부분이 0이다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjrcaU/btsCow1YSmg/F5U7xGA7Qr94Iwm6mhxt6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjrcaU/btsCow1YSmg/F5U7xGA7Qr94Iwm6mhxt6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjrcaU/btsCow1YSmg/F5U7xGA7Qr94Iwm6mhxt6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjrcaU%2FbtsCow1YSmg%2FF5U7xGA7Qr94Iwm6mhxt6K%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;673&quot; height=&quot;213&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qauwH/btsCknFfkZf/bSxQLZXywVgTP9XeuFKKyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qauwH/btsCknFfkZf/bSxQLZXywVgTP9XeuFKKyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qauwH/btsCknFfkZf/bSxQLZXywVgTP9XeuFKKyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqauwH%2FbtsCknFfkZf%2FbSxQLZXywVgTP9XeuFKKyK%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;553&quot; height=&quot;123&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&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;a2 = 알파2*베타1 + 1*0 + 0*0 + 0*0 &amp;hellip;..&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Bzo4/btsCo5pvYfl/DbMvhACq5R0qLCKgU1tof1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Bzo4/btsCo5pvYfl/DbMvhACq5R0qLCKgU1tof1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Bzo4/btsCo5pvYfl/DbMvhACq5R0qLCKgU1tof1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Bzo4%2FbtsCo5pvYfl%2FDbMvhACq5R0qLCKgU1tof1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;115&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 LU분해를 해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LUx = f&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lg = f&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ux = g&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;아까와 같이 Lg = f 단계에선 처음 요소부터 대입해서 얻으면되고(L의 첫 항은 1이니까 그냥 바로 얻을 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ux = g 에선 끝 요소부터 대입해서 값을 얻으면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sgmob/btsCovWjgQB/thcSV09NKjFSPkQMcXp6P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sgmob/btsCovWjgQB/thcSV09NKjFSPkQMcXp6P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sgmob/btsCovWjgQB/thcSV09NKjFSPkQMcXp6P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsgmob%2FbtsCovWjgQB%2FthcSV09NKjFSPkQMcXp6P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;81&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bel1ez/btsCovhHVTt/xtXj2rAZpfcJVQyB7Itqj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bel1ez/btsCovhHVTt/xtXj2rAZpfcJVQyB7Itqj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bel1ez/btsCovhHVTt/xtXj2rAZpfcJVQyB7Itqj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbel1ez%2FbtsCovhHVTt%2FxtXj2rAZpfcJVQyB7Itqj1%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;484&quot; height=&quot;170&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특성을 만족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산 횟수 계산하기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5n-4개의 곱하기와 나누기를 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;why?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A 에서 LU로 분해할때 첫행 이후 각 단계마다 1번의 나누기와 곱하기 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 2 2 2&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2(n-1)&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;Lg = f 에서 첫 요소가 g1이고 g1에 multiplier 곱한거 빼서 g2 얻고 &amp;hellip;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 1 1 1 &amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-1&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;Ux = g 에서 맨끝항은 gn에 베타n로 나누고 그 이후는 c와 gn곱을 뺀거에 베타 n-1 나누기 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 2 2 2 &amp;hellip;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2n-1&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;5n-4 개의 곱하기 나누기 연산 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDTOYI/btsCoES8Qb1/6xQtd1PLWgVEk1bOoKqnU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDTOYI/btsCoES8Qb1/6xQtd1PLWgVEk1bOoKqnU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDTOYI/btsCoES8Qb1/6xQtd1PLWgVEk1bOoKqnU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDTOYI%2FbtsCoES8Qb1%2F6xQtd1PLWgVEk1bOoKqnU0%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;276&quot; height=&quot;169&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이부분을 LU로 분해&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz641g/btsCpeNrvqy/DWir8DOKhkrUVc5bZuLaKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz641g/btsCpeNrvqy/DWir8DOKhkrUVc5bZuLaKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz641g/btsCpeNrvqy/DWir8DOKhkrUVc5bZuLaKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz641g%2FbtsCpeNrvqy%2FDWir8DOKhkrUVc5bZuLaKK%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;508&quot; height=&quot;197&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 예제는 피벗팅을 고려하지 않았음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYCn27/btsCj1PRwaG/WhFRvcFxuZlRNfvtKSIu1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYCn27/btsCj1PRwaG/WhFRvcFxuZlRNfvtKSIu1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYCn27/btsCj1PRwaG/WhFRvcFxuZlRNfvtKSIu1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYCn27%2FbtsCj1PRwaG%2FWhFRvcFxuZlRNfvtKSIu1K%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;393&quot; height=&quot;128&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양 끝에 있을땐 a와 c의 절대값보다 더 커야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;j일땐 대각 성분의 절대값이 a와 c의 절대값 합보다 항상 크거나 같아야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 상황에서 대각 성분이 0과 가까워지지 않음.&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;tridiagonal matrix는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분이 0과 가까운 희소행렬에 속하는 특이한 케이스이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 희소행렬에 대해 가우스 소거법의 효율적인 확장이 이루어질 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;</description>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/73</guid>
      <comments>https://dyd1310.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 20 Dec 2023 22:19:09 +0900</pubDate>
    </item>
    <item>
      <title>Spring Login API</title>
      <link>https://dyd1310.tistory.com/70</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-12-03 at 1.29.09 PM.png&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH7E33/btsBmSK9U2G/q7kuUxLXMCZkRsWMLUbZw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH7E33/btsBmSK9U2G/q7kuUxLXMCZkRsWMLUbZw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH7E33/btsBmSK9U2G/q7kuUxLXMCZkRsWMLUbZw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH7E33%2FbtsBmSK9U2G%2Fq7kuUxLXMCZkRsWMLUbZw0%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;1266&quot; height=&quot;812&quot; data-filename=&quot;Screen Shot 2023-12-03 at 1.29.09 PM.png&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA를 위한 로그인 API를 생각하자. Oauth 와 일반적인 로그인에 대해 고려해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oauth같은 경우 정보를 대조해서 DB에 없으면 기본 정보들을 담은채로 회원가입 페이지로 redict 시키고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 페이지에서 부가적인 정보가 완전히 입력되었을때 DB에 회원을 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Oauth 로그인을 할때는 정보를 암호화하고 나의 웹에 키를 바탕으로 JWT token을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 로그인 같은 경우 DB에 있다면 똑같이 정보를 가져오고 암호화한 후 JWT token을 생성한다.&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;id, password 혹은, Oauth를 통해 회원 DB에 있다면 그 정보를 바탕으로 JWT토큰 생성하고 반환하는 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 id와 패스워드를 로그인 API 에 요청한다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 API는 Access token과 refreshtoken을 json에 담아 응답하고 (JWT token)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 받은 access token을 통해 여러 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;다른 API는 JWT token을 통해 각 SecurityContext에 JWT Authentication Token을 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* JWT에 대해 간략히 설명하면, 유저의 권한과 이름 같은 정보, 토큰 정보 등 여러 정보를 디코딩, 인코딩할 수 있음.&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;처음부터 JWT 토큰이 들어오는 경우, 초기 로그인에서 ID, password가 들어오는 경우.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 경우 AuthenticationProvider에서 JWT, 혹은 2번 과정의&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;AuthenticationToken이 들어오게됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 각각의 AuthenticationProvide를 정의해야함.&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;Authenticationfilter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT 인증, 요청에 대한 헤더값을 검증. AuthenticationManeger 이용&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;AuthenticationManeger&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;AuthenticationProvider&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 data-ke-size=&quot;size16&quot;&gt;스프링 2.7.9 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jdk 11&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;starter-web&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;starter-security&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lombok&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;devtools&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;jwts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jjwt-api&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jjwt-impl&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jjwt-jackson&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;gson - json 다루기위한 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gson&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;dto -validation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;starter-validation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.yml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jwt:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;secretKey:&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;refreshKey:&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;각 키는 32byte 이상.&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;WebConfig - WebMvcConfigurer의 구현체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CORS설정 (호출할 ip)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-12-03 at 2.09.05 PM.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtTRe4/btsBl4kDxzp/sGeAs98OelF0Eio2jJyJrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtTRe4/btsBl4kDxzp/sGeAs98OelF0Eio2jJyJrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtTRe4/btsBl4kDxzp/sGeAs98OelF0Eio2jJyJrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtTRe4%2FbtsBl4kDxzp%2FsGeAs98OelF0Eio2jJyJrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;182&quot; data-filename=&quot;Screen Shot 2023-12-03 at 2.09.05 PM.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SecurityConfig&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1701581024385&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Spring Security&quot; data-og-description=&quot;Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications. Spring Security is a framework that focuses on providing both authentication and authoriz&quot; data-og-host=&quot;spring.io&quot; data-og-source-url=&quot;https://spring.io/projects/spring-security&quot; data-og-url=&quot;https://spring.io/projects/spring-security&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FZvj9/hyUE3nOCVZ/5198h2HEiRNwJKCJIl6nzK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cxQ6PY/hyUIwIDCdW/JiVTXxU22vhmRdVBeO2Km0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://spring.io/projects/spring-security&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spring.io/projects/spring-security&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FZvj9/hyUE3nOCVZ/5198h2HEiRNwJKCJIl6nzK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cxQ6PY/hyUIwIDCdW/JiVTXxU22vhmRdVBeO2Km0/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;Spring Security&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications. Spring Security is a framework that focuses on providing both authentication and authoriz&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;SecurityFilterChain filterChain을 정의&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;&lt;span&gt;-  http 에 대한 설정(권한별로 할수있는 요청 범위 지정, 보안설정 등등)&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;&lt;span&gt;PasswordEncoder 정의&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;&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;AuthenticationManagerConfig&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;&lt;span&gt;provider를 주입받아야함.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-12-03 at 2.28.40 PM.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHOUe8/btsBjFeLlT6/wjnaKS01DcKMPCjPv2l7Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHOUe8/btsBjFeLlT6/wjnaKS01DcKMPCjPv2l7Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHOUe8/btsBjFeLlT6/wjnaKS01DcKMPCjPv2l7Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHOUe8%2FbtsBjFeLlT6%2FwjnaKS01DcKMPCjPv2l7Z0%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;894&quot; height=&quot;218&quot; data-filename=&quot;Screen Shot 2023-12-03 at 2.28.40 PM.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 필터는 인증 처리 방법을 정의한 manager를 사용해야하고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manager는 provider를 사용해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해야할것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답 데이터를 쿠키로 만들어서 리턴하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리플래시 토큰을 DB에서 관리하기(만료되지않았는데 access가 아닌 refresh token을 요청한 경우 둘다 만료시키기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;json 내부 값 암호화&lt;/p&gt;
&lt;figure id=&quot;og_1701582992673&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JWT에서 Refresh Token은 왜 필요한가?&quot; data-og-description=&quot;개인 프로젝트 중 JWT를 사용하는 SimpleTodoList 에서는 회원가입 후 로그인 시 아래처럼 JWT를 발급해준다.이 토큰은 애플리케이션 전반에서 사용자를 인증하는데 사용된다. 기존의 세션과는 달리 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80&quot; data-og-url=&quot;https://velog.io/@park2348190/JWT에서-Refresh-Token은-왜-필요한가&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bxFfeN/hyUEZsaS9J/mfqvEpUQIiS7jHQAvmvq4K/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxFfeN/hyUEZsaS9J/mfqvEpUQIiS7jHQAvmvq4K/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&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;JWT에서 Refresh Token은 왜 필요한가?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개인 프로젝트 중 JWT를 사용하는 SimpleTodoList 에서는 회원가입 후 로그인 시 아래처럼 JWT를 발급해준다.이 토큰은 애플리케이션 전반에서 사용자를 인증하는데 사용된다. 기존의 세션과는 달리&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/70</guid>
      <comments>https://dyd1310.tistory.com/70#entry70comment</comments>
      <pubDate>Sun, 3 Dec 2023 14:59:46 +0900</pubDate>
    </item>
    <item>
      <title>API 학습하기</title>
      <link>https://dyd1310.tistory.com/69</link>
      <description>&lt;figure id=&quot;og_1701577637860&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Fake Store API&quot; data-og-description=&quot;Fake store rest api for your ecommerce or shopping website prototype&quot; data-og-host=&quot;fakestoreapi.com&quot; data-og-source-url=&quot;https://fakestoreapi.com/docs&quot; data-og-url=&quot;https://fakestoreapi.com/fakestoreapi.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://fakestoreapi.com/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fakestoreapi.com/docs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Fake Store API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Fake store rest api for your ecommerce or shopping website prototype&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fakestoreapi.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;products&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /products&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 상품 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /products/1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- id가 1인 상품 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /products?limit=5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 5건의 상품 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /products?sort=desc&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내림차순 정렬 후 모든 상품 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;GET&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;/products?sort=desc&amp;amp;limit=5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내림차순 정렬후 5가지 상품 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /products/categories&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 카테고리 분류를 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /products/category/A&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A카테고리의 모든 상품 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST /products&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- body: name , price, image, category&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상품 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PUT &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/products/7&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- body: name , price, image, category&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 7번 상품 업데이트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE &amp;nbsp;/products/6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 6번 상품 삭제&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;User&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /users&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /users/1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /users/limit=5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET /users?sort=desc&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST /users&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- body: name , price, image, category&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PUT&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/users/7&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; body: name , price, image, category&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DELETE &amp;nbsp;/users/6&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/69</guid>
      <comments>https://dyd1310.tistory.com/69#entry69comment</comments>
      <pubDate>Sun, 3 Dec 2023 13:27:56 +0900</pubDate>
    </item>
    <item>
      <title>카카오 로그인 api</title>
      <link>https://dyd1310.tistory.com/68</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 참고하면 좋은 글&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1701574540290&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Access Token의 문제점과 Refresh Token&quot; data-og-description=&quot;Access Token의 문제점 사용자의 잦은 로그아웃 경험 현재 달록에서는 Refresh Token을 사용중이지 않다. Access Token 만을 사용하여 사용자를 인증한다. 현재 달록의 Access Token 유효 기한은 24시간 즉, 하&quot; data-og-host=&quot;hudi.blog&quot; data-og-source-url=&quot;https://hudi.blog/refresh-token/&quot; data-og-url=&quot;https://hudi.blog/refresh-token/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbJaPZ/hyUE9hfhmq/ZUQ8vCm51Tmopil40QKBZk/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400&quot;&gt;&lt;a href=&quot;https://hudi.blog/refresh-token/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hudi.blog/refresh-token/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbJaPZ/hyUE9hfhmq/ZUQ8vCm51Tmopil40QKBZk/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400');&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;Access Token의 문제점과 Refresh Token&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Access Token의 문제점 사용자의 잦은 로그아웃 경험 현재 달록에서는 Refresh Token을 사용중이지 않다. Access Token 만을 사용하여 사용자를 인증한다. 현재 달록의 Access Token 유효 기한은 24시간 즉, 하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hudi.blog&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이트 도메인&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span&gt; : &lt;/span&gt;http://localhost:8000&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;redirect URI : http://localhost:8080/kakao/login/callback&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실험 도구&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1701571115517&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;포스트맨(Postman) 사용법과&amp;nbsp;API&amp;nbsp;실행해 보기&quot; data-og-description=&quot;포스트맨의 사용방법과 이를 이용하여 API를 실행하여 테스트 하는 방법에 대해 소개한다. API에 요청을 보내고 결과를 확인하고 싶을 때, 브라우저에 직접 API URL을 작성하여 결과를 확인할 수 있&quot; data-og-host=&quot;binit.tistory.com&quot; data-og-source-url=&quot;https://binit.tistory.com/17&quot; data-og-url=&quot;https://binit.tistory.com/17&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/w5PdA/hyUIEUbOyC/0G2j797lNxEsF58cKEgTB1/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/DyJ07/hyUIDucO37/PEKlgZiQhv6ug511UDbmq0/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/2vVdW/hyUE6rigUz/Xxglm1KkdhD3B2CBar7Yq0/img.png?width=1342&amp;amp;height=800&amp;amp;face=0_0_1342_800&quot;&gt;&lt;a href=&quot;https://binit.tistory.com/17&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://binit.tistory.com/17&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/w5PdA/hyUIEUbOyC/0G2j797lNxEsF58cKEgTB1/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/DyJ07/hyUIDucO37/PEKlgZiQhv6ug511UDbmq0/img.png?width=800&amp;amp;height=470&amp;amp;face=0_0_800_470,https://scrap.kakaocdn.net/dn/2vVdW/hyUE6rigUz/Xxglm1KkdhD3B2CBar7Yq0/img.png?width=1342&amp;amp;height=800&amp;amp;face=0_0_1342_800');&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;포스트맨(Postman) 사용법과&amp;nbsp;API&amp;nbsp;실행해 보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;포스트맨의 사용방법과 이를 이용하여 API를 실행하여 테스트 하는 방법에 대해 소개한다. API에 요청을 보내고 결과를 확인하고 싶을 때, 브라우저에 직접 API URL을 작성하여 결과를 확인할 수 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;binit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;로직&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #111111; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;http://localhost:8000 &lt;/span&gt;사이트에서 카카오 로그인을 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 완료시 Authorization Code를&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;http://localhost:8080/kakao/login/callback 에 보냄. (인증)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;3. &lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;http://localhost:8080/kakao/login/callback 에서 Authorization Code를 통해 accessToken 을 받음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;4. &lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;accessToken을 통해 사용자 정보를 요청&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;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;4. 로그인 정보를 받음.&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;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;user 오브젝트 :&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;id, username, password, email, address&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;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1701572879436&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Kakao Developers&quot; data-og-description=&quot;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&quot; data-og-host=&quot;developers.kakao.com&quot; data-og-source-url=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot; data-og-url=&quot;https://developers.kakao.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnH3IY/hyUIslU8Uw/fbycTNZpywVeKwan3rDaM1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/ooqLl/hyUIEs7lht/WYyvveB2fNQH21lxWkaJbk/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/S6YpB/hyUE5y9X7B/hVMsYUqxadXxbthepaAk81/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000&quot;&gt;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnH3IY/hyUIslU8Uw/fbycTNZpywVeKwan3rDaM1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/ooqLl/hyUIEs7lht/WYyvveB2fNQH21lxWkaJbk/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/S6YpB/hyUE5y9X7B/hVMsYUqxadXxbthepaAk81/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000');&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;Kakao Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;1단계 인증 코드 받기&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;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt; 클라이언트 서버에서 (&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;https://kauth.kakao.com/oauth/authorize)로  GET요청&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;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;필수 항목 (body)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;&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;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;client_id : &lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;REST API 키&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;redirect_uri : &lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;redirect URI(&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;http://localhost:8080/kakao/login/callback&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;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;response_type : 'code' 고정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;2단계 토큰 받기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;rediect된 Spring API서버에서 (&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;https://kauth.kakao.com/oauth/token)로 POST 요청&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Content-type : &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Content-type: application/x-www-form-urlencoded;charset=utf-8&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;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;필수항목 (body)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;grant_type : '&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;authorization_code' 고정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;client_id : &lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;REST API 키&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;redirect_uri : &lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;redirect URI(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;http://localhost:8080/kakao/login/callback&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;code : 1단계의 인증 코드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;3단계 사용자 정보가져오기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;rediect된 Spring API서버에서 (&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;https://kapi.kakao.com/v2/user/me&lt;/span&gt;)로&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt; GET 요청&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Authorization: Bearer ${ACCESS_TOKEN} &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;//&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Bearer 후&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;공백 꼭 쓰기&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Content-type: application/x-www-form-urlencoded;charset=utf-8&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;참고 :&amp;nbsp; 토큰 정보 보기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;rediect된 Spring API서버에서 &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;(&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;https://kapi.kakao.com/v1/user/access_token_info)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt; 로 POST 요청&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Authorization: Bearer ${ACCESS_TOKEN} // &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Bearer 후&amp;nbsp;&lt;/span&gt;공백 꼭 쓰기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;참고 : 토큰 갱신하기 &lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;rediect된 Spring API서버에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;(&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;&lt;a href=&quot;https://kauth.kakao.com/oauth/token&quot;&gt;https://kauth.kakao.com/oauth/token&lt;/a&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 POST 요청&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필수항목 (헤더 )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Content-type :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;Content-type: application/x-www-form-urlencoded;charset=utf-8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;필수 항목 &lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(body)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;grant_type : '&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;refresh_token' 고정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;client_id : &lt;span style=&quot;background-color: #ffffff; color: #111111; text-align: left;&quot;&gt;REST API 키&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: left;&quot;&gt;refresh_token : 발급때 받은 refresh_token&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;토큰과 관련한 간단한 보안 이슈&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF : 관리자 권한이 있는 사용자가 특정 url요청을 하도록 유도.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(대표적인 예시 : 이미지에 캐시 100만원을 추가하는 &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;API 주소를 적고 관리자가 이미지를 클릭하도록 유도한다.&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS : 자바스크립트를 홈페이지에 게시판 같은곳에 기입하여 공격할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프링부트</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/68</guid>
      <comments>https://dyd1310.tistory.com/68#entry68comment</comments>
      <pubDate>Sun, 3 Dec 2023 12:58:18 +0900</pubDate>
    </item>
    <item>
      <title>디자인 패턴(생성 패턴)</title>
      <link>https://dyd1310.tistory.com/64</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;디자인 패턴이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 지향 프로그래밍 설계과정에서 자주 발생하는 문제들을 피하기 위한 패턴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;생성 패턴&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 팩토리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 책임 원칙을 지키기 위해 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map 과 unit 클래스가 있을 때 map에 unit에 대한 책임이 있으면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map class는 맵 파일로 맵을 구성하고 맵에 있는 unit들을 분류해서 적절하게 배치해야한다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unit에 대한 책임이 없다는 건 unit이 추가되거나 할때 map class를 수정할 필요가 없는걸 뜻한다.&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;하지만 map을 정의하기 위해 unit과 관련된 내용이 포함 될 수 밖에 없다.(unit들을 분류해서 적절하게 배치)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 다른 추가 class를 만들어서 책임을 다른 클래스로 돌린다.(UnitFactory class)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 Map은 맵 구성 , UnitFactory는 유닛 생성, Unit은 유닛 정의. 이렇게 각각의 기능만을 맡을 수 있게된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 빈즈 패턴&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setter/getter 를 이용하여 객체를 생성하는 방법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡슐화를 위해 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;캡슐화 ?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 연관 있는 속성과 기능을 캡슐로 만들어 외부로 부터 보호한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 접근하지 못하게 하고 부가적인 기능을 거치게 하면서 개발자가 정보 노출 범위와 변경 가능성을 조절할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;getter로 우리가 노출 범위를 설정할 수 있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4가지 변수(a, b , c, d)가 있을때 모두 private로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 우리가 사용자가 변수 c에 대해서만 값을 확인할 수 있도록 유도하고 싶다면 c에 대한 getter만 만들면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;setter 로 변경 가능성을 조절할 수 있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;final 로 변수들의 불변성을 확보한다면 내가 작성한 코드를 처음 본 사람이 해당 객체를 변경할 가능성이 없게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 본 사람이 변수가 변하면 안되는지 모르고 그 부분을 건드린다면? 의도치 않은 결과가 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 해당 변수가 수정해도 되는 변수인지 하면 안되는 변수인지 코드를 확인해야하기 때문에 유지 보수에 더 많은 시간을&lt;/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;빈즈패턴은 이러한 setter과 getter를 이용해 객체를 만들고 setter로 초기화하는 방식을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 점층적 생성자 패턴&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필드 변수에는 필수적으로 기입되어야할 변수와 선택적으로 기입되어야할 변수로 구분 될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-07 at 3.30.40 PM.png&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btTV7Z/btszRTl9iiO/yErh8kNkXbobMS5hIvcfXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btTV7Z/btszRTl9iiO/yErh8kNkXbobMS5hIvcfXk/img.png&quot; data-alt=&quot;https://effortguy.tistory.com/4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btTV7Z/btszRTl9iiO/yErh8kNkXbobMS5hIvcfXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtTV7Z%2FbtszRTl9iiO%2FyErh8kNkXbobMS5hIvcfXk%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;450&quot; height=&quot;452&quot; data-filename=&quot;Screen Shot 2023-11-07 at 3.30.40 PM.png&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://effortguy.tistory.com/4&lt;/figcaption&gt;
&lt;/figure&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;하지만 매개변수가 늘어날수록 유지보수 비용이 매우 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 빌더 패턴&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자를 통해 직접 생성하지 않고 빌더라는 내부 static calss를 통해 간접적으로 객체를 생성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법(어노테이션으로 지원하지만 정석적 방법)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자를 private로 정의하고 빌더 클래스를 정의한 후 빌더를 통해 모든 변수에 대해 설정하고 build 함수로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자를 호출한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 쓰는가?&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식들을 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점층적 생성자 패턴은 가독성이 안좋다. (몇번째 인자가 무엇을 의미하더라..?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 빈즈 패턴을 쓰려는데 일관성과 불변성이 보장되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setter를 모든 변수에 대해 쓰는 경우와 몇개 변수에 대해선 쓰지 않는 경우 일관성이 보장되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 기껏 설정해도 setter로 바꿀 수 도 있으니 불변성에도 문제가 생긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 자바 빈즈 패턴처럼 정보를 하나 하나 입력하지만 모든 정보가 모일 때 객체를 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-07 at 3.34.51 PM.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;1314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wevqQ/btszXEA2j10/sXb9kwORtGUGKEJvAMqSQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wevqQ/btszXEA2j10/sXb9kwORtGUGKEJvAMqSQ1/img.png&quot; data-alt=&quot;https://sudo-minz.tistory.com/133&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wevqQ/btszXEA2j10/sXb9kwORtGUGKEJvAMqSQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwevqQ%2FbtszXEA2j10%2FsXb9kwORtGUGKEJvAMqSQ1%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;572&quot; height=&quot;505&quot; data-filename=&quot;Screen Shot 2023-11-07 at 3.34.51 PM.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;1314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://sudo-minz.tistory.com/133&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 싱글톤 패턴&lt;/h4&gt;
&lt;pre id=&quot;code_1699339662709&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Singleton {

    static final Singleton instance = new Singleton();

    private Singleton() {
        //초기화
    }

    public Singleton getInstance() {
        return instance;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 과정에서 객체가 1개임을 보장하기 위한 방법. 모두 같은 객체를 사용해야할 때 final로 instance를 설정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 getInstance() 로 해당 클래스의 인스턴스를 얻는다.&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;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/64</guid>
      <comments>https://dyd1310.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 7 Nov 2023 15:54:31 +0900</pubDate>
    </item>
    <item>
      <title>객체 지향 5원칙 SOLID</title>
      <link>https://dyd1310.tistory.com/63</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 단일 책임 원칙(SRP)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 모듈이 하나의 책임을 가진다. -&amp;gt; 오직 하나의 기능을 맡아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무를 효율적으로 분리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; DB 패스워드 암호화 방식을 변경해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; DB Entity 를 정의해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;게임을 만든다고 가정.(Map과 Unit 으로 구성)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 Map class에 Unit을 분류하는 기능이 있다면? 단일 책임 원칙에 위배된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 문제인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 Unit이 생겼을때 Unit class를 건드려야하는데 Unit이 아니라 Map을 건드려야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 개방 폐쇄 원칙(OCP)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장에 대해선 열여있고 수정에 대해선 닫혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 확장에 대해 열려있다. : 요구 사항에 대해 기능을 추가할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 수정에 대해 닫혀있다. : 수정하지 않은채로 기능을 추가해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 정의되어있던 Unit을 만드는 방식이 A에서 B로 변경되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 Aunit class를 사용하고 있었다면? 개방 폐쇄 원칙에 위배된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 문제인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AUnit class를 Map에서 사용하고 있었는데 BUnit class 로 바뀌었으니 해당 선언부를 수정해야한다.&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;interface를 이용하는 코드를 사용한다. 즉 Unit interface를 생성하여 코드를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Map을 바꿀 필요없이 Map 객체를 만들 때 BUnit을 넣어 초기화 시켜주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;런타임 의존성? 컴파일 의존성?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 시점에선 Unit에 의존하고 있으나 런타임 시점에선 BUnit에 의존한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍에선 이 두 시점을 구분해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 인터페이스 분리 원칙(ISP)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 자신이 이용하지 않는 기능을 제공하는 인터페이스를 사용해선 안된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임에 새롭게 skill class 를 생성했다. 이때 기존 Unit interface에 create 함수만 정의되어있었는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;skill 함수를 추가했다. 이때 인터페이스 분리 원칙을 위반한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 문제인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BUnit은 skill이 필요없고 create만 필요하다. Unit 으로 skill을 접근할 수 있게됬는데 BUnit에 없는 기능을 사용할 수 있게된 것이다.&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;UnitSkill이라는 새로운 인터페이스를 만들어 이를 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 skill과 create 모두 필요한 class가 생긴다면, 이 두 인터페이스를 상속받으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 리스코프 치환 원칙(LSP)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 타입은 상위 타입을 대체할 수 있어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 객체를 사용할때 상위 타입에서 하위 타입으로 변경해서 객체를 사용할 때 차이점을 인식하지 못해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상위 : 직사각형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 : 정사각형 (정사각형을 상속 받음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직사각형은 가로와 세로를 설정하는 함수가 있다. 이를 정사각형이 오버라이딩해서 가로를 입력하건 세로를 입력하건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가로와 세로 모두 같도록 설정하도록 기능을 변경했다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 리스코프 치환 원칙을 위반하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 문제인가?&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다형성으로 부모 클래스로 자식 클래스 타입의 인스턴스를 참조할 수 있는데 이때 하위 타입과 상위 타입이 호환이 안된다면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예기치 않은 오류가 발생할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트 입장에서 직사각형으로 정사각형 타입의 인스턴스를 참조했는데 정사각형의 가로 설정, 세로 설정함수를&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이용했더니 가로 세로가 각각 설정되는게 아니라 계속 같도록 설정되는 예기치 않는 오류가 생길 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오버라이딩을 좀 더 세심히 신경쓰고 접근 제어자를 이용하여 호환에 문제가 생길 부분을 제한한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. 의존 역전 법칙(DIP)&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저수준 모듈이 고수준 모듈에 의존해야한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저수준 모듈? 입력과 출력과 가까운 구현 모듈&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;고수준 모듈? 도메인과 관련된 추상화된 모듈&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;고수준 모듈이 우리가 위 예제에서 살펴본 Interface와 관련이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;추상화에 의존하도록 변경하여 유연한 애플리케이션을 만들 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 의존성이 역전되는 시점은 컴파일 시점이다. 컴파일 시점에 인터페이스에 의존해야한다는 뜻이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/63</guid>
      <comments>https://dyd1310.tistory.com/63#entry63comment</comments>
      <pubDate>Tue, 7 Nov 2023 14:47:27 +0900</pubDate>
    </item>
    <item>
      <title>stream 문법</title>
      <link>https://dyd1310.tistory.com/62</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 11.29.51 PM.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWULh/btszLsH5Tiv/4KZddDMmYGRddNhDyxLfZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWULh/btszLsH5Tiv/4KZddDMmYGRddNhDyxLfZk/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;http://tcpschool.com/java/java_stream_creation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWULh/btszLsH5Tiv/4KZddDMmYGRddNhDyxLfZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWULh%2FbtszLsH5Tiv%2F4KZddDMmYGRddNhDyxLfZk%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;1142&quot; height=&quot;338&quot; data-filename=&quot;Screen Shot 2023-11-05 at 11.29.51 PM.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;http://tcpschool.com/java/java_stream_creation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위의 그림은 stream을 관통하는 그림이라고 생각한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정의하는 방법&lt;/h4&gt;
&lt;pre id=&quot;code_1699194982066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;Integer&amp;gt;();
Stream&amp;lt;Integer&amp;gt; stream = list.stream();

String[] arr = new String[]{&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;};
Stream&amp;lt;String&amp;gt; stream1 = Arrays.stream(arr);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 여러 방법이 있지만 대표적인 방법은 위의 2가지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 알아야할건 Stream&amp;lt;T&amp;gt; 와 Arrays.stream은 아예 다르다는 것이다.&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;Arrays.stream의 기능을 확인하기 위해서 아래의 추상 클래스를 확인해야한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;abstract class ReferencePipeline&amp;lt;P_IN, P_OUT&amp;gt;
        extends AbstractPipeline&amp;lt;P_IN, P_OUT, Stream&amp;lt;P_OUT&amp;gt;&amp;gt;
        implements Stream&amp;lt;P_OUT&amp;gt;  &lt;/code&gt;&lt;/pre&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;또 Stream&amp;lt;T&amp;gt;의 기능을 확인하기 위해서 아래의 인터페이스를 확인해야한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public interface Stream&amp;lt;T&amp;gt; extends BaseStream&amp;lt;T, Stream&amp;lt;T&amp;gt;&amp;gt; &lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 메소드&lt;/h4&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;필터링 : filter(), distinct()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변환 : map() , flatMap()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제한 : limit(), skip()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정렬 : sorted&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;일반적인 흐름&lt;/h4&gt;
&lt;pre id=&quot;code_1699195248180&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Stream&amp;lt;T&amp;gt; extends BaseStream&amp;lt;T, Stream&amp;lt;T&amp;gt;&amp;gt; {

    Stream&amp;lt;T&amp;gt; filter(Predicate&amp;lt;? super T&amp;gt; predicate);
    &amp;lt;R&amp;gt; Stream&amp;lt;R&amp;gt; map(Function&amp;lt;? super T, ? extends R&amp;gt; mapper);
    &amp;lt;R&amp;gt; Stream&amp;lt;R&amp;gt; flatMap(Function&amp;lt;? super T, ? extends Stream&amp;lt;? extends R&amp;gt;&amp;gt; mapper);
    Stream&amp;lt;T&amp;gt; sorted();
    Stream&amp;lt;T&amp;gt; sorted(Comparator&amp;lt;? super T&amp;gt; comparator);
    Stream&amp;lt;T&amp;gt; limit(long maxSize);
    void forEach(Consumer&amp;lt;? super T&amp;gt; action);
    &amp;lt;A&amp;gt; A[] toArray(IntFunction&amp;lt;A[]&amp;gt; generator);
    
    ....
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스를 살펴보면 주석을 제외하고 위와같은 형태임을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fillter 같은 경우 매개변수로 Predicate 인터페이스를 따르는 람다식이 매개변수로 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Predicate 인터페이스는 T, 혹은 T보다 상위클래스의 제네릭 타입으로 정의된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환형으로 람다식의 연산을 수행하고 True인 stream&amp;lt;T&amp;gt;를 return한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;map 같은 경우 매개변수로 Function 인터페이스를 따르는 람다식이 매개변수로 온다.&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(T, 혹은 T보다 상위클래스, R 혹은 R보다 하위 클래스의 제네릭 타입으로 정의된다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반환형으로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;람다식의 연산을 수행하고 변환된 R로 구성된 stream&amp;lt;R&amp;gt;를 return한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;forEach같은 경우 매개변수로 Consumer 인터페이스를 따르는 람다식이 매개변수로 온다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반환형은 없고 람다식에 선언된 메소드들을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/62</guid>
      <comments>https://dyd1310.tistory.com/62#entry62comment</comments>
      <pubDate>Sun, 5 Nov 2023 23:48:26 +0900</pubDate>
    </item>
    <item>
      <title>함수형 프로그래밍 , 람다식</title>
      <link>https://dyd1310.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기존 익명 함수는 너무 번거로우니 함수형 인터페이스를 정의하고 해당 인터페이스를 계승하는 람다식들은 인터페이스에서 정의한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수와 반환형을 사용한다고 생각하자!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 인터페이스는 추상 메소드가 1개인 인터페이스이다. 2개이면 람다식에서 사용하는 변수의 매개변수와 반환 자료형이 무엇인지&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;Supplier&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수가 없고 T 타입으로 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Consumer&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T 타입 매개변수를 받고 아무것도 반환하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Function&amp;lt;T,R&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T 타입을 매개변수로 받아서 R타입을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Predicate&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T 타입을 매개변수로 받아서 boolean을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Runnable&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수도 없고 반환도 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BiConsumer&amp;lt;T,U&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T타입과 R타입을 매개변수로 받아서 boolean을 반환한다.&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;pre id=&quot;code_1699194032827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;() -&amp;gt; {}
// 한줄일 경우 {} 생략가능(권장하진 않음).return 으로만 구성되어있는 경우 return 생략가능
() -&amp;gt; 1 
// 해당 식으로 치환 가능
() -&amp;gt; { return 1; }

// 함수형 인터페이스에 따라 자료형 생략 가능
(int x) -&amp;gt; x+1
(x) -&amp;gt; x+1
x -&amp;gt; x+1
(int x) -&amp;gt; { return x+1; }
x -&amp;gt; { return x+1; }
(x) -&amp;gt; {x+1}

(int x, int y) -&amp;gt; x+y
(x, y) -&amp;gt; x+y
(x, y) -&amp;gt; { return x+y; }

//선언된 type과 선언되지 않은 type을 같이 사용 할 수 없다.
(x, int y) -&amp;gt; x+y
(x, final y) -&amp;gt; x+y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/61</guid>
      <comments>https://dyd1310.tistory.com/61#entry61comment</comments>
      <pubDate>Sun, 5 Nov 2023 23:28:06 +0900</pubDate>
    </item>
    <item>
      <title>자바 Arrays.asList</title>
      <link>https://dyd1310.tistory.com/60</link>
      <description>&lt;pre id=&quot;code_1699180381639&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @SafeVarargs
    @SuppressWarnings(&quot;varargs&quot;)
    public static &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; asList(T... a) {
        return new ArrayList&amp;lt;&amp;gt;(a);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드를 보면 위와 같다. 반환형이 ArrayList인데 우리가 생각하는 java.util.ArrayList가 아니다.&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;&lt;/span&gt;java.util.Arrays.ArrayList이다.&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;/p&gt;
&lt;pre id=&quot;code_1699180480639&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;Integer&amp;gt;(Arrays.asList(1,2,3));
List&amp;lt;Integer&amp;gt; list2 = new ArrayList&amp;lt;Integer&amp;gt;(Arrays.asList(1,2,3));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;check point&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. new 연산자를 왜 사용하는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return으로 반환되는 ArrayList는 클래스만 변경되는 wraper 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1699180796134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] stringArray = new String[] { &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot; };
List stringList = Arrays.asList(stringArray);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 예제에서 stringList의 값을 변경하면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얕은 복사처럼 stringArray의 값이 같이 바뀐다.&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;해당 예제에서 stringList의 값을 추가하면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 동작을 지원하지 않는다는 오류를 받게된다.&lt;/p&gt;
&lt;pre id=&quot;code_1699181337313&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public ArrayList(Collection&amp;lt;? extends E&amp;gt; c) {
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }&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;해당 코드는 자바 util의 ArrayList의 생성자이고 Collection&amp;lt;? extends E&amp;gt;는 E타입이거나 E의 하위 타입들을 포함하는 Collection 타입을 의미한다. 따라서 wrapper로 클래스가 변경된 Array가 매개변수로 들어갈 수 있게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 왜 List로 가져오는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분은 다형성과 관련된 부분으로 ArrayList가 아니라 List로 받으면 추후 개발과정에서 List를 ArrayList , 혹은 LinkedList로 쉽게 변경할 수 있다. why? 개발 과정에서 List라고 생각하고 코드를 짤거니까 해당 인터페이스를 상속받는 ArrayList , 혹은 LinkedList 에서도 쉽게 호환이 된다.&lt;/p&gt;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/60</guid>
      <comments>https://dyd1310.tistory.com/60#entry60comment</comments>
      <pubDate>Sun, 5 Nov 2023 19:56:12 +0900</pubDate>
    </item>
    <item>
      <title>자바 String Literal, String Object? immutable?</title>
      <link>https://dyd1310.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글을 참고하여 작성했습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1699170593498&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java]String 리터럴(Literal), String 객체(Object)&quot; data-og-description=&quot;Java에서 문자열을 생성하는 과정은 2가지 방법이 있습니다. 1. 문자열 리터럴(Literal)을 사용 public class Main { public static void main(String[] args) { String strLiteral1 = &amp;quot;TEST&amp;quot;; String strLiteral3 = &amp;quot;TEST&amp;quot;; String strLitera&quot; data-og-host=&quot;developer-talk.tistory.com&quot; data-og-source-url=&quot;https://developer-talk.tistory.com/44&quot; data-og-url=&quot;https://developer-talk.tistory.com/44&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2C0p3/hyUrDBEgBf/fFev03nCktPRMv29FoQxv1/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/YQp0s/hyUrAZdiZn/j26e5gYCFPqt7c4TtCdXXK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/pAJ6F/hyUrtTk0sI/kHPjkT3IhkaKcfkZZxbCbK/img.png?width=785&amp;amp;height=500&amp;amp;face=0_0_785_500&quot;&gt;&lt;a href=&quot;https://developer-talk.tistory.com/44&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer-talk.tistory.com/44&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2C0p3/hyUrDBEgBf/fFev03nCktPRMv29FoQxv1/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/YQp0s/hyUrAZdiZn/j26e5gYCFPqt7c4TtCdXXK/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/pAJ6F/hyUrtTk0sI/kHPjkT3IhkaKcfkZZxbCbK/img.png?width=785&amp;amp;height=500&amp;amp;face=0_0_785_500');&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;[Java]String 리터럴(Literal), String 객체(Object)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java에서 문자열을 생성하는 과정은 2가지 방법이 있습니다. 1. 문자열 리터럴(Literal)을 사용 public class Main { public static void main(String[] args) { String strLiteral1 = &quot;TEST&quot;; String strLiteral3 = &quot;TEST&quot;; String strLitera&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer-talk.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Literal과 객체는 어디에 저장되고 관리되는가? 에 대한 답이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new 연산자를 이용하여 String Object를 생성할 경우 메모리의 Heap 영역,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&quot; 로 Literal로 선언할 경우 String Contant Pool에 할당된다. (String Contant Pool 도 Heap 영역에 있다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.08.00 PM.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpYDv0/btszLYmu3GE/ZqQeOWCLFfU0Vnk2dqlhn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpYDv0/btszLYmu3GE/ZqQeOWCLFfU0Vnk2dqlhn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpYDv0/btszLYmu3GE/ZqQeOWCLFfU0Vnk2dqlhn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpYDv0%2FbtszLYmu3GE%2FZqQeOWCLFfU0Vnk2dqlhn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;818&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.08.00 PM.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;equals vs ==&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;== 는 객체의 주소값을 비교하는 연산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;equals는 문자열의 내용이 일치하는지 확인하는 연산&lt;/p&gt;
&lt;pre id=&quot;code_1699171176811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        return (anObject instanceof String aString)
                &amp;amp;&amp;amp; (!COMPACT_STRINGS || this.coder == aString.coder)
                &amp;amp;&amp;amp; StringLatin1.equals(value, aString.value);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세히 살펴보면 주소값이 같은지 우선 확인하고 아니라면 3가지 조건이 모두 참인지 확인하여 두 문자열의 내용이 일치하는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;check point&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자바 string 더하기 연산은 어떻게 되는걸까? String을 조작하는 연산은 메모리를 사용할까?&lt;/p&gt;
&lt;pre id=&quot;code_1699173187506&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        String s1 = &quot;hihi&quot;;
        String s2 = &quot;hi&quot; + &quot;hi&quot;;
        if(s1==s2) {
            System.out.println(&quot;성공&quot;);
        }
    }
}&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;실행 결과로 &quot;성공&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699173262906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        String s1 = &quot;hihi&quot;;
        String s2 = &quot;hi&quot; + &quot;hi&quot;;
        String s3 = new String(&quot;hi&quot;) + &quot;hi&quot;;
        if(s1==s3) {
            System.out.println(&quot;성공&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과로 &quot;성공&quot; 이 출력되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 리터럴 + String Object = Object로 새롭게 객체를 생성함을 알 수 있다.&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;기존 String Object에서 더하기 연산을 하면 기존 객체에 문자만 추가할까? 아니면 계속해서 새로운 객체를 만들어 낼까?&lt;/p&gt;
&lt;pre id=&quot;code_1699173706224&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        String s1 = &quot;hihi&quot;;
        String s2 = &quot;hi&quot; + &quot;hi&quot;;
        String s3 = new String(&quot;hi&quot;);
        System.out.println(System.identityHashCode(s3));
        s3 = s3 + &quot;hi&quot;;
        System.out.println(System.identityHashCode(s3));

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.41.51 PM.png&quot; data-origin-width=&quot;198&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AtPzK/btszLYzZLJy/aLDnwEhtBTb1Cff0GdL7J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AtPzK/btszLYzZLJy/aLDnwEhtBTb1Cff0GdL7J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AtPzK/btszLYzZLJy/aLDnwEhtBTb1Cff0GdL7J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAtPzK%2FbtszLYzZLJy%2FaLDnwEhtBTb1Cff0GdL7J0%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;67&quot; height=&quot;32&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.41.51 PM.png&quot; data-origin-width=&quot;198&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&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;이러한 동작 과정들은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;immutable과 관련있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산에 대한 추가적인 정보는 아래의 링크에서 얻을 수 있었다.&lt;/p&gt;
&lt;figure id=&quot;og_1699172853000&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;자바 String, StringBuilder 그리고 StringBuffer 성능 차이 비교&quot; data-og-description=&quot;자바에서 String과 StringBuilder 그리고 StringBuffer의 차이는 무엇일까? 그리고 제일 빠른 연산 속도는 어떤 것일까?&quot; data-og-host=&quot;madplay.github.io&quot; data-og-source-url=&quot;https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java&quot; data-og-url=&quot;https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beAMkM/hyUnIxPFKK/Ug7HZYxvo4eTeJTPmTF5ZK/img.jpg?width=1436&amp;amp;height=1436&amp;amp;face=0_0_1436_1436,https://scrap.kakaocdn.net/dn/wtzlf/hyUrz64Nkl/5mP4STmSuazN4USGHORAR1/img.png?width=1288&amp;amp;height=1150&amp;amp;face=0_0_1288_1150&quot;&gt;&lt;a href=&quot;https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beAMkM/hyUnIxPFKK/Ug7HZYxvo4eTeJTPmTF5ZK/img.jpg?width=1436&amp;amp;height=1436&amp;amp;face=0_0_1436_1436,https://scrap.kakaocdn.net/dn/wtzlf/hyUrz64Nkl/5mP4STmSuazN4USGHORAR1/img.png?width=1288&amp;amp;height=1150&amp;amp;face=0_0_1288_1150');&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;자바 String, StringBuilder 그리고 StringBuffer 성능 차이 비교&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바에서 String과 StringBuilder 그리고 StringBuffer의 차이는 무엇일까? 그리고 제일 빠른 연산 속도는 어떤 것일까?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;madplay.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StringBuilder와 StringBuffer는 최초에 문자 객체를 만들고 기존 객체에서 문자를 추가하는 형태로 동작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 기존의 연산보다 더 빠르다. 또한 StringBuilder와 StringBuffer의 차이는 동기화 여부에 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StringBuilder 동기화 보장 x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;StringBuffer 동기화 보장 o&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;동기화 여부는 멀티스레드 환경과 연관이 있는 키워드로 해당 게시글에선 더 자세히 말하지 않겠다. (궁금하면 race condition 알아보기)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmyjZN/btszOORb0m1/U9mwEfKSSysuOdMULdwzD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmyjZN/btszOORb0m1/U9mwEfKSSysuOdMULdwzD0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;1240&quot; data-filename=&quot;Screen Shot 2023-11-05 at 6.23.40 PM.png&quot; style=&quot;width: 39.2049%; margin-right: 10px;&quot; data-widthpercent=&quot;39.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmyjZN/btszOORb0m1/U9mwEfKSSysuOdMULdwzD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmyjZN%2FbtszOORb0m1%2FU9mwEfKSSysuOdMULdwzD0%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;920&quot; height=&quot;1240&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnMB1D/btszQBKVjGE/Huc6G5Mi49Y5aP2UIPRC0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnMB1D/btszQBKVjGE/Huc6G5Mi49Y5aP2UIPRC0K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;996&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.52.14 PM.png&quot; width=&quot;422&quot; data-widthpercent=&quot;60.33&quot; style=&quot;width: 59.6323%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnMB1D/btszQBKVjGE/Huc6G5Mi49Y5aP2UIPRC0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnMB1D%2FbtszQBKVjGE%2FHuc6G5Mi49Y5aP2UIPRC0K%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;1124&quot; height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 게시글에서 성능 비교 그래프를 확인할 수 있었는데 너무 유익한 게시글이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 6.17.28 PM.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaFFC/btszI1Syv1e/lKBbBInzeg5Y50etRT7PFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaFFC/btszI1Syv1e/lKBbBInzeg5Y50etRT7PFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaFFC/btszI1Syv1e/lKBbBInzeg5Y50etRT7PFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxaFFC%2FbtszI1Syv1e%2FlKBbBInzeg5Y50etRT7PFk%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;1488&quot; height=&quot;600&quot; data-filename=&quot;Screen Shot 2023-11-05 at 6.17.28 PM.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 해당 코드에서 기존 공간을 늘리기 위한 새로운 공간을 할당하는 과정에서 수행속도가 매우 큰 차이가 나게된다는 소개도 인상 깊었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;2. 문자열 리터럴의 경우 어떻게 비교되는가?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.22.30 PM.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vvVT1/btszK5TNyex/y0cbQWf6vHLAy7oKDoHGS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vvVT1/btszK5TNyex/y0cbQWf6vHLAy7oKDoHGS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vvVT1/btszK5TNyex/y0cbQWf6vHLAy7oKDoHGS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvvVT1%2FbtszK5TNyex%2Fy0cbQWf6vHLAy7oKDoHGS0%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;404&quot; height=&quot;298&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.22.30 PM.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Language Specification 문서를 보면 내부적으로 String의 intern 메소드를 호출함을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.25.20 PM.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c84IHI/btszLagD9Kr/WDVBFi8uKC8pyBKhU91Y30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c84IHI/btszLagD9Kr/WDVBFi8uKC8pyBKhU91Y30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c84IHI/btszLagD9Kr/WDVBFi8uKC8pyBKhU91Y30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc84IHI%2FbtszLagD9Kr%2FWDVBFi8uKC8pyBKhU91Y30%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;462&quot; height=&quot;728&quot; data-filename=&quot;Screen Shot 2023-11-05 at 5.25.20 PM.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String 에서 intern은 위처럼 선언되어있고 native로 선언되어 내부에서 동작함을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;literal은 immutable 이라는 특성을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int a = 3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a = 5;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 작성한다면 literal 내부가 3에서 5로 바뀌는게 아니라 참조 주소를 5를 가리키도록 변경시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제로 얕은 복사와 깊은 복사 문제가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체들은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;immutable&lt;span&gt; 하지 않기 때문에 데이터가 바뀌면 그 속의 내용도 바뀌어버린다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int a = 3;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;a = 5;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;에서 a가 불변하지않다면 참조하는 주소가 바뀌는게 아니라 주소가 같은채로 3이 5로 바뀌어버리는 것과 같은 문제이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 immutable하지 않는 객체들에 관해 얕은 복사와 깊은 복사 문제를 구분해야한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 내용들은 Cloneable 인터페이스에 clone 추상 메소드가 깊은 복사를 담당하고 있고 Cloneable 인터페이스를 상속받는다면 깊은 복사 기능이 있다. (Object clone과 구분해야한다. 또 만약 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Cloneable&lt;span&gt; 를 상속받으면 오버라이딩하고 직접 하나하나 구현해야한다. 그렇지않으면 Object clone의 얕은 복사와 다를바없다.&lt;/span&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예로 ArrayList도 Cloneable를 상속받아 clone함수가 있고 clone을 통해 깊은 복사를 수행할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 6.09.38 PM.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3CvL2/btszJIry9k0/hMiW7I9UuoKodiUO3vGU7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3CvL2/btszJIry9k0/hMiW7I9UuoKodiUO3vGU7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3CvL2/btszJIry9k0/hMiW7I9UuoKodiUO3vGU7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3CvL2%2FbtszJIry9k0%2FhMiW7I9UuoKodiUO3vGU7k%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;408&quot; height=&quot;36&quot; data-filename=&quot;Screen Shot 2023-11-05 at 6.09.38 PM.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699175307953&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public Object clone() {
    try {
        ArrayList&amp;lt;?&amp;gt; v = (ArrayList&amp;lt;?&amp;gt;) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    } catch (CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw new InternalError(e);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 return type이 object라 형변환이 필요하다.&lt;/p&gt;
&lt;pre id=&quot;code_1699175774216&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        String[] fruitsName = {&quot;apple&quot;, &quot;banana&quot;};
        ArrayList&amp;lt;String&amp;gt; fruits = new ArrayList&amp;lt;&amp;gt;(Arrays.asList(fruitsName));
        ArrayList&amp;lt;String&amp;gt; clone = (ArrayList&amp;lt;String&amp;gt;) fruits.clone();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 방식으로 깊은 복사를 수행할 수 있다.&lt;/p&gt;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/59</guid>
      <comments>https://dyd1310.tistory.com/59#entry59comment</comments>
      <pubDate>Sun, 5 Nov 2023 18:23:52 +0900</pubDate>
    </item>
    <item>
      <title>자바 심화 체크리스트</title>
      <link>https://dyd1310.tistory.com/58</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;상속과 다형성&lt;/li&gt;
&lt;li&gt;접근 제어자&lt;/li&gt;
&lt;li&gt;this,super&lt;/li&gt;
&lt;li&gt;오버라이딩, 오버로딩&lt;/li&gt;
&lt;li&gt;예외 처리&lt;/li&gt;
&lt;li&gt;모델 설계(DDD , MVC 등)&lt;/li&gt;
&lt;li&gt;함수형 인터페이스&lt;/li&gt;
&lt;li&gt;wrapper class&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;기술과 관련된 부분&lt;/p&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;어노테이션&lt;/li&gt;
&lt;li&gt;API class(Object, Enum, Arrays, String, StringBuffer 등)&lt;/li&gt;
&lt;li&gt;제네릭, 스트림, iter&lt;/li&gt;
&lt;li&gt;Comparable, BiConsumer&lt;/li&gt;
&lt;li&gt;Test (&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;JUnit5, &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AssertJ)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/58</guid>
      <comments>https://dyd1310.tistory.com/58#entry58comment</comments>
      <pubDate>Sun, 5 Nov 2023 16:48:09 +0900</pubDate>
    </item>
    <item>
      <title>자바 collection 개념</title>
      <link>https://dyd1310.tistory.com/57</link>
      <description>&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;figure id=&quot;og_1699164273086&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] 자바 - Collection이란? (컬렉션과 제네릭)&quot; data-og-description=&quot;자바 - Collection이란? (컬렉션과 제네릭) 컬렉션(collection)은 많은 데이터 요소를 효율적으로 관리하기 위한 자료구조를 말하며, ArrayList, LinkedList, HashMap 등이 여기에 포함됩니다. 그리고 이 컬렉션&quot; data-og-host=&quot;kadosholy.tistory.com&quot; data-og-source-url=&quot;https://kadosholy.tistory.com/117&quot; data-og-url=&quot;https://kadosholy.tistory.com/117&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ecFhnq/hyUnSNXSyR/0bS8igllwfWcjocFbDUSq0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bAwhFr/hyUrFMXnzx/yVtAkKDswiUPA6XQ6UwXo0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/CIEjr/hyUrq3kWar/TtorK2jLXNtssBOv9cVOuk/img.png?width=1264&amp;amp;height=644&amp;amp;face=0_0_1264_644&quot;&gt;&lt;a href=&quot;https://kadosholy.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kadosholy.tistory.com/117&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ecFhnq/hyUnSNXSyR/0bS8igllwfWcjocFbDUSq0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bAwhFr/hyUrFMXnzx/yVtAkKDswiUPA6XQ6UwXo0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/CIEjr/hyUrq3kWar/TtorK2jLXNtssBOv9cVOuk/img.png?width=1264&amp;amp;height=644&amp;amp;face=0_0_1264_644');&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;[Java] 자바 - Collection이란? (컬렉션과 제네릭)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바 - Collection이란? (컬렉션과 제네릭) 컬렉션(collection)은 많은 데이터 요소를 효율적으로 관리하기 위한 자료구조를 말하며, ArrayList, LinkedList, HashMap 등이 여기에 포함됩니다. 그리고 이 컬렉션&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kadosholy.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 3.04.15 PM.png&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBpMXQ/btszQDu9zSS/aDLJlB2znICyCv6PC4Ez8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBpMXQ/btszQDu9zSS/aDLJlB2znICyCv6PC4Ez8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBpMXQ/btszQDu9zSS/aDLJlB2znICyCv6PC4Ez8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBpMXQ%2FbtszQDu9zSS%2FaDLJlB2znICyCv6PC4Ez8k%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;1550&quot; height=&quot;896&quot; data-filename=&quot;Screen Shot 2023-11-05 at 3.04.15 PM.png&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서가 있는가? 데이터의 중복을 허용하는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set : &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;중복이 허용되지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;List : 순서가 있음 . 중복 허용.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Map : 키의 중복이 허용되지 않음. Value는 중복 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 3.11.10 PM.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCXI0K/btszQBjOfAc/ulSHpXPGWuPhKFMTH7DHB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCXI0K/btszQBjOfAc/ulSHpXPGWuPhKFMTH7DHB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCXI0K/btszQBjOfAc/ulSHpXPGWuPhKFMTH7DHB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCXI0K%2FbtszQBjOfAc%2FulSHpXPGWuPhKFMTH7DHB0%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;1548&quot; height=&quot;876&quot; data-filename=&quot;Screen Shot 2023-11-05 at 3.11.10 PM.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터를 동적으로 추가할 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이터를 삭제할 수 있으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 데이터의 포함여부를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. null 여부를 검증할 수 있고 사이즈를 체크할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 사이즈, 반복자, 배열로 반환할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;check point&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collection을 상속받는 ArrayList를 살펴보면서 해당 인터페이스에 대해 감을 잡아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-11-05 at 3.58.41 PM.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NB128/btszK3VXCaB/5kCdxozRoO30lWePdH4sO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NB128/btszK3VXCaB/5kCdxozRoO30lWePdH4sO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NB128/btszK3VXCaB/5kCdxozRoO30lWePdH4sO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNB128%2FbtszK3VXCaB%2F5kCdxozRoO30lWePdH4sO0%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;329&quot; height=&quot;141&quot; data-filename=&quot;Screen Shot 2023-11-05 at 3.58.41 PM.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArrayList는 AbstractListf라는 추상 클래스를 상속받고 여러 인터페이스를 다중 상속받고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. remove할 때 해당 객체가 없다면 예외가 발생하는가?&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;List Interface에 정의되어있고 이를 ArrayList가 오버라이딩 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1699168394833&quot; class=&quot;arduino&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;    boolean remove(Object o);&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_1699165940954&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public boolean remove(Object o) {
        final Object[] es = elementData;
        final int size = this.size;
        int i = 0;
        found: {
            if (o == null) {
                for (; i &amp;lt; size; i++)
                    if (es[i] == null)
                        break found;
            } else {
                for (; i &amp;lt; size; i++)
                    if (o.equals(es[i]))
                        break found;
            }
            return false;
        }
        fastRemove(es, i);
        return true;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AbstracList의 remove는 해당 코드로 작성되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 생소한 부분은 found: 와 break found;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분은 레이블(labeled) 문장을 사용한 제어문으로 break 시 found 밖으로 빠져나가서 return false를 만나지 않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fastRemove를 실행할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object는 자바의 최상위 클래스로 모든 자료형을 다 받을 수 있고 같은 것이 있다면 가장 먼저 발견된 인덱스의 데이터를 삭제한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외를 발생시키지는 않고 성공 여부를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 보면 예외를 발생시키지 않고 성공, 실패 여부만을 반환함을 알 수 있다.&lt;/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;elementData&lt;/p&gt;
&lt;pre id=&quot;code_1699166513271&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;transient Object[] elementData;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드로 필드 변수로 선언되어있고 초기 ArrayList 생성자에 의해 Object들이 담긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. removeAll은 어떻게 구현되는가?&lt;/p&gt;
&lt;pre id=&quot;code_1699167134661&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    boolean batchRemove(Collection&amp;lt;?&amp;gt; c, boolean complement,
                        final int from, final int end) {
        Objects.requireNonNull(c);
        final Object[] es = elementData;
        int r;
        // Optimize for initial run of survivors
        for (r = from;; r++) {
            if (r == end)
                return false;
            if (c.contains(es[r]) != complement)
                break;
        }
        int w = r++;
        try {
            for (Object e; r &amp;lt; end; r++)
                if (c.contains(e = es[r]) == complement)
                    es[w++] = e;
        } catch (Throwable ex) {
            // Preserve behavioral compatibility with AbstractCollection,
            // even if c.contains() throws.
            System.arraycopy(es, r, es, w, end - r);
            w += end - r;
            throw ex;
        } finally {
            modCount += end - w;
            shiftTailOverGap(es, w, end);
        }
        return 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;핵심은 위의 함수이고 collection을 비교하여 삭제하는걸 알 수 있다. 해당 함수는 collection이 null일 때 예외를 발생시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. remove를 할 때 index로 삭제한 경험이 있는데 이건 뭘까?&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;해당 코드 또한 List Interface에 정의되어있고 이를 ArrayList가 오버라이딩 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1699168574077&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    E remove(int index);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1699168308771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public E remove(int index) {
        Objects.checkIndex(index, size);
        final Object[] es = elementData;

        @SuppressWarnings(&quot;unchecked&quot;) E oldValue = (E) es[index];
        fastRemove(es, index);

        return oldValue;
    }&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;@SuppressWarnings(&quot;unchecked&quot;) 어노테이션을 통해 unchecked 에러를 억제시키는 역할을 한다.&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: #555555; text-align: start;&quot;&gt;checked exception?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;&lt;b&gt;컴파일 시점에 컴파일러에서 확인하는 예외&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;&lt;b&gt;txt 파일을 가져오려는데 파일이 있는지 없는지는 컴파일 시점에 알 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;unchecked exception?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;&lt;b&gt;런타임 시점에서 확인 할수 있는 예외&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;&lt;b&gt;배열의 크기를 입력받고 동적으로 할당받는데 배열보다 넘는 인덱스를 참조하는건 런타임 시점에 알 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdsgdR/btszM2oBeoW/uIUhIV0OtNcu5JDR5du5Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdsgdR/btszM2oBeoW/uIUhIV0OtNcu5JDR5du5Wk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;306&quot; data-filename=&quot;Screen Shot 2023-11-05 at 4.28.37 PM.png&quot; style=&quot;width: 50.2181%; margin-right: 10px;&quot; data-widthpercent=&quot;50.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdsgdR/btszM2oBeoW/uIUhIV0OtNcu5JDR5du5Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdsgdR%2FbtszM2oBeoW%2FuIUhIV0OtNcu5JDR5du5Wk%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;812&quot; height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTVHOy/btszLp5yCgy/QXMJnG0elFXKYVekKTT3kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTVHOy/btszLp5yCgy/QXMJnG0elFXKYVekKTT3kk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;492&quot; data-filename=&quot;Screen Shot 2023-11-05 at 4.28.46 PM.png&quot; data-widthpercent=&quot;49.19&quot; style=&quot;width: 48.6191%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTVHOy/btszLp5yCgy/QXMJnG0elFXKYVekKTT3kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTVHOy%2FbtszLp5yCgy%2FQXMJnG0elFXKYVekKTT3kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;remove에는 이러한 주석이 있는데 개발할때 이러한 주석을 추가해도 좋겠다는 생각을 했다.&lt;/p&gt;</description>
      <category>java</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/57</guid>
      <comments>https://dyd1310.tistory.com/57#entry57comment</comments>
      <pubDate>Sun, 5 Nov 2023 16:30:18 +0900</pubDate>
    </item>
    <item>
      <title>체비쇼프 다항식</title>
      <link>https://dyd1310.tistory.com/51</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;p data-ke-size=&quot;size16&quot;&gt;cos^-1(cos &amp;theta;) = &amp;theta; 를 이용해 cos(n&amp;theta;) 를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bepS6v/btszbRob2PZ/7OLwonsVSmAKHHbABw94rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bepS6v/btszbRob2PZ/7OLwonsVSmAKHHbABw94rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bepS6v/btszbRob2PZ/7OLwonsVSmAKHHbABw94rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbepS6v%2FbtszbRob2PZ%2F7OLwonsVSmAKHHbABw94rk%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;541&quot; height=&quot;474&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼각함수 덧셈 정리를 통해 다항식을 유도해 낼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqWQiG/btsy9Tz2esX/i0FonbZjOS7hkk9YJSmlP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqWQiG/btsy9Tz2esX/i0FonbZjOS7hkk9YJSmlP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqWQiG/btsy9Tz2esX/i0FonbZjOS7hkk9YJSmlP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqWQiG%2Fbtsy9Tz2esX%2Fi0FonbZjOS7hkk9YJSmlP0%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;494&quot; height=&quot;86&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CPTQ9/btszbtA7aSl/SCxWxhtPd2g8OOZYxzwaRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CPTQ9/btszbtA7aSl/SCxWxhtPd2g8OOZYxzwaRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CPTQ9/btszbtA7aSl/SCxWxhtPd2g8OOZYxzwaRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCPTQ9%2FbtszbtA7aSl%2FSCxWxhtPd2g8OOZYxzwaRk%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;470&quot; height=&quot;166&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반항 유도 매우 중요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bulWai/btsy9P5tSx4/vnXyqMyRXZNhKWOU42ATm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bulWai/btsy9P5tSx4/vnXyqMyRXZNhKWOU42ATm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bulWai/btsy9P5tSx4/vnXyqMyRXZNhKWOU42ATm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbulWai%2Fbtsy9P5tSx4%2FvnXyqMyRXZNhKWOU42ATm1%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;560&quot; height=&quot;84&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chEQwy/btsy9RI0Iq0/D8qOQbID4Xldv5jEqNKR9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chEQwy/btsy9RI0Iq0/D8qOQbID4Xldv5jEqNKR9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chEQwy/btsy9RI0Iq0/D8qOQbID4Xldv5jEqNKR9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchEQwy%2Fbtsy9RI0Iq0%2FD8qOQbID4Xldv5jEqNKR9k%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;367&quot; height=&quot;186&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점화식을 이용해 Tn을 구할 수 있음&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;사용할 수 있는 조건 : -1&amp;lt;= x &amp;lt;= 1 (cos&amp;theta; 라서 이 범위안에서만 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 -1과 1이 아니라면 x를 z로 치환해 -1&amp;lt;=z&amp;lt;=1 에서 구하고 다시 x로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 논하기전 변수 선택에 대해 이야기하겠다. 우리가 흔히 보간을 하는데 점이 주어져있다. 근데 만약 주어진 구간안에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오차가 가장 적게 되는 점을 능동적으로 선택해야하는 경우 체비쇼프가 매우 효과 적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 x를 cos&amp;theta;&amp;nbsp;으로 정의했으니 다음을 만족한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWuoLm/btsy9jMwcaU/KmmKXhoQ96riCrqcEtR3YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWuoLm/btsy9jMwcaU/KmmKXhoQ96riCrqcEtR3YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWuoLm/btsy9jMwcaU/KmmKXhoQ96riCrqcEtR3YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWuoLm%2Fbtsy9jMwcaU%2FKmmKXhoQ96riCrqcEtR3YK%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;216&quot; height=&quot;74&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 특성 때문에 n이 증가하더라도 최대 크기가 변하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tn의 x^n 항의 계수를 1로 만들면&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(최고차항의 계수가 1인 방정식을 monic polynomial 라고 함)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-1&amp;lt;= x &amp;lt;= 1 에서 가장 작은 최대값을 가지는 일원 다항식은 1/2^n-1*Tn이다. 이때 최대값은 1/2^n-1 이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JPwyi/btszdnmkEFa/2EnWn0NbIlseMHrpvAvHXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JPwyi/btszdnmkEFa/2EnWn0NbIlseMHrpvAvHXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JPwyi/btszdnmkEFa/2EnWn0NbIlseMHrpvAvHXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJPwyi%2FbtszdnmkEFa%2F2EnWn0NbIlseMHrpvAvHXK%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;356&quot; height=&quot;116&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n7RXS/btszbSHpaKk/af9R8k8Y0XlqStkfiDrkV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n7RXS/btszbSHpaKk/af9R8k8Y0XlqStkfiDrkV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n7RXS/btszbSHpaKk/af9R8k8Y0XlqStkfiDrkV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn7RXS%2FbtszbSHpaKk%2Faf9R8k8Y0XlqStkfiDrkV0%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;303&quot; height=&quot;130&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분할 차분법에서 e(x) =(x-x0)(x-x1)&amp;hellip;(x-xn)f^(n+1)(cx)/(n+1)! 이었는데 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(x-x0)(x-x1)&amp;hellip;(x-xn)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이부분을&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;체비쇼프&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;방정식을&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;통해&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;근을&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T4(x) = cos(4&amp;theta;), x = cos(&amp;theta;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cos(4&amp;theta;) = 0을 만족해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4&amp;theta; = +-&amp;pi;/2 , +- 3&amp;pi;/2 , ... (수열형태로 나타남)&lt;br /&gt;&amp;theta; = +-&amp;pi;/8 , +- 3&amp;pi;/8 , ... (수열형태로 나타남)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x= cos(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;theta;&lt;/span&gt;) = cos(&amp;pi;/8),cos(3&amp;pi;/8), ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 점들로 e^x를 근사한다면? -1과 1 구간에서 성능이 매우 좋다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분할 차분법에서 e(x) =(x-x0)(x-x1)&amp;hellip;(x-xn)f^(n+1)(cx)/(n+1)! 이었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(x-x0)(x-x1)&amp;hellip;(x-xn) &lt;span&gt;이부분을&lt;/span&gt; &lt;span&gt;체비쇼프&lt;/span&gt; &lt;span&gt;방정식을&lt;/span&gt; &lt;span&gt;통해&lt;/span&gt; &lt;span&gt;근을&lt;/span&gt; &lt;span&gt;선택한다&lt;/span&gt;.&lt;/p&gt;</description>
      <category>수치해석학</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/51</guid>
      <comments>https://dyd1310.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 26 Oct 2023 02:21:04 +0900</pubDate>
    </item>
    <item>
      <title>정보학</title>
      <link>https://dyd1310.tistory.com/48</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;차원의 저주&amp;nbsp;&lt;/h4&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&gt;ex1 ) 분류 문제&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.14.36 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQJ3FD/btsy06zatCS/4pd1ppNmbafYTJSeRxJtW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQJ3FD/btsy06zatCS/4pd1ppNmbafYTJSeRxJtW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQJ3FD/btsy06zatCS/4pd1ppNmbafYTJSeRxJtW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQJ3FD%2Fbtsy06zatCS%2F4pd1ppNmbafYTJSeRxJtW0%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;580&quot; height=&quot;272&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.14.36 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 영역을 분류하는 문제인데 어떻게 분류되는지 이해할 수 없음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.15.39 PM.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AtVju/btsy47cR7cX/ljx49wwUDns6gJT8kLnBNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AtVju/btsy47cR7cX/ljx49wwUDns6gJT8kLnBNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AtVju/btsy47cR7cX/ljx49wwUDns6gJT8kLnBNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAtVju%2Fbtsy47cR7cX%2Fljx49wwUDns6gJT8kLnBNK%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;427&quot; height=&quot;580&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.15.39 PM.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차원에서 3등분을 나누면 그냥 3등분이 나눠지는건데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이차원에선 3등분하면 9개의 공간이 나오고 3차원에서 3등분하면 27개의 공간이 나옴.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;맘대로 나누지 못함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex2) point간 거리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGlGy/btsy6jxmGBB/FzkTALEOB8VHGnRzlEdVC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGlGy/btsy6jxmGBB/FzkTALEOB8VHGnRzlEdVC1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;494&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.17.01 PM.png&quot; width=&quot;549&quot; style=&quot;width: 47.1544%; margin-right: 10px;&quot; data-widthpercent=&quot;47.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGlGy/btsy6jxmGBB/FzkTALEOB8VHGnRzlEdVC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGlGy%2Fbtsy6jxmGBB%2FFzkTALEOB8VHGnRzlEdVC1%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;1270&quot; height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eKmBZT/btsy4bUocK7/JokVRfb15cTJWMV0MfU08K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eKmBZT/btsy4bUocK7/JokVRfb15cTJWMV0MfU08K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;406&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.18.03 PM.png&quot; style=&quot;width: 51.6828%;&quot; data-widthpercent=&quot;52.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eKmBZT/btsy4bUocK7/JokVRfb15cTJWMV0MfU08K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeKmBZT%2Fbtsy4bUocK7%2FJokVRfb15cTJWMV0MfU08K%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;1144&quot; height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원이 높아질수록 가장 가까운 곳과 먼 곳의 거리가 0에 수렴하게 됨.&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;ex3) cosine similarity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 벡터간 유사도를 구하는 방법으로 내적과 벡터의 크기를 나누는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.20.14 PM.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaEnM/btsyYnnDSXY/Iut5ZA48VockyJG4DQcscK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaEnM/btsyYnnDSXY/Iut5ZA48VockyJG4DQcscK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaEnM/btsyYnnDSXY/Iut5ZA48VockyJG4DQcscK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxaEnM%2FbtsyYnnDSXY%2FIut5ZA48VockyJG4DQcscK%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;339&quot; height=&quot;76&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.20.14 PM.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 기법을 사용하면 [-1,1] 구간의 값이 나온다. 직교일때 0 (cos &amp;pi;/2 = 0), 벡터의 각도에 의존한다는 특징이 있는 기법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원이 높아질수록 이 기법을 사용할 때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.24.27 PM.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3flY7/btsy4nAasev/muDHGOi1XJo2AJ6kPZBkt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3flY7/btsy4nAasev/muDHGOi1XJo2AJ6kPZBkt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3flY7/btsy4nAasev/muDHGOi1XJo2AJ6kPZBkt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3flY7%2Fbtsy4nAasev%2FmuDHGOi1XJo2AJ6kPZBkt0%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;365&quot; height=&quot;548&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.24.27 PM.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원이 높아질수록 벡터간의 유사성이 사라져간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex4) 공의 부피&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.26.17 PM.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKgTZN/btsy3Od2lDn/X7d4BsdaVGpKakPkLBbtM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKgTZN/btsy3Od2lDn/X7d4BsdaVGpKakPkLBbtM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKgTZN/btsy3Od2lDn/X7d4BsdaVGpKakPkLBbtM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKgTZN%2Fbtsy3Od2lDn%2FX7d4BsdaVGpKakPkLBbtM0%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;247&quot; height=&quot;233&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.26.17 PM.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원이 높아질수록 공의 부피가 0에 수렴해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;차원의 축복&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex1 ) 고차원일수록 아무렇게나 만든 두 벡터가 orthogonal 하고 랜덤으로 만든 n by n random matrix이 가역적이게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.27.41 PM.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brVD6E/btsy2n8OS9f/H3y8l9qykFREsj1AkXEoy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brVD6E/btsy2n8OS9f/H3y8l9qykFREsj1AkXEoy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brVD6E/btsy2n8OS9f/H3y8l9qykFREsj1AkXEoy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrVD6E%2Fbtsy2n8OS9f%2FH3y8l9qykFREsj1AkXEoy1%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;271&quot; height=&quot;272&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.27.41 PM.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex2 ) 고차원에서&lt;span&gt; &lt;/span&gt;아이젠벨류를&lt;span&gt; &lt;/span&gt;구해봤더니&lt;span&gt; &lt;/span&gt;원안에&lt;span&gt; &lt;/span&gt;모임&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.28.11 PM.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB9wlq/btsy4cseuH0/2dLAQifLnkbY6lZBBS32r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB9wlq/btsy4cseuH0/2dLAQifLnkbY6lZBBS32r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB9wlq/btsy4cseuH0/2dLAQifLnkbY6lZBBS32r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB9wlq%2Fbtsy4cseuH0%2F2dLAQifLnkbY6lZBBS32r0%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;534&quot; height=&quot;274&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.28.11 PM.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;entropy&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보를&lt;span&gt; &lt;/span&gt;정량화하는 방법론(자주&lt;span&gt; &lt;/span&gt;보내지는&lt;span&gt; &lt;/span&gt;정보는&lt;span&gt; &lt;/span&gt;가치가&lt;span&gt; &lt;/span&gt;떨어진다&lt;span&gt; &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;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Shannon entropy&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.30.28 PM.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbloyX/btsy36yEcyb/ocuU0IH5bp9d321g9sLr4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbloyX/btsy36yEcyb/ocuU0IH5bp9d321g9sLr4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbloyX/btsy36yEcyb/ocuU0IH5bp9d321g9sLr4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbloyX%2Fbtsy36yEcyb%2FocuU0IH5bp9d321g9sLr4k%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;632&quot; height=&quot;100&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.30.28 PM.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이산 확률 변수 X ( sum(X) = 1, xi &amp;gt; 0) 에 대해 위의 식이 성립한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보의 양을 질문의 개수로 측정!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동등한&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;확률로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;정보를&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;생산하는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기계,&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;동등하지&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;않은&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;확률로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;정보를&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;생산하는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기계&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;중&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;무엇이&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;더&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 가치 있는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;정보를 생산할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확률이 같다면 정보의 가치가 높아진다. (뭐가 나올지 확률이 비슷하니까 예측하기 어려움.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.34.30 PM.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GFLWz/btsyTVZYFSi/ees9sa0kX6FQTI2EJA0YZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GFLWz/btsyTVZYFSi/ees9sa0kX6FQTI2EJA0YZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GFLWz/btsyTVZYFSi/ees9sa0kX6FQTI2EJA0YZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGFLWz%2FbtsyTVZYFSi%2Fees9sa0kX6FQTI2EJA0YZK%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;599&quot; height=&quot;216&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.34.30 PM.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.35.00 PM.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GqhMA/btsy2qR0AhO/acpg0rvX1ndKLPuk0pC1Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GqhMA/btsy2qR0AhO/acpg0rvX1ndKLPuk0pC1Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GqhMA/btsy2qR0AhO/acpg0rvX1ndKLPuk0pC1Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGqhMA%2Fbtsy2qR0AhO%2Facpg0rvX1ndKLPuk0pC1Lk%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;437&quot; height=&quot;158&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.35.00 PM.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 질문의 답은 0이다 why? 질문을 하지 않아도 1인걸 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 질문의 답은 logk 이다. -&amp;gt; k * (1/k logk) = logk&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.50.04 PM.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coWNIu/btsyVjsThVo/WKJKkrGagsq1L0qrpWMPe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coWNIu/btsyVjsThVo/WKJKkrGagsq1L0qrpWMPe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coWNIu/btsyVjsThVo/WKJKkrGagsq1L0qrpWMPe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoWNIu%2FbtsyVjsThVo%2FWKJKkrGagsq1L0qrpWMPe1%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;472&quot; height=&quot;346&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.50.04 PM.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파란색의 함수가 x, (1-x) 의 엔트로피를 합친 그래프이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x1,x2,1-x1-x2 의 엔트로피의 그래프는 3차원 상 (1/3,1/3,1/3) 의 값이 1이고 최대값인 그래프이다.&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;joint entropy&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.42.44 PM.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckOxkF/btsy35Njf2A/yBKZnUcNIkhMTmsJZ4Fm2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckOxkF/btsy35Njf2A/yBKZnUcNIkhMTmsJZ4Fm2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckOxkF/btsy35Njf2A/yBKZnUcNIkhMTmsJZ4Fm2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckOxkF%2Fbtsy35Njf2A%2FyBKZnUcNIkhMTmsJZ4Fm2K%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;467&quot; height=&quot;94&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.42.44 PM.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1BwqY/btsyYqq8prH/Uskh4yUJ8VCJOznLlCKD80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1BwqY/btsyYqq8prH/Uskh4yUJ8VCJOznLlCKD80/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;330&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.43.25 PM.png&quot; style=&quot;width: 47.0725%; margin-right: 10px;&quot; data-widthpercent=&quot;47.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1BwqY/btsyYqq8prH/Uskh4yUJ8VCJOznLlCKD80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1BwqY%2FbtsyYqq8prH%2FUskh4yUJ8VCJOznLlCKD80%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;1028&quot; height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgIkTc/btsy05NKYAC/EUk6qYJRE3qA4HEkbKbqLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgIkTc/btsy05NKYAC/EUk6qYJRE3qA4HEkbKbqLk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;296&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.43.19 PM.png&quot; data-widthpercent=&quot;52.37&quot; style=&quot;width: 51.7647%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgIkTc/btsy05NKYAC/EUk6qYJRE3qA4HEkbKbqLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgIkTc%2Fbtsy05NKYAC%2FEUk6qYJRE3qA4HEkbKbqLk%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;1014&quot; height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.45.18 PM.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKYXay/btsyWgJrPAO/7klAimUBUM2QVnidulTfu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKYXay/btsyWgJrPAO/7klAimUBUM2QVnidulTfu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKYXay/btsyWgJrPAO/7klAimUBUM2QVnidulTfu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKYXay%2FbtsyWgJrPAO%2F7klAimUBUM2QVnidulTfu1%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;516&quot; height=&quot;64&quot; data-filename=&quot;Screen Shot 2023-10-23 at 10.45.18 PM.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X와 Y가 독립일때 분리할 수 있다.&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;cross entropy&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 분포 p와 q에 두 확률 분포 p,q 에 차이를 알기위해 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 11.07.30 PM.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VevaE/btsy6f9AnfE/qiOOjhw8WmrcAkgILujOa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VevaE/btsy6f9AnfE/qiOOjhw8WmrcAkgILujOa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VevaE/btsy6f9AnfE/qiOOjhw8WmrcAkgILujOa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVevaE%2Fbtsy6f9AnfE%2FqiOOjhw8WmrcAkgILujOa1%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;391&quot; height=&quot;184&quot; data-filename=&quot;Screen Shot 2023-10-23 at 11.07.30 PM.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&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;우리는 훈련 데이터로 무작위로 x 음식에 대한 선호도(좋음 , 보통 , 싫음)이&amp;nbsp; 0.8, 0.1 , 0.1 비율로 존재한다는 걸 안다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능이 초기 값으로 0.2 , 0.2 , 0.6 비율로 존재한다고 가정했다. 이때 cross entropy가 1.5 임을 알게됬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 지표가 최소화가 되도록, 경사하강법을 사용해 최적의 파라미터를 찾아낼 수 있게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-23 at 11.25.17 PM.png&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wo5Iq/btsy3guNH60/kwlaLe5pz1SWnDKXmyviJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wo5Iq/btsy3guNH60/kwlaLe5pz1SWnDKXmyviJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wo5Iq/btsy3guNH60/kwlaLe5pz1SWnDKXmyviJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwo5Iq%2Fbtsy3guNH60%2FkwlaLe5pz1SWnDKXmyviJk%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;532&quot; height=&quot;152&quot; data-filename=&quot;Screen Shot 2023-10-23 at 11.25.17 PM.png&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KL divergence&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bz0Hs/btsy6hsNOQu/kvhbs4VY2QbIeAKbGPr5Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bz0Hs/btsy6hsNOQu/kvhbs4VY2QbIeAKbGPr5Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bz0Hs/btsy6hsNOQu/kvhbs4VY2QbIeAKbGPr5Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBz0Hs%2Fbtsy6hsNOQu%2Fkvhbs4VY2QbIeAKbGPr5Rk%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;516&quot; height=&quot;230&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크로스 엔트로피만으로는 실제 샤논 엔트로피와의 차이가 어느정도인지 직관적이지 않으니 이 둘을 빼자!&lt;/p&gt;
&lt;figure id=&quot;og_1698072762865&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;초보를 위한 정보이론 안내서 - KL divergence 쉽게 보기&quot; data-og-description=&quot;사실 KL divergence는 전혀 낯선 개념이 아니라 우리가 알고 있는 내용에 이미 들어있는 개념입니다. 두 확률분포 간의 차이를 나타내는 개념인 KL divergence가 어디서 나온 것인지 먼저 파악하고, 이&quot; data-og-host=&quot;hyunw.kim&quot; data-og-source-url=&quot;https://hyunw.kim/blog/2017/10/27/KL_divergence.html&quot; data-og-url=&quot;https://skywalker023.github.io/blog/2017/10/27/KL_divergence.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cNv5e5/hyUgMfVXWJ/pe5wt94byYzeWciNkCPYDk/img.jpg?width=2550&amp;amp;height=3300&amp;amp;face=0_0_2550_3300,https://scrap.kakaocdn.net/dn/X9kRY/hyUlvXyyML/MWp6kOSwlhCkx6o6RbKMQK/img.jpg?width=4032&amp;amp;height=1735&amp;amp;face=0_0_4032_1735&quot;&gt;&lt;a href=&quot;https://hyunw.kim/blog/2017/10/27/KL_divergence.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyunw.kim/blog/2017/10/27/KL_divergence.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cNv5e5/hyUgMfVXWJ/pe5wt94byYzeWciNkCPYDk/img.jpg?width=2550&amp;amp;height=3300&amp;amp;face=0_0_2550_3300,https://scrap.kakaocdn.net/dn/X9kRY/hyUlvXyyML/MWp6kOSwlhCkx6o6RbKMQK/img.jpg?width=4032&amp;amp;height=1735&amp;amp;face=0_0_4032_1735');&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;초보를 위한 정보이론 안내서 - KL divergence 쉽게 보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;사실 KL divergence는 전혀 낯선 개념이 아니라 우리가 알고 있는 내용에 이미 들어있는 개념입니다. 두 확률분포 간의 차이를 나타내는 개념인 KL divergence가 어디서 나온 것인지 먼저 파악하고, 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hyunw.kim&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면 젠슨 부등식으로 KL divergence 가 항상 0보다 크고 역이 성립하지 않아 거리의 개념이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그밖에도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건부 엔트로피&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-24 at 1.33.55 AM.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tndeB/btsyT1FU1xd/jTT30MjEkUxEgD59l9dXv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tndeB/btsyT1FU1xd/jTT30MjEkUxEgD59l9dXv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tndeB/btsyT1FU1xd/jTT30MjEkUxEgD59l9dXv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtndeB%2FbtsyT1FU1xd%2FjTT30MjEkUxEgD59l9dXv1%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;278&quot; height=&quot;128&quot; data-filename=&quot;Screen Shot 2023-10-24 at 1.33.55 AM.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Mutual information 등 여러 엔트로피가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-10-24 at 1.34.02 AM.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGyiTW/btsyXYog9tq/0ldRskQv7fNcyz73dGn97K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGyiTW/btsyXYog9tq/0ldRskQv7fNcyz73dGn97K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGyiTW/btsyXYog9tq/0ldRskQv7fNcyz73dGn97K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGyiTW%2FbtsyXYog9tq%2F0ldRskQv7fNcyz73dGn97K%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;349&quot; height=&quot;160&quot; data-filename=&quot;Screen Shot 2023-10-24 at 1.34.02 AM.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>빅데이터 수학 기초</category>
      <author>dyd1310</author>
      <guid isPermaLink="true">https://dyd1310.tistory.com/48</guid>
      <comments>https://dyd1310.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 24 Oct 2023 01:28:39 +0900</pubDate>
    </item>
  </channel>
</rss>