<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발자 Dongbaek</title>
    <link>https://devdongbaek.tistory.com/</link>
    <description>어제보다 더 나아진 나</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 17:15:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발자Dongbaek</managingEditor>
    <image>
      <title>개발자 Dongbaek</title>
      <url>https://tistory1.daumcdn.net/tistory/5023799/attach/383305eb3b5245d39847c30d30042e2a</url>
      <link>https://devdongbaek.tistory.com</link>
    </image>
    <item>
      <title>Spring boot 도메인 분석 설계</title>
      <link>https://devdongbaek.tistory.com/164</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1668612315130&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;실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의&quot; data-og-description=&quot;실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard&quot; data-og-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yji3t/hyQBfeFi21/M3OsADxTmIJL2k7gsbQek1/img.png?width=768&amp;amp;height=500&amp;amp;face=513_86_648_233,https://scrap.kakaocdn.net/dn/HZR66/hyQBbDmY2c/rkZZChW9GbIZqyr7Qtckd0/img.png?width=768&amp;amp;height=500&amp;amp;face=513_86_648_233,https://scrap.kakaocdn.net/dn/8aDWd/hyQB2x1F9m/IP7yYELYVqQs5wC0MHnEUK/img.png?width=1200&amp;amp;height=628&amp;amp;face=731_255_826_360&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yji3t/hyQBfeFi21/M3OsADxTmIJL2k7gsbQek1/img.png?width=768&amp;amp;height=500&amp;amp;face=513_86_648_233,https://scrap.kakaocdn.net/dn/HZR66/hyQBbDmY2c/rkZZChW9GbIZqyr7Qtckd0/img.png?width=768&amp;amp;height=500&amp;amp;face=513_86_648_233,https://scrap.kakaocdn.net/dn/8aDWd/hyQB2x1F9m/IP7yYELYVqQs5wC0MHnEUK/img.png?width=1200&amp;amp;height=628&amp;amp;face=731_255_826_360');&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 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소프트웨어 개발 단계&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;요구사항 분석&lt;/b&gt;&lt;/span&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;span style=&quot;color: #ee2323;&quot;&gt;요구명세서 작성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 시스템 명세&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;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 설계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;프로그램 설계 -&amp;nbsp; 프로그램 내의 각 모듈에서의 처리 절차나 알고리즘을 설계&lt;/li&gt;
&lt;li&gt;사용자 인터페이스 설계 - 사용자가 시스템을 사용하기 위해 보여지는 화면 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 프로그래밍&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;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 테스트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 단위 테스트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #303a3e;&quot;&gt;단위 테스트는 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 통합 테스트&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #303a3e;&quot;&gt;통합 테스트는 단위 테스트보다 더 큰 동작을 달성하기 위해 여러 모듈들을 모아 이들이 의도대로 협력하는지 확인하는 테스트이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. 인수 테스트&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #303a3e;&quot;&gt;인수 테스트는 사용자 스토리(시나리오)에 맞춰 수행하는 테스트이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;span style=&quot;color: #000000;&quot;&gt;도메인 분석 설계&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 요구사항 분석&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요구사항 명세서가 공통적으로 가지고 있는 특징들&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ID : 내부 규칙에 따라 식별자를 부여한다. 하나의 요구사항에 하나의 식별자이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;화면명 : 어느 화면에서 구현할 기능인지 기재한다. 화면에 속하지 않는 요구사항도 있을 수 있다.&lt;/li&gt;
&lt;li&gt;요구사항명 : 요구사항의 설명을 요약하여 기재한다.&lt;/li&gt;
&lt;li&gt;내용 : 요구사항의 설명을 요약하여 기재한다.&lt;/li&gt;
&lt;li&gt;중요도 : 상중하, 1~5 등 내부 규칙에 따라 부여한다.&lt;/li&gt;
&lt;li&gt;부서 / 작성자 : 요구사항을 기재한 담당자를 기재한다. 부서가 없는 경우 생략해도 무방하다.&lt;/li&gt;
&lt;li&gt;날짜 : 요구사항을 기재한 날짜를 명시한다.&lt;/li&gt;
&lt;li&gt;진행사항 (구현 여부) : 검토 예정, 진행 확정, 진행 불가, 추후 진행등 내부에서 결정된 사항을 기재한다.&lt;/li&gt;
&lt;li&gt;버젼명 : 요구사항이 변경될 수 있으므로 버전으로 표기한다.&lt;/li&gt;
&lt;li&gt;그 외 : 유형, 출처등&lt;/li&gt;
&lt;/ul&gt;
&lt;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;table style=&quot;border-collapse: collapse; width: 100%; height: 205px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;ID&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;화면명&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;중요도&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;요구사항 내용&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;날짜&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;작성자&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;진행사항&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;버젼명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;0001&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;회원&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;회원가입을 할 수있다.&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;11/16&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;동백&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;반영&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;0.1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0002&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;회원&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;찾고자 회원을 조회하여 찾을 수 있다.&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;11/16&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;동백&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;반영&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0.1.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;0003&lt;/td&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;상품&lt;/td&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;상품을 등록한다.&lt;/td&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;11/24&lt;/td&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;고길동&lt;/td&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;미반영&lt;/td&gt;
&lt;td style=&quot;height: 23px;&quot;&gt;0.2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0004&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;상품&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;등록된 상품들을 볼 수 있다.&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;12/1&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;둘리&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;미반영&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0.2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;0005&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;주문&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;상품을 주문한다.&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;12/1&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;송풍&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;미반영&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;0.2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0006&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;주문&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;주문했던 상품들의 내역을 볼 수 있다.&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&amp;nbsp;12/4&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;풍풍&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;반영&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0.3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0007&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;상품&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;상품은 재고 관리가 필요하다.&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;12/10&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;동백&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;미반영&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0.3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0008&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;상품&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;상품의 종류는 카테고리로 분류할 수 있다.&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;12/10&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;동백&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;미반영&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;0.3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;0009&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;주문&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;상품 주문시 배송 정보를 입력할 수 있다.&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;12/10&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;동백&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;미반영&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;0.3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;span style=&quot;color: #000000;&quot;&gt;2. 도메인 모델과 테이블 설계&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 모델링 단계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 업무 파악 : 요구사항 명세서등을 작성하면서, 만들고자 하는 도메인에 대해서 파악해야한다.&lt;/span&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 개념적 데이터 모델링 :&amp;nbsp; 개념적 데이터 모델링은 내가 하고자하는 일의 데이터 간의 관계를 구상하는 단계이다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;핵심 엔터티와 그들간의 관계를 발견하고, 그것을 표현하기 위해서&amp;nbsp;엔터티-관계 다이어그램(ER 다이어그램)을 생성하는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도메인 모델과 테이블 설계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSLd82/btrRlJgBu9Y/KgXjlgA08cCnBXD1Pe57wk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSLd82/btrRlJgBu9Y/KgXjlgA08cCnBXD1Pe57wk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSLd82/btrRlJgBu9Y/KgXjlgA08cCnBXD1Pe57wk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSLd82%2FbtrRlJgBu9Y%2FKgXjlgA08cCnBXD1Pe57wk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;168&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;168&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 논리적 데이터 모델링 : 구체화된 업무중심의 데이터 모델을 만들어 내는데 이것을 논리적인 데이터 모델링이라 한다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;이 단계에서 업무에 대한 Key, 속성, 관계등을 표시하며, 정규화 활동을 수행한다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원 엔티티 분석&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHm5h/btrRnZW043x/Zqa4oDnGDsupKY3nsS9kS0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHm5h/btrRnZW043x/Zqa4oDnGDsupKY3nsS9kS0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHm5h/btrRnZW043x/Zqa4oDnGDsupKY3nsS9kS0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHm5h%2FbtrRnZW043x%2FZqa4oDnGDsupKY3nsS9kS0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;256&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원(Member):&amp;nbsp;이름과&amp;nbsp;임베디드&amp;nbsp;타입인&amp;nbsp;주소(&amp;nbsp;Address&amp;nbsp;),&amp;nbsp;그리고&amp;nbsp;주문(&amp;nbsp;orders&amp;nbsp;)&amp;nbsp;리스트를&amp;nbsp;가진다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주문(Order):&amp;nbsp;한&amp;nbsp;번&amp;nbsp;주문시&amp;nbsp;여러&amp;nbsp;상품을&amp;nbsp;주문할&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;주문과&amp;nbsp;주문상품(&amp;nbsp;OrderItem&amp;nbsp;)은&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;일대다&amp;nbsp;&lt;/b&gt;&lt;/span&gt;관계 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다.&amp;nbsp;주문은&amp;nbsp;상품을&amp;nbsp;주문한&amp;nbsp;회원과&amp;nbsp;배송&amp;nbsp;정보,&amp;nbsp;주문&amp;nbsp;날짜,&amp;nbsp;주문&amp;nbsp;상태(&amp;nbsp;status&amp;nbsp;)를&amp;nbsp;가지고&amp;nbsp;있다.&amp;nbsp;주문&amp;nbsp;상태는&amp;nbsp;열 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;거형을&amp;nbsp;사용했는데&amp;nbsp;주문(&amp;nbsp;ORDER&amp;nbsp;),&amp;nbsp;취소(&amp;nbsp;CANCEL&amp;nbsp;)을&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주문상품(OrderItem):&amp;nbsp;주문한&amp;nbsp;상품&amp;nbsp;정보와&amp;nbsp;주문&amp;nbsp;금액(&amp;nbsp;orderPrice&amp;nbsp;),&amp;nbsp;주문&amp;nbsp;수량(&amp;nbsp;count&amp;nbsp;)&amp;nbsp;정보를&amp;nbsp;가지고 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;있다.&amp;nbsp;(보통&amp;nbsp;OrderLine&amp;nbsp;,&amp;nbsp;LineItem&amp;nbsp;으로&amp;nbsp;많이&amp;nbsp;표현한다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상품(Item):&amp;nbsp;이름,&amp;nbsp;가격,&amp;nbsp;재고수량(&amp;nbsp;stockQuantity&amp;nbsp;)을&amp;nbsp;가지고&amp;nbsp;있다.&amp;nbsp;상품을&amp;nbsp;주문하면&amp;nbsp;재고수량이&amp;nbsp;줄어든 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다.&amp;nbsp;상품의&amp;nbsp;종류로는&amp;nbsp;도서,&amp;nbsp;음반,&amp;nbsp;영화가&amp;nbsp;있는데&amp;nbsp;각각은&amp;nbsp;사용하는&amp;nbsp;속성이&amp;nbsp;조금씩&amp;nbsp;다르다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;배송(Delivery): 주문시 하나의 배송 정보를 생성한다. 주문과 배송은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;일대일&lt;/b&gt; &lt;/span&gt;관계다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;카테고리(Category):&amp;nbsp;상품과&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;다대다&amp;nbsp;&lt;/b&gt;&lt;/span&gt;관계를&amp;nbsp;맺는다.&amp;nbsp;parent&amp;nbsp;,&amp;nbsp;child&amp;nbsp;로&amp;nbsp;부모,&amp;nbsp;자식&amp;nbsp;카테고리를&amp;nbsp;연결한 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주소(Address): 값 타입(임베디드 타입)이다. 회원과 배송(Delivery)에서 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강사님의 한마디&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA 운영 단계에서는 다대다 관계를 쓰면 안된다! -&amp;gt; 일대다, 다대일로 풀어내야한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 아래 사진을 통해 설명하겠다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;양방향 관계가 아닌 일방향 관계를 사용해라 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 예를 들어 위 ERD에서 멤버 &amp;lt; - &amp;gt; 주문의 경우 양방향으로 관계가 맺어져있는데(외래키) 시스템은 서로를 아예 동등하게 봄으로 주문이 멤버를 필요로 한다고 보는게 맞다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원 테이블 분석&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;15.JPG&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V49x6/btrRpFwwnWk/exlHL1wumePusV2ZPuUKBk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V49x6/btrRpFwwnWk/exlHL1wumePusV2ZPuUKBk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V49x6/btrRpFwwnWk/exlHL1wumePusV2ZPuUKBk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV49x6%2FbtrRpFwwnWk%2FexlHL1wumePusV2ZPuUKBk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;377&quot; data-filename=&quot;15.JPG&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ITEM:&amp;nbsp;앨범,&amp;nbsp;도서,&amp;nbsp;영화&amp;nbsp;타입을&amp;nbsp;통합해서&amp;nbsp;하나의&amp;nbsp;테이블로&amp;nbsp;만들었다.&amp;nbsp;DTYPE&amp;nbsp;컬럼으로&amp;nbsp;타입을&amp;nbsp;구분한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;싱글 테이블 전략&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA 운영 단계에서는 다대다 관계를 쓰면 안된다! -&amp;gt; 일대다, 다대일로 풀어내야한다.&lt;/span&gt;&lt;/b&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;그렇기에 중간 카테고리_아이템 테이블을 만들어서 카테고리(1) &amp;lt;-&amp;gt; 카테고리_아이템(N), 카테고리_아이템(N) &amp;lt;-&amp;gt; 아이템(1)을 만들었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원과&amp;nbsp;주문:&amp;nbsp;일대다&amp;nbsp;,&amp;nbsp;다대일의&amp;nbsp;양방향&amp;nbsp;관계다.&amp;nbsp;따라서&amp;nbsp;연관관계의&amp;nbsp;주인을&amp;nbsp;정해야&amp;nbsp;하는데,&amp;nbsp;&lt;u&gt;외래&amp;nbsp;키가&amp;nbsp;있는&amp;nbsp;주 &lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;문을&amp;nbsp;연관관계의&amp;nbsp;주인으로&amp;nbsp;정하는&amp;nbsp;것이&amp;nbsp;좋다.&lt;/u&gt;&amp;nbsp;그러므로&amp;nbsp;Order.member&amp;nbsp;를&amp;nbsp;ORDERS.MEMBER_ID&amp;nbsp;외래&amp;nbsp;키와 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;매핑한다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주문상품과&amp;nbsp;주문:&amp;nbsp;다대일&amp;nbsp;양방향&amp;nbsp;관계다.&amp;nbsp;외래&amp;nbsp;키가&amp;nbsp;주문상품에&amp;nbsp;있으므로&amp;nbsp;주문상품이&amp;nbsp;연관관계의&amp;nbsp;주인이다.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러므로&amp;nbsp;OrderItem.order&amp;nbsp;를&amp;nbsp;ORDER_ITEM.ORDER_ID&amp;nbsp;외래&amp;nbsp;키와&amp;nbsp;매핑한다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주문상품과&amp;nbsp;상품:&amp;nbsp;다대일&amp;nbsp;단방향&amp;nbsp;관계다.&amp;nbsp;OrderItem.item&amp;nbsp;을&amp;nbsp;ORDER_ITEM.ITEM_ID&amp;nbsp;외래&amp;nbsp;키와&amp;nbsp;매핑한 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주문과&amp;nbsp;배송:&amp;nbsp;일대일&amp;nbsp;양방향&amp;nbsp;관계다.&amp;nbsp;Order.delivery&amp;nbsp;를&amp;nbsp;ORDERS.DELIVERY_ID&amp;nbsp;외래&amp;nbsp;키와&amp;nbsp;매핑한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;카테고리와&amp;nbsp;상품:&amp;nbsp;@ManyToMany&amp;nbsp;를&amp;nbsp;사용해서&amp;nbsp;매핑한다.(실무에서&amp;nbsp;@ManyToMany는&amp;nbsp;사용하지&amp;nbsp;말자.&amp;nbsp;여기 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서는&amp;nbsp;다대다&amp;nbsp;관계를&amp;nbsp;예제로&amp;nbsp;보여주기&amp;nbsp;위해&amp;nbsp;추가했을&amp;nbsp;뿐이다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강사님의 한마디&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;외래 키가 있는 곳(N측)을 연관관계의 주인으로 정해라. &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;gt; 연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지 비즈니스상 우위에 있다고 주인으로 정하면 &lt;br /&gt;안된다.. 예를 들어서 자동차와 바퀴가 있으면, 사람들은 당연히 자동차가 중요하다고 생각을 하는데 이는 DB 설계에서는 잘못된 것이다. &lt;b&gt;일대다 관계에서 항상 다쪽에 외래 키가 있으므로&lt;/b&gt; 외래 키가 있는&amp;nbsp;바퀴를&amp;nbsp;연관관계의&amp;nbsp;주인으로&amp;nbsp;정하면&amp;nbsp;된다.&amp;nbsp;물론&amp;nbsp;자동차를&amp;nbsp;연관관계의&amp;nbsp;주인으로&amp;nbsp;정하는&amp;nbsp;것이&amp;nbsp;불가능&amp;nbsp;한 &lt;br /&gt;것은&amp;nbsp;아니지만,&amp;nbsp;자동차를&amp;nbsp;연관관계의&amp;nbsp;주인으로&amp;nbsp;정하면&amp;nbsp;자동차가&amp;nbsp;관리하지&amp;nbsp;않는&amp;nbsp;바퀴&amp;nbsp;테이블의&amp;nbsp;외래&amp;nbsp;키&amp;nbsp;값이 &lt;br /&gt;업데이트&amp;nbsp;되므로&amp;nbsp;관리와&amp;nbsp;유지보수가&amp;nbsp;어렵고,&amp;nbsp;추가적으로&amp;nbsp;별도의&amp;nbsp;업데이트&amp;nbsp;쿼리가&amp;nbsp;발생하는&amp;nbsp;성능&amp;nbsp;문제도&amp;nbsp;있 &lt;br /&gt;다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 물리적 데이터 모델링 : 최종적을 데이터를 관리할 데이터베이스를 선택하고, 선택한 데이터베이스에 실제 테이블을 만드는 작업을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엔티티 클래스 개발&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;실무에서는 가급적 Getter는 열어두고, Setter는 꼭 필요한 경우에만 사용하는 것을 추천&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이론적으로 Getter, Setter 모두 제공하지 않고, 꼭 필요한 별도의 메서드를 제공하는게 가장 이상적&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다.&amp;nbsp;하지만&amp;nbsp;실무에서&amp;nbsp;엔티티의&amp;nbsp;데이터는&amp;nbsp;조회할&amp;nbsp;일이&amp;nbsp;너무&amp;nbsp;많으므로,&amp;nbsp;Getter의&amp;nbsp;경우&amp;nbsp;모두&amp;nbsp;열어두는&amp;nbsp;것이&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;편리하다.&amp;nbsp;Getter는&amp;nbsp;아무리&amp;nbsp;호출해도&amp;nbsp;호출&amp;nbsp;하는&amp;nbsp;것&amp;nbsp;만으로&amp;nbsp;어떤&amp;nbsp;일이&amp;nbsp;발생하지는&amp;nbsp;않는다.&amp;nbsp;하지만&amp;nbsp;Setter는&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제가&amp;nbsp;다르다.&amp;nbsp;Setter를&amp;nbsp;호출하면&amp;nbsp;데이터가&amp;nbsp;변한다.&amp;nbsp;Setter를&amp;nbsp;막&amp;nbsp;열어두면&amp;nbsp;가까운&amp;nbsp;미래에&amp;nbsp;엔티티에가&amp;nbsp;도대&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;체&amp;nbsp;왜&amp;nbsp;변경되는지&amp;nbsp;추적하기&amp;nbsp;점점&amp;nbsp;힘들어진다.&amp;nbsp;그래서&amp;nbsp;엔티티를&amp;nbsp;변경할&amp;nbsp;때는&amp;nbsp;Setter&amp;nbsp;대신에&amp;nbsp;변경&amp;nbsp;지점이&amp;nbsp;명확&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉 엔티티에는 가급적 Setter를 사용하지 말자&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDL로 생성 후 반드시 그대로 사용하는 것이 아닌 만들어진 테이블과 필드들을 검토하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원 엔티티&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668615096223&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter // Lombok을 사용하기에 게터 세터 어노테이션 가능
public class Member {

    @Id @GeneratedValue
    // 엔티티는 타입(ex:Meber)가 있으므로, id 필드만으로 구별이 쉽지만, DB의 경우 타입이 없기에 id라고 이름을 지으면 구별하기 어렵다.
    @Column(name = &quot;member_id&quot;) // 보통 '테이블명+id'를 많이 사용한다. member_id라는 컬럼에 매핑한다.
    private Long id;

    private String username;

    @Embedded // 내장 타입을 포함했다는 의미
    private Address address;

    // 양방향 연관관계에서 주인이 아닌 쪽(1)은 MappedBy 속성을 넣어주고, 값은 연관 관계 주인인 Order.member
    // mappedBy를 지정해주면, 읽기 전용 필드가 되고, 값을 생성, 변경할 수 없다.
    // Order 테이블에 있는 member 필드에 의해서 나는 매핑된거야!
    @OneToMany(mappedBy = &quot;member&quot;)
    private List&amp;lt;Order&amp;gt; orders = new ArrayList&amp;lt;&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&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;&lt;span style=&quot;color: #000000;&quot;&gt;주문 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668747954645&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = &quot;orders&quot;) // 테이블 이름을 지정하지않으면 자동으로 Order
@Getter @Setter
public class Order {

    @Id @GeneratedValue
    @Column(name = &quot;order_id&quot;) // DB 컬럼 명을 DB이름_필드이름
    private Long id;

    // 회원(1) : 주문(N)이기에, 주문(N)Many에 to 회원 외래키(FK)One를 둔다.
    @ManyToOne(fetch = FetchType.LAZY) // FetchType.Lazy는 JPA의 프록시와 지연로딩의 기초적인 내용을 공부해야한다.
    @JoinColumn(name = &quot;member_id&quot;) // FK이름 지정
    private Member member; // Order.member

    // 양방향 연관관계 -&amp;gt; 양쪽에 모두 서로의 외래키가 존재하는 경우
    // Db는 외래키 하나만 바꾸면 되지만, 객체 지향은 둘 다 바꿔줘야 한다. 이 간극을 해결하기 위해서 객체 지향에서 둘 중 하나를 주인으로 정한다.
    // 이 경우는 연관관계 주인을 정해주어야 한다. 그 이유는 Order.member를 통해 값을 바꿀 수도있고, Member.orders를 통해 값을 바꿀 수 있기에
    // 예를 들어 Order.member는 값을 변경했는데, 연관된 Member.orders는 값이 변경되지 않은 경우 둘 중 뭘 믿어야할지 JPA는 어려워함
    // 그래서 둘 중 N측(Order)을 주인으로 설정한다.
    // 그렇게하면 Order.member를 변경했을 경우, JPA는 Order.member를 변경했다는 것을 인지하고, 그 것을 중점으로 DB 업데이트를 한다.


    // 양방향 연관관계에서 주인이 아닌 쪽(1)은 MappedBy 속성을 넣어주고, 값은 연관 관계 주인인 OrderItem.order
    @OneToMany(mappedBy = &quot;order&quot;, cascade = CascadeType.ALL) // 부모 엔티티가 영속화될 때 자식 엔티티도 같이 영속화되고, 부모 엔티티가 삭제될 때 자식 엔티티도 삭제되는 등 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 전이되는 것을 의미합니다.
    // cascade = CascadeType.ALL를 통해서 orderItems에 데이터를 넣어두고,
    private List&amp;lt;OrderItem&amp;gt; orderItems = new ArrayList&amp;lt;&amp;gt;();

    /* 기존 방식 = 1. Order 엔티티 저장하고 2. 그다음 Order.OrderItem들을 엔티티당 각각 persist를 호출해야 했음.\
        3. 그다음 마지막으로 다시 Order를 Persist 해줘야함.
     persist(orderItemA)
     persist(orderItemB)
     persist(orderItemC)
     persist(order)
     */

    /* 현재 방식 = Casacade.All은 persist를 전파시켜주어서(영속성 전이), Order를 persist하면 Order.orderItems를 같이 persist해준다.
        삭제 또한 마찬가지로 같이 진행해준다.
    persist(order)
     */

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    // Order.delivery또한 Order가 persist될 때 같이 persist된다.
    @JoinColumn(name = &quot;delivery_id&quot;)
    private Delivery delivery; // 배송 정보

    private LocalDateTime orderDate; // 주문 시간
    
    @Enumerated(EnumType.STRING)
    private OrderStatus status; // 주문상태 [ORDER. CANCEL]

    //==연관 관계 메소드==//
    /*
    양방향 관계의
    Order랑 Member가 있을 때, Member가 주문하면 Member.orders에도 넣어주어야한다.
    그리고 Order.member에도 저장을 해야한다.

     */

    public void setMember(Member member){ // 주문한 멤버를 세팅할 때,
        this.member = member; // Order.member에 멤버를 넣어준다.
        member.getOrders().add(this); // Order.member.orders에도 해당 주문을 넣어준다. 즉 this는 Order 객체를 가리킨다.
    }

    public void addOrderItem(OrderItem orderItem){
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }

    public void setDelivery(Delivery delivery) {
        this.delivery = delivery;
        delivery.setOrder(this);
    }
}&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주소 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668746528086&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

import lombok.Getter;

import javax.persistence.Embeddable;

@Embeddable // JPA Entity안의 Column을 하나의 객체로써 사용을 하고 싶을 때 사용, 어딘가에 내장될 수 있음을 알림
@Getter // 값 타입은 반드시 Getter만 사용하자. 그 이유는 생성될 때의 값이 변경되면 안되기 때문이다.
public class Address {

    // 다른 엔티티에서 Address안의 엔티티를 Address라는 하나의 객체로 사용할 수 있다.
    private String city;
    private String streets;
    private String zipcode;

    // public, protected중 protected로 설정하는 것을 추천
    protected Address() { // JPA가 생성할 때 @Embeddable가 있는 클래스는 리프랙션, 프록시등의 기술을 사용하기 위해서,기본 생성자를 요구한다.

    }

    // &amp;gt; 참고: 값 타입은 변경 불가능하게 설계해야 한다.
    //&amp;gt; @Setter 를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스를 만들자. JPA 스펙상 엔티
    // 티나 임베디드 타입( @Embeddable )은 자바 기본 생성자(default constructor)를 public 또는
    // protected 로 설정해야 한다. public 으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전
    // 하다.
    //&amp;gt; JPA가 이런 제약을 두는 이유는 JPA 구현 라이브러리가 객체를 생성할 때 리플랙션 같은 기술을 사용할 수있도록 지원해야 하기 때문이다
    public Address(String city, String streets, String zipcode) {
        this.city = city;
        this.streets = streets;
        this.zipcode = zipcode;
    }

}&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주문 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748034456&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = &quot;orders&quot;) // 테이블 이름을 지정하지않으면 자동으로 Order
@Getter @Setter
public class Order {

    @Id @GeneratedValue
    @Column(name = &quot;order_id&quot;) // DB 컬럼 명을 DB이름_필드이름
    private Long id;

    // 회원(1) : 주문(N)이기에, 주문(N)Many에 to 회원 외래키(FK)One를 둔다.
    @ManyToOne(fetch = FetchType.LAZY) // FetchType.Lazy는 JPA의 프록시와 지연로딩의 기초적인 내용을 공부해야한다.
    @JoinColumn(name = &quot;member_id&quot;) // FK이름 지정
    private Member member; // Order.member

    // 양방향 연관관계 -&amp;gt; 양쪽에 모두 서로의 외래키가 존재하는 경우
    // Db는 외래키 하나만 바꾸면 되지만, 객체 지향은 둘 다 바꿔줘야 한다. 이 간극을 해결하기 위해서 객체 지향에서 둘 중 하나를 주인으로 정한다.
    // 이 경우는 연관관계 주인을 정해주어야 한다. 그 이유는 Order.member를 통해 값을 바꿀 수도있고, Member.orders를 통해 값을 바꿀 수 있기에
    // 예를 들어 Order.member는 값을 변경했는데, 연관된 Member.orders는 값이 변경되지 않은 경우 둘 중 뭘 믿어야할지 JPA는 어려워함
    // 그래서 둘 중 N측(Order)을 주인으로 설정한다.
    // 그렇게하면 Order.member를 변경했을 경우, JPA는 Order.member를 변경했다는 것을 인지하고, 그 것을 중점으로 DB 업데이트를 한다.


    // 양방향 연관관계에서 주인이 아닌 쪽(1)은 MappedBy 속성을 넣어주고, 값은 연관 관계 주인인 OrderItem.order
    @OneToMany(mappedBy = &quot;order&quot;, cascade = CascadeType.ALL) // 부모 엔티티가 영속화될 때 자식 엔티티도 같이 영속화되고, 부모 엔티티가 삭제될 때 자식 엔티티도 삭제되는 등 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 전이되는 것을 의미합니다.
    // cascade = CascadeType.ALL를 통해서 orderItems에 데이터를 넣어두고,
    private List&amp;lt;OrderItem&amp;gt; orderItems = new ArrayList&amp;lt;&amp;gt;();

    /* 기존 방식 = 1. Order 엔티티 저장하고 2. 그다음 Order.OrderItem들을 엔티티당 각각 persist를 호출해야 했음.\
        3. 그다음 마지막으로 다시 Order를 Persist 해줘야함.
     persist(orderItemA)
     persist(orderItemB)
     persist(orderItemC)
     persist(order)
     */

    /* 현재 방식 = Casacade.All은 persist를 전파시켜주어서(영속성 전이), Order를 persist하면 Order.orderItems를 같이 persist해준다.
        삭제 또한 마찬가지로 같이 진행해준다.
    persist(order)
     */

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    // Order.delivery또한 Order가 persist될 때 같이 persist된다.
    @JoinColumn(name = &quot;delivery_id&quot;)
    private Delivery delivery; // 배송 정보

    private LocalDateTime orderDate; // 주문 시간
    
    @Enumerated(EnumType.STRING)
    private OrderStatus status; // 주문상태 [ORDER. CANCEL]

    //==연관 관계 메소드==//
    /*
    양방향 관계의
    Order랑 Member가 있을 때, Member가 주문하면 Member.orders에도 넣어주어야한다.
    그리고 Order.member에도 저장을 해야한다.

     */

    public void setMember(Member member){ // 주문한 멤버를 세팅할 때,
        this.member = member; // Order.member에 멤버를 넣어준다.
        member.getOrders().add(this); // Order.member.orders에도 해당 주문을 넣어준다. 즉 this는 Order 객체를 가리킨다.
    }

    public void addOrderItem(OrderItem orderItem){
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }

    public void setDelivery(Delivery delivery) {
        this.delivery = delivery;
        delivery.setOrder(this);
    }
}&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;&lt;span style=&quot;color: #000000;&quot;&gt;주문아이템 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748080909&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

import com.jpabook.jpashop.domain.Item.Item;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Table(name=&quot;order_item&quot;)
@Getter @Setter
public class OrderItem { // 주문(1) - 주문&amp;amp;아이템(N) - 아이템(1)

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = &quot;item_id&quot;)
    private Item item; // 주문 상품

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = &quot;order_id&quot;)
    private Order order; // 주문

    private int orderPrice; // 주문 당시의 가격
    private int count; // 주문 당시의 수량

}&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;&lt;span style=&quot;color: #000000;&quot;&gt;아이템 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748094439&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain.Item;

import com.jpabook.jpashop.domain.Category;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 상속관계 전략을 부모 엔티티(클래스)에 해주어야한다.
// 싱글 테이블 전략시 부모 엔티티를 기준으로 자식 엔티티들이 모두 한 테이블에 생성된다.
@DiscriminatorColumn(name = &quot;dtype&quot;) // type별로 구분하는 것
@Getter @Setter
public abstract class Item { // 추상 클래스(부모 클래스)

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

    private String name;

    private int price;

    private int stockQuantity;

    @ManyToMany(mappedBy = &quot;items&quot;)
    private List&amp;lt;Category&amp;gt; cagegories = new ArrayList&amp;lt;Category&amp;gt;();
}&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;&lt;span style=&quot;color: #000000;&quot;&gt;앨범 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748130768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain.Item;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue(&quot;M&quot;)
@Getter @Setter
public class Movie extends Item {

    private String director;
    private String actor;
}&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #000000;&quot;&gt;책 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748145567&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain.Item;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue(&quot;B&quot;) // 싱글 테이블이기에, DB에서는 자식 테이블들을 분리할 기준이 필요하다.
@Getter @Setter
public class Book extends Item {

    private String author;
    private String isbn;
}&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #000000;&quot;&gt;영화 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748154291&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain.Item;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue(&quot;M&quot;)
@Getter @Setter
public class Movie extends Item {

    private String director;
    private String actor;
}&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;카테고리 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748186016&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

import com.jpabook.jpashop.domain.Item.Item;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
public class Category {

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

    private String name;

    // ManyToMany는 최대한 피하는게 좋고, 중간 테이블을 만들어주는 게 맞다.
    // ex) 카테고리 - 카테고리&amp;amp;아이템 - 아이템
    // 다대다관계는 @JoinTable을 통해서 중간 테이블을 만들어주어야한다.
    // @JoinTable은 각 테이블들의 PK값들을 인자로 받아서, 중계 테이블을 만들어준다.
    // 실전에서 사용하지않는 이유는 중간 테이블에 각 테이블 PK 말고는 값을 추가할 수 없기 때문이다.
    @ManyToMany
    @JoinTable(name = &quot;category_item&quot;,
            joinColumns = @JoinColumn(name = &quot;category_id&quot;), // joinColumns는 중간 테이블에 있는 category_id
            inverseJoinColumns = @JoinColumn(name = &quot;item_id&quot;)) // inverseJoinColumns는 중간 테이블에 있는 item_id
    private List&amp;lt;Item&amp;gt; items = new ArrayList&amp;lt;&amp;gt;();

    // Category 구조는 같은 엔티티 내의 계층구조이다. 카테고리(부모) 1 : N 카테고리(자식)
    // 부모는 하나이니까 ManyToOne
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = &quot;parent_id&quot;)
    private Category parent;

    // 자식은 여러개니까 OneToMany
    @OneToMany(mappedBy = &quot;parent&quot;) //
    private List&amp;lt;Category&amp;gt; child = new ArrayList&amp;lt;&amp;gt;();

    //==연관관계 메소드==//
    public void addChildCategory(Category child) {
        this.child.add(child);
        child.setParent(this);
    }
}&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;배송 엔티티&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1668748232455&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Getter @Setter
public class Delivery {

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

    // OneToOne 또한 반드시 연관관계의 주인을 정해주어야한다.
    // 이 때 주인은 어느쪽에서 더 많이 참조하는지를 보면서 정하면 된다. 예를 들어서
    // 유저가 주문.배송을 찾는 것과 배송.주문을 찾는 것중 주문.배송을 더 많이 찾기에 주문에 FK를 넣는다.
    @OneToOne(mappedBy = &quot;delivery&quot;, fetch = FetchType.LAZY)
    private Order order;

    @Embedded
    private Address address;

    // Enum Type은 무조건 STRING으로 하자. ORDINAL로 할 경우 도중 데이터 변경시 장애가 생긴다.
    @Enumerated(EnumType.STRING)
    private DeliveryStatus status; // ENUM [READY(준비), COMP(배송)]

}&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;h4 data-ke-size=&quot;size20&quot;&gt;Enum 클래스들&lt;/h4&gt;
&lt;pre id=&quot;code_1668748258327&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

public enum DeliveryStatus {
    READY, COMP
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668748265945&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop.domain;

public enum OrderStatus {
    ORDER, CANCEL
}&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;&lt;a href=&quot;https://galid1.tistory.com/592&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://galid1.tistory.com/592&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668615389128&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 - Entity의 가독성을 높이자(@Embedded, @Embeddable, @AttributeOverride 사용법)&quot; data-og-description=&quot;@Embedded, @AttributeOverride JPA에서는 Entity안의 값을 조금 더 의미있는 값으로 표현하기 위해 응집된 하나의 객체로 데이터를 표현합니다. 이번 포스팅에서는 이 처럼 JPA의 Entity를 조금 더 확실한 의&quot; data-og-host=&quot;galid1.tistory.com&quot; data-og-source-url=&quot;https://galid1.tistory.com/592&quot; data-og-url=&quot;https://galid1.tistory.com/592&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FvlJF/hyQBchXQUW/wNDtpTe77C0CmdpBi5xN31/img.png?width=613&amp;amp;height=237&amp;amp;face=0_0_613_237,https://scrap.kakaocdn.net/dn/5RbUK/hyQBX4zbAm/VXdflaUOMC7kTHEBAZZ2Ak/img.png?width=613&amp;amp;height=237&amp;amp;face=0_0_613_237,https://scrap.kakaocdn.net/dn/hjTv6/hyQBVr8R0U/Qe4EMMDhUDSmydvbeBejK1/img.png?width=746&amp;amp;height=266&amp;amp;face=0_0_746_266&quot;&gt;&lt;a href=&quot;https://galid1.tistory.com/592&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://galid1.tistory.com/592&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FvlJF/hyQBchXQUW/wNDtpTe77C0CmdpBi5xN31/img.png?width=613&amp;amp;height=237&amp;amp;face=0_0_613_237,https://scrap.kakaocdn.net/dn/5RbUK/hyQBX4zbAm/VXdflaUOMC7kTHEBAZZ2Ak/img.png?width=613&amp;amp;height=237&amp;amp;face=0_0_613_237,https://scrap.kakaocdn.net/dn/hjTv6/hyQBVr8R0U/Qe4EMMDhUDSmydvbeBejK1/img.png?width=746&amp;amp;height=266&amp;amp;face=0_0_746_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;JPA - Entity의 가독성을 높이자(@Embedded, @Embeddable, @AttributeOverride 사용법)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;@Embedded, @AttributeOverride JPA에서는 Entity안의 값을 조금 더 의미있는 값으로 표현하기 위해 응집된 하나의 객체로 데이터를 표현합니다. 이번 포스팅에서는 이 처럼 JPA의 Entity를 조금 더 확실한 의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;galid1.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;span style=&quot;color: #000000;&quot;&gt;엔티티 설계시 주의점&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Setter가 모두 열려있다. 변경 포인트가 너무 많아서, 유지보수가 어렵다. 나중에 리펙토링으로 Setter 제거&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;세터 없이 개발하는 방법은 추후 설명을 해주신다고 하셨음.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;모든&amp;nbsp;연관관계는&amp;nbsp;지연로딩으로&amp;nbsp;설정!&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉시로딩은 예를 들어서 멤버를 조회할 때 연관된 주문도 한번에 조회하는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉시로딩(&amp;nbsp;EAGER&amp;nbsp;)은&amp;nbsp;예측이&amp;nbsp;어렵고,&amp;nbsp;어떤&amp;nbsp;SQL이&amp;nbsp;실행될지&amp;nbsp;추적하기&amp;nbsp;어렵다.&amp;nbsp;특히&amp;nbsp;JPQL을&amp;nbsp;실행할&amp;nbsp;때&amp;nbsp;N+1&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제가 자주 발생한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;N+1을 쉽게 설명하면 멤버를 조회할 때 연관된 모든 테이블들을 조회하는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;N+1의 뜻은 날린 쿼리는 1개인데, 그에 따른 결과 쿼리는 N개임을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실무에서&amp;nbsp;모든&amp;nbsp;연관관계는&amp;nbsp;지연로딩(&amp;nbsp;LAZY&amp;nbsp;)으로&amp;nbsp;설정해야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;연관된 엔티티를 함께 DB에서 조회하고자 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@XToOne(OneToOne,&amp;nbsp;ManyToOne)&amp;nbsp;관계는&amp;nbsp;기본이&amp;nbsp;즉시로딩이므로&amp;nbsp;직접&amp;nbsp;지연로딩으로&amp;nbsp;설정해야&amp;nbsp;한 &lt;br /&gt;다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Fetch join과 엔티티 그래프는 뭘까???&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컬렉션은&amp;nbsp;필드에서&amp;nbsp;초기화&amp;nbsp;하자.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;What Collection : &lt;a href=&quot;https://gangnam-americano.tistory.com/41&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gangnam-americano.tistory.com/41&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컬렉션은&amp;nbsp;필드에서&amp;nbsp;바로&amp;nbsp;초기화&amp;nbsp;하는&amp;nbsp;것이&amp;nbsp;안전하다. &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;null&amp;nbsp;문제에서&amp;nbsp;안전하다. &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하이버네이트는&amp;nbsp;엔티티를&amp;nbsp;영속화&amp;nbsp;할&amp;nbsp;때,&amp;nbsp;컬랙션을&amp;nbsp;감싸서&amp;nbsp;하이버네이트가&amp;nbsp;제공하는&amp;nbsp;내장&amp;nbsp;컬렉션으로&amp;nbsp;변경한 &lt;br /&gt;다.&amp;nbsp;만약&amp;nbsp;getOrders()&amp;nbsp;처럼&amp;nbsp;임의의&amp;nbsp;메서드에서&amp;nbsp;컬력션을&amp;nbsp;잘못&amp;nbsp;생성하면&amp;nbsp;하이버네이트&amp;nbsp;내부&amp;nbsp;메커니즘에&amp;nbsp;문 &lt;br /&gt;제가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;따라서&amp;nbsp;필드레벨에서&amp;nbsp;생성하는&amp;nbsp;것이&amp;nbsp;가장&amp;nbsp;안전하고,&amp;nbsp;코드도&amp;nbsp;간결하다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;JPA에서 컬렉션은 언제 사용될까???&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하이버네이트&amp;nbsp;기존&amp;nbsp;구현:&amp;nbsp;엔티티의&amp;nbsp;필드명을&amp;nbsp;그대로&amp;nbsp;테이블의&amp;nbsp;컬럼명으로&amp;nbsp;사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하이버네이트 신규 구현: 엔티티의 필드명을 테이블의 컬럼명 스타일에 맞게 아래와 같이 바꿔준다.&lt;/span&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링&amp;nbsp;부트&amp;nbsp;신규&amp;nbsp;설정&amp;nbsp;(엔티티(필드) &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; &lt;/span&gt;테이블(컬럼))&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;카멜&amp;nbsp;케이스 &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; &lt;/span&gt;언더스코어(memberPoint&amp;nbsp;member_point)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.(점) &lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt; _(언더스코어)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. 대문자 &amp;rarr; 소문자&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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>강의 정리/Spring 기초</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/164</guid>
      <comments>https://devdongbaek.tistory.com/164#entry164comment</comments>
      <pubDate>Fri, 18 Nov 2022 14:11:18 +0900</pubDate>
    </item>
    <item>
      <title>Spring 실전편</title>
      <link>https://devdongbaek.tistory.com/163</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://spring.io/guides&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://spring.io/guides&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1668445511793&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 | Guides&quot; data-og-description=&quot; &quot; data-og-host=&quot;spring.io&quot; data-og-source-url=&quot;https://spring.io/guides&quot; data-og-url=&quot;https://spring.io/guides&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://spring.io/guides&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spring.io/guides&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;Spring | Guides&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;spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;공식 문서는 사랑이다&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;순서&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 프로젝트 환경설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 요구사항 분석&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 도메인과 엔티티, 테이블 설계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 아키텍쳐 구성(Controller, Service, Repository)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 핵심 비즈니스 로직 개발(회원, 상품, 주문)&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;회원, 상품, 주문 도메인 개발&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;핵심 비즈니스 로직 개발&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트 케이스 검증&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도메인 주도 설계 이해&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 테스트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7. 웹 계층 개발&lt;/span&gt;&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;span style=&quot;color: #000000;&quot;&gt;학습 방법&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처음부터 끝까지 직접 코딩하면서 공부하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;강의 목표&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기술(Spring, JPA)들을 이미 알고있는 사람들이, 최대한 기술을 잘 사용할 수 있게 만들어주는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트 환경설정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 프로젝트 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1-1. &lt;a href=&quot;https://start.spring.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://start.spring.io/&lt;/a&gt; 에서 기본 설정들을 저장하고, 프로젝트 생성(generate)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTtYp/btrRb7uG2W3/jSJZ2fjklJwAl4TktoALXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTtYp/btrRb7uG2W3/jSJZ2fjklJwAl4TktoALXK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTtYp/btrRb7uG2W3/jSJZ2fjklJwAl4TktoALXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTtYp%2FbtrRb7uG2W3%2FjSJZ2fjklJwAl4TktoALXK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;809&quot; height=&quot;916&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;916&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-2. 파일 압축 풀고, 저장후 IntelliJ에서 import나 Open을 통해서 폴더를 열어준다.&lt;/p&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-3. build gradle을 확인해주고, main 디렉토리의 Application, Test 실행해보고, 정상적으로 실행되는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// 혹시나&lt;b&gt; invalid source release&lt;/b&gt; 에러가 생겼다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sohee-dev.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sohee-dev.tistory.com/134&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668438475911&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/ Spring Boot] IntelliJ - invalid source release 해결 방법&quot; data-og-description=&quot;  에러 내용 Execution failed for task ':compileJava'. &amp;gt; invalid source release: 11 JDK 버전과 project language level이 달라서 생기는 에러입니다.   해결 방법 File -&amp;gt; Project Structure 저는 Project language level 이 11로 설&quot; data-og-host=&quot;sohee-dev.tistory.com&quot; data-og-source-url=&quot;https://sohee-dev.tistory.com/134&quot; data-og-url=&quot;https://sohee-dev.tistory.com/134&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eq0p0b/hyQzkmJaZm/CftkMi1F0onBg2xI1iXQR1/img.png?width=468&amp;amp;height=910&amp;amp;face=0_0_468_910,https://scrap.kakaocdn.net/dn/cVoiYc/hyQBaCMo3U/JHu4A6KAfpBrYbK16KPCL1/img.png?width=468&amp;amp;height=910&amp;amp;face=0_0_468_910,https://scrap.kakaocdn.net/dn/bv82B3/hyQznKxFv0/n0XMkrrMRejqcj02CZqXCk/img.png?width=2806&amp;amp;height=824&amp;amp;face=0_0_2806_824&quot;&gt;&lt;a href=&quot;https://sohee-dev.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sohee-dev.tistory.com/134&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eq0p0b/hyQzkmJaZm/CftkMi1F0onBg2xI1iXQR1/img.png?width=468&amp;amp;height=910&amp;amp;face=0_0_468_910,https://scrap.kakaocdn.net/dn/cVoiYc/hyQBaCMo3U/JHu4A6KAfpBrYbK16KPCL1/img.png?width=468&amp;amp;height=910&amp;amp;face=0_0_468_910,https://scrap.kakaocdn.net/dn/bv82B3/hyQznKxFv0/n0XMkrrMRejqcj02CZqXCk/img.png?width=2806&amp;amp;height=824&amp;amp;face=0_0_2806_824');&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/ Spring Boot] IntelliJ - invalid source release 해결 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  에러 내용 Execution failed for task ':compileJava'. &amp;gt; invalid source release: 11 JDK 버전과 project language level이 달라서 생기는 에러입니다.   해결 방법 File -&amp;gt; Project Structure 저는 Project language level 이 11로 설&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sohee-dev.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-4. http://127.0.0.1:8080로 접속해보기&lt;/p&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.5 lombok 설치가 잘되었는지 확인하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;windows 기준 : File - settings - 검색창에 plugins 서치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lombok이 잘 설치되어있다면 File - settings - 검색창에 Annotation processor 서치후 Enable 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 아무 클래스나 만들고 @Getter @Setter등의 어노테이션을 적어보기&lt;/p&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라이브러리에 대해서&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;Gradle은 의존관계가 있는 라이브러리를 함께 다운로드한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnuFTJ/btrRfIUgPY7/OwTyskHH2hAyJ94ne0jzt1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnuFTJ/btrRfIUgPY7/OwTyskHH2hAyJ94ne0jzt1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnuFTJ/btrRfIUgPY7/OwTyskHH2hAyJ94ne0jzt1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnuFTJ%2FbtrRfIUgPY7%2FOwTyskHH2hAyJ94ne0jzt1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;207&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring boot 핵심 라이브러리&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-tomcat:&amp;nbsp;톰캣&amp;nbsp;(웹서버)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-webmvc: 스프링 웹 MVC&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-thymeleaf:&amp;nbsp;타임리프&amp;nbsp;템플릿&amp;nbsp;엔진(View)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA, Hibernate, Spring data JPA // &lt;span style=&quot;color: #000000;&quot;&gt;Spring data JPA는 스프링과 JPA를 먼저 이해하고 사용해야 하는 응용 기술이다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter(공통):&amp;nbsp;스프링&amp;nbsp;부트&amp;nbsp;+&amp;nbsp;스프링&amp;nbsp;코어&amp;nbsp;+&amp;nbsp;로깅&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-core&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-logging&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;logback,&amp;nbsp;slf4j&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트 라이브러리&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-test&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;junit:&amp;nbsp;테스트&amp;nbsp;프레임워크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;mockito:&amp;nbsp;목&amp;nbsp;라이브러리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;assertj:&amp;nbsp;테스트&amp;nbsp;코드를&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;편하게&amp;nbsp;작성하게&amp;nbsp;도와주는&amp;nbsp;라이브러리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-test:&amp;nbsp;스프링&amp;nbsp;통합&amp;nbsp;테스트&amp;nbsp;지원&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. View 환경 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1단계에서 Thymeleaf를 설치했어야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Thymeleaf의 장점은 HTML의 마크업을 최대한 깨지 않는다는 점이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단점은 반드시 태그를 닫아주어야 한다는 점이다. &amp;lt;br&amp;gt;또한 닫아주어야 한다.&amp;lt;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;br&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot-devtools라는 라이브러리를 추가해주고, build - recompile을 하면 개발 도중 html을 변경해도 서버를 재시작 하지않아도 된다.&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;V&lt;/b&gt;&lt;/span&gt;iew : 화면을 그리는데 집중&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위치 : resources/templates/hello.html&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668446232503&quot; class=&quot;dust&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head xmlns:th=&quot;https://www.thymeleaf.org&quot;&amp;gt; &amp;lt;!- thymeleaf 문법을 사용하겠다.--&amp;gt;
&amp;lt;body&amp;gt;
Hello
&amp;lt;p th:text=&quot;'안녕하세요. ' + ${data}&quot;&amp;gt;안녕하세요. 손님&amp;lt;/p&amp;gt; &amp;lt;!- thymeleaf 문법을 사용하고, Controller(=Views.py)에서 보낸 인자 출력  --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;ontroller : 비즈니스 로직을 처리하는데 집중&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위치 : hello.hellospring/controller&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668446232504&quot; class=&quot;kotlin&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller // controller는 반드시 Annotation을 해주어야 함
public class HelloController {

    @GetMapping(&quot;hello&quot;) // HTTP의 Get을 의미
    // /hello url로 들어오면 해당 함수가 매핑이 된다.
    public String hello(Model model) {
        model.addAttribute(&quot;data&quot;, &quot;hello!&quot;); // data라는 key 값에 hello!라는 value 전송
        return &quot;hello&quot;; // resources:templates 폴더 밑에 있는 &quot;hello&quot; 이름을 가진 템플릿을 Render
    }
  }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Controller에서 리턴 값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 찾아서 처리 함&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring boot 템플릿엔진 기본 viewName 매핑&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;resource:templates/ {viewName} + .html&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컨트롤러에서 &quot;hello&quot; 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뷰 리졸버에서 resource/templates 디렉토리 아래의 hello.html을 찾아 매핑 시켜줌.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. H2 DB 설치 및 JPA와 DB 설정, 동작 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;H2는 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공 &lt;br /&gt;&lt;a href=&quot;https://www.h2database.com&quot;&gt;https://www.h2database.com&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;윈도우&amp;nbsp;설치&amp;nbsp;버전:&amp;nbsp;&lt;a href=&quot;https://h2database.com/h2-setup-2019-10-14.exe&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://h2database.com/h2-setup-2019-10-14.exe&lt;/a&gt; &lt;br /&gt;윈도우,&amp;nbsp;맥,&amp;nbsp;리눅스&amp;nbsp;실행&amp;nbsp;버전:&amp;nbsp;&lt;a href=&quot;https://h2database.com/h2-2019-10-14.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://h2database.com/h2-2019-10-14.zip&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://www.h2database.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.h2database.com&lt;/a&gt; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;H2 설치후 H2 콘솔 실행하기&lt;/li&gt;
&lt;li&gt;데이터베이스&amp;nbsp;파일&amp;nbsp;생성&amp;nbsp;방법 &lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jdbc:h2:~/jpashop(프로젝트명으로) (최소 한번)&lt;/li&gt;
&lt;li&gt;~/jpashop.mv.db&amp;nbsp;파일&amp;nbsp;생성&amp;nbsp;확인&lt;/li&gt;
&lt;li&gt;이후&amp;nbsp;부터는&amp;nbsp;jdbc:h2:tcp://localhost/~/jpashop&amp;nbsp;이렇게&amp;nbsp;접속&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTZkGn/btrRcQsrYWn/kD8xyoOS5A91LHp2ZRov10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTZkGn/btrRcQsrYWn/kD8xyoOS5A91LHp2ZRov10/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTZkGn/btrRcQsrYWn/kD8xyoOS5A91LHp2ZRov10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTZkGn%2FbtrRcQsrYWn%2FkD8xyoOS5A91LHp2ZRov10%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;361&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;361&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 style=&quot;color: #000000;&quot;&gt;JPA와 DB 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. application.yml에 아래와 같이 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668448660770&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver 
  
  jpa:
    hibernate:
      ddl-auto: create # 자동으로 테이블을 만들어주는 코드
    properties:
      hibernate:
        # show_sql: true
          format_sql: true

logging:
  level:
    org.hibernate.SQL: debug # 하이버네이트가 생성한 모든 sql과 로그를 남길 수 있다.
    # org.hibernate.type: trace&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 실제로 동작하는지 확인을 위해 엔티티를 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668448819946&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter // Lombok을 사용하기에 게터 세터 어노테이션 가능
public class Member {

    @Id @GeneratedValue
    private Long id;

    private String username;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 레포지토리도 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668449105116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop;

import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Repository
public class MemberRepo {

    @PersistenceContext
    private EntityManager em; // @PersistenceContext를 등록해놓으면 스프링이 알아서 엔티티매니저를 생성해준다.

    public Long save(Member member) {
        em.persist(member); // 멤버 엔티티 영속 컨텍스트에 저장 -&amp;gt; DB로 전달
        return member.getId();
    }

    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}&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;4. Shift + Ctrl + T로 테스트 클래스 생성하기&lt;/p&gt;
&lt;pre id=&quot;code_1668450187633&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.jpabook.jpashop;

import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringRunner.class) // JUnit에게 Spring에 관련된 것을 테스팅한다 말해줘야함.
@SpringBootTest
public class MemberRepoTest {
    @Autowired
    MemberRepo memberRepo; // 의존성 주입

    @Test
    @Transactional // DB에 접근할 때는 반드시 트랜잭션 안에서 실행되어야한다.
    @Rollback(false)
    public void testMember() {
        //given
        Member member = new Member();
        member.setUsername(&quot;memberA&quot;);

        //when
        Long savedId = memberRepo.save(member);
        Member findMember = memberRepo.find(savedId);

        //then
        // 실제 잘 저장되었는지 확인
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        Assertions.assertThat(findMember).isEqualTo(member); // true가 반환된다. 그 이유는 같은 트랜잭션 내에서 조회하면 같은 영속성 컨텍스트 안에 있기에, ID가 같다면 같은 엔티티로 인식함.
    }
}&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;캡처.JPG&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HfnF0/btrRh62Z85x/MQiqftkWKpB6qfHhFB4hfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HfnF0/btrRh62Z85x/MQiqftkWKpB6qfHhFB4hfK/img.jpg&quot; data-alt=&quot;위 테스트 메소드를 실행하면 위 SQL이 실행된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HfnF0/btrRh62Z85x/MQiqftkWKpB6qfHhFB4hfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHfnF0%2FbtrRh62Z85x%2FMQiqftkWKpB6qfHhFB4hfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;122&quot; data-filename=&quot;캡처.JPG&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 테스트 메소드를 실행하면 위 SQL이 실행된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring에서는 테스트의 경우 테스트가 끝나면 실행했던 SQL문을 다시 롤백한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Rollback(false)일시 롤백을 하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 실제 DB에 가서, 잘 저장되었는지 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9.JPG&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ruuCk/btrRjqM94Wy/IxDUCe9Mc3iAWRAVaeAmeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ruuCk/btrRjqM94Wy/IxDUCe9Mc3iAWRAVaeAmeK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ruuCk/btrRjqM94Wy/IxDUCe9Mc3iAWRAVaeAmeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FruuCk%2FbtrRjqM94Wy%2FIxDUCe9Mc3iAWRAVaeAmeK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;436&quot; data-filename=&quot;9.JPG&quot; data-origin-width=&quot;962&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;오류 해결하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/15495&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/questions/15495&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668450169374&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;테스트 도중 에러 발생 - 인프런 | 질문 &amp;amp; 답변&quot; data-og-description=&quot;FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. &amp;gt; No tests found for given includes: [jpabook.jpashop....&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/15495&quot; data-og-url=&quot;https://www.inflearn.com/questions/15495&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YglHB/hyQBgXkOnK/ChVkjJCqz88BRpVE8qgBAk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464,https://scrap.kakaocdn.net/dn/lkTrB/hyQA2dIkFD/p1sBauJQYmpM5cHZGPRDIK/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/15495&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/questions/15495&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YglHB/hyQBgXkOnK/ChVkjJCqz88BRpVE8qgBAk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464,https://scrap.kakaocdn.net/dn/lkTrB/hyQA2dIkFD/p1sBauJQYmpM5cHZGPRDIK/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_464');&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;테스트 도중 에러 발생 - 인프런 | 질문 &amp;amp; 답변&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. &amp;gt; No tests found for given includes: [jpabook.jpashop....&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;&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;size18&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTamUe/btrRhT3QdfE/iyK9daIWqScjizm5cXEi7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTamUe/btrRhT3QdfE/iyK9daIWqScjizm5cXEi7k/img.jpg&quot; data-alt=&quot;?, ?에 무엇이 들어갔는지(= 값이 잘 전달되었는지)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTamUe/btrRhT3QdfE/iyK9daIWqScjizm5cXEi7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTamUe%2FbtrRhT3QdfE%2FiyK9daIWqScjizm5cXEi7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;151&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;?, ?에 무엇이 들어갔는지(= 값이 잘 전달되었는지)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;방법 1 : 로그에&amp;nbsp;다음을&amp;nbsp;추가하기&amp;nbsp;org.hibernate.type&amp;nbsp;:&amp;nbsp;SQL&amp;nbsp;실행&amp;nbsp;파라미터를&amp;nbsp;로그로&amp;nbsp;남긴다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668528665842&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;logging:
  level:
    org.hibernate.type: trace # 파라미터의 인자 타입과 값을 보여준다.&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;10.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVhq4V/btrRfObbceT/kSpIagrBslA321Z4U1gzw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVhq4V/btrRfObbceT/kSpIagrBslA321Z4U1gzw0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVhq4V/btrRfObbceT/kSpIagrBslA321Z4U1gzw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVhq4V%2FbtrRfObbceT%2FkSpIagrBslA321Z4U1gzw0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;151&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/17J6k/btrRh7HynHc/L7RKiQdQMYvYqSKlulJaJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/17J6k/btrRh7HynHc/L7RKiQdQMYvYqSKlulJaJ0/img.jpg&quot; data-alt=&quot;인자 - 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/17J6k/btrRh7HynHc/L7RKiQdQMYvYqSKlulJaJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F17J6k%2FbtrRh7HynHc%2FL7RKiQdQMYvYqSKlulJaJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;206&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인자 - 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;방법 2 : ?, ?를 직접적으로 보기 위해서 외부 라이브러리를 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://github.com/gavlyukovskiy/spring-boot-data-source-decorator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/gavlyukovskiy/spring-boot-data-source-decorator&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668528787176&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 - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s&quot; data-og-description=&quot;Spring Boot integration with p6spy, datasource-proxy, flexy-pool and spring-cloud-sleuth - GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-p...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/gavlyukovskiy/spring-boot-data-source-decorator&quot; data-og-url=&quot;https://github.com/gavlyukovskiy/spring-boot-data-source-decorator&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Kcfaw/hyQA2ZGoAu/Kgc3BeGJ2zsgoxUYn9fKek/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_133_1068_247&quot;&gt;&lt;a href=&quot;https://github.com/gavlyukovskiy/spring-boot-data-source-decorator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/gavlyukovskiy/spring-boot-data-source-decorator&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Kcfaw/hyQA2ZGoAu/Kgc3BeGJ2zsgoxUYn9fKek/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_133_1068_247');&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 - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot integration with p6spy, datasource-proxy, flexy-pool and spring-cloud-sleuth - GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-p...&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.JPG&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VcdLm/btrRjXqq1Cb/BTifE38dL3KVK3gHVpkJQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VcdLm/btrRjXqq1Cb/BTifE38dL3KVK3gHVpkJQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VcdLm/btrRjXqq1Cb/BTifE38dL3KVK3gHVpkJQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVcdLm%2FbtrRjXqq1Cb%2FBTifE38dL3KVK3gHVpkJQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;247&quot; data-filename=&quot;12.JPG&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;247&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 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>강의 정리/Spring 기초</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/163</guid>
      <comments>https://devdongbaek.tistory.com/163#entry163comment</comments>
      <pubDate>Tue, 15 Nov 2022 03:23:13 +0900</pubDate>
    </item>
    <item>
      <title>Spring 기초 정리본</title>
      <link>https://devdongbaek.tistory.com/162</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-size=&quot;size23&quot; data-ke-style=&quot;style1&quot;&gt;Spring 기술 그 자체에 매몰되지말자!&lt;br /&gt;어떻게 기술을 사용해야 하는지 초점을 두자!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;span style=&quot;color: #000000;&quot;&gt;프로젝트 환경설정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://start.spring.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://start.spring.io&lt;/a&gt;&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;0.JPG&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMuUMS/btrQrEMNlVb/dYLd8fcG0KHzUyI8BiaVAk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMuUMS/btrQrEMNlVb/dYLd8fcG0KHzUyI8BiaVAk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMuUMS/btrQrEMNlVb/dYLd8fcG0KHzUyI8BiaVAk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMuUMS%2FbtrQrEMNlVb%2FdYLd8fcG0KHzUyI8BiaVAk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;816&quot; height=&quot;898&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gradle Project : Life Cycle을 도와주는 Tool&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Group : 기업 도메인 명&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Artifact : 빌드된 결과물&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Dependencies : 어떤 라이브러리를 사용할 것인지&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring Web&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Thymeleaf : 템플릿 엔진&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring&amp;nbsp;Boot&amp;nbsp;버전은&amp;nbsp;SNAPSHOT,&amp;nbsp;M1&amp;nbsp;같은&amp;nbsp;미정식&amp;nbsp;버전을&amp;nbsp;제외하고&amp;nbsp;최신&amp;nbsp;버전을&amp;nbsp;사용하시면&amp;nbsp;됩니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #000000;&quot;&gt;Gradle 전체 설정&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1667632166954&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
	id 'org.springframework.boot' version '2.7.4'
	id 'io.spring.dependency-management' version '1.0.14.RELEASE'
	id 'java'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11' // 자바 11버젼

repositories {
	mavenCentral() // 라이브러리들을 다운받을 특정 사이트
}

dependencies { // Spring은 의존 관계의 라이브러리들을 모두 땡겨온다. Gradle에서 확인 가능
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' // spring io에서 선택했던 라이브러리들
	implementation 'org.springframework.boot:spring-boot-starter-web' // spring io에서 선택했던 라이브러리들
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test' // 기본적으로 포함되는 라이브러리
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // jdbc 또한 포함
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

tasks.named('test') {
	useJUnitPlatform()
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동작 확인&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;src : 자바 파일은 src에 있다고 생각하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 메인 클래스 실행 : src/main/java/hello.hellospring/HelloSpringApplication&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 부트 메인 실행 후 에러 페이지로 간단하게 동작 확인 (http://localhost:8080)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;&lt;span style=&quot;color: #000000;&quot;&gt;IntelliJ Gradle 대신에 자바 직접 실행&lt;/span&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;최근 IntelliJ 버전은 Gradle을 통해서 실행 하는 것이 기본 설정이다. 그러나 이렇게 하면 실행 속도가 느리기에 IntelliJ로 실행시키는 것이 실행 속도가 더 빠르다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;File - Setting&amp;nbsp;&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;1.JPG&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b06hWD/btrQr111UDB/KMwfZ1ElgW3vH45jwKsbdk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b06hWD/btrQr111UDB/KMwfZ1ElgW3vH45jwKsbdk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b06hWD/btrQr111UDB/KMwfZ1ElgW3vH45jwKsbdk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb06hWD%2FbtrQr111UDB%2FKMwfZ1ElgW3vH45jwKsbdk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;704&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라이브러리 확인하기&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gradle은 의존관계가 있는 라이브러리를 함께 다운로드한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLP47/btrQuMiMxPD/1IUkDL243n1HIORngU2isk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLP47/btrQuMiMxPD/1IUkDL243n1HIORngU2isk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLP47/btrQuMiMxPD/1IUkDL243n1HIORngU2isk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLP47%2FbtrQuMiMxPD%2F1IUkDL243n1HIORngU2isk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;207&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring boot 라이브러리&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-tomcat:&amp;nbsp;톰캣&amp;nbsp;(웹서버)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-webmvc: 스프링 웹 MVC&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-thymeleaf:&amp;nbsp;타임리프&amp;nbsp;템플릿&amp;nbsp;엔진(View)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter(공통):&amp;nbsp;스프링&amp;nbsp;부트&amp;nbsp;+&amp;nbsp;스프링&amp;nbsp;코어&amp;nbsp;+&amp;nbsp;로깅&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-core&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-logging&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;logback,&amp;nbsp;slf4j&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트 라이브러리&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;spring-boot-starter-test&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;junit:&amp;nbsp;테스트&amp;nbsp;프레임워크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;mockito:&amp;nbsp;목&amp;nbsp;라이브러리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;assertj:&amp;nbsp;테스트&amp;nbsp;코드를&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;편하게&amp;nbsp;작성하게&amp;nbsp;도와주는&amp;nbsp;라이브러리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spring-test:&amp;nbsp;스프링&amp;nbsp;통합&amp;nbsp;테스트&amp;nbsp;지원&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring은 너무 거대하기에, 필요한 것을 찾는 능력이 매우 중요하다!&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;스프링 웹 개발 기초&lt;/span&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;웹 페이지를 개발하는 3가지 방법&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정적 컨텐츠&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MVC와 템플릿 엔진&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API&lt;/span&gt;&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;&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;span style=&quot;color: #000000;&quot;&gt;정적 컨텐츠&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;html, css를 통해 정적으로 개발하는 방법&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;rarr; html 파일 이름 그 자체로 서버로 올라간다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MVC와 템플릿 엔진&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqJteI/btrQuMQCwXe/MsyCtO3XUBXJCLa5D4Rj3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqJteI/btrQuMQCwXe/MsyCtO3XUBXJCLa5D4Rj3K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqJteI/btrQuMQCwXe/MsyCtO3XUBXJCLa5D4Rj3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqJteI%2FbtrQuMQCwXe%2FMsyCtO3XUBXJCLa5D4Rj3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;735&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;735&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;V&lt;/b&gt;&lt;/span&gt;iew : 화면을 그리는데 집중&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위치 : resources/templates/hello.html&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667633971502&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head xmlns:th=&quot;https://www.thymeleaf.org&quot;&amp;gt; &amp;lt;!- thymeleaf 문법을 사용하겠다.--&amp;gt;
&amp;lt;body&amp;gt;
Hello
&amp;lt;p th:text=&quot;'안녕하세요. ' + ${data}&quot;&amp;gt;안녕하세요. 손님&amp;lt;/p&amp;gt; &amp;lt;!- thymeleaf 문법을 사용하고, Controller(=Views.py)에서 보낸 인자 출력  --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;ontroller : 비즈니스 로직을 처리하는데 집중&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위치 : hello.hellospring/controller&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667633750239&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller // controller는 반드시 Annotation을 해주어야 함
public class HelloController {

    @GetMapping(&quot;hello&quot;) // HTTP의 Get을 의미
    // /hello url로 들어오면 해당 함수가 매핑이 된다.
    public String hello(Model model) {
        model.addAttribute(&quot;data&quot;, &quot;hello!&quot;); // data라는 key 값에 hello!라는 value 전송
        return &quot;hello&quot;; // resources:templates 폴더 밑에 있는 &quot;hello&quot; 이름을 가진 템플릿을 Render
    }
  }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Controller에서 리턴 값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 찾아서 처리 함&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring boot 템플릿엔진 기본 viewName 매핑&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;resource:templates/ {viewName} + .html&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컨트롤러에서 &quot;hello&quot; 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뷰 리졸버에서 resource/templates 디렉토리 아래의 hello.html을 찾아 매핑 시켜줌.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빌드하고 실행하기&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;콘솔로 이동 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;rarr; cmd로 이동하기&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;./gradlew &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;rarr; gradlew.bat를 실행한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;cmd에서 gradlew.bat를 실행하려면 gladlew를 타이핑하고, 엔터를 친다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;gradlew build&lt;/span&gt;&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667635170462&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  	@Controller // controller는 반드시 Annotation을 해주어야 함
	public class HelloController {
  	@GetMapping(&quot;hello-mvc&quot;)
        public String helloMvc(@RequestParam(value = &quot;name&quot;, required = false) String name, Model model) { // 외부에서 파라미터, 인자를 받고자 할 때, @RequestParam 사용
            model.addAttribute(&quot;name&quot;, name);
            return &quot;hello-templates&quot;;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RequestParam이란?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://heavenly-appear.tistory.com/302&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://heavenly-appear.tistory.com/302&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1667647843009&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;[스프링] @RequestParam에 대한 이해 - parameter를 쉽게 컨트롤하기&quot; data-og-description=&quot;스프링에서는 컨트롤러로 사용할 클래스 상단에 @Controller 지정하며 유용하게 사용할수 있는 기능들이 있다. 그중에 @RequestParam에 대해서 알아볼까합니다. 1. 단일 파라미터 변환 private ModelAndView r&quot; data-og-host=&quot;heavenly-appear.tistory.com&quot; data-og-source-url=&quot;https://heavenly-appear.tistory.com/302&quot; data-og-url=&quot;https://heavenly-appear.tistory.com/302&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ksCpB/hyQtsDVXuv/NEMfnMB5oLaNJSKD2Szoa1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bppSwX/hyQsax6o6q/If5Fntr7e10U5pfFZYxbDK/img.png?width=748&amp;amp;height=750&amp;amp;face=0_0_748_750,https://scrap.kakaocdn.net/dn/j3UHO/hyQsbw1WZU/JFk6CwTqFpOWZaeYxWoHT0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://heavenly-appear.tistory.com/302&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://heavenly-appear.tistory.com/302&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ksCpB/hyQtsDVXuv/NEMfnMB5oLaNJSKD2Szoa1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bppSwX/hyQsax6o6q/If5Fntr7e10U5pfFZYxbDK/img.png?width=748&amp;amp;height=750&amp;amp;face=0_0_748_750,https://scrap.kakaocdn.net/dn/j3UHO/hyQsbw1WZU/JFk6CwTqFpOWZaeYxWoHT0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&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;[스프링] @RequestParam에 대한 이해 - parameter를 쉽게 컨트롤하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링에서는 컨트롤러로 사용할 클래스 상단에 @Controller 지정하며 유용하게 사용할수 있는 기능들이 있다. 그중에 @RequestParam에 대해서 알아볼까합니다. 1. 단일 파라미터 변환 private ModelAndView r&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;heavenly-appear.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;&lt;span style=&quot;color: #000000;&quot;&gt;인자로 데이터를 받는 MVC 패턴 프로세스&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;url에서 인자를 받음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 url에 매핑된 컨트롤러 실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모델에 인자값 저장 후 템플릿 Render&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;View에서 모델값(=인자로 받은 값) 사용&lt;/span&gt;&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;&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;API&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API를 보내는 방법들&amp;nbsp;&lt;/span&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;1. @ResponseBody 문자 반환&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667647583807&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @GetMapping(&quot;hello-string&quot;) // ResponseBody 문자 반환
    @ResponseBody
    public String helloString(@RequestParam(&quot;name&quot;) String name) {
        return &quot;hello&quot; + name;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문자 반환은 자주 쓰이지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@ResponseBody를 사용하면 뷰 리졸버를 사용하지 않음 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;rarr; 즉 HTML을 렌더링하는게 아니라 API를 응답해줌&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;대신 HTTP의 Body에 문자 내용을 직접 반환해준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;2. @ResponseBody 객체 반환&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667647718115&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @GetMapping(&quot;hello-api&quot;) // ResponseBody 객체 반환
    @ResponseBody
    public Hello helloApi(@RequestParam(&quot;name&quot;) String name) { // url 인자로 넘겨받은 값을 String 형의 name 변수에 저장
        Hello hello = new Hello(); // 객체 생성
        hello.setName(name); // 객체 메소드를 통해 변수 지정
        return hello; // 객체(=Json 반환)
    }
    
     static class Hello { // static class는 상위 클래스와 독립적으로 유지되게 도와줌
        private String name; // private이기에 getter와 setter를 통해 외부에서 접근 가능케 함. = Property 접근 방식

        public String getName(){ // getter와 setter 단축기 : ALT + ENTER
            return name;
        }

        public void setName(String name){
            this.name = name;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대부분 이 방법을 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@ResponseBody를 사용하고, 객체를 반환하면 객체가 JSON으로 변환된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@ResponseBody의 사용 원리&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTTP의 BODY에 문자 내용, 객체를 직접 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;중요 !!! : viewResolver 대신에 HttpMessageConverter 가 동작&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 문자처리 : &lt;span style=&quot;background-color: #9feec3;&quot;&gt;StringHttpMessageConverter&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 객체처리 : &lt;span style=&quot;background-color: #9feec3;&quot;&gt;MappingJackson2HttpMessageConveter&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;커스터마이징 가능하지만 거의 그대로 사용한다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;byte 처리 등등 기타 여러 HttpMessageConveter가 기본으로 등록 되어있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HTTPMessageConverter가 선택된다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제를 통해 알아보는 Spring boot 백엔드 개발&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;일반적인 개발 순서&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비즈니스 요구사항 정리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원 도메인과 리포지토리 만들기 &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;rarr; 저장소&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원 리포지토리 테스트 케이스 작성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원 서비스 개발 &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;rarr; 실제 비지니스 로직&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;회원 서비스 테스트 &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;rarr; Junit&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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;span style=&quot;color: #000000;&quot;&gt;일반적인 Spring boot 개발 순서&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Domain 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Repository 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Service 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Controller 생성&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;일반적인 웹 애플리케이션 계층 구조&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcZMsQ/btrQrqBnNii/19q7fBDpO7bpLCDqAkHEKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcZMsQ/btrQrqBnNii/19q7fBDpO7bpLCDqAkHEKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcZMsQ/btrQrqBnNii/19q7fBDpO7bpLCDqAkHEKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcZMsQ%2FbtrQrqBnNii%2F19q7fBDpO7bpLCDqAkHEKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;265&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;265&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컨트롤러 : 웹 MVC의 컨트롤러 역할&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Url과 매핑된 메소드에서 유저의 요청에 응답해 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;서비스에서 만든 로직&lt;/b&gt;&lt;/span&gt;을 이용해 객체, 데이터를 전달해주는 역할&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1667648699188&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.controller;

import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
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 java.util.List;


@Controller
public class MemberController { // @Controller를 사용하면, Spring Container에서 스스로 MemberController 객체를 생성해서 Spring에서 저장하고,관리한다.
                                // 이를 Spring Container에서 bin이 관리된다고 표현한다.

    // private final MemberService memberService = new MemberService();
    // 이런식으로 new를 사용해 객체를 생성하면, 각 컨트롤러마다 각자 new 객체를 생성할 수 있기 때문에 
    // Spring Container로부터 등록한 후 받아서 사용할 수 있게 해야한다.

    private final MemberService memberService;

    // 의존성이 생성자를 통해서 들어오는 걸 생성자 주입이라고 한다.
    // 생성자 주입을 사용하는 것을 추천
    @Autowired // 생성자에 @Autowired가 있으면, Spring bin에 등록되어 있는 memberService 객체를 가져와 연결 시켜줌 -&amp;gt; Dependency Injection
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    /*
     @AutoWired private final MemberService memberService; // 필드 주입 방법 -&amp;gt; 중간에 변경할 수 없기에 비추

    @Autowired // setter 주입 방법 -&amp;gt; 누군가가 호출했을 때 public으로 되어있어야 하기에, 보안 문제 생김
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
     */

    @GetMapping(&quot;/members/new&quot;)
    public String createForm() {
        return &quot;members/createMemberForm&quot;;
    }

    @PostMapping(&quot;/members/new&quot;)
    public String create(MemberForm form) { // MemberForm과 연결시켜줌
        Member member = new Member();
        member.setName(form.getName()); // form에서 입력받은 이름을 member domain에서 객체로 생성

        memberService.join(member); // 생성한 객체를 회원가입 로직에 넘김

        return &quot;redirect:/&quot;; // Django의 redirect와 같은데, 홈 화면으로 바로 보냄
    }

    @GetMapping(&quot;/members&quot;)
    public String List(Model model) {
        List&amp;lt;Member&amp;gt; members = memberService.findMembers(); // 모든 멤버 객체들을 다 가져온다.
        model.addAttribute(&quot;members&quot;, members); // members라는 key 값에 members라는 value 전송
        return &quot;members/memberList&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스 : 핵심 비즈니스 로직 구현&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;리포지토리의 데이터&lt;/b&gt;&lt;/span&gt;를 이용해 비즈니스 로직들을 구현한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Service에서는 기획자도 알 수 있도록 비즈니스에 가까운 네이밍을 지어야한다!&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667648832946&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

// Testing을 쉽게 하는 방법
// 1. Ctrl + Shift + T -&amp;gt; Create New Test -&amp;gt; Junit으로 선택하고, 테스팅할 메소드 선택

//@Service  @Service는 MemberService를 Spring에 등록시켜주는 역할을 한다. -&amp;gt; Django에서 view, model 상속받는 것과 같다 생각하기
public class MemberService {

    // Repository 객체 생성
    // MemberService가 메모리 회원 리포지토리를 직접 생성하게 했습니다.
    // 인터페이스 사용법 : 인터페이스로 구현 객체를 사용하려면 다음과 같이 인터페이스 변수를 선언하고 구현 객체를 대입해야 합니다. 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장합니다.
    // 인터페이스 변수 = new 구현객체;
    private final MemberRepository memberRepository; // 객체 변수에 final로 선언하면 그 변수에 다른 참조 값을 지정할 수 없습니다. 원시 타입과 동일하게 한번 쓰여진 변수는 재변경 불가합니다. 단, 객체 자체가 immutable하다는 의미는 아닙니다. 객체의 속성은 변경 가능합니다

    //@Autowired // 생성자에 @Autowired가 있으면, Spring bin에 등록되어 있는 MemberRepository 객체를 가져와 연결 시켜줌 -&amp;gt; Dependency Injection
    // MemberService - 연결 -&amp;gt; MemberRepository
    public MemberService(MemberRepository memberRepository) { // MemberService 입장에서 외부에서 객체를 넘겨주는 것을 Dependency Injection이라고 한다.
        // 3. 2단계에서 넘겨줬던 인자를 받아서 memberRepository로 저장
        // 4. 이렇게 하면 테스팅 Repository와 Service Repository가 같아진다.
        this.memberRepository = memberRepository;
    }

    // 회원가입 기능
    public long join(Member member) {
        validateDuplicateMember(member);// 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }
    
    // 중복 회원 검증 기능
    private void validateDuplicateMember(Member member) { // ctrl + t -&amp;gt; Refactory와 관련된 단축기
        memberRepository.findByName(member.getName())
                .ifPresent(m -&amp;gt; { // member.getName()이 Null이 아니면, 즉 만약 값이 있으면 예외처리를 해라
                    throw new IllegalStateException(&quot;이미 존재하는 회원입니다.&quot;);
                });
    }
    
    // 전체 회원 조회
    public List&amp;lt;Member&amp;gt; findMembers() {
        return memberRepository.findAll();
    }

    // 1명의 유저 반환
    public Optional&amp;lt;Member&amp;gt; findOne(long memberId){
        return memberRepository.findById(memberId);
    }
}&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리포지토리 : 데이터베이스에 접근하여서, 도메인 객체를 DB에 저장하고 관리&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리포지토리는 인터페이스와 인터페이스 구현체로 만들어진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 코드는 JPA 방식 리포지토리 구현체&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1667649055657&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

@Transactional // JPA를 사용할 때는 항상 @Transactional을 어노테이션 해야한다.
public class JPAMemberRepo implements MemberRepository{

    private final EntityManager em; // JPA는 EntityManager를 통해서 모든 동작을 한다.
    // JPA는 내부적으로 Datasource를 다 탑재하고있다.

    public JPAMemberRepo(EntityManager em) {
        this.em = em;
    }

    @Override
    public Member save(Member member) {
        em.persist(member); // .persist()는 이 메서드가 호출되면 article은 managed(영속)상태로 진입하게 됩니다.
        /*
        persist 는 새로운 entity 를 영속성 컨텍스트내에서 관리하고 싶을 때 사용합니다.
        entityManager.persist(xxx) 를 호출하면 바로 insert 쿼리가 동작합니다.
         */
        return member;

    }

    @Override
    // pk 같은 경우 .find로 매핑한다.
    public Optional&amp;lt;Member&amp;gt; findById(Long id) {
        Member member = em.find(Member.class, id); // 첫 인자로는 조회할 타입, 두번째 인자로는 식별자를 넣어주면 된다.
        // .find는 실제로 DB에서 값을 찾아온다. 추가로 Optional로 한번 감싸서 값을 가져오는데, 얘는 해당 ID의 객체가 없다면 Null을 반환한다.
        return Optional.ofNullable(member);
    }

    @Override
    // pk가 아닌 경우, jpql이라는 객체 지향 쿼리를 사용한다.
    public Optional&amp;lt;Member&amp;gt; findByName(String name) {
        List&amp;lt;Member&amp;gt; result = em.createQuery(&quot;select m from Member m where m.name= :name&quot;, Member.class)
                .setParameter(&quot;name&quot;, name) // 외부(인자로 받아온 값)에서 파라미터를 설정할 수 있습니다.
                .getResultList(); // 결과를 컬렉션으로 반환한다. 결과가 없으면 빈 컬렉션이 반환된다. 1건이면 1건만 들어간 컬렉션이 반환된다

        return result.stream().findAny();
    }

    @Override
    // pk가 아닌 경우, jpql이라는 객체 지향 쿼리를 사용한다.
    public List&amp;lt;Member&amp;gt; findAll() {  // ctrl + alt + N = Inline(하나의 문장으로 합치기)
        return em.createQuery(&quot;select m from Member m&quot;, Member.class) // Member(=m) Enitity 자체를 Select 해, 두번째 인자는 타입을 적어준다.
                // jpql은 객체를 대상으로 쿼리를 보내고, 객체를 .
                .getResultList();
    }
}&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도메인 : 비즈니스 도메인 객체 ex) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 Member Class를 하나의 DB Table이라 생각하면 편하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1667649324396&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.domain;

import javax.persistence.*;

// JPA는 자바의 표준 ORM 인터페이스고 여러 구현체들이 있다.
@Entity // 이렇게 @Entity 어노테이션을 하면, JPA가 관리하는 엔티티가 되는거다.
public class Member {

    @Id // pk값으로 매핑시켜준다.
    @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 알아서 value를 생성해주는 걸 IDENTITY라고 한다.
    private Long id; // 데이터를 구분하기 위해서 시스템에서 저장한 아이디

    @Column(name = &quot;username&quot;) // DB에 있는 username과 아래 name 변수를 매핑시켜준다.
    private String name; // 닉네임

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스들간의 의존관계&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8yJuj/btrQqMdWY2f/m8LzFfzCpIyrgvTAsvDQI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8yJuj/btrQqMdWY2f/m8LzFfzCpIyrgvTAsvDQI0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8yJuj/btrQqMdWY2f/m8LzFfzCpIyrgvTAsvDQI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8yJuj%2FbtrQqMdWY2f%2Fm8LzFfzCpIyrgvTAsvDQI0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;473&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;473&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;h4 data-ke-size=&quot;size20&quot;&gt;Repository 테스트 케이스 작성 방법&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위치 : src/test/java 하위 폴더에 생성한다.&lt;/li&gt;
&lt;li&gt;이러한 Test를 먼저 만들고, 리포지토리를 만드는 것을 TDD라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1667649652337&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.repositiory;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository(); // 테스트할 Repository의 객체를 생성한다.

    @AfterEach // 매우 중요!!! @AfterEach는 메소드가 끝날때마다 실행되는 콜백 함수
    // 즉 save()가 실행되고, 호출 또 findByName()가 호출되고 실행
    public void afterEach() {
        repository.clearStore(); 
    }

    @Test // @Test 어노테이션을 사용하면, 해당 메소드를 바로 테스팅 실행할 수 있다.
    public void save() {
        // 테스트할 기능에 넣어줄 값들을 입력한다.
        Member member = new Member();
        member.setName(&quot;Spring&quot;);

        // repository 객체의 save 메소드에 값을 넘겨서 저장시킨다. = DB 역할
        repository.save(member);

        // save시 ID를 부여하였으므로, 잘 부여되었는지 확인한다.
        Member result = repository.findById(member.getId()).get(); // Optional에서는 get()으로 값을 꺼낼 수 있다.
        // 위 프로세스
        // 1. domain에 있는 프로퍼티(id, name)를 Member 객체를 통해 지정
        // 2. Repository의 객체를 통해서 save() 메소드 호출 -&amp;gt; DB에 저장
        // 3. Member 새로운 객체에 2단계의 객체를 이용해 findById() 메소드로 멤버 객체의 Id값을 가진 객체를 저장합니다.

        assertThat(result).isEqualTo(member); // 1~2단계에서 멤버 객체에 저장했던 것과, DB에 있는 것이 같은지 검증
        // assertThat은 첫 인자가 isEqualTo 인자와 같은지를 반환해줌
        // 실무에서는 해당 테스트를 통과 못하면 다음 단계로 아예 못넘어가게 막아버림
    }

    @Test
    public void findByName() {
        Member member1 = new Member();
        member1.setName(&quot;spring1&quot;);
        repository.save(member1);

        Member member2 = new Member();
        member1.setName(&quot;spring2&quot;);
        repository.save(member2);

        Member result = repository.findByName(&quot;spring1&quot;).get();

        assertThat(result).isEqualTo(member1); // findByName으로 인자로 넘겼던 Name의 멤버 객체를 잘 불러왔는지 검사
    }

    @Test
    public void findAll() {
        Member member1 = new Member();
        member1.setName(&quot;spring1&quot;);
        repository.save(member1);

        Member member2 = new Member();
        member1.setName(&quot;spring2&quot;);
        repository.save(member2);

        List&amp;lt;Member&amp;gt; result = repository.findAll(); // 여러 Member 객체들을 findAll()로 모두 불러와서 Member 객체 자료형 리스트에 저장함
        // List&amp;lt;자료형&amp;gt; 리스트 명 = new ArrayList(or LinkedList)&amp;lt;자료형(생략가능)&amp;gt;();

        assertThat(result.size()).isEqualTo(2);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한번에 여러 테스트를 실행하면, DB에 직전 테스트의 결과가 남을 수 있다. &lt;span&gt;위의 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;@AfterEach&lt;/span&gt;는&lt;span&gt; 이러한 문제를 해결해주기 위해 존재하는데, &lt;span&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;@AfterEach&lt;/span&gt;는&lt;span&gt; 각 테스트가 종료될때 마다 이 기능을 실행한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;@BeforeEach&lt;/span&gt;는 각 테스트 실행전에 호출되며, 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존 관계도 새로 맺어준다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;@SpringBootTest&lt;/span&gt; :&amp;nbsp; 스프링 컨테이너와 테스트를 함께 실행하도록 하는 어노테이션 = 통합 테스트&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;@Transactional&lt;/span&gt; : 테스트 케이스에 이 어노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스프링(Spring) 컨테이너가 관리하는 자바 객체를 빈(Bean)이라 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어의 역전이란, 간단히 말해서 객체의 생성 및 제어권을 사용자가 아닌 스프링에게 맡기는 것이다. 지금까지는 사용자가 new연산을 통해 객체를 생성하고 메소드를 호출했다. IoC가 적용된 경우에는 이러한 객체의 생성과 사용자의 제어권을 스프링에게 넘긴다. 사용자는 직접 new를 이용해 생성한 객체를 사용하지 않고, 스프링에 의하여 관리당하는 자바 객체를 사용한다. 이 객체를 '빈(bean)'이라 한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;span style=&quot;color: #000000;&quot;&gt;빈 등록하는 방법은 2가지가 있다.&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 스캔과 자동 의존관계 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바 코드로 직접 스프링 빈 등록하기&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 스캔과 자동 의존관계 설정을 통한 빈 등록&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@Component 어노테이션이 있으면 스프링 빈으로 자동 등록된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유는 컴포넌트 스캔 때문이다..&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@Controller&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@Service&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@Repository&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667651174382&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service  @Service는 MemberService를 Spring에 등록시켜주는 역할을 한다. -&amp;gt; Django에서 view, model 상속받는 것과 같다 생각하기
public class MemberService {

    // Repository 객체 생성
    // MemberService가 메모리 회원 리포지토리를 직접 생성하게 했습니다.
    // 인터페이스 사용법 : 인터페이스로 구현 객체를 사용하려면 다음과 같이 인터페이스 변수를 선언하고 구현 객체를 대입해야 합니다. 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장합니다.
    // 인터페이스 변수 = new 구현객체;
    private final MemberRepository memberRepository; // 객체 변수에 final로 선언하면 그 변수에 다른 참조 값을 지정할 수 없습니다. 원시 타입과 동일하게 한번 쓰여진 변수는 재변경 불가합니다. 단, 객체 자체가 immutable하다는 의미는 아닙니다. 객체의 속성은 변경 가능합니다

    @Autowired // 생성자에 @Autowired가 있으면, Spring bin에 등록되어 있는 MemberRepository 객체를 가져와 연결 시켜줌 -&amp;gt; Dependency Injection
    // MemberService - 연결 -&amp;gt; MemberRepository
    public MemberService(MemberRepository memberRepository) { // MemberService 입장에서 외부에서 객체를 넘겨주는 것을 Dependency Injection이라고 한다.
        // 3. 2단계에서 넘겨줬던 인자를 받아서 memberRepository로 저장
        // 4. 이렇게 하면 테스팅 Repository와 Service Repository가 같아진다.
        this.memberRepository = memberRepository;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 생성자가 1개만 있으면 @Autowired는 생략할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생성자에&amp;nbsp;@Autowired&amp;nbsp;가&amp;nbsp;있으면&amp;nbsp;스프링이&amp;nbsp;연관된&amp;nbsp;객체를&amp;nbsp;스프링&amp;nbsp;컨테이너에서&amp;nbsp;찾아서&amp;nbsp;넣어준다.&amp;nbsp;이렇게 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체&amp;nbsp;의존관계를&amp;nbsp;외부에서&amp;nbsp;넣어주는&amp;nbsp;것을&amp;nbsp;DI&amp;nbsp;(Dependency&amp;nbsp;Injection),&amp;nbsp;의존성&amp;nbsp;주입이라&amp;nbsp;한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;객체를 스프링이 직접 생성해주니까 우리는 연관 관계를 스프링에게 반드시 알려주어야 한다!!&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스프링 빈 등록 이미지&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci9whX/btrQrGjMbNj/gwREdAdJ1OkaKBHuHIpR1K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci9whX/btrQrGjMbNj/gwREdAdJ1OkaKBHuHIpR1K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci9whX/btrQrGjMbNj/gwREdAdJ1OkaKBHuHIpR1K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci9whX%2FbtrQrGjMbNj%2FgwREdAdJ1OkaKBHuHIpR1K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;140&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 빈 등록은 컴포넌트 스캔 방법에서 @Controller, @Service, @Repository를 통해 등록하고&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의존 관계는 아래와 같이 연결해준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컨트롤러 &amp;rarr; 서비스 의존관계 연결&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667651783026&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class MemberController { // @Controller를 사용하면, Spring Container에서 스스로 MemberController 객체를 생성해서 Spring에서 저장하고,관리한다.
                                // 이를 Spring Container에서 bin이 관리된다고 표현한다.

    // private final MemberService memberService = new MemberService();
    // 이런식으로 new를 사용해 객체를 생성하면, 각 컨트롤러마다 각자 new 객체를 생성할 수 있기 때문에 
    // Spring Container로부터 등록한 후 받아서 사용할 수 있게 해야한다.

    private final MemberService memberService;

    // 의존성이 생성자를 통해서 들어오는 걸 생성자 주입이라고 한다.
    // 생성자 주입을 사용하는 것을 추천
    @Autowired // 생성자에 @Autowired가 있으면, Spring bin에 등록되어 있는 memberService 객체를 가져와 연결 시켜줌 -&amp;gt; Dependency Injection
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}&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;&lt;span style=&quot;color: #000000;&quot;&gt;서비스 &amp;rarr; 레포지토리 의존관계 연결&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667651868918&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberService {

    // Repository 객체 생성
    // MemberService가 메모리 회원 리포지토리를 직접 생성하게 했습니다.
    // 인터페이스 사용법 : 인터페이스로 구현 객체를 사용하려면 다음과 같이 인터페이스 변수를 선언하고 구현 객체를 대입해야 합니다. 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장합니다.
    // 인터페이스 변수 = new 구현객체;
    private final MemberRepository memberRepository; // 객체 변수에 final로 선언하면 그 변수에 다른 참조 값을 지정할 수 없습니다. 원시 타입과 동일하게 한번 쓰여진 변수는 재변경 불가합니다. 단, 객체 자체가 immutable하다는 의미는 아닙니다. 객체의 속성은 변경 가능합니다

    //@Autowired // 생성자에 @Autowired가 있으면, Spring bin에 등록되어 있는 MemberRepository 객체를 가져와 연결 시켜줌 -&amp;gt; Dependency Injection
    // MemberService - 연결 -&amp;gt; MemberRepository
    public MemberService(MemberRepository memberRepository) { // MemberService 입장에서 외부에서 객체를 넘겨주는 것을 Dependency Injection이라고 한다.
        // 3. 2단계에서 넘겨줬던 인자를 받아서 memberRepository로 저장
        // 4. 이렇게 하면 테스팅 Repository와 Service Repository가 같아진다.
        this.memberRepository = memberRepository;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의존관계는 필드 주입, 세터 주입, 생성자 주입 3가지 방법이 있는데, 위와 같은 생성자 주입을 권장한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;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;스프링 DB 접근 기술&lt;/h3&gt;
&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring에서 DB 접근하기&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 설정 변경 : DI&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667652303681&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.service;

import hello.hellospring.repository.JPAMemberRepo;
import hello.hellospring.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// Java Code로 직접 Spring Bean을 등록시키는 방법
// Spring이 실행될 떄 먼저 @Configuration이 있는 클래스에 들려서 @Bean이 있는 메소드들을 등록시킨다.

@Configuration
public class SpringConfig {

    private DataSource dataSource;
    private SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    private EntityManager em;

    @Autowired
    public SpringConfig(EntityManager em){
        this.em = em;
    }

    private final MemberRepository memberRepository;

    @Autowired
    public SpringConfig(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }


    @Bean
    public MemberService memberService() { // 리턴을 memberRepository()을 함으로써, AutoWired를 사용한 것 같은 효과를 누린다.
        return new MemberService(memberRepository); //
        //  new는 클래스 타입의 인스턴스(객체)를 생성해주는 역할을 담당한다.
        // Ctrl + p를 누르면, 어떤 인자를 필요로 하는지 알 수 있다.
    }

    @Bean
    public MemberRepository memberRepository() {
//
//        //return new MemoryMemberRepository(); // 인터페이스는 new가 안되니 구현체를 리턴
//        //return new JDBCRepo(dataSource);
        return new JPAMemberRepo(em);
//    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체이다. 스프링 부투는 데이터베이스 커넥션 정보를 바탕으로 Datasource를 생성하고, 스프링 빈으로 만들어준다. 그래서 DI를 받을 수 있다.&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;application.properties에 datasource 관련 정보(=데이터베이스 정보)들을 입력해준다.&lt;/li&gt;
&lt;li&gt;SpringConfig에서 datasource를 import하고 객체를 만들어줌으로서 데이터베이스 정보를 가져온다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #000000;&quot;&gt;스프링의 DI&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개방-폐쇄 원칙(OCP, Open-Closed Principle)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;확장에는 열려있고, 수정, 변경에는 닫혀있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스프링의 DI(Dependency Injection)를 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;domain을 통해서 DB에 직접적으로 접근하는 것을 피할 수 있다!!&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Domain이 따로 필요한 이유!!!&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/209&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devlog-wjdrbs96.tistory.com/209&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667659335041&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;이번 글에서는 스프링은 어떤 계층이 존재하는지와 계층의 역할을 무엇인지, 프로젝트시 패키지를 어떻게 나누는 것이 좋은지에 대해 정리해보려 한다. 스프링의 계층은 Presentation Layer, Business, &quot; data-og-host=&quot;devlog-wjdrbs96.tistory.com&quot; data-og-source-url=&quot;https://devlog-wjdrbs96.tistory.com/209&quot; data-og-url=&quot;https://devlog-wjdrbs96.tistory.com/209&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/czggBg/hyQr90pgJ5/RriCdTa9TTQclPjk6a71X0/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/bAQlQ1/hyQr9693v9/6MvqSXMQccsKj2YSduqshK/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/cJlyNd/hyQtv1OFFj/av3Ie9KvRv39cEl9I4BydK/img.png?width=1280&amp;amp;height=974&amp;amp;face=0_0_1280_974&quot;&gt;&lt;a href=&quot;https://devlog-wjdrbs96.tistory.com/209&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devlog-wjdrbs96.tistory.com/209&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/czggBg/hyQr90pgJ5/RriCdTa9TTQclPjk6a71X0/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/bAQlQ1/hyQr9693v9/6MvqSXMQccsKj2YSduqshK/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/cJlyNd/hyQtv1OFFj/av3Ie9KvRv39cEl9I4BydK/img.png?width=1280&amp;amp;height=974&amp;amp;face=0_0_1280_974');&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;이번 글에서는 스프링은 어떤 계층이 존재하는지와 계층의 역할을 무엇인지, 프로젝트시 패키지를 어떻게 나누는 것이 좋은지에 대해 정리해보려 한다. 스프링의 계층은 Presentation Layer, Business,&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;jdbcTemplate&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jdbcTemplate는 쿼리를 통해서 DB에 접근한다고 생각하기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1667658341113&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.repository;


import hello.hellospring.domain.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Optional;

public class JDBCRepo implements MemberRepository {

    private final JdbcTemplate jdbcTemplate;

    @Autowired // 생성자가 하나만 있으면 @Autowired 생략 가능
    public JDBCRepo(DataSource dataSource) { // DataSource는 DB와 관계된 커넥션 정보를 담고있으며 빈으로 등록하여 인자로 넘겨준다. &amp;rarr; 이 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다.
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public Member save(Member member) {
        return null;
    }

    @Override
    public Optional&amp;lt;Member&amp;gt; findById(Long id) {
        // ResultSet(java.sql.ResultSet)은 executeQuery(String sql)을 통해 쿼리 실행하면 ResultSet타입으로 반환을 해주어 결과값을 저장할 수 있다.
        List&amp;lt;Member&amp;gt; result = jdbcTemplate.query(&quot;select * from member where id = ?&quot;, memberRowMapper(), id); // &quot;select * from member where id = ?&quot; 구문으로 Member 객체 자체를 반환받기 위해 RowMapper 사용
        return result.stream().findAny(); // stream()은 컬렉션에 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드 패턴이다. -&amp;gt; 여러 멤버 객체들중
    }

    @Override
    public Optional&amp;lt;Member&amp;gt; findByName(String name) {
        List&amp;lt;Member&amp;gt; result = jdbcTemplate.query(&quot;select * from member where name = ?&quot;, memberRowMapper(), name); // &quot;select * from member where id = ?&quot; 구문으로 Member 객체 자체를 반환받기 위해 RowMapper 사용
        return result.stream().findAny(); // stream()은 컬렉션에 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드 패턴이다. -&amp;gt; 여러 멤버 객체들중
    }

    @Override
    public List&amp;lt;Member&amp;gt; findAll() {
        return null;
    }

    /*
    RowMapper를 사용하면, 원하는 형태의 결과값을 반환할 수 있다.
    SELECT로 나온 여러개의 값을 반환할 수 있을 뿐만 아니라,
    사용자가 원하는 형태로도 얼마든지 받을 수 있다.
     */
    private RowMapper&amp;lt;Member&amp;gt; memberRowMapper() {
        return (rs, rowNum) -&amp;gt; { // alt + enter로 lambda로 변환 가능

            Member member = new Member();
            member.setId(rs.getLong(&quot;id&quot;));
            member.setName(rs.getString(&quot;name&quot;));
            return member; // result에 저장된 id, name을 추출해서 Member 객체로 반환
        };
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;JPA&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA는 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA를 사용하면 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA를 사용하면 개발 생산성을 크게 높일 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 먼저 build.gradle에 JPA, 데이터베이스 관련 라이브러리 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667659558281&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
//implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 스프링 부트에 JPA 설정 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위치 : resources/application.properties&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667659602673&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;show-sql : JPA가&amp;nbsp;생성하는&amp;nbsp;SQL을&amp;nbsp;출력한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ddl-auto : JPA는&amp;nbsp;테이블을&amp;nbsp;자동으로&amp;nbsp;생성하는&amp;nbsp;기능을&amp;nbsp;제공하는데&amp;nbsp;none&amp;nbsp;를&amp;nbsp;사용하면&amp;nbsp;해당&amp;nbsp;기능을&amp;nbsp;끈다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA 엔티티 매핑&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667659705594&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.domain;

import javax.persistence.*;

// JPA는 자바의 표준 ORM 인터페이스고 여러 구현체들이 있다.
@Entity // 이렇게 @Entity 어노테이션을 하면, JPA가 관리하는 엔티티가 되는거다.
public class Member {

    @Id // pk값으로 매핑시켜준다.
    @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 알아서 value를 생성해주는 걸 IDENTITY라고 한다.
    private Long id; // 데이터를 구분하기 위해서 시스템에서 저장한 아이디

    @Column(name = &quot;username&quot;) // DB에 있는 username과 아래 name 변수를 매핑시켜준다.
    private String name; // 닉네임

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA 회원 레포지토리&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667659757420&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

@Transactional // JPA를 사용할 때는 항상 @Transactional을 어노테이션 해야한다.
public class JPAMemberRepo implements MemberRepository{

    private final EntityManager em; // JPA는 EntityManager를 통해서 모든 동작을 한다.
    // JPA는 내부적으로 Datasource를 다 탑재하고있다.

    public JPAMemberRepo(EntityManager em) {
        this.em = em;
    }

    @Override
    public Member save(Member member) {
        em.persist(member); // .persist()는 이 메서드가 호출되면 article은 managed(영속)상태로 진입하게 됩니다.
        /*
        persist 는 새로운 entity 를 영속성 컨텍스트내에서 관리하고 싶을 때 사용합니다.
        entityManager.persist(xxx) 를 호출하면 바로 insert 쿼리가 동작합니다.
         */
        return member;

    }

    @Override
    // pk 같은 경우 .find로 매핑한다.
    public Optional&amp;lt;Member&amp;gt; findById(Long id) {
        Member member = em.find(Member.class, id); // 첫 인자로는 조회할 타입, 두번째 인자로는 식별자를 넣어주면 된다.
        // .find는 실제로 DB에서 값을 찾아온다. 추가로 Optional로 한번 감싸서 값을 가져오는데, 얘는 해당 ID의 객체가 없다면 Null을 반환한다.
        return Optional.ofNullable(member);
    }

    @Override
    // pk가 아닌 경우, jpql이라는 객체 지향 쿼리를 사용한다.
    public Optional&amp;lt;Member&amp;gt; findByName(String name) {
        List&amp;lt;Member&amp;gt; result = em.createQuery(&quot;select m from Member m where m.name= :name&quot;, Member.class)
                .setParameter(&quot;name&quot;, name) // 외부(인자로 받아온 값)에서 파라미터를 설정할 수 있습니다.
                .getResultList(); // 결과를 컬렉션으로 반환한다. 결과가 없으면 빈 컬렉션이 반환된다. 1건이면 1건만 들어간 컬렉션이 반환된다

        return result.stream().findAny();
    }

    @Override
    // pk가 아닌 경우, jpql이라는 객체 지향 쿼리를 사용한다.
    public List&amp;lt;Member&amp;gt; findAll() {  // ctrl + alt + N = Inline(하나의 문장으로 합치기)
        return em.createQuery(&quot;select m from Member m&quot;, Member.class) // Member(=m) Enitity 자체를 Select 해, 두번째 인자는 타입을 적어준다.
                // jpql은 객체를 대상으로 쿼리를 보내고, 객체를 .
                .getResultList();
    }
}&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스 계층에 트랜잭션 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667659904734&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.transaction.annotation.Transactional

@Transactional
public class MemberService {}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을 커밋한다. 만약 런타임 예외가 발생하면 롤백한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스프링 데이터 JPA&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 데이터 JPA를 사용한다면 레포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 할 수 있고, 반복 개발한 기본 CRUD 기능 또한 스프링 데이터 JPA가 모두 제공한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 데이터 JPA는 JPA를 편리하게 사용해주는 도구이기에, 스프링 데이터 JPA를 먼저 학습해야한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스프링 데이터 JPA 회원 레포지토리&lt;/h4&gt;
&lt;pre id=&quot;code_1667660269487&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;

public interface SpringDataJpaMemberRepository extends JpaRepository&amp;lt;Member,
Long&amp;gt;, MemberRepository {
 Optional&amp;lt;Member&amp;gt; findByName(String name);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring JPA와 데이터 JPA&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@junho918/Spring-Data-Jpa-JPA..%EA%B7%B8%EB%9E%98-%EC%95%8C%EA%B2%A0%EC%96%B4..-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B0%EB%8A%94%EB%8D%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@junho918/Spring-Data-Jpa-JPA..%EA%B7%B8%EB%9E%98-%EC%95%8C%EA%B2%A0%EC%96%B4..-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B0%EB%8A%94%EB%8D%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667660434482&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 Data Jpa] JPA..그래 알겠어.. 그래서 스프링 데이터 JPA는 어떻게 쓰는데..&quot; data-og-description=&quot;김영한님의 실전 Spring Data Jpa를 수강하고 정리한 문서 입니다. 강추! 최고최고. 인프런 김영한님 실전 스프링 데이터 JPA 링크딴거는 다 모르겠고, 기록할 부분만 기록해야겠다.\-h2 데이터베이스 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@junho918/Spring-Data-Jpa-JPA..%EA%B7%B8%EB%9E%98-%EC%95%8C%EA%B2%A0%EC%96%B4..-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B0%EB%8A%94%EB%8D%B0&quot; data-og-url=&quot;https://velog.io/@junho918/Spring-Data-Jpa-JPA..그래-알겠어..-그래서-스프링-데이터-JPA는-어떻게-쓰는데&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QOr3U/hyQsdhoSMQ/15yHzDEl733vgJ2tjT8uG0/img.png?width=1584&amp;amp;height=812&amp;amp;face=0_0_1584_812,https://scrap.kakaocdn.net/dn/kPDtI/hyQtqe9Cnu/6ST9avRRUVPqAf3Qz3TaPK/img.png?width=1584&amp;amp;height=812&amp;amp;face=0_0_1584_812,https://scrap.kakaocdn.net/dn/b2qpND/hyQtAIO00r/Zut18iHY57PjAgi1qlXIlK/img.png?width=1584&amp;amp;height=812&amp;amp;face=0_0_1584_812&quot;&gt;&lt;a href=&quot;https://velog.io/@junho918/Spring-Data-Jpa-JPA..%EA%B7%B8%EB%9E%98-%EC%95%8C%EA%B2%A0%EC%96%B4..-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B0%EB%8A%94%EB%8D%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@junho918/Spring-Data-Jpa-JPA..%EA%B7%B8%EB%9E%98-%EC%95%8C%EA%B2%A0%EC%96%B4..-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B0%EB%8A%94%EB%8D%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QOr3U/hyQsdhoSMQ/15yHzDEl733vgJ2tjT8uG0/img.png?width=1584&amp;amp;height=812&amp;amp;face=0_0_1584_812,https://scrap.kakaocdn.net/dn/kPDtI/hyQtqe9Cnu/6ST9avRRUVPqAf3Qz3TaPK/img.png?width=1584&amp;amp;height=812&amp;amp;face=0_0_1584_812,https://scrap.kakaocdn.net/dn/b2qpND/hyQtAIO00r/Zut18iHY57PjAgi1qlXIlK/img.png?width=1584&amp;amp;height=812&amp;amp;face=0_0_1584_812');&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 Data Jpa] JPA..그래 알겠어.. 그래서 스프링 데이터 JPA는 어떻게 쓰는데..&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;김영한님의 실전 Spring Data Jpa를 수강하고 정리한 문서 입니다. 강추! 최고최고. 인프런 김영한님 실전 스프링 데이터 JPA 링크딴거는 다 모르겠고, 기록할 부분만 기록해야겠다.\-h2 데이터베이스&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;
&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;&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;&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;&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;&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;&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;&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;&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;&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;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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;</description>
      <category>강의 정리/Spring 기초</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/162</guid>
      <comments>https://devdongbaek.tistory.com/162#entry162comment</comments>
      <pubDate>Sun, 6 Nov 2022 00:08:06 +0900</pubDate>
    </item>
    <item>
      <title>자바야 어 반갑다 - 객체 지향 프로그래밍이란?</title>
      <link>https://devdongbaek.tistory.com/161</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2년전 전공 수업때 만났던 자바를 Spring 프레임워크를 위해 다시 공부하기로 하였다.&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 어느정도는 기억할 줄 알고 바로&lt;/span&gt;&lt;/span&gt;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 공부를 시작했지만 &lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개같이 털려버리고,&amp;nbsp; 강의를 통해 다시 기억을 더듬고자 한다.&lt;/span&gt;&lt;/span&gt;&lt;/h4&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;93_3535.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZzL4V/btrP35qvHjz/Bpgf9J2h6vg90qKPjTBxHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZzL4V/btrP35qvHjz/Bpgf9J2h6vg90qKPjTBxHk/img.jpg&quot; data-alt=&quot;ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZzL4V/btrP35qvHjz/Bpgf9J2h6vg90qKPjTBxHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZzL4V%2FbtrP35qvHjz%2FBpgf9J2h6vg90qKPjTBxHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;93_3535.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;다운로드 (4).jpg&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFE5x/btrP4VVfMC9/jpDhEAmQoDhSAFW256pWAk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFE5x/btrP4VVfMC9/jpDhEAmQoDhSAFW256pWAk/img.jpg&quot; data-alt=&quot;레츠기릿&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFE5x/btrP4VVfMC9/jpDhEAmQoDhSAFW256pWAk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFE5x%2FbtrP4VVfMC9%2FjpDhEAmQoDhSAFW256pWAk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;277&quot; height=&quot;182&quot; data-filename=&quot;다운로드 (4).jpg&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레츠기릿&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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: #000000;&quot;&gt;강의 출처 : &lt;a style=&quot;color: #000000;&quot; href=&quot;https://cloudstudying.kr/lectures/195&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cloudstudying.kr/lectures/195&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667224209432&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;09 클래스와 객체 | CloudStudying&quot; data-og-description=&quot;# 클래스와 객체 ## 들어가며.. --- 우리는 이전 파트에서 자바의 기본 문법에 대해 알아보았다. ![클라우드스터딩-자바-기본-문법-파트-요약](https://i.imgur.com/wU3oHxo.png) 이번 파트에서는 데이터와 &quot; data-og-host=&quot;cloudstudying.kr&quot; data-og-source-url=&quot;https://cloudstudying.kr/lectures/195&quot; data-og-url=&quot;https://cloudstudying.kr/lectures/195&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://cloudstudying.kr/lectures/195&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cloudstudying.kr/lectures/195&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;09 클래스와 객체 | CloudStudying&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;# 클래스와 객체 ## 들어가며.. --- 우리는 이전 파트에서 자바의 기본 문법에 대해 알아보았다. ![클라우드스터딩-자바-기본-문법-파트-요약](https://i.imgur.com/wU3oHxo.png) 이번 파트에서는 데이터와&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cloudstudying.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 첫번째 강의에서는 객체 지향 프로그래밍의 전반적인 정의와 여러 개념들에 대해서 공부하였다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;객체 지향 프로그래밍&lt;/b&gt;은 쉽게 말해 조립식 프로그래밍이라 할 수 있다. 객체를 조립하여 전체 프로그램을 만드는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;은 조립식으로 프로그램을 만들기에, 고장이 나도 해당 부분만 수리하면 되고, 또 기능을 추가할 때 만들어서 끼워 넣으면 된다는 것이다. 즉 관리, 재사용, 확장에 매우 유용하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;객체&lt;/b&gt;는 클래스를 통해서 만들어지는 데 그러면 &lt;b&gt;클래스와 객체의 차이&lt;/b&gt;는 무엇일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;클래스와 객체의 차이&lt;/b&gt;는 클래스는 객체를 만들기 위한 설계도이고, 객체는 설계도를 통해 만들어지는 부품이라는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체는 &lt;b&gt;인스턴스&lt;/b&gt;(instance)라고도 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로그램을 만들려면 여러 객체가 필요하고, 여러 객체를 만들려면, 객체별 클래스가 필요하다. 결과적으로,프로그램을 만들기 위해서는 &lt;b&gt;클래스를 잘 만들어야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;클래스를 잘 만들기 위해서는&lt;/b&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;스크린샷 2021-05-13 오후 9.13.25.png&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bugYXy/btrP3MrcuPI/vskNHePaopncZZRpti1mek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bugYXy/btrP3MrcuPI/vskNHePaopncZZRpti1mek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bugYXy/btrP3MrcuPI/vskNHePaopncZZRpti1mek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbugYXy%2FbtrP3MrcuPI%2FvskNHePaopncZZRpti1mek%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;1848&quot; height=&quot;1252&quot; data-filename=&quot;스크린샷 2021-05-13 오후 9.13.25.png&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;클래스의 구조&lt;/b&gt;에 대해서 알아보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스는 상태를 정의하는 &lt;b&gt;필드&lt;/b&gt;와 동작을 정의하는 &lt;b&gt;메소드&lt;/b&gt;로 나뉘어진다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667224868018&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Cat {
  /* 필드(상태) 영역 */
  String name;   // 이름
  String breeds; // 품종
  double weight; // 무게
  
  /* 메소드(동작) 영역 */
  void claw() {
    System.out.println(&quot;할퀴기!!&quot;);
  }
  void meow() {
    System.out.println(&quot;야옹!!&quot;);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문제&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주어진 코드는 두 개의 클래스, Main과 Dog로 이루어져있다. 아래의 클래스 다이어그램을 참조하여 Dog 클래스를 완성하고, 출력 예와 같은 결과를 얻으시오. (Main 클래스의 코드 그대로 사용 할 것)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2590&quot; data-origin-height=&quot;964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmfWlX/btrP2qh9Iyp/R89otRxPsXcVZ8Lr3lbrck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmfWlX/btrP2qh9Iyp/R89otRxPsXcVZ8Lr3lbrck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmfWlX/btrP2qh9Iyp/R89otRxPsXcVZ8Lr3lbrck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmfWlX%2FbtrP2qh9Iyp%2FR89otRxPsXcVZ8Lr3lbrck%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;2590&quot; height=&quot;964&quot; data-origin-width=&quot;2590&quot; data-origin-height=&quot;964&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;출력 예&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이름: null&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;품종: null&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나이: 0&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667225352068&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* Main 클래스 */
public class Main {
  public static void main(String[] args) {
    // Dog 객체 생성
    Dog d = new Dog();
    
    d.name = &quot;핫도그&quot;;
    d.breeds = &quot;요크셔테리어&quot;;
    d.age = 2;  
    
  
    // Dog 객체 필드 값 출력
    System.out.printf(&quot;이름: %s\n&quot;, d.name);
    System.out.printf(&quot;품종: %s\n&quot;, d.breeds);
    System.out.printf(&quot;나이: %s\n&quot;, d.age);
  }
}

/* Dog 클래스 */
class Dog {
  /* 1. 필드 영역을 작성하시오. */
  String name;
  String breeds;
  int age;
  
  /* 2. 메소드 영역을 추가하시오. */
  void wag() {
    system.out.println(&quot;wak!&quot;);
  }
  
  void bark() {
    system.out.println(&quot;bark;&quot;);
  }
  
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;객체 생성 과정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 Dog 클래스의 객체(인스턴스)를 만드는 코드는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667225666188&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Dog 객체를 생성
new Dog();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일반적으로는 만든 객체를 다시 사용키 위해, 다음과 같이 변수로 이름을 붙여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 숫자 86을 재사용하기 위해서 변수에 할당한 것과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667225677534&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 객체 생성 후, dog1 변수에 연결
Dog dog1 = new Dog();

// 비교: 일반 변수
int score = 86;&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;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;생성된 객체는 연결된 변수에 닷(.) 연산을 함으로써, 접근할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667225875864&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// dog1 변수에 연결된 객체에 접근, name 변경.
dog1.name = &quot;멍무이&quot;;

// dog1 변수에 연결된 객체에 접근, weight 변경.
dog1.weight = 4.27;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체 생성시의 정확한 프로세스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;1. new 연산자가 d 객체에 저장될 메모리 공간 할당&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;2. 생성자가 d 객체를 초기화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;3. new 연산자가 새로 생성된 객체의 주소(reference) d 변수에 저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;4. d를 통해 Dog에 접근 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://sime.tistory.com/41&quot;&gt;https://sime.tistory.com/41&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[심이 블로그:티스토리]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;하나의 잘 설계된 클래스로, 여러 개의 객체를 만들 수 있습니다.&lt;/b&gt; 이는 마치, 붕어빵틀로 여러개의 붕어빵을 만드는 것과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667227581928&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 메인 클래스 */
public class BicycleTest {
  public static void main(String[] args) {
    // 자전거 객체 생성
    Bicycle b1 = new Bicycle();

    // 객체 필드값 초기화
    b1.name = &quot;로드형 자전거&quot;;
    b1.weight = 7.25;
    b1.price = 326000;

    // 객체 정보 출력
    System.out.printf(&quot;b1-&amp;gt;{%s, %.2f, %d}\n&quot;, b1.name, b1.weight, b1.price);
    
    /* 1. 새 자전거 객체 b2를 생성하시오. */
    /* 2. b2 객체의 필드를 초기화하시오. */
    /* 3. b2 객체 정보를 출력하시오. */
  }
}

/* 자전거 클래스 */
class Bicycle {
  /* 필드 */
  String name;    // 이름
  double weight;  // 무게
  int price;      // 가격

  /* 메소드 */
  void move() {
    System.out.println(&quot;자전거를 타고 이동합니다.&quot;);
  }
  
  void horn() {
    System.out.println(&quot;따르르릉! 지나갈게요~&quot;);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래는 Bicycle 클래스를 통해 두 객체를 생성하는 예입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667227526333&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 자전거 객체를 만들고, b1 변수에 대입
Bicycle b1 = new Bicycle();

// 자전거 객체 b2 생성
Bicycle b2 = new Bicycle();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b1과 b2는 서로 다른 객체이다. 상호 관계 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;객체는 생성, 초기화, 출력의 단계를 거친다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성&lt;/p&gt;
&lt;pre id=&quot;code_1667227736827&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 자전거 객체를 만들고, b1 변수에 대입
Bicycle b1 = new Bicycle();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;초기화&lt;/p&gt;
&lt;pre id=&quot;code_1667227785027&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;b1.name = &quot;산악자전거&quot;;
b1.weight = 7.25;
b1.price = 132000;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스를 통해 생성된 객체. 이를 인스턴스(instance)라 합니다. 아래는 Cat 인스턴스의 메소드인&amp;nbsp;meow()를 수행시키는 코드 예입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667227958250&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Cat cat1 = new Cat();
cat1.meow(); // &quot;야옹~&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 &lt;b&gt;객체에 특정 동작을 수행시키는 것&lt;/b&gt;. 이를 &amp;ldquo;&lt;b&gt;인스턴스 메소드 호출&lt;/b&gt;&amp;rdquo;이라 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스에서 동작을 하는게 아닌, 객체에서 동작을 하는 것이다!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스 스코프&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 변수의 활동영역을 스코프(scope)라 합니다. 따라서 필드의 활동영역은 &amp;ldquo;클래스 스코프&amp;rdquo;가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;필드의 활동 영역은 클래스 전체&lt;/b&gt;입니다. 따라서, 메소드 호출 시 필드를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667228245933&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Dog {
    String name;
    int age;

    void bark() {
    // 해당 클래스의 필드 name을 사용
    System.out.println(name + &quot;의 멍멍!&quot;);
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;각 객체에 저장된 필드를 메소드로 출력하거나 이용할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메소드 스코프&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파라미터와 지역변수는 메소드 스코프를 가집니다. 다시 말해, 이들의 활동영역은 자신이 속한 메소드 내부입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지역변수&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 지역변수란, 메소드 내부에 선언된 변수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667228696215&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class DrinkMachine {
  String output; // 필드 output 선언
  void pushButton(int num) { // 파라미터 num 선언
    // 지역변수 drinks 선언
    String[] drinks = {&quot;콜라&quot;, &quot;사이다&quot;, &quot;맥주&quot;};
    output = drinks[num];
  }
  void printOutput() {
    System.out.println(output);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #000000;&quot;&gt;스코프 정리&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스 스코프: 필드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메소드 스코프: 파라미터, 지역변수&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>강의 정리/Spring 기초</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/161</guid>
      <comments>https://devdongbaek.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 1 Nov 2022 00:09:21 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 - 완주 하지못한 선수</title>
      <link>https://devdongbaek.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 설명&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
제한사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.&lt;/li&gt;
&lt;li&gt;completion의 길이는 participant의 길이보다 1 작습니다.&lt;/li&gt;
&lt;li&gt;참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.&lt;/li&gt;
&lt;li&gt;참가자 중에는 동명이인이 있을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
입출력 예&lt;/div&gt;
&lt;div&gt;participant / completion / return
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;leo&quot;, &quot;kiki&quot;, &quot;eden&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;eden&quot;, &quot;kiki&quot;]&lt;/td&gt;
&lt;td&gt;&quot;leo&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;marina&quot;, &quot;josipa&quot;, &quot;nikola&quot;, &quot;vinko&quot;, &quot;filipa&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;josipa&quot;, &quot;filipa&quot;, &quot;marina&quot;, &quot;nikola&quot;]&lt;/td&gt;
&lt;td&gt;&quot;vinko&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;mislav&quot;, &quot;stanko&quot;, &quot;mislav&quot;, &quot;ana&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;stanko&quot;, &quot;ana&quot;, &quot;mislav&quot;]&lt;/td&gt;
&lt;td&gt;&quot;mislav&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 #1&lt;br /&gt;&quot;leo&quot;는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 #2&lt;br /&gt;&quot;vinko&quot;는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 #3&lt;br /&gt;&quot;mislav&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;pre id=&quot;code_1667224093286&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(participant, completion): # 해시 참고 -&amp;gt; https://ablue-1.tistory.com/68
    hashDict = {}
    sumHash = 0
    
    for part in participant:
        hashDict[part] = hash(part) # 딕셔너리의 key값으로는 참가자의 이름을, value 값으로는 이름의 해시값(랜덤한 숫자)을 저장한다.
        sumHash += hash(part) # 이름에 대한 해시값들을 저장한다.
    
    for comp in completion:
        sumHash -= hash(comp) # completion에 있는 참가자들의 해시값을 일일이 빼주면 결국 완주하지 못한 선수의 해시값만 남을 것이다
    
    
    for k, v in hashDict.items(): # 딕셔너리의 value가 위에서 구한 완주하지 못한 선수의 value와 같다면 해당 값을 리턴해줌.
        if v == sumHash:
            ans = k
            
    return ans&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>프로그래머스</category>
      <category>프로그래머스 완주하지못한 선수</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/160</guid>
      <comments>https://devdongbaek.tistory.com/160#entry160comment</comments>
      <pubDate>Mon, 31 Oct 2022 22:47:25 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 - 전화번호 목록 #파이썬</title>
      <link>https://devdongbaek.tistory.com/159</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;문제 설명&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.&lt;br /&gt;전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조대 : 119&lt;/li&gt;
&lt;li&gt;박준영 : 97 674 223&lt;/li&gt;
&lt;li&gt;지영석 : 11 9552 4421&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
제한 사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;phone_book의 길이는 1 이상 1,000,000 이하입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 전화번호의 길이는 1 이상 20 이하입니다.&lt;/li&gt;
&lt;li&gt;같은 전화번호가 중복해서 들어있지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
입출력 예제&lt;/div&gt;
&lt;div&gt;phone_book / return
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;119&quot;, &quot;97674223&quot;, &quot;1195524421&quot;]&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;123&quot;,&quot;456&quot;,&quot;789&quot;]&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;12&quot;,&quot;123&quot;,&quot;1235&quot;,&quot;567&quot;,&quot;88&quot;]&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #1&lt;br /&gt;앞에서 설명한 예와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #2&lt;br /&gt;한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #3&lt;br /&gt;첫 번째 전화번호, &amp;ldquo;12&amp;rdquo;가 두 번째 전화번호 &amp;ldquo;123&amp;rdquo;의 접두사입니다. 따라서 답은 false입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1667223903522&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(phone_book):
    answer = True
    phone_book.sort()
    
    for i in range(len(phone_book)-1): # 0, 1
        if phone_book[i+1] is not None:
            if phone_book[i] == phone_book[i+1][:len(phone_book[i])]: # 접두어이기 때문에
                answer = False
                break
            
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>프로그래머스</category>
      <category>프로그래머스 전화번호 목록</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/159</guid>
      <comments>https://devdongbaek.tistory.com/159#entry159comment</comments>
      <pubDate>Mon, 31 Oct 2022 22:46:18 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 - 기능개발 #파이썬</title>
      <link>https://devdongbaek.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1667223813028&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mYFLi/hyQpxMFg4C/XdeJm0VgS6TVuYNBJUJ340/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/be1a5E/hyQpC1uY7W/YYGYjKEKQdH2K03Qw3kOa0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mYFLi/hyQpxMFg4C/XdeJm0VgS6TVuYNBJUJ340/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/be1a5E/hyQpC1uY7W/YYGYjKEKQdH2K03Qw3kOa0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;programmers.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;p data-ke-size=&quot;size16&quot;&gt;문제 설명&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.&lt;/p&gt;
제한 사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.&lt;/li&gt;
&lt;li&gt;작업 진도는 100 미만의 자연수입니다.&lt;/li&gt;
&lt;li&gt;작업 속도는 100 이하의 자연수입니다.&lt;/li&gt;
&lt;li&gt;배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.&lt;/li&gt;
&lt;/ul&gt;
입출력 예&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;progresses / speeds / return&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[93, 30, 55]&lt;/td&gt;
&lt;td&gt;[1, 30, 5]&lt;/td&gt;
&lt;td&gt;[2, 1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[95, 90, 99, 99, 80, 99]&lt;/td&gt;
&lt;td&gt;[1, 1, 1, 1, 1, 1]&lt;/td&gt;
&lt;td&gt;[1, 3, 2]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #1&lt;br /&gt;첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.&lt;br /&gt;두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.&lt;br /&gt;세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #2&lt;br /&gt;모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.&lt;/p&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;&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_1667223780515&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(progresses, speeds):

    
    answer = [] # 결과를 담을 리스트
    time = 0 # 작업까지 걸린 시간
    worked = 0 # 이전 완료된 작업

    
    while len(progresses) &amp;gt; 0: # 작업 리스트가 빌 때까지 반복
        if (progresses[0] + speeds[0] * time) &amp;gt;= 100: # 작업이 완료된 경우 작업 완료 횟수 1을 증가시킨다.
            progresses.pop(0) # FIFO
            speeds.pop(0)   
            worked += 1 
        
        else: # 작업이 완료 되지않은 경우 
            if worked &amp;gt; 0: # 만약 완료된 이전 작업이 있다면 정답 리스트에 추가
                answer.append(worked)    
                worked = 0
            
            time += 1 # 작업에 걸리는 시간을 계속 더해준다.
    
    answer.append(worked) # 마지막 작업은 else문을 안거치기에 answer에 직접 추가해줌
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>기능개발 파이썬.</category>
      <category>프로그래머스</category>
      <category>프로그래머스 기능개발</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/158</guid>
      <comments>https://devdongbaek.tistory.com/158#entry158comment</comments>
      <pubDate>Mon, 31 Oct 2022 22:44:38 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon V-Log</title>
      <link>https://devdongbaek.tistory.com/157</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20221031_223144680.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca5nFV/btrP0f2emx1/j2dWDn8akMjXVkRAVa7lQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca5nFV/btrP0f2emx1/j2dWDn8akMjXVkRAVa7lQ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca5nFV/btrP0f2emx1/j2dWDn8akMjXVkRAVa7lQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca5nFV%2FbtrP0f2emx1%2Fj2dWDn8akMjXVkRAVa7lQ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot; data-filename=&quot;KakaoTalk_20221031_223144680.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>해커톤, 개인 프로젝트</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/157</guid>
      <comments>https://devdongbaek.tistory.com/157#entry157comment</comments>
      <pubDate>Mon, 31 Oct 2022 22:34:41 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 13 회고 Part 4~5</title>
      <link>https://devdongbaek.tistory.com/156</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 4주차 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.gif&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xmNWx/btrIBUb5Kcx/QZpEGoc5uekb6IWEtaUj60/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xmNWx/btrIBUb5Kcx/QZpEGoc5uekb6IWEtaUj60/img.gif&quot; data-alt=&quot;반가워요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xmNWx/btrIBUb5Kcx/QZpEGoc5uekb6IWEtaUj60/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/xmNWx/btrIBUb5Kcx/QZpEGoc5uekb6IWEtaUj60/img.gif&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;270&quot; data-filename=&quot;img.gif&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;반가워요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;반갑다 여러분&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;images.jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btfgfz/btrIEcXCj7P/zQiufDbSslegyO4asDrnJK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btfgfz/btrIEcXCj7P/zQiufDbSslegyO4asDrnJK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btfgfz/btrIEcXCj7P/zQiufDbSslegyO4asDrnJK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtfgfz%2FbtrIEcXCj7P%2FzQiufDbSslegyO4asDrnJK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-filename=&quot;images.jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&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 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;h4 data-ke-size=&quot;size20&quot;&gt;오늘은 저번 강의에 만들었던&lt;/h4&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드 (1).jpg&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MSLqa/btrIyYM5EBe/xSTpHEkxgYpbZhDhiTK2xk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MSLqa/btrIyYM5EBe/xSTpHEkxgYpbZhDhiTK2xk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MSLqa/btrIyYM5EBe/xSTpHEkxgYpbZhDhiTK2xk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMSLqa%2FbtrIyYM5EBe%2FxSTpHEkxgYpbZhDhiTK2xk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;201&quot; data-filename=&quot;다운로드 (1).jpg&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;h3 data-ke-size=&quot;size23&quot;&gt;점프맵에 대한 기본적인 플레이 영상은 아래와 같다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;
&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;p data-ke-size=&quot;size16&quot;&gt;포션을 통해서 hp를 회복하기 위해서는 장애물 구현과 비슷하게 플레이어가 TriggerEvent 발생시 먹은 포션은 사라지고, hp가 증가하게 만들면 된다.&lt;/p&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;먼저 TriggerComponent를 extend해서 PotionTriggerComponent를 추가해주고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 컴포넌트에 TriggerEnterEvent를 추가해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 반드시 heal Property를 만들어주어야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled (1).png&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0ssmh/btrIyZSMiYf/qmvjynj3gK8FLuKnUTGUM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0ssmh/btrIyZSMiYf/qmvjynj3gK8FLuKnUTGUM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0ssmh/btrIyZSMiYf/qmvjynj3gK8FLuKnUTGUM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0ssmh%2FbtrIyZSMiYf%2Fqmvjynj3gK8FLuKnUTGUM1%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;1251&quot; height=&quot;347&quot; data-filename=&quot;Untitled (1).png&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;347&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;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;
&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;포탈을 만드는 방법은 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;1. Model List에서 Portal을 선택해 Scene에 배치하는 방법이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 경우 모델에 Portal Component가 이미 포함되어 있다.&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;2. 그 다음으로는 직접 포탈을 만드는 방법이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;먼저 엔티티를 배치하고, 엔티티에 Add Component를 통해 PortalComponent를 직접 추가해주는 방법이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 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;포탈은 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;포탈 엔티티를 만든 후 PortalEntityRef 프로퍼티에 목적지 포탈을 적어주면 된다.&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;10.JPG&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o15A5/btrIEY5VdnR/LloWldgnDW20azY53Phglk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o15A5/btrIEY5VdnR/LloWldgnDW20azY53Phglk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o15A5/btrIEY5VdnR/LloWldgnDW20azY53Phglk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo15A5%2FbtrIEY5VdnR%2FLloWldgnDW20azY53Phglk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;109&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;109&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;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;
&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사랑해요 여러분&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DhCrxTPV4AAp6tK.jpg&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T7H5K/btrIEcDlxCk/sAYGHZEkEUssLHHfrLZAMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T7H5K/btrIEcDlxCk/sAYGHZEkEUssLHHfrLZAMk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T7H5K/btrIEcDlxCk/sAYGHZEkEUssLHHfrLZAMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT7H5K%2FbtrIEcDlxCk%2FsAYGHZEkEUssLHHfrLZAMk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;360&quot; data-filename=&quot;DhCrxTPV4AAp6tK.jpg&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;360&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>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/156</guid>
      <comments>https://devdongbaek.tistory.com/156#entry156comment</comments>
      <pubDate>Sun, 31 Jul 2022 21:37:51 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 13 회고 Part 3</title>
      <link>https://devdongbaek.tistory.com/155</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 4주차 27일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;640x-.webp&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BuF34/btrIoChCf4E/DwDg4Vny2K0kujnKmpKCmK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BuF34/btrIoChCf4E/DwDg4Vny2K0kujnKmpKCmK/img.webp&quot; data-alt=&quot;반가워용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BuF34/btrIoChCf4E/DwDg4Vny2K0kujnKmpKCmK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBuF34%2FbtrIoChCf4E%2FDwDg4Vny2K0kujnKmpKCmK%2Fimg.webp&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;640&quot; height=&quot;829&quot; data-filename=&quot;640x-.webp&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;반가워용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 반갑다 여러분 &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;EQse_mkU0AAUXDa.jpg&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gw5YL/btrIkpqe034/oDmRyO3u32IkKjHQSTWkr1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gw5YL/btrIkpqe034/oDmRyO3u32IkKjHQSTWkr1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gw5YL/btrIkpqe034/oDmRyO3u32IkKjHQSTWkr1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGw5YL%2FbtrIkpqe034%2FoDmRyO3u32IkKjHQSTWkr1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;428&quot; data-filename=&quot;EQse_mkU0AAUXDa.jpg&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원래 오늘 충돌 기능을 회고에 써야했었는데 멍청한 내가 또 실수를 저질러버려서 어제 미리 작성해버렸다.....&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&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;CXnxpd8U0AATAbk.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RKAGD/btrIn4k8geP/1beit7lDfJR83UPHP1cSy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RKAGD/btrIn4k8geP/1beit7lDfJR83UPHP1cSy0/img.jpg&quot; data-alt=&quot;아이쿠..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RKAGD/btrIn4k8geP/1beit7lDfJR83UPHP1cSy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRKAGD%2FbtrIn4k8geP%2F1beit7lDfJR83UPHP1cSy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;408&quot; data-filename=&quot;CXnxpd8U0AATAbk.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아이쿠..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 오늘은 &lt;s&gt;노가리&amp;nbsp; &lt;/s&gt;아니 내가&lt;/span&gt;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 신청하고, 합격하게 된 스토리를 적어볼까한다.&amp;nbsp;&lt;/span&gt;&lt;/h3&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2702045056D7F7B72F.jpg&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MXsDB/btrIiJ38yA9/J9mFGvrgO1HqcXbb1kzkNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MXsDB/btrIiJ38yA9/J9mFGvrgO1HqcXbb1kzkNk/img.jpg&quot; data-alt=&quot;안궁금한 사람들도 일단 들어는 보자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MXsDB/btrIiJ38yA9/J9mFGvrgO1HqcXbb1kzkNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMXsDB%2FbtrIiJ38yA9%2FJ9mFGvrgO1HqcXbb1kzkNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;215&quot; data-filename=&quot;2702045056D7F7B72F.jpg&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;안궁금한 사람들도 일단 들어는 보자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;&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;span style=&quot;color: #000000;&quot;&gt;MOD라는 것을 알게된 것은 그리 오래로 건너가지는 않는다.&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;때는 멋쟁이사자처럼 10기를 합격하고 전체 OT를 줌으로 할 때였다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_20220727_203831320.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca9vU3/btrIksUAMSh/SfjKFZOWjUfha3rSyDVQL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca9vU3/btrIksUAMSh/SfjKFZOWjUfha3rSyDVQL0/img.png&quot; data-alt=&quot;비록 영상으로 뵙지만 사랑합니다 대장님...ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca9vU3/btrIksUAMSh/SfjKFZOWjUfha3rSyDVQL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca9vU3%2FbtrIksUAMSh%2FSfjKFZOWjUfha3rSyDVQL0%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;950&quot; height=&quot;1016&quot; data-filename=&quot;edited_KakaoTalk_20220727_203831320.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비록 영상으로 뵙지만 사랑합니다 대장님...ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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: #000000;&quot;&gt;신기한 이름, 그리고 단체 해커톤 대회!!!, 또 여러 대학들을 만날 수 있고, 또 체계적인 커리큘럼 등등!!!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;kXvkzoaw3Z.webp&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqBQpW/btrImbZon0N/wHjHt6gJHF02SvObpg6340/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqBQpW/btrImbZon0N/wHjHt6gJHF02SvObpg6340/img.webp&quot; data-alt=&quot;크으으..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqBQpW/btrImbZon0N/wHjHt6gJHF02SvObpg6340/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqBQpW%2FbtrImbZon0N%2FwHjHt6gJHF02SvObpg6340%2Fimg.webp&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;564&quot; height=&quot;540&quot; data-filename=&quot;kXvkzoaw3Z.webp&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;크으으..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220727_203831320_01.png&quot; data-origin-width=&quot;2208&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTYcMB/btrIlx2H26J/Z6yaycvL85fZbJRURinBt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTYcMB/btrIlx2H26J/Z6yaycvL85fZbJRURinBt0/img.png&quot; data-alt=&quot;당시 캡쳐했던 사진&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTYcMB/btrIlx2H26J/Z6yaycvL85fZbJRURinBt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTYcMB%2FbtrIlx2H26J%2FZ6yaycvL85fZbJRURinBt0%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;2208&quot; height=&quot;1242&quot; data-filename=&quot;KakaoTalk_20220727_203831320_01.png&quot; data-origin-width=&quot;2208&quot; data-origin-height=&quot;1242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;당시 캡쳐했던 사진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;바로 MOD였다.&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메이플 리소스를 제공하여, 나만의 컨텐츠를 제작할 수 있다는 말에 더 이상 설명을 듣지 않고&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;나의 TODO 리스트에 MOD.... 라고 바로 적었었다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9929B4405B9A15E90E.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rsBR3/btrIkpqfBXt/qHzkzyu0pzdwsRSc03HyFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rsBR3/btrIkpqfBXt/qHzkzyu0pzdwsRSc03HyFK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rsBR3/btrIkpqfBXt/qHzkzyu0pzdwsRSc03HyFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrsBR3%2FbtrIkpqfBXt%2FqHzkzyu0pzdwsRSc03HyFK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;490&quot; data-filename=&quot;9929B4405B9A15E90E.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;490&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 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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇게 MOD 신청날이 가까오고,&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 밤을 새고 커피를 마셔가며&amp;nbsp; 신청서를 작성했다.&lt;/span&gt;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: GungSeo, serif;&quot;&gt;나는&amp;nbsp; 더 좋은 아이디어를 짜내기 위해서 나를 채찍질 하고, 또 채찍질했다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&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;&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 잠을 꼬박 꼬박 잘잤다. &lt;/span&gt;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;커피도 나는 사실 잘 못마신다.&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드 (5).jpg&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NjS6h/btrIlxaxI37/9ramO7hasVzihfli2ihcB0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NjS6h/btrIlxaxI37/9ramO7hasVzihfli2ihcB0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NjS6h/btrIlxaxI37/9ramO7hasVzihfli2ihcB0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjS6h%2FbtrIlxaxI37%2F9ramO7hasVzihfli2ihcB0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;275&quot; height=&quot;183&quot; data-filename=&quot;다운로드 (5).jpg&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;183&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 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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;화자가 열심히 했다는 것만 알아두자&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;102_8908.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIklT/btrInEAbVSn/DoMxi7iNGuuEaSUiKeRTB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIklT/btrInEAbVSn/DoMxi7iNGuuEaSUiKeRTB1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIklT/btrInEAbVSn/DoMxi7iNGuuEaSUiKeRTB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIklT%2FbtrInEAbVSn%2FDoMxi7iNGuuEaSUiKeRTB1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;102_8908.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&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 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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;신청서에서는 내가 다뤄본 프로그래밍 언어 및 프레임워크를 물어보는 질문과&amp;nbsp; MOD를 통해서 어떤 컨텐츠를 제작하고 싶은지를 물어보는 문항이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나는 파이썬, 자바, C언어를 대학에서 공부하면서 다뤄봤고, 장고와 안드로이드 스튜디오 프레임워크를 다뤄봤기에 해당 문항은 어렵지 않게 작성하고, 만들고 싶은 컨텐츠를 물어본 문항도 어렵지 않게 적어서 냈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 만들고 싶다 제출했던 콘텐츠는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두번째는&amp;nbsp;치유&amp;nbsp;상담&amp;nbsp;위주의&amp;nbsp;콘텐츠입니다.&amp;nbsp;넓은&amp;nbsp;맵을&amp;nbsp;구성하여,&amp;nbsp;유저들이&amp;nbsp;자유롭게&amp;nbsp;돌아다니며&amp;nbsp;이야기도&amp;nbsp;하고,&amp;nbsp;퀘스트&amp;nbsp;및&amp;nbsp;미니게임을&amp;nbsp;하는&amp;nbsp;등&amp;nbsp;기존의&amp;nbsp;메이플과&amp;nbsp;비슷하지만,&amp;nbsp; &lt;br /&gt;&amp;nbsp;가능하다면&amp;nbsp;맵의&amp;nbsp;곳곳에&amp;nbsp;자연스럽게&amp;nbsp;전문&amp;nbsp;상담사를&amp;nbsp;배치하여(ex)&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;나누고,&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;사실&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;유저분들이&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;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #000000;&quot;&gt;그렇게 나는 합격자 발표날을 기다리고, 기다렸다..&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;홍진경-불안-초조-긴장-압박-바보전쟁.jpg&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by9ZkI/btrIi6Y6MGv/Kgt1Y4YGHHDUtbQmykZVp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by9ZkI/btrIi6Y6MGv/Kgt1Y4YGHHDUtbQmykZVp0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by9ZkI/btrIi6Y6MGv/Kgt1Y4YGHHDUtbQmykZVp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby9ZkI%2FbtrIi6Y6MGv%2FKgt1Y4YGHHDUtbQmykZVp0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;330&quot; data-filename=&quot;홍진경-불안-초조-긴장-압박-바보전쟁.jpg&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과는 모두 알고 있다 싶이....&lt;/h2&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;&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;KakaoTalk_20220727_210212719.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KZBGn/btrImQuczq1/nuyDVDHs6u5YY63K4at6xK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KZBGn/btrImQuczq1/nuyDVDHs6u5YY63K4at6xK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KZBGn/btrImQuczq1/nuyDVDHs6u5YY63K4at6xK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKZBGn%2FbtrImQuczq1%2FnuyDVDHs6u5YY63K4at6xK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2000&quot; data-filename=&quot;KakaoTalk_20220727_210212719.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2000&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 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;&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;h2 data-ke-size=&quot;size26&quot;&gt;글을 쓰다보니 내가 무엇을 이야기 하고 싶었는지 잘 기억이 나지않는다.&amp;nbsp;&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사랑해요 여러분&lt;/h2&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;zd41057taa33eb0av164.jpg&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FhMHN/btrIn0C2scR/YFhE8hapCA0Xsi62YammFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FhMHN/btrIn0C2scR/YFhE8hapCA0Xsi62YammFK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FhMHN/btrIn0C2scR/YFhE8hapCA0Xsi62YammFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFhMHN%2FbtrIn0C2scR%2FYFhE8hapCA0Xsi62YammFK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;401&quot; data-filename=&quot;zd41057taa33eb0av164.jpg&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/155</guid>
      <comments>https://devdongbaek.tistory.com/155#entry155comment</comments>
      <pubDate>Wed, 27 Jul 2022 21:06:09 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 13 회고 Part 2</title>
      <link>https://devdongbaek.tistory.com/154</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 4주차 26일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220724_62dc0fdabd532.gif&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXt1JZ/btrIkquHJNP/v5laPv3Il6AnqDW1aYNkfk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXt1JZ/btrIkquHJNP/v5laPv3Il6AnqDW1aYNkfk/img.gif&quot; data-alt=&quot;재밌더라구요 ㅋㅋㅋ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXt1JZ/btrIkquHJNP/v5laPv3Il6AnqDW1aYNkfk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bXt1JZ/btrIkquHJNP/v5laPv3Il6AnqDW1aYNkfk/img.gif&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;360&quot; height=&quot;218&quot; data-filename=&quot;20220724_62dc0fdabd532.gif&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;재밌더라구요 ㅋㅋㅋ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;이번 글에서는 저번 글에서 올렸던 게임 플레이 영상의 코드와 프로세스에 대해서 이야기해보겠다.&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저번 글 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/153&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658839695571&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 13 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 4주차 26일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/153&quot; data-og-url=&quot;https://devdongbaek.tistory.com/153&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dFtRiV/hyPeGwg1ML/ekZcaIZCUUlQmpmtGHsvGk/img.jpg?width=560&amp;amp;height=284&amp;amp;face=0_0_560_284,https://scrap.kakaocdn.net/dn/bvPBLR/hyPeLj3j20/grTkTpwjDIfG3IWQwzO5bk/img.jpg?width=560&amp;amp;height=284&amp;amp;face=0_0_560_284,https://scrap.kakaocdn.net/dn/JKNfk/hyPeMpJixo/zY5GNk6G979CzROnYNH1tK/img.jpg?width=560&amp;amp;height=284&amp;amp;face=0_0_560_284&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/153&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dFtRiV/hyPeGwg1ML/ekZcaIZCUUlQmpmtGHsvGk/img.jpg?width=560&amp;amp;height=284&amp;amp;face=0_0_560_284,https://scrap.kakaocdn.net/dn/bvPBLR/hyPeLj3j20/grTkTpwjDIfG3IWQwzO5bk/img.jpg?width=560&amp;amp;height=284&amp;amp;face=0_0_560_284,https://scrap.kakaocdn.net/dn/JKNfk/hyPeMpJixo/zY5GNk6G979CzROnYNH1tK/img.jpg?width=560&amp;amp;height=284&amp;amp;face=0_0_560_284');&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 넥슨 MOD Suppoters Hackathon Chapter 13 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 4주차 26일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;h3 data-ke-size=&quot;size23&quot;&gt;먼저 게임은 몬스터를 피해서 도착지까지 가는 게임이다.&amp;nbsp; 유저는 공중을 날아다닐 수 있으며, 몬스터와 닿게 되면 유저의 HP가 감소하며, HP가 0이되면 유저는 몇 초간 움직일 수 없는 사망 상태가 된다. 시간이 지나면 다시 움직이며 플레이할 수 있다.&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;모두!! 위의 게임 규칙들을 하나 하나 뜯어보며, 어떤 코드를 적용시켰는지 알아볼까요??&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5c4f56415544f34228ef47afa0a0887b.jpg&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F5D6g/btrIkpo2iiu/jU15bH2jNIEgon1nSBNvH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F5D6g/btrIkpo2iiu/jU15bH2jNIEgon1nSBNvH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F5D6g/btrIkpo2iiu/jU15bH2jNIEgon1nSBNvH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF5D6g%2FbtrIkpo2iiu%2FjU15bH2jNIEgon1nSBNvH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;608&quot; data-filename=&quot;5c4f56415544f34228ef47afa0a0887b.jpg&quot; data-origin-width=&quot;404&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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220724_62dc1563d2321.gif&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccWZkJ/btrIdeQyqAN/oyw9Dd5dBnG22w9xB2KG1k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccWZkJ/btrIdeQyqAN/oyw9Dd5dBnG22w9xB2KG1k/img.gif&quot; data-alt=&quot;넵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccWZkJ/btrIdeQyqAN/oyw9Dd5dBnG22w9xB2KG1k/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ccWZkJ/btrIdeQyqAN/oyw9Dd5dBnG22w9xB2KG1k/img.gif&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;360&quot; height=&quot;304&quot; data-filename=&quot;20220724_62dc1563d2321.gif&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;넵&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;1. 유저는 공중을 날아다닐 수 있다. 이를 구현해보자!&lt;/h3&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;7.JPG&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AZYts/btrIi5LojXk/cnKJR5QwaaGUPZPJ0gUsdk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AZYts/btrIi5LojXk/cnKJR5QwaaGUPZPJ0gUsdk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AZYts/btrIi5LojXk/cnKJR5QwaaGUPZPJ0gUsdk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAZYts%2FbtrIi5LojXk%2FcnKJR5QwaaGUPZPJ0gUsdk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;526&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;526&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위는 구현하는데 필요한 코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대략적으로 코드가 어떻게 동작하는지 알아보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. HandleKeyDownEvent를 통해서 유저가 키를 입력했을 때, 즉 LeftAlt(점프)키를 눌렀을 때 이벤트가 발생하게했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 모드를 Property로 설정해주고, Mode가 &quot;Avoid_Obstacle&quot;일 때만 해당 이벤트가 동작하도록 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 그리고 CameraComponent.Damping을 통해서 유저의 이동을 카메라가 빠르게 따라오게 하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. rigidbody:SetForce(vector2(x방향, y방향))을 통해서 중력을 조절하여서, 밑으로 떨어지지않고 공중에 떠있게 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;h3 data-ke-size=&quot;size23&quot;&gt;2. 몬스터와 닿게 되면 유저의 HP가 감소하며, HP가 0이되면 유저는 몇 초간 움직일 수 없는 사망 상태를 구현한 코드를 아래 사진으로 알아보자&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3J2mP/btrIi7bkLqD/ysHNfsATRbVPwsTTEPjidk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3J2mP/btrIi7bkLqD/ysHNfsATRbVPwsTTEPjidk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3J2mP/btrIi7bkLqD/ysHNfsATRbVPwsTTEPjidk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3J2mP%2FbtrIi7bkLqD%2FysHNfsATRbVPwsTTEPjidk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;349&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;349&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. Damage를 각 엔티티마다 다르게 적용할 수 있게끔 Propery로 설정했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. PlayDead()와 PlayerAlive() 함수를 만들어주고, 각 상태에 맞는 코드들을 작성해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TS2a0/btrIjMSjaw0/jkQvwgu6FTxt6zRqLfor4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TS2a0/btrIjMSjaw0/jkQvwgu6FTxt6zRqLfor4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TS2a0/btrIjMSjaw0/jkQvwgu6FTxt6zRqLfor4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTS2a0%2FbtrIjMSjaw0%2FjkQvwgu6FTxt6zRqLfor4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1097&quot; height=&quot;461&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 만약 충돌이 감지된 엔티티의 Id가 플레이어의 Id와 같다면, 즉 유저가 몬스터와 부딪혔다면 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 만약 Take_Damage_Period, 유저가 공격을 받을 수 있는 상태(기간)이고, 유저에 체력이 0보다 작으면 아래 문장들이 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Take_Damage_Period를 거짓으로 두어서 더이상 공격을 받지 않게 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유저의 상태를 &quot;사망 상태&quot;로 변경한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위에서 작성한 PlayDead()를 호출한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5초간 유저의 사망 상태를 지속시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4초가 지난후 유저의 상태를 변경해주고,&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유저의 체력과 위치를 초기화 시켜주고, &lt;span style=&quot;color: #000000;&quot;&gt;Take_Damage_Period를 참으로 줌으로써 다시 공격을 받을 수 있게 한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. &lt;span style=&quot;color: #000000;&quot;&gt;만약 Take_Damage_Period, 유저가 공격을 받을 수 있는 상태(기간)이고, 유저에 체력이 0보다 많으면 아래 문장들이 동작한다.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Take_Damage_Period를 거짓으로 두어서 더이상 공격을 받지 않게 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입은 데미지 만큼 체력에서 제한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유저를 뒤로 밀려나게 만든다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0.75의 시간을 준 다음 다시 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Take_Damage_Period를 참으로 줌으로써 다시 공격을 받을 수 있게 한다.&lt;/span&gt;&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&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;a_w255546001_1c7c58fb6282e13753480e30153a820014a725a2.gif&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZ2C3/btrIiKOh1c1/p9rhTwXWr0UdnNQSZmnRF0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZ2C3/btrIiKOh1c1/p9rhTwXWr0UdnNQSZmnRF0/img.gif&quot; data-alt=&quot;사랑해요 여 to the 러 to the 분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZ2C3/btrIiKOh1c1/p9rhTwXWr0UdnNQSZmnRF0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/mZ2C3/btrIiKOh1c1/p9rhTwXWr0UdnNQSZmnRF0/img.gif&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;1200&quot; height=&quot;675&quot; data-filename=&quot;a_w255546001_1c7c58fb6282e13753480e30153a820014a725a2.gif&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여 to the 러 to the 분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/154</guid>
      <comments>https://devdongbaek.tistory.com/154#entry154comment</comments>
      <pubDate>Tue, 26 Jul 2022 22:12:48 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 13 회고</title>
      <link>https://devdongbaek.tistory.com/153</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 4주차 26일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2020011523297892621_1.jpg&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl8Dqe/btrH9IcYT3w/tUi3QpqQJiXrW5qT0HuzR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl8Dqe/btrH9IcYT3w/tUi3QpqQJiXrW5qT0HuzR0/img.jpg&quot; data-alt=&quot;우수에 차는 밤이네여&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl8Dqe/btrH9IcYT3w/tUi3QpqQJiXrW5qT0HuzR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl8Dqe%2FbtrH9IcYT3w%2FtUi3QpqQJiXrW5qT0HuzR0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;284&quot; data-filename=&quot;2020011523297892621_1.jpg&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우수에 차는 밤이네여&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 개의 해커톤 대회를 준비하다 보니 최근에는 시간이 너무 빨리 지나간다.&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;93_3535.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wZ5lj/btrIaPbRYpx/pmgeOIcEYSK6EkxcxTo5tk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wZ5lj/btrIaPbRYpx/pmgeOIcEYSK6EkxcxTo5tk/img.jpg&quot; data-alt=&quot;난 아직 감자일뿐인데..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wZ5lj/btrIaPbRYpx/pmgeOIcEYSK6EkxcxTo5tk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwZ5lj%2FbtrIaPbRYpx%2FpmgeOIcEYSK6EkxcxTo5tk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;93_3535.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;난 아직 감자일뿐인데..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하고, 멍청한 나이지만 둘 다 최고의 결과를 만들기 위해서 정말 최선을 다하고있다.&lt;/span&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;그러나 최근에는 너무 피곤하고 지쳐서 내 스스로 정신승리를 하려고만 자꾸 한다.&lt;/h3&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;h2 data-ke-size=&quot;size26&quot;&gt;나는 두 해커톤을 동시에 준비했으니까...&lt;/h2&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1040510507cf171bb918aec7d9bd22fb.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1dkHT/btrIdxOQBTf/KaQ7z8wkZJK5KpkVbk4stk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1dkHT/btrIdxOQBTf/KaQ7z8wkZJK5KpkVbk4stk/img.jpg&quot; data-alt=&quot;포기하지마..!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1dkHT/btrIdxOQBTf/KaQ7z8wkZJK5KpkVbk4stk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1dkHT%2FbtrIdxOQBTf%2FKaQ7z8wkZJK5KpkVbk4stk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;472&quot; data-filename=&quot;1040510507cf171bb918aec7d9bd22fb.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포기하지마..!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그랬으니까... 이 정도면 잘한거야&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Df6SctGV4AAKAIS.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qC2IE/btrIaO5apug/THRsRmg593PkILftEOVWKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qC2IE/btrIaO5apug/THRsRmg593PkILftEOVWKk/img.jpg&quot; data-alt=&quot;포기하지마!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qC2IE/btrIaO5apug/THRsRmg593PkILftEOVWKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqC2IE%2FbtrIaO5apug%2FTHRsRmg593PkILftEOVWKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;488&quot; data-filename=&quot;Df6SctGV4AAKAIS.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포기하지마!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드 (1).png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/06B9a/btrIbNkARzW/PrgACz4zFsHTcvhlyAKhKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/06B9a/btrIbNkARzW/PrgACz4zFsHTcvhlyAKhKK/img.png&quot; data-alt=&quot;어이...!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/06B9a/btrIbNkARzW/PrgACz4zFsHTcvhlyAKhKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F06B9a%2FbtrIbNkARzW%2FPrgACz4zFsHTcvhlyAKhKK%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;300&quot; height=&quot;240&quot; data-filename=&quot;다운로드 (1).png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어이...!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;내가 제일 싫어하는 것은 스스로 이정도면 잘했다고 만족하는 것이다.&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;대회들이 끝나고 침대에서 일주일을 보내더라도, 스스로 후회하지 않을정도로 노력하고, 노력해보겠다!&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드 (1).jpg&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zVji3/btrIbM0gRST/HgafP2p8oVp5jFFr7DKJuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zVji3/btrIbM0gRST/HgafP2p8oVp5jFFr7DKJuK/img.jpg&quot; data-alt=&quot;가보장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zVji3/btrIbM0gRST/HgafP2p8oVp5jFFr7DKJuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzVji3%2FbtrIbM0gRST%2FHgafP2p8oVp5jFFr7DKJuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;201&quot; data-filename=&quot;다운로드 (1).jpg&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가보장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번 Chapter 13에서는 실제로 MOD를 통해서 게임을 만드는 방법을 자세히 배워보는 시간이었다.&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번 게시글에서는 게임 플레이 영상과 만들고 느낀 점에 대해서 집중적으로 설명하고, 추후 코드들과 코드 프로세스에 대해서 이야기 해보겠다!&lt;/h2&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;h4 data-ke-size=&quot;size20&quot;&gt;먼저 플레이 영상이다.&lt;/h4&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만들면서 느낀점&lt;/span&gt;&lt;/h3&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 style=&quot;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드 (3).jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/00Vh2/btrH76kTyL6/skKGzkOjvp8ohC1vAKxs61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/00Vh2/btrH76kTyL6/skKGzkOjvp8ohC1vAKxs61/img.jpg&quot; data-alt=&quot;포테이토&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/00Vh2/btrH76kTyL6/skKGzkOjvp8ohC1vAKxs61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F00Vh2%2FbtrH76kTyL6%2FskKGzkOjvp8ohC1vAKxs61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-filename=&quot;다운로드 (3).jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포테이토&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;span style=&quot;color: #000000;&quot;&gt;분명 코드를 다 맞게 작성했는데, Trigger Event가 제대로 실행되지 않았다.&lt;/span&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;봤던 코드를 보고, 또 보고 모니터를 때리기전에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;xiLVl.webp&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kOdSC/btrH74UWx10/zz8QDhVJBxVL1YIK1BkAJK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kOdSC/btrH74UWx10/zz8QDhVJBxVL1YIK1BkAJK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kOdSC/btrH74UWx10/zz8QDhVJBxVL1YIK1BkAJK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkOdSC%2FbtrH74UWx10%2Fzz8QDhVJBxVL1YIK1BkAJK%2Fimg.webp&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;1087&quot; height=&quot;828&quot; data-filename=&quot;xiLVl.webp&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;발견했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;3.JPG&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/199xb/btrIdaGlVqt/ERg5Dw2qJt3k7IvZCLZE0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/199xb/btrIdaGlVqt/ERg5Dw2qJt3k7IvZCLZE0k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/199xb/btrIdaGlVqt/ERg5Dw2qJt3k7IvZCLZE0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F199xb%2FbtrIdaGlVqt%2FERg5Dw2qJt3k7IvZCLZE0k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1059&quot; height=&quot;625&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #000000;&quot;&gt;여러분은 틀린 부분이 바로 보이는가??&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csCRi4/btrH76kTGmm/ds4L24EXMAURKOnKpAhzyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csCRi4/btrH76kTGmm/ds4L24EXMAURKOnKpAhzyk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csCRi4/btrH76kTGmm/ds4L24EXMAURKOnKpAhzyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsCRi4%2FbtrH76kTGmm%2Fds4L24EXMAURKOnKpAhzyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;31&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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시간을 태웠다!!!&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;20171218_5a377627d884c.webp&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF9044/btrIdXzMYtg/kK2W1nwAKQOCJwq9VIVHUk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF9044/btrIdXzMYtg/kK2W1nwAKQOCJwq9VIVHUk/img.webp&quot; data-alt=&quot;정말 바보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF9044/btrIdXzMYtg/kK2W1nwAKQOCJwq9VIVHUk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF9044%2FbtrIdXzMYtg%2FkK2W1nwAKQOCJwq9VIVHUk%2Fimg.webp&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;291&quot; data-filename=&quot;20171218_5a377627d884c.webp&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정말 바보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;그래도 게임을 만들어보니 이제 정말 MOD 개발을 시작한다는 느낌을 들었다.&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;앞으로도 바보더라도 함께 쭉 가보자!!!!&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;optimize.jpg&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6Dkk/btrH9HkS4IY/vuWIlknMtLGrcGBnYkP28K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6Dkk/btrH9HkS4IY/vuWIlknMtLGrcGBnYkP28K/img.jpg&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6Dkk/btrH9HkS4IY/vuWIlknMtLGrcGBnYkP28K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl6Dkk%2FbtrH9HkS4IY%2FvuWIlknMtLGrcGBnYkP28K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;315&quot; data-filename=&quot;optimize.jpg&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/153</guid>
      <comments>https://devdongbaek.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 26 Jul 2022 02:26:06 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 12 회고</title>
      <link>https://devdongbaek.tistory.com/152</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 3주차 24일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5976ad24b09ea35563d2e42f9a0a86c4.jpg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;879&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Vxlv/btrH2hF9AoA/X9mWrEEePm4UxLEznvc4p0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Vxlv/btrH2hF9AoA/X9mWrEEePm4UxLEznvc4p0/img.jpg&quot; data-alt=&quot;공부란 뭘까&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Vxlv/btrH2hF9AoA/X9mWrEEePm4UxLEznvc4p0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Vxlv%2FbtrH2hF9AoA%2FX9mWrEEePm4UxLEznvc4p0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;879&quot; data-filename=&quot;5976ad24b09ea35563d2e42f9a0a86c4.jpg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;879&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공부란 뭘까&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;이번 Chapter 12에서는 MOD 개발을 하는데 있어서 알아두면 유용한 것들에 대하여 배운 Chapter였다.&lt;/h2&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;h4 data-ke-size=&quot;size20&quot;&gt;최근 Chapter와 다르게 가볍게 들을 수 있는 내용들이니 모두 긴장풀고 들어보자!&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20160815_57b17dfd58631.webp&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTZcd/btrH49UwFTV/hWIfHoTlESCcayHwquN0U1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTZcd/btrH49UwFTV/hWIfHoTlESCcayHwquN0U1/img.webp&quot; data-alt=&quot;편하 개...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTZcd/btrH49UwFTV/hWIfHoTlESCcayHwquN0U1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTZcd%2FbtrH49UwFTV%2FhWIfHoTlESCcayHwquN0U1%2Fimg.webp&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;600&quot; height=&quot;450&quot; data-filename=&quot;20160815_57b17dfd58631.webp&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;편하 개...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;알아두면 유용할 것들을 코드와 영상을 통해서 쉽게 알아보자!&lt;/h3&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;resource(505).jpg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs8vEb/btrH0t719Db/t19MRBrC7izi5HQFHedIKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs8vEb/btrH0t719Db/t19MRBrC7izi5HQFHedIKk/img.jpg&quot; data-alt=&quot;잠깐!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs8vEb/btrH0t719Db/t19MRBrC7izi5HQFHedIKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs8vEb%2FbtrH0t719Db%2Ft19MRBrC7izi5HQFHedIKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;360&quot; data-filename=&quot;resource(505).jpg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잠깐!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;알아보기전에 Model에 대해 다시 개념 정리를 하자면 아래와 같다.&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;모델&lt;/b&gt; : 엔티티에 컴포넌트를 추가해 모델화 할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Original Model&lt;/b&gt; : 빈 엔터티에서 컴포넌트들을 추가해 새로운 무언가를 만든 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Child Model&lt;/b&gt; : 기존 엔터티에서 상세 컴포넌트만 바뀐 것으로, 기존 엔티티에서 파생된 모델이다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;부모 모델과 자식 모델의 관계&lt;/b&gt;자식 모델에서는 자신보다 상위 모델인 부모 모델에서 추가한 컴포넌트를 삭제할 수 없다. 반대로 부모 모델에 새로운 어떤 컴포넌트 추가시 자식 모델에도 추가된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자식 모델의 기존 엔터티를 부모 모델이라 생각하시면 된다. 부모 모델이 자식 모델의 상위 개념이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;span style=&quot;color: #000000;&quot;&gt;기본 개념에 대해 다시 복습을 해봤으니 이제 알아보자!&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&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;span style=&quot;color: #000000;&quot;&gt;동적 Spawn을 통해 Model을 스폰 시키는 방법&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동적 spawn 구현시 SpawnByModelId 함수를 사용한다.&amp;nbsp;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SpawnByModelId 함수 더 알아보기&lt;/b&gt;_SpawnService:SpawnByModelId를 사용하기 위해서는 엔티티로 생성할 모델이 WorkSpace에 추가되어 있어야 하며, 추가된 Model ID를 파라미터로 넘겨주어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;spawn을 클라이언트에서 구현시 나에게만 보인다. 반대로 서버에서 구현하면 유저 모두에게 보인다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SpawnByModelId는 _SpawnService가 제공하는 스폰 관련 함수 중 하나이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;0.JPG&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mYpRF/btrH31phEUz/FkSsNYBCmGBEzJ4WSooknK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mYpRF/btrH31phEUz/FkSsNYBCmGBEzJ4WSooknK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mYpRF/btrH31phEUz/FkSsNYBCmGBEzJ4WSooknK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmYpRF%2FbtrH31phEUz%2FFkSsNYBCmGBEzJ4WSooknK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;299&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;299&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 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 class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;
&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;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: #000000;&quot;&gt;&lt;b&gt;동적 생성이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개발자가 모든 설정을 수동으로 작업해 엔티티를 생성하는 것이 아니라, 알아서 엔티티가 자동으로 생성되도록 하는 것이다. 주로 같은 모델의 엔티티를 여러개 생성할 때 사용한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XClNY/btrH6Iv3tX4/OHkK0TWZgR215NCsdHVxB0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XClNY/btrH6Iv3tX4/OHkK0TWZgR215NCsdHVxB0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XClNY/btrH6Iv3tX4/OHkK0TWZgR215NCsdHVxB0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXClNY%2FbtrH6Iv3tX4%2FOHkK0TWZgR215NCsdHVxB0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1073&quot; height=&quot;267&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2초에 하나씩 몬스터를 스폰시키는 코드이다.&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;span style=&quot;color: #000000;&quot;&gt;*CallBack == (SetTimer) : 주기적으로 실행하는 것으로 함수의 경우 self.으로 호출한다. (일반 함수는 self:로 호출)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일정 시간을 두고 조금 기다렸다가 실행하거나 db에 저장하는 경우 등에 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uzm0H/btrH2gHh3LB/Hpi6DlPuxaaN0rTTzioc2K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uzm0H/btrH2gHh3LB/Hpi6DlPuxaaN0rTTzioc2K/img.jpg&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uzm0H/btrH2gHh3LB/Hpi6DlPuxaaN0rTTzioc2K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUzm0H%2FbtrH2gHh3LB%2FHpi6DlPuxaaN0rTTzioc2K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;540&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/152</guid>
      <comments>https://devdongbaek.tistory.com/152#entry152comment</comments>
      <pubDate>Sun, 24 Jul 2022 20:40:43 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 11 회고</title>
      <link>https://devdongbaek.tistory.com/151</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 3주차 21일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1040510507cf171bb918aec7d9bd22fb.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5kFiN/btrHPJwLSfg/67zFKsG9NsE5eCbP3dEzD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5kFiN/btrHPJwLSfg/67zFKsG9NsE5eCbP3dEzD1/img.jpg&quot; data-alt=&quot;오늘도 와줘서 고마워요 ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5kFiN/btrHPJwLSfg/67zFKsG9NsE5eCbP3dEzD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5kFiN%2FbtrHPJwLSfg%2F67zFKsG9NsE5eCbP3dEzD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;472&quot; data-filename=&quot;1040510507cf171bb918aec7d9bd22fb.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오늘도 와줘서 고마워요 ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이번 챕터 11에서는 MOD의 UI 에디터에 대해서&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 공부하였다.&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;MOD에서는 UI 에디터를 통해서 화면 상에 출력되는 UI를 조작한다.&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;MOD의 UI 에디터는 아래와 같은 구성들을 지니고 있다.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;1. &lt;b&gt;모델리스트&lt;/b&gt; : 메이커에서 제공하는 다양한 UI Preset 활용 가능&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;UI 엔티티를 생성하는 방법은 2가지 방법이 있다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;기본 UI 모델을 선택해 배치하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;UI Preset을 활용하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;26.JPG&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;889&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dARzyn/btrHPJXQemf/AiLJvSDnsHUvb6C3u5K4T0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dARzyn/btrHPJXQemf/AiLJvSDnsHUvb6C3u5K4T0/img.jpg&quot; data-alt=&quot;모델리스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dARzyn/btrHPJXQemf/AiLJvSDnsHUvb6C3u5K4T0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdARzyn%2FbtrHPJXQemf%2FAiLJvSDnsHUvb6C3u5K4T0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;463&quot; height=&quot;889&quot; data-filename=&quot;26.JPG&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;889&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모델리스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. &lt;b&gt;UI 경로 정보 &lt;/b&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; 선택된 UI 엔티티의 경로 정보를 얻어오는 기능&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;27.JPG&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC7EDf/btrHSAza3Oj/4x0DTe9HTnpLOYP0dCgSS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC7EDf/btrHSAza3Oj/4x0DTe9HTnpLOYP0dCgSS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC7EDf/btrHSAza3Oj/4x0DTe9HTnpLOYP0dCgSS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC7EDf%2FbtrHSAza3Oj%2F4x0DTe9HTnpLOYP0dCgSS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;366&quot; height=&quot;30&quot; data-filename=&quot;27.JPG&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;3. &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;캔버스&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;선택된 UI 엔티티의 배치 및 편집을 작업하는 공간&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&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;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;28.JPG&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMyhqX/btrHTXf0kVZ/SxHbBXhThaCzbs5envfGuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMyhqX/btrHTXf0kVZ/SxHbBXhThaCzbs5envfGuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMyhqX/btrHTXf0kVZ/SxHbBXhThaCzbs5envfGuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMyhqX%2FbtrHTXf0kVZ%2FSxHbBXhThaCzbs5envfGuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;430&quot; data-filename=&quot;28.JPG&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4.&lt;b&gt;&lt;span&gt; 기본 도구&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이미지 &amp;amp; 버튼 등의 UI 엔티티 배치 가능&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;29.JPG&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAm5Mp/btrHVg6ZJ4k/joK8jkQF3qXR4t5JE427mk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAm5Mp/btrHVg6ZJ4k/joK8jkQF3qXR4t5JE427mk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAm5Mp/btrHVg6ZJ4k/joK8jkQF3qXR4t5JE427mk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAm5Mp%2FbtrHVg6ZJ4k%2FjoK8jkQF3qXR4t5JE427mk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;40&quot; height=&quot;189&quot; data-filename=&quot;29.JPG&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 UI 엔티티는 기본 도구를 통해 배치할 수 있고, 기본 도구에 추가되어있는 기본 UI 엔티티는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이미지&lt;/li&gt;
&lt;li&gt;버튼&lt;/li&gt;
&lt;li&gt;스크롤뷰&lt;/li&gt;
&lt;li&gt;텍스트&lt;/li&gt;
&lt;li&gt;입력텍스트&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5.&lt;b&gt;&lt;span&gt;&lt;span&gt; UI Group 편집창&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;UI Group의 선택 / 추가 / 삭제 기&lt;span style=&quot;color: #000000;&quot;&gt;능 제공&lt;/span&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;30.JPG&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dctcav/btrHPcS6Q8n/1zj6EChxiW6Z37CkwwCTeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dctcav/btrHPcS6Q8n/1zj6EChxiW6Z37CkwwCTeK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dctcav/btrHPcS6Q8n/1zj6EChxiW6Z37CkwwCTeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdctcav%2FbtrHPcS6Q8n%2F1zj6EChxiW6Z37CkwwCTeK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;165&quot; height=&quot;349&quot; data-filename=&quot;30.JPG&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;우리는 스크립트를 이용해 UI 엔티티를 제어할 수 있다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;EfREv45U0AEWQGD.jpg&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgMjfW/btrHPK3xut4/SH3NlwB4pxI5dwn8rreKLK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgMjfW/btrHPK3xut4/SH3NlwB4pxI5dwn8rreKLK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgMjfW/btrHPK3xut4/SH3NlwB4pxI5dwn8rreKLK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgMjfW%2FbtrHPK3xut4%2FSH3NlwB4pxI5dwn8rreKLK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1136&quot; height=&quot;640&quot; data-filename=&quot;EfREv45U0AEWQGD.jpg&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;640&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 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;h3 data-ke-size=&quot;size23&quot;&gt;우리가 UI 엔티티를 생성하였다면, UI 엔티티에 접근해 엔티티를 제어해야한다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UI 엔티티는 &lt;b&gt;월드에서의 엔티티로의 접근법&lt;/b&gt;과 동일하게 접근할 수 있다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;즉 스크립트에서 엔티티 객체를 불러올 수 있다는 것이다.&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;버튼 클릭 시 서버에서의 처리를 요청하는 예시 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658394752233&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Function:
    [server only]
    void OnbeginPlay()
    {
        local button = _EntityService:GetEntityByPath(&quot;ButtonEntityPath&quot;) 
        -- 가져 올 버튼 엔티티 경로를 &quot;ButtonEntityPath&quot;에 입력합니다.
        button:Connect(&quot;ButtonClickEvernt&quot;, self.OnButtonClickClient, self)
    }

    [client only] 
    Void OnButtonClickClient()
    {
        --processing in client..
        self:OnButtonClickServer()
    }

    [server] 
    void OnButtonClickServer()
    {
        log(&quot;Start processing on the server&quot;)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서버에서 처리 결과를 UI로 출력할 때의 예시 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658394847873&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Property:
    [sync]
    number time=0

Function:
    [server only]
    void OnUpdate(number delta)
    {
        self.time = self.time + delta
        if self.time &amp;gt;= 3 then
            self.time = 0
            self:ShowToastMessage(&quot;Time Reset&quot;)
        end
    }[client]
    void ShowToastMessage (string text)
    {
        local toastUiEntity = _EntityService:GetEntityByPath(&quot;UIEntityPath&quot;)
        -- 가져 올 UI 엔티티 경로를 &quot;UIEntityPath&quot;에 입력합니다.

        local textComponent = toastUIEntity.TextComponent

        -- print toast message
        textComponent.Text = text
        toastUIEntity:SetEnable(true)

        --reservate hide toast message
        local callback = function()
                toastUIEntity:SetEnable(false)
            end
        _TimerService:SetTimerOnce(callback,3)
    }&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;h2 data-ke-size=&quot;size26&quot;&gt;또한 UI를 상황과 조건에 따라 노출 시킬 수 있다.&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;UI 엔티티는 화면의 입출력을 담당하는 엔티티이기에, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상황과 조건에 따라 UI를 띄우거나 숨길 수 있어야 한다.&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 몬스터를 잡고있는데 채팅창이 계속 떠서 방해하거나, 보스전에서 내 HP바가 안보이면 큰 낭패이지 않은가... ㅠㅠ&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AWviU.webp&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcFtAf/btrHVgspYMT/xLlf3YFI4zv3y6uynL3oHK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcFtAf/btrHVgspYMT/xLlf3YFI4zv3y6uynL3oHK/img.webp&quot; data-alt=&quot;ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcFtAf/btrHVgspYMT/xLlf3YFI4zv3y6uynL3oHK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcFtAf%2FbtrHVgspYMT%2FxLlf3YFI4zv3y6uynL3oHK%2Fimg.webp&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;1107&quot; height=&quot;828&quot; data-filename=&quot;AWviU.webp&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Entity 함수인 setEnable 을 통해 알림 팝업 및 토스트 메시지를 띄우는 기능을 구현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658395311441&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void ShowToastMessage ()
{
    local toastUIEntity = _EntityService:GetEntityByPath(&quot;/ui/.../EntityPath&quot;)
    toastUIEntity:SetEnable(true)
}
 
void HideToastMessage ()
{
    local toastUIEntity = _EntityService:GetEntityByPath(&quot;/ui/.../EntityPath&quot;)
    toastUIEntity:SetEnable(false)
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수에 따라 toastUIEntity:SetEnable() 의 boolean 값을 바꿔줌으로써 토스트메시지가 상황에 따라 출력되거나 숨겨지도록 할 수 있다.&lt;/li&gt;
&lt;/ul&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;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;span style=&quot;color: #000000;&quot;&gt;만약 여러개의 토스트메시지를 한번에 띄우거나 숨겨야하는 경우 엔티티의 노출 처리를 효율적으로 관리할 수 있는 &lt;b&gt;계층구조&lt;/b&gt;를 활용할 수 있다.&lt;/span&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;계층 구조를 사용하지 않은 UI 노출 처리는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658395472625&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void ShowPopupUI ()
{
    local PopupUIEntity_1 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODImage_1&quot;)
    local PopupUIEntity_2 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODButton_1&quot;)
    local PopupUIEntity_3 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODButton_1_1&quot;)
    local PopupUIEntity_4 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODText_1&quot;)
    local PopupUIEntity_5 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODButton_1_1_1&quot;)
    PopupUIEntity_1:SetEnable(true)
    PopupUIEntity_2:SetEnable(true)
    PopupUIEntity_3:SetEnable(true)
    PopupUIEntity_4:SetEnable(true)
    PopupUIEntity_5:SetEnable(true)
}

void HidePopupUI ()
{
    local PopupUIEntity_1 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODImage_1&quot;)
    local PopupUIEntity_2 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODButton_1&quot;)
    local PopupUIEntity_3 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODButton_1_1&quot;)
    local PopupUIEntity_4 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODText_1&quot;)
    local PopupUIEntity_5 = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODButton_1_1_1&quot;)
    PopupUIEntity_1:SetEnable(false)
    PopupUIEntity_2:SetEnable(false)
    PopupUIEntity_3:SetEnable(false)
    PopupUIEntity_4:SetEnable(false)
    PopupUIEntity_5:SetEnable(false)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;계층 구조를 사용한 UI 노출 처리는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658395490289&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void ShowPopupUI ()
{
    local PopupUIEntity = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODImage_1&quot;)
    PopupUIEntity:SetEnable(true)
}

void HidePopupUI ()
{
    local PopupUIEntity = _EntityService:GetEntityByPath(&quot;/ui/DefaultGroup/MODImage_1&quot;)
    PopupUIEntity:SetEnable(false)
}&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Df6SctGV4AAKAIS.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1mrsS/btrHTYe0ZEu/GM5AoZODG8Yw23luA4Lh91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1mrsS/btrHTYe0ZEu/GM5AoZODG8Yw23luA4Lh91/img.jpg&quot; data-alt=&quot;혁...신!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1mrsS/btrHTYe0ZEu/GM5AoZODG8Yw23luA4Lh91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1mrsS%2FbtrHTYe0ZEu%2FGM5AoZODG8Yw23luA4Lh91%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;488&quot; data-filename=&quot;Df6SctGV4AAKAIS.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혁...신!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;UI는 UI Group을 통해서 연관 기능이 있는 UI 엔티티끼리 묶어 관리한다.&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예를 들어 체력바는 인벤토리와, 지도는 랭킹과 함께 UI Group으로 묶을 수 있다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;31.JPG&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMavQ1/btrHTr9NDUR/MnqMLiCywD2kAuQ2yrHTRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMavQ1/btrHTr9NDUR/MnqMLiCywD2kAuQ2yrHTRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMavQ1/btrHTr9NDUR/MnqMLiCywD2kAuQ2yrHTRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMavQ1%2FbtrHTr9NDUR%2FMnqMLiCywD2kAuQ2yrHTRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;165&quot; height=&quot;347&quot; data-filename=&quot;31.JPG&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;347&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;UI Group의 노출 및 숨김 처리도 위에서 이야기한 SetEnable 함수로 설정한다.&lt;/h4&gt;
&lt;pre id=&quot;code_1658395822329&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void ShowUIGroup_1 ()
{
    local UIGroup_1 = _EntityService:GetEntityByPath(&quot;/ui/UIGroup_1&quot;)
    UIGroup_1:SetEnable(true)
}

void HideUIGroup_1 ()
{
    local UIGroup_1 = _EntityService:GetEntityByPath(&quot;/ui/UIGroup_1&quot;)
    UIGroup_1:SetEnable(false)
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;UI Group의 상시 노출을 설정하고자 하는 경우에는 DefaultShow 속성의 값을 true로 설정하자&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;UI Group에 텍스트 그룹을 추가하는 방법&lt;/h2&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. UI Group 편집창에서 새 그룹을 추가하기&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;32.JPG&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9om5Z/btrHTYsz7GL/1MPZVQ3JfIxkBKna1jQs4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9om5Z/btrHTYsz7GL/1MPZVQ3JfIxkBKna1jQs4K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9om5Z/btrHTYsz7GL/1MPZVQ3JfIxkBKna1jQs4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9om5Z%2FbtrHTYsz7GL%2F1MPZVQ3JfIxkBKna1jQs4K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;509&quot; height=&quot;570&quot; data-filename=&quot;32.JPG&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;570&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;&lt;b&gt;UITransformComponent &lt;/b&gt;은 &lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;배치한 텍스트 박스의 위치와 크기를 설정&lt;/span&gt;할 수 있는 컴포넌트이다.&lt;/h4&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;SpriteGUIRendererComponen&lt;/b&gt;t 의 다양한 속성값을 통해 텍스트박스의 배경색, 배경, 리소스 경로 설정 등 텍스트박스를 예쁘게 꾸며볼 수 있다.&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp; 메이커의 UI 버튼을 눌러 UI 에디터로 이동하여 UIGroup에서 해당 그룹으로 이동한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 좌측의 기본도구에서 이미지를 클릭해 이미지 UI를 추가한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. SpriteGUIRendererComponent의 ImageRUID 프로퍼티의 우측 버튼을 클릭해 Sprite Picker 메뉴를 선택한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 프로퍼티를 조정해 이미지 UI의 크기와 위치를 설정해준다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&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;703433_414498_4732.jpg&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkEsYE/btrHUiddR7N/7ur9g1XPDkaGWisnzArX8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkEsYE/btrHUiddR7N/7ur9g1XPDkaGWisnzArX8k/img.jpg&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkEsYE/btrHUiddR7N/7ur9g1XPDkaGWisnzArX8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkEsYE%2FbtrHUiddR7N%2F7ur9g1XPDkaGWisnzArX8k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;609&quot; data-filename=&quot;703433_414498_4732.jpg&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;&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>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/151</guid>
      <comments>https://devdongbaek.tistory.com/151#entry151comment</comments>
      <pubDate>Thu, 21 Jul 2022 18:45:42 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 9~ 10 회고</title>
      <link>https://devdongbaek.tistory.com/150</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 3주차 20일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jjv2fm.jpg&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epDa9I/btrHNMyYlk7/UOQNn9NGJ7T1sl5SHc8PQK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epDa9I/btrHNMyYlk7/UOQNn9NGJ7T1sl5SHc8PQK/img.jpg&quot; data-alt=&quot;아뇨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epDa9I/btrHNMyYlk7/UOQNn9NGJ7T1sl5SHc8PQK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepDa9I%2FbtrHNMyYlk7%2FUOQNn9NGJ7T1sl5SHc8PQK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;371&quot; data-filename=&quot;jjv2fm.jpg&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아뇨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 블로그를 찾아줘서 고맙고, 반갑다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;784477_618017_618.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0S4Mt/btrHJZNdEwR/KRCJrc3wEqGvVxTAzctNzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0S4Mt/btrHJZNdEwR/KRCJrc3wEqGvVxTAzctNzk/img.jpg&quot; data-alt=&quot;반갑습니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0S4Mt/btrHJZNdEwR/KRCJrc3wEqGvVxTAzctNzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0S4Mt%2FbtrHJZNdEwR%2FKRCJrc3wEqGvVxTAzctNzk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;327&quot; data-filename=&quot;784477_618017_618.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;반갑습니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Chapter 9~ 10은 컴포넌트의 활용에 대해서 중점적으로 배우는&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매우&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;매우 &lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;매우 &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;중요한 챕터이다.&lt;/h2&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;h4 data-ke-size=&quot;size20&quot;&gt;MOD 개발에 있어서의 컴포넌트는 엔티티의 움직임 및 여러 속성들을 좌지우지 하기에 반드시 반드시 알고있어야 한다.&lt;/h4&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;반드시&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0423f7f57a6f2739a185f4bb3423c4b9.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9LPi1/btrHPKPE8cv/JY8BYjwiMNKFnQEvQApdV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9LPi1/btrHPKPE8cv/JY8BYjwiMNKFnQEvQApdV1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9LPi1/btrHPKPE8cv/JY8BYjwiMNKFnQEvQApdV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9LPi1%2FbtrHPKPE8cv%2FJY8BYjwiMNKFnQEvQApdV1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-filename=&quot;0423f7f57a6f2739a185f4bb3423c4b9.jpg&quot; data-origin-width=&quot;1280&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 컴포넌트에 대한 기초 개념과 기본 컴포넌트는 아래 주소를 참고하도록 하자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/131&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/131&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;이번 챕터에서는 여러 컴포넌트들과 해당 컴포넌트의 Property가 어떤 역할을 하는지에 대해서 배웠는데, Chapter 2에서 배우지 않았던 컴포넌트들은 제외하고 한번 이야기 해보자&lt;/h4&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;5c4f56415544f34228ef47afa0a0887b.jpg&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oSYOE/btrHN38h2IZ/gH9VCdTJS8I0UTYDXcDcS0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oSYOE/btrHN38h2IZ/gH9VCdTJS8I0UTYDXcDcS0/img.jpg&quot; data-alt=&quot;가보자~!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oSYOE/btrHN38h2IZ/gH9VCdTJS8I0UTYDXcDcS0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoSYOE%2FbtrHN38h2IZ%2FgH9VCdTJS8I0UTYDXcDcS0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;608&quot; data-filename=&quot;5c4f56415544f34228ef47afa0a0887b.jpg&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가보자~!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;첫번째로 이야기 해볼 컴포넌트는 &lt;b&gt;MovementComponent&lt;/b&gt; 이다. 이름에서 알 수 있듯이 이 컴포넌트는 캐릭터의 움직임에 관여하는 컴포넌트이다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&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;20.JPG&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K79oT/btrHN3UM0SY/8iTys0aFCBm9RjWScg3G8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K79oT/btrHN3UM0SY/8iTys0aFCBm9RjWScg3G8k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K79oT/btrHN3UM0SY/8iTys0aFCBm9RjWScg3G8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK79oT%2FbtrHN3UM0SY%2F8iTys0aFCBm9RjWScg3G8k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;103&quot; data-filename=&quot;20.JPG&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MovementComponent는 2개의 Property가 존재하는데, 각 Property는 다음과 같다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;InputSpeed&lt;/b&gt; : 이동 속도를 조절하는 프로퍼티 (X축 기준)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;JumpForce&lt;/b&gt; : 점프력을 조절하는 프로퍼티 (Y축 기준)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;두번째로 이야기 할 컴포넌트는 &lt;b&gt;WebSpriteComponent&amp;nbsp;&lt;/b&gt;이다. 이 컴포넌트는 웹에 있는 이미지를 가져와서 표시해주는 컴포넌트이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;21.JPG&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ru3Gh/btrHJissBUV/z9onwrASMmYpHM0b01soB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ru3Gh/btrHJissBUV/z9onwrASMmYpHM0b01soB1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ru3Gh/btrHJissBUV/z9onwrASMmYpHM0b01soB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fru3Gh%2FbtrHJissBUV%2Fz9onwrASMmYpHM0b01soB1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;306&quot; height=&quot;274&quot; data-filename=&quot;21.JPG&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WebSpriteComponent는 위와 같은 Property가 존재하는데, 중요한 Property는 다음과 같다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Color&lt;/b&gt; : Sprite에 색깔을 덧씌운다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;FlipX, FlipY&lt;/b&gt; : Sprite의 X, 축을 기준으로 반전 여부를 결정한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Url&lt;/b&gt; : Sprite의 Url이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 다음은 &lt;b&gt;YoutubePlayerWorldComponent&lt;/b&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;22.JPG&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br2cSl/btrHOzyXfLf/1StLOpHOg4hja6JlIEu5F1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br2cSl/btrHOzyXfLf/1StLOpHOg4hja6JlIEu5F1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br2cSl/btrHOzyXfLf/1StLOpHOg4hja6JlIEu5F1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr2cSl%2FbtrHOzyXfLf%2F1StLOpHOg4hja6JlIEu5F1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;357&quot; data-filename=&quot;22.JPG&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;357&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;&lt;span style=&quot;color: #000000;&quot;&gt;YoutubePlayerWorldComponent는 위와 같은 Property가 존재하는데, 중요한 Property는 다음과 같다.&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;YoutubePlayerGUIComponent &lt;/b&gt;: UI 상에서 표시해줄 때 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;YoutubePlayerWorldComponent &lt;/b&gt;: 월드상에 표시할 때 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래부터는 실 mod 개발에 정말 빈번하게 사용되는 컴포넌트들에 대해서 알아보겠다.&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;정말 정말 중요하니 다들 집중해주길 바란다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드 (1).jpg&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMpWu4/btrHROcYKdU/S2dSVIMkO7GJKNmdGDgno1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMpWu4/btrHROcYKdU/S2dSVIMkO7GJKNmdGDgno1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMpWu4/btrHROcYKdU/S2dSVIMkO7GJKNmdGDgno1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMpWu4%2FbtrHROcYKdU%2FS2dSVIMkO7GJKNmdGDgno1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;201&quot; data-filename=&quot;다운로드 (1).jpg&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 입력 관련 컴포넌트들을 알아보겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력 관련 컴포넌트는&lt;b&gt; Entity Event Handler &lt;/b&gt;에서 작업한다&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래는 유저가 키보드의 키를 입력했을 때 이벤트를 처리하는 컴포넌트들이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;23.JPG&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IQJfG/btrHK1jstz4/KRoNwxUpgP3zQ2rCkpBuz1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IQJfG/btrHK1jstz4/KRoNwxUpgP3zQ2rCkpBuz1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IQJfG/btrHK1jstz4/KRoNwxUpgP3zQ2rCkpBuz1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIQJfG%2FbtrHK1jstz4%2FKRoNwxUpgP3zQ2rCkpBuz1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;309&quot; data-filename=&quot;23.JPG&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;309&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;KeyDownEvent&lt;/b&gt; : 키를 1번 눌렀을 때 발생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;KeyHoldEvent&lt;/b&gt; : 키를 누르는 동안 발생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;KeyReleaseEvent&lt;/b&gt; : 키를 길게 눌렀다 뗐을 때 발생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;KeyUpEvent&lt;/b&gt; : 키를 1번 눌렀을 때 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 키보드의 'P'를 눌렀을 때의 로그를 출력하는 이벤트를 작성할 때의 예시 코드&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;24.JPG&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AeNsY/btrHKeb6bUU/SlrJ6TzblWYctSXyiok2wK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AeNsY/btrHKeb6bUU/SlrJ6TzblWYctSXyiok2wK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AeNsY/btrHKeb6bUU/SlrJ6TzblWYctSXyiok2wK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAeNsY%2FbtrHKeb6bUU%2FSlrJ6TzblWYctSXyiok2wK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;526&quot; height=&quot;250&quot; data-filename=&quot;24.JPG&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;250&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유저가 화면을 터치 할 때 이벤트를 처리하는 컴포넌트들이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;25.JPG&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8gAxe/btrHKnUzqVc/HbVoVqHIzX1Ka2uAHTeXS0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8gAxe/btrHKnUzqVc/HbVoVqHIzX1Ka2uAHTeXS0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8gAxe/btrHKnUzqVc/HbVoVqHIzX1Ka2uAHTeXS0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8gAxe%2FbtrHKnUzqVc%2FHbVoVqHIzX1Ka2uAHTeXS0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;315&quot; data-filename=&quot;25.JPG&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ScreenTouchEvent&lt;/b&gt; : 월드상의 화면을 터치, 또는 클릭했을 때 1회 발생하는 이벤트&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ScreenTouchHoldEvent&lt;/b&gt; : 월드상의 화면을 터치하고 있는 동안 프레임마다 발생하는 이벤트&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ScreenTouchReleaseEvent&lt;/b&gt; : 터치를 유지하다가 터치를 종료했을 때 1회 발생하는 이벤트&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TouchEvent&lt;/b&gt; : Entity를 터치했을 때 발생하는 이벤트, 엔티티에 TouchReceiveComponent&amp;nbsp;컴포넌트가 있어야 이벤트 발생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TouchHoldEvent&lt;/b&gt;&amp;nbsp;: Entity를 터치하고 있는 동안 발생하는 이벤트, 엔티티에&amp;nbsp;TouchReceiveComponent&amp;nbsp;컴포넌트가 있어야 이벤트 발생, 짧게 터치하면 발생 X&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TouchReleaseEvent&lt;/b&gt;&amp;nbsp;: Entity를 터치 땠을 때 발생하는 이벤트, 엔티티에&amp;nbsp;TouchReceiveComponent&amp;nbsp;컴포넌트가 있어야 이벤트 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 터치를 받는 이벤트를 받는 컴포넌트에 반드시 &lt;b&gt;TouchReceiveComponent&lt;/b&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력 관련 컴포넌트에는 유저가 특정 키를 누를 때마다 스킬을 사용할 수 있게 해주는 컴포넌트가 있다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 컴포넌트를 Skill Effect라고 하는데, _EffectService 클래스 내부에 이벤트를 컨트롤 할 수 있는 함수가 내장되어 있으며, 주로 PlayEffect() 함수와 PlayEffectAttached() 함수가 개발에 자주 사용된다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;PlayEffect() 함수 -&amp;gt; 이펙트를 고정된 특정 위치에 원하는 크기로 호출한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 쉽게 말해서 스킬을 썼을 때의 해당 유저 위치에 호출&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1658301269401&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PlayEffect (string animationClipRUID, Entity instigator, Vector3 position, number zRotation, Vector3 scale, boolean isLoop = False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;animationClipRUID&lt;/b&gt; : 호출하려는 이펙트 리소스의 &lt;b&gt;RUID&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;instigator&lt;/b&gt; : 맵 정보를 받아오기 위한 엔티티&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;position&lt;/b&gt; : 이펙트가 호출될 위치 벡터값 입력 파라미터&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;zRotation&lt;/b&gt; : 회전 값&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;scale&lt;/b&gt; : 호출될 이펙트의 크기 벡터값 (Vector3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;isLoop&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;true&lt;/b&gt; : 이펙트 무한 재생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;false&lt;/b&gt; : 이펙트 한 번 재생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PlayEffectAttached() 함수 -&amp;gt; 이펙트 호출, 호출될 이펙트의 부모 엔티티 선정, 부모의 위치를 기준으로 호출될 위치 설정을 하는 함수&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 쉽게 말해서 스킬을 쓴 유저의 위치를 따라다니며 호출&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;animationClipRUID&lt;/b&gt; : 호출하려는 이펙트 리소스의 RUID&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;parentEntity&lt;/b&gt; : 호출될 이펙트의 부모가 될 엔티티&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;localPosition&lt;/b&gt; : 부모 엔티티의 position 기준, 얼마만큼 떨어진 곳에서 호출할 것인지에 대한 위치 벡터값 (Vector3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;localZRotation&lt;/b&gt; : 부모 엔티티의 회전값을 기준, 회전 값 입력&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;localScale&lt;/b&gt; : 호출될 이펙트의 크기 벡터값 (Vector3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;isLoop&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;true&lt;/b&gt; : 이펙트 무한 재생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;false&lt;/b&gt; : 이펙트 한 번 재생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;span style=&quot;color: #000000;&quot;&gt;입력 관련 컴포넌트에는 또한 카메라를&amp;nbsp; 조정할 수 있는 컴포넌트가 존재한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바로 &lt;b&gt;CameraComponent&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로 Camera는 엔티티, 즉 내 캐릭터를 잡아주고 있다. CameraComponent는 카메라로 목적지가 어디인지 보여주고 다시 내 캐릭터를 잡아주는 함수이다.&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Camera를 다룬 이벤트들도 존재한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CameraSwitchEvent&lt;/b&gt; : &lt;span style=&quot;background-color: #ffffff;&quot;&gt;카메라가 비추는 대상이 전환될 때 발생하는 이벤트&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CameraZoomEndEvent &lt;/b&gt;: &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;카메라의 줌 변경이 완료된 후 발생하는 이벤트&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;
&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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;입력 관련 컴포넌트에는 또한 포탈을 조정할 수 있는 컴포넌트가 존재한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 &lt;b&gt;PortalComponent&lt;/b&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: #000000;&quot;&gt;Portal은 출발지와 목적지가 반드시 한 쌍으로 존재해야 하고, Portal은 기본적으로 방향 키 위를 누를 경우 이동할 수 있다.&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;PortalComponent에 중요한 Property가 존재한다.&lt;/b&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;PortalEntityRef&lt;/b&gt; : PortalComponent를 가진 Entity를 목적지로 설정한다. 설치 후 게임을 저장해야 목록에 노출된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Portal를 다룬 이벤트들도 존재한다.&lt;/b&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;b&gt;PortalUseEvent&lt;/b&gt; &lt;/span&gt;: &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;플레이어가 포탈을 이용할 때 발생하는 이벤트&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&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;&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오늘의 사소한 깨달음&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 컴포넌트 뿐만 아니라 해당 컴포넌트의 property와 Service에 대해서 더 공부를 해야겠다.&lt;br /&gt;- Service란 말 그대로 기능을 제공한다. Service의 원하는 기능을 객체 형식으로 가져와서 멤버 변수를 넣어주면 된다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드 (2).jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edJLfZ/btrHTuywhkI/8kRS3dmLksiFKM3dnnxkYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edJLfZ/btrHTuywhkI/8kRS3dmLksiFKM3dnnxkYk/img.jpg&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edJLfZ/btrHTuywhkI/8kRS3dmLksiFKM3dnnxkYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedJLfZ%2FbtrHTuywhkI%2F8kRS3dmLksiFKM3dnnxkYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-filename=&quot;다운로드 (2).jpg&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/150</guid>
      <comments>https://devdongbaek.tistory.com/150#entry150comment</comments>
      <pubDate>Wed, 20 Jul 2022 16:21:38 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 8 회고</title>
      <link>https://devdongbaek.tistory.com/149</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 3주차 19일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220516_6281d7bcdea30.jpg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laGDS/btrHJbZwlY8/2X8HFizoSiYu9J0Ic00S00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laGDS/btrHJbZwlY8/2X8HFizoSiYu9J0Ic00S00/img.jpg&quot; data-alt=&quot;오늘도 사랑합니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laGDS/btrHJbZwlY8/2X8HFizoSiYu9J0Ic00S00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaGDS%2FbtrHJbZwlY8%2F2X8HFizoSiYu9J0Ic00S00%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;351&quot; data-filename=&quot;20220516_6281d7bcdea30.jpg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오늘도 사랑합니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은 Chapter 8. Event와 컴포넌트 확장에 대해 배웠다.&amp;nbsp;&lt;/span&gt;&lt;/h3&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;MOD에서는 Event 처리를 위해 Entity Event System을 제공한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220613_62a748345ad98.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UYUhr/btrHJ0J1HhI/nKDLHc3lC03rbuLyjGQfkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UYUhr/btrHJ0J1HhI/nKDLHc3lC03rbuLyjGQfkK/img.jpg&quot; data-alt=&quot;이벤트는 특정 상황에서만 발생된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UYUhr/btrHJ0J1HhI/nKDLHc3lC03rbuLyjGQfkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUYUhr%2FbtrHJ0J1HhI%2FnKDLHc3lC03rbuLyjGQfkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;1202&quot; data-filename=&quot;20220613_62a748345ad98.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이벤트는 특정 상황에서만 발생된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&lt;span style=&quot;color: #000000;&quot;&gt;아래는 Event System에 해당하는 3가지 구성 요소이다.&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Event&lt;/b&gt; : 로직 상에서 사건의 발생을 의미 (Event의 종류의 식별 정보, 추가 정보 소유)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ex) 공격을 받은 사건&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Handler&lt;/b&gt; : 해당 Event를 받았을 때 처리하는 행동의 주체&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ex) 플레이어가 공격을 받았을 때 호출되는 함수&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Sender&lt;/b&gt; : 해당 이벤트를 발송하는 객체&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AttackComponent에서 이벤트를 발송했으면 &lt;span style=&quot;color: #000000;&quot;&gt;AttackComponent가 Sender이다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;18.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgpBux/btrHDRao3YZ/vbpxhCwzCPQm6XcU3TruoK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgpBux/btrHDRao3YZ/vbpxhCwzCPQm6XcU3TruoK/img.jpg&quot; data-alt=&quot;이해하기 쉽게 우리가 만들었던 코드를 들고왔다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgpBux/btrHDRao3YZ/vbpxhCwzCPQm6XcU3TruoK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgpBux%2FbtrHDRao3YZ%2FvbpxhCwzCPQm6XcU3TruoK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;544&quot; data-filename=&quot;18.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이해하기 쉽게 우리가 만들었던 코드를 들고왔다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 코드를 예시로 용어를 좀 더 쉽게 이해해보자&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Event : 엔티티간 충돌이 있어난 사건을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Handler : 이벤트가 일어났을 때 호출 될 HandlerTriggerEnterEvent를 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sender : 해당 이벤트를 발송하는 객체는 self.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;&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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;MOD에서 사용하는 Event 시스템의 장단점은 아래와 같다.&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;다른 component나 기능 단위에서 결합성이 떨어진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;행위에 대한 액션 추가 희망 시 행위 수행하는 곳 수정 없이 추가 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;다른 Component의 정보를 필요로 하지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;사건 발생 시 전체적 플로우 찾기 어렵다 (각각 처리하는 로직으로 인해 실행되는 시점에서 알 수 없다)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;디버깅이 어렵다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;순차적 행위 수행이 어렵다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번에는 핸들러의 등록 구조에 대해서 알아보자&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;각 엔티티들은 컴포넌트들을 포함하고 있다. &lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;17.JPG&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckKYjp/btrHEWW71B3/uqnJa0fo5lAyiYGXHtiUw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckKYjp/btrHEWW71B3/uqnJa0fo5lAyiYGXHtiUw0/img.jpg&quot; data-alt=&quot;중학생 형만 하더라도 수많은 컴포넌트들을 지니고 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckKYjp/btrHEWW71B3/uqnJa0fo5lAyiYGXHtiUw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckKYjp%2FbtrHEWW71B3%2FuqnJa0fo5lAyiYGXHtiUw0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;525&quot; data-filename=&quot;17.JPG&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중학생 형만 하더라도 수많은 컴포넌트들을 지니고 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;엔티티 이벤트 시스템은 다음과 같이 동작한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;16560446599253c3fab51c71c43a681173496cc4ee5a4.png&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKqpCf/btrHFQI7452/HgBetgtWVTKdkj4172HFDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKqpCf/btrHFQI7452/HgBetgtWVTKdkj4172HFDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKqpCf/btrHFQI7452/HgBetgtWVTKdkj4172HFDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKqpCf%2FbtrHFQI7452%2FHgBetgtWVTKdkj4172HFDk%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;374&quot; height=&quot;480&quot; data-filename=&quot;16560446599253c3fab51c71c43a681173496cc4ee5a4.png&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 먼저 컴포넌트는 각 엔티티를 중계자로 사용할 수 있으며, 각 컴포넌트는 엔티티를 통해 핸들러를 등록한다. (이벤트 발생 역시 엔티티를 통해 가능하다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;18.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGVtL/btrHI3Hq6ye/yhcKuYplkiUUpjbklO3kv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGVtL/btrHI3Hq6ye/yhcKuYplkiUUpjbklO3kv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGVtL/btrHI3Hq6ye/yhcKuYplkiUUpjbklO3kv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGVtL%2FbtrHI3Hq6ye%2FyhcKuYplkiUUpjbklO3kv0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;544&quot; data-filename=&quot;18.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 말을 Bbing Component로 설명해보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Bbing Component는 DefaultUser 엔티티(Self)를 중계자로 사용하며, &lt;span style=&quot;color: #000000;&quot;&gt;DefaultUser를 통해 핸들러인 &lt;span style=&quot;color: #000000;&quot;&gt;HandlerTriggerEnterEvent 함수를 등록한다.&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;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;16560447014255f87e1b80f4a4a85b4b4857f01923163.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKoUuF/btrHFRuxSdT/CV6eRi52Z2trwuxHaUbWKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKoUuF/btrHFRuxSdT/CV6eRi52Z2trwuxHaUbWKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKoUuF/btrHFRuxSdT/CV6eRi52Z2trwuxHaUbWKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKoUuF%2FbtrHFRuxSdT%2FCV6eRi52Z2trwuxHaUbWKk%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;480&quot; data-filename=&quot;16560447014255f87e1b80f4a4a85b4b4857f01923163.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;sender&lt;/b&gt; 역시 엔티티를 통해 이벤트를 발생하는 것이 가능하며, 이 때 엔티티는 &lt;b&gt;Handler&lt;/b&gt;들에게 해당 이벤트를 전송하는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;정리를 해보자면, 어떤 event를 감지하였을 때 이것을 처리하는 부분을 component내의 로직에 넣는다. 그리고 이벤트 수신 등록을 register, addListener 등으로 하며, MOD에서는 entity에 등록을 하는 구조이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;&amp;nbsp;&lt;/h3&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;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;엔티티끼리 이벤트를 주고받을 때에 대해서 알아보자&lt;/span&gt;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;&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: #000000;&quot;&gt;1. 같은 엔티티에서 이벤트를 주고 받을 때&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;e50defc5790e331837e043f6ae399e8f.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2oW2y/btrHDPwYQpF/CnZNiX17OjPIZ8qLElxyyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2oW2y/btrHDPwYQpF/CnZNiX17OjPIZ8qLElxyyk/img.jpg&quot; data-alt=&quot;짤 출처 : 이승훈님&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2oW2y/btrHDPwYQpF/CnZNiX17OjPIZ8qLElxyyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2oW2y%2FbtrHDPwYQpF%2FCnZNiX17OjPIZ8qLElxyyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;826&quot; data-filename=&quot;e50defc5790e331837e043f6ae399e8f.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;짤 출처 : 이승훈님&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;2. 다른 엔티티끼리 이벤트를 주고 받을 때&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;images.png&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4yQRj/btrHEzObLqX/hQHA5Y5DpkBxJRQDvsEcLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4yQRj/btrHEzObLqX/hQHA5Y5DpkBxJRQDvsEcLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4yQRj/btrHEzObLqX/hQHA5Y5DpkBxJRQDvsEcLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4yQRj%2FbtrHEzObLqX%2FhQHA5Y5DpkBxJRQDvsEcLk%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;186&quot; data-filename=&quot;images.png&quot; data-origin-width=&quot;271&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 같은 엔티티에서 이벤트를 주고 받을 때의 프로세스를 알아보자&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;component1이 특정 타이밍에 의해 엔티티로 발송&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;로그 이벤트를 수신하겠다고 등록한 컴포넌트&lt;/u&gt;들에게 이벤트 발송&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;로그 이벤트를 객체로 불러온 컴포넌트들&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 컴포넌트들은 이벤트를 받아서 처리&lt;/span&gt;&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;&lt;span style=&quot;color: #000000;&quot;&gt;Ex) component1에서 이벤트 발생 시, component3의 이벤트를 실행시키고 싶을 때를 가정한다. &lt;u&gt;두 component간에 연관이 없기 때문에&lt;/u&gt; component에서 바로 호출하지 않고 엔티티를 통해 호출하는 구조이다.&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;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 이러한 이유로 위에서 컴포넌트는 엔티티를 중계자로 활용한다고 말했던 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;span style=&quot;color: #000000;&quot;&gt;그럼 다른 엔티티에서 이벤트를 주고 받을 때의 프로세스를 알아보자&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;신호를 보내는 엔티티 쪽에서 component들이 이벤트 발송&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;받는 엔티티 쪽에서 신호를 받고 이벤트 수행&lt;/span&gt;&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;&lt;span style=&quot;color: #000000;&quot;&gt;위 프로세스를 구현하는 방법을 이야기해보자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. Entity1의 Component1에서 이벤트 등록&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. Entity2의 &lt;span style=&quot;color: #000000;&quot;&gt;Component2에서 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Entity1로 이벤트 발송&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;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 style=&quot;color: #000000;&quot;&gt;Ex) &lt;span style=&quot;color: #000000;&quot;&gt;Entity1이&lt;/span&gt; Entity2 쪽으로 이벤트를 쏘면 Component가 수신해서 Component 안의 로그 메시지가 출력 되는 구조이며, 특히 Map Entity와 World Entity는 서로 Event를 주고받는 경우가 많아 자주 사용된다.&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;16560447361361ac2b80437934439be6a9a35b95b41e4.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqKrOy/btrHEAM5AYO/nGtIcUG72ceIx9FZniZGxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqKrOy/btrHEAM5AYO/nGtIcUG72ceIx9FZniZGxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqKrOy/btrHEAM5AYO/nGtIcUG72ceIx9FZniZGxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqKrOy%2FbtrHEAM5AYO%2FnGtIcUG72ceIx9FZniZGxK%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;600&quot; height=&quot;402&quot; data-filename=&quot;16560447361361ac2b80437934439be6a9a35b95b41e4.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;402&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이벤트 처리는 아래의 순서로 이루어진다.&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;이벤트를 처리할 컴포넌트 &amp;amp; 엔티티 생성&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;핸들러 로직 추가&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;핸들러 로직이 이루어지는 방법&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Entity Event Handler 추가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;핸들러 상단 이벤트 중계자 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이벤트 처리 로직&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;이벤트 발생 로직 추가&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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;span style=&quot;color: #000000;&quot;&gt;위 순서를 중학생 형 Entity에서 Bbing Component를 생성하는 걸 예로 들어보자&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 중학생 형 엔티티에 이벤트를 처리할 Bbing Component를 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 충돌을 감지했을 때 실행될 HandleTriggerEnterEvent 핸들러 로직 추가&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;19.JPG&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P45Xu/btrHHjkeLb2/yHOALNaA0pDKtERPSoI7Hk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P45Xu/btrHHjkeLb2/yHOALNaA0pDKtERPSoI7Hk/img.jpg&quot; data-alt=&quot;중계자 설정하는 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P45Xu/btrHHjkeLb2/yHOALNaA0pDKtERPSoI7Hk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP45Xu%2FbtrHHjkeLb2%2FyHOALNaA0pDKtERPSoI7Hk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;313&quot; height=&quot;194&quot; data-filename=&quot;19.JPG&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중계자 설정하는 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 충돌 이벤트 발생시 실행될 로직 추가&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;&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;&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&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;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;102_8908.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OyEal/btrHJASAmmd/vyvG6dC6xMIVkoEAbVCwQK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OyEal/btrHJASAmmd/vyvG6dC6xMIVkoEAbVCwQK/img.jpg&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OyEal/btrHJASAmmd/vyvG6dC6xMIVkoEAbVCwQK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOyEal%2FbtrHJASAmmd%2FvyvG6dC6xMIVkoEAbVCwQK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;102_8908.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/149</guid>
      <comments>https://devdongbaek.tistory.com/149#entry149comment</comments>
      <pubDate>Tue, 19 Jul 2022 18:41:06 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 7 회고</title>
      <link>https://devdongbaek.tistory.com/148</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 3주차 18일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// 해당 글은 멋쟁이 사자처럼 공동 학습 교안을 바탕을 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20210615_60c85c7ec0f6a.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vQR5E/btrHCnzZQuo/1NhgSDOEzI6kYwfMNuFys0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vQR5E/btrHCnzZQuo/1NhgSDOEzI6kYwfMNuFys0/img.jpg&quot; data-alt=&quot;예비군 다녀왔습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vQR5E/btrHCnzZQuo/1NhgSDOEzI6kYwfMNuFys0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvQR5E%2FbtrHCnzZQuo%2F1NhgSDOEzI6kYwfMNuFys0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;274&quot; data-filename=&quot;20210615_60c85c7ec0f6a.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예비군 다녀왔습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&lt;span style=&quot;color: #000000;&quot;&gt;오늘은 Chapter 7. 네트워크에 대해 공부하였다.&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;공부한 것을 나누며 이야기 하기 전에 앞서서 기본적인 단어 정리에 대해서 정리해보겠다.&lt;/span&gt;&lt;/h4&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;20190111_5c38825e8c0ca.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D8WA4/btrHDAZFkS6/5t9m3ehWks8dTnz2S9EXE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D8WA4/btrHDAZFkS6/5t9m3ehWks8dTnz2S9EXE1/img.jpg&quot; data-alt=&quot;깔 끔&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D8WA4/btrHDAZFkS6/5t9m3ehWks8dTnz2S9EXE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD8WA4%2FbtrHDAZFkS6%2F5t9m3ehWks8dTnz2S9EXE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;383&quot; data-filename=&quot;20190111_5c38825e8c0ca.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깔 끔&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;클라이언트&lt;/b&gt; : 접속된 각각의 유저 ex) MOD를 플레이 하는 유저&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;서버&lt;/b&gt; : 클라이언트의 요청을 받는 서버 ex) MOD 서버&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동기화&lt;/b&gt;&amp;nbsp;: 어느 한 쪽의 값이 달라졌을 때 양쪽의 값을 모두 바꾸는 행동을 취하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단어 정리는 이쯤하고 MOD 네트워크 구조에 대해서 알아보도록 하자&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;MOD는 기본적으로 &lt;b&gt;서버-클라이언트&lt;/b&gt; 모델을 지원하고 있다.&lt;/span&gt;&lt;/h4&gt;
&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;&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;&lt;span style=&quot;color: #000000;&quot;&gt;서버-클라이언트 모델에 대해서 자세히 이야기해보자면&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서버-클라이언트 모델은 서버는 기본적으로 하나이고, 여러 클라이언트를 가지고 있다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 메이플 서버에 여러 유저가 동시접속하고 있는 것을 생각하면 이해하기 쉬울 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;span style=&quot;color: #000000;&quot;&gt;또한 서버에서 특정 Property 값을 바꾸면, 그 Property를 가지고 있는 클라이언트의 &lt;span style=&quot;color: #000000;&quot;&gt;Property도 전부 값이 변한다.&lt;/span&gt;&lt;/span&gt;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나 클라이언트에서는 독자적으로&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;Property 값을 변경해도 다른 클라이언트나 서버에 영향을 미치지 않는다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&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;&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: #000000;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리는 인기 많은 사냥터에 가서 사냥할 생각에 신나있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;20151201_565cc251c7425.gif&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFfbh/btrHzoGreR3/LlICN3BBvaNB9WTWYdNc1K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFfbh/btrHzoGreR3/LlICN3BBvaNB9WTWYdNc1K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFfbh/btrHzoGreR3/LlICN3BBvaNB9WTWYdNc1K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/kFfbh/btrHzoGreR3/LlICN3BBvaNB9WTWYdNc1K/img.gif&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;224&quot; height=&quot;168&quot; data-filename=&quot;20151201_565cc251c7425.gif&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 맵에 도착해보니, 어느 유저가 해당 사냥터는 본인의 자리라고 말을 하는 것을 듣게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;화가난 우리는 상대방에게 그런게 어딨냐 했지만, 상대적으로 약한 우리는 그저 인기도를 내리고 도망가는 것 밖에 방법이 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;다운로드.jpg&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czgVMC/btrHDAZFYya/MAiFIUNVZkO7kGRdGUMQK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czgVMC/btrHDAZFYya/MAiFIUNVZkO7kGRdGUMQK1/img.jpg&quot; data-alt=&quot;자리요@@@@@@@&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czgVMC/btrHDAZFYya/MAiFIUNVZkO7kGRdGUMQK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczgVMC%2FbtrHDAZFYya%2FMAiFIUNVZkO7kGRdGUMQK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;268&quot; height=&quot;188&quot; data-filename=&quot;다운로드.jpg&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자리요@@@@@@@&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그런데 인기도가 클라이언트 Property일 뿐이면, 우리가 내렸다 하더라도 서버의 Property에 영향을 끼치지 못하므로, 우리의 일격(?)은 물거품이 될 것이다. &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;EwuQi.webp&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTs7pM/btrHzpefFFE/PbagxxoJksUBtSE9hBNSik/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTs7pM/btrHzpefFFE/PbagxxoJksUBtSE9hBNSik/img.webp&quot; data-alt=&quot;화가 나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTs7pM/btrHzpefFFE/PbagxxoJksUBtSE9hBNSik/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTs7pM%2FbtrHzpefFFE%2FPbagxxoJksUBtSE9hBNSik%2Fimg.webp&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;339&quot; data-filename=&quot;EwuQi.webp&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화가 나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그러나 인기도가 서버의 &lt;span style=&quot;color: #000000;&quot;&gt;Property라면 우리의 공격은 성공적일 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위에서 배운 개념들을 더해 MOD의 핵심 네트워크 개념들을 더 배워보자&lt;/span&gt;&lt;/span&gt;&lt;/h4&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;20171215_5a3356709cfa8.jpeg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQGyd/btrHEe9UW27/9UkzowL741BvmhTuqWKLwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQGyd/btrHEe9UW27/9UkzowL741BvmhTuqWKLwK/img.jpg&quot; data-alt=&quot;가즈아&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQGyd/btrHEe9UW27/9UkzowL741BvmhTuqWKLwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQGyd%2FbtrHEe9UW27%2F9UkzowL741BvmhTuqWKLwK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;381&quot; data-filename=&quot;20171215_5a3356709cfa8.jpeg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가즈아&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위에서 이야기 했듯이&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;서버에서는 특정 Property의 값을 바꾸면 갖고 있는 클라이언트의 Property 또한 전부 값이 변경되는 반면 클라이언트에서는 Property의 값을 바꿔도 서버의 Property에 영향을 미치지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;만약 인기도가 클라이언트 Property이고, 모든 유저가 상대방의 인기도를 동시에 내렸다고 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;서버-클라이언트는 1:n 관계이기 때문에 서버는 펑 터져버리고 말 것 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;그렇기에 동기화는 서버 -&amp;gt; 클라이언트 단방향으로 진행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;12.JPG&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMAqZS/btrHDPoKm6Q/sXE9hxKi0ckndWf5Icw0kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMAqZS/btrHDPoKm6Q/sXE9hxKi0ckndWf5Icw0kk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMAqZS/btrHDPoKm6Q/sXE9hxKi0ckndWf5Icw0kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMAqZS%2FbtrHDPoKm6Q%2FsXE9hxKi0ckndWf5Icw0kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;248&quot; data-filename=&quot;12.JPG&quot; data-origin-width=&quot;426&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;&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;&lt;span style=&quot;color: #000000;&quot;&gt;MOD에서는 &lt;u&gt;Property에 동기화 옵션을 설정&lt;/u&gt;할 수 있게 해준다.&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 Property 실행제어라 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;b&gt;[Sync]&lt;/b&gt; : 동기화가 되는 property&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[None]&lt;/b&gt; : 동기화 되지 않는 Property&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 Property의 타입들도 설정할 수 있는데, 일부 타입(any, table)은 동기화가 지원되지않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;13.JPG&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvDRwY/btrHDjDCneW/mCOetY9tG0BpfpusdK6u91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvDRwY/btrHDjDCneW/mCOetY9tG0BpfpusdK6u91/img.jpg&quot; data-alt=&quot;property를 우클릭하면 위 창이 뜬다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvDRwY/btrHDjDCneW/mCOetY9tG0BpfpusdK6u91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvDRwY%2FbtrHDjDCneW%2FmCOetY9tG0BpfpusdK6u91%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;549&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;property를 우클릭하면 위 창이 뜬다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #000000;&quot;&gt;또 MOD에서는 Function 실행 제어를 지원한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Function은 호출한 쪽이 서버인지 클라이언트인지에 따라 동작하는 공간이 다르다. 따라서 실행 제어를 통해 공간을 활성화 시켜주어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공간을 활성화 해준다는 것은 해당 Function이 특정한 속성을 지니게 하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;14.JPG&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rn0F9/btrHEevjWlk/MCEMKGf3QWMJLgay7KtgM1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rn0F9/btrHEevjWlk/MCEMKGf3QWMJLgay7KtgM1/img.jpg&quot; data-alt=&quot;Function setting으로 들어가면 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rn0F9/btrHEevjWlk/MCEMKGf3QWMJLgay7KtgM1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frn0F9%2FbtrHEevjWlk%2FMCEMKGf3QWMJLgay7KtgM1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;293&quot; height=&quot;209&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Function setting으로 들어가면 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Function 공간 활성화 옵션은 아래와 같습니다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Client &lt;/b&gt;: 서버가 클라이언트의 함수를 호출하면 서버와 연결된 클라이언트들에게 함수 호출을 요청하고, 연결된 클라이언트들에 있는 함수가 실행된다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;호출시 클라이언트에서 실행된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ClientOnly &lt;/b&gt;: 클라이언트에만 불릴 수 있으며 서버에서는 부를 수 없다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Server&lt;/b&gt; : 클라이언트 쪽에서 서버의 함수를 호출하면 서버 쪽에 신호를 보내 서버 안에서 함수가 실행되게 한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;호출시 서버에서 실행된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ServerOnly&lt;/b&gt; : 서버에만 불릴 수 있고, 클라이언트에서는 부를 수 없다. 대부분의 로직는 서버에서 서버 기준으로 짜게 된다. 즉, 로직은 주로 서버 위주의 행위를 많이 하게 됩니다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Multicast &lt;/b&gt;: 서버와 클라이언트 양쪽 모두 실행한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 코드는 위 공간 활성화 옵션들을 잘 설명해줄 수 있는 예시 코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;image.png&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHZN4K/btrHzpZFiFI/a6ii0K7wKKDcn8gkm58bf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHZN4K/btrHzpZFiFI/a6ii0K7wKKDcn8gkm58bf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHZN4K/btrHzpZFiFI/a6ii0K7wKKDcn8gkm58bf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHZN4K%2FbtrHzpZFiFI%2Fa6ii0K7wKKDcn8gkm58bf0%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;293&quot; height=&quot;596&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1658158188600&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyFirstComponent {
		Property:
		Function:
				void OnBeginPlay()
				{
						log(&quot;BEGIN PLAY&quot;)
						wait(2)
						self:Server()  -- 1. 서버가 서버 메시지를 뿌립니다.
						self:Client(&quot;HAHAHA&quot;)  -- 2. 클라이언트에서 메시지를 뿌려달라고 요청 후 바로 다음을 실행합니다.
						log(&quot;END&quot;)
				
				void Client( string arg1 )  -- 3. 클라이언트에 도착하면 클라이언트가 메시지를 받은 순간 요청을 실행합니다.
				{
						log(&quot;CLIENT&quot; .. arg1)
				}

				void Server()
				{
						log(&quot;SERVER&quot;)
				}

			
}&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;1. log(&quot;BEGIN PLAY&quot;)을 통해 &quot;BEGIN PLAY&quot;라는 문자열을 log에 출력한다.&lt;/p&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. wait(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;3. self:Server()를 통해 void Server() 함수를 호출한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버( Server() )가 서버( Server 공간 활성화 옵션 )에 메세지를 뿌린다.&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;4. self:Client ( &quot;문자열&quot; )를 통해 void Client( string arg1 ) 함수를 호출한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트( Clien() )가 클라이언트( Clien 공간 활성화 옵션 )에 메세지를 뿌린다.&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;size18&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;16.JPG&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFVEK7/btrHEAESyYD/wSeGBPRZVKfVOhA8wyieF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFVEK7/btrHEAESyYD/wSeGBPRZVKfVOhA8wyieF1/img.jpg&quot; data-alt=&quot;위 코드 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFVEK7/btrHEAESyYD/wSeGBPRZVKfVOhA8wyieF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFVEK7%2FbtrHEAESyYD%2FwSeGBPRZVKfVOhA8wyieF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1023&quot; height=&quot;169&quot; data-filename=&quot;16.JPG&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버에서 요청했을 때 클라이언트까지 요청이 도달하는 시간이 서버가 다음 코드를 실행하는 시간보다 짧으면 클라이언트가 먼저 찍히게 된다. 즉, 요청이 클라이언트까지 도달하지 못했기 때문에 다음 코드인 end가 먼저 찍히고 클라이언트가 찍힌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*wait(2)을 써주지 않았을 때 CLIENT 뒤에 파라미터로 받은 문자열이 출력되지 않는 현상 발생하는 이유&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;답 : 서버에서 엔티티를 생성하고 클라이언트에도 엔티티가 생성되기까지 시간이 걸린다. 클라이언트에서 엔티티가 생성되는 도중에 서버에서 엔티티의 값을 넣어 전송하면 클라이언트에서 값을 받지 못하는 현상이 발생한다. 이를 타이밍 이슈라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MOD는 Server only 에서 이야기 했듯이 MOD의 로직 대부분은 서버 기반으로 돌아가며, &lt;/span&gt;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;서버에서 로직의 흐름을 관리하고 중간중간 변경된 사항을 각 클라이언트에 전달하는 시스템이다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;특정 클라이언트 안에서만 생성되는 엔티티의 대표적인 예시들&lt;/b&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;UI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;effect - effect의 경우 보통 서버로 제어하는데 특정 클라이언트에서만 연출하고 싶을 땐 로컬 엔티티를 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최적화 - 서버에 엔티티가 너무 많을 때 비용 때문에 최적화 시 로컬 엔티티를 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&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;img_20200909164416_11d4b34c.webp&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0JeRn/btrHCwpUzGl/D5R4AHLPkszuYvKHKqJE7K/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0JeRn/btrHCwpUzGl/D5R4AHLPkszuYvKHKqJE7K/img.webp&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0JeRn/btrHCwpUzGl/D5R4AHLPkszuYvKHKqJE7K/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0JeRn%2FbtrHCwpUzGl%2FD5R4AHLPkszuYvKHKqJE7K%2Fimg.webp&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;750&quot; height=&quot;388&quot; data-filename=&quot;img_20200909164416_11d4b34c.webp&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/148</guid>
      <comments>https://devdongbaek.tistory.com/148#entry148comment</comments>
      <pubDate>Tue, 19 Jul 2022 00:57:19 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 공동 월드 회고</title>
      <link>https://devdongbaek.tistory.com/147</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 15일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&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;102_12342.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Awyh/btrHqnlz1WE/ATMb0R5iLnqjghX8xVOOX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Awyh/btrHqnlz1WE/ATMb0R5iLnqjghX8xVOOX1/img.jpg&quot; data-alt=&quot;짝짝&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Awyh/btrHqnlz1WE/ATMb0R5iLnqjghX8xVOOX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Awyh%2FbtrHqnlz1WE%2FATMb0R5iLnqjghX8xVOOX1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;102_12342.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;짝짝&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래는 지난 회고록들로 쉽게 갈 수 있는 링크입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 1~4 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/132&quot;&gt;https://devdongbaek.tistory.com/132&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657894011023&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1~4 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1주차 11일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKPR86/hyO5NRjdi7/Uo1F03cmIInJ7EcIpau791/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/px840/hyO5Oil4Fm/zy82Ka9eFxBQ15JT8nfdnk/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/kgL4S/hyO5Q8l6M6/taRsD8wVyndBH5k7Xr4Q31/img.jpg?width=1596&amp;amp;height=923&amp;amp;face=0_0_1596_923&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/132&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKPR86/hyO5NRjdi7/Uo1F03cmIInJ7EcIpau791/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/px840/hyO5Oil4Fm/zy82Ka9eFxBQ15JT8nfdnk/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/kgL4S/hyO5Q8l6M6/taRsD8wVyndBH5k7Xr4Q31/img.jpg?width=1596&amp;amp;height=923&amp;amp;face=0_0_1596_923');&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 넥슨 MOD Suppoters Hackathon Chapter 1~4 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1주차 11일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;Chapter 5 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/136&quot;&gt;https://devdongbaek.tistory.com/136&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657894017829&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 5 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 12일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/136&quot; data-og-url=&quot;https://devdongbaek.tistory.com/136&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dtwIh2/hyO5ICrU8y/mbn96hT9Mu4bAthMOAKRq1/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/brtiWF/hyO5G5IoLt/MtNCchejERHC8mL8Blekwk/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/6yad8/hyO5QAuYog/PjCCU7rIXlNbblZuN2azf0/img.jpg?width=1879&amp;amp;height=1024&amp;amp;face=0_0_1879_1024&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/136&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dtwIh2/hyO5ICrU8y/mbn96hT9Mu4bAthMOAKRq1/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/brtiWF/hyO5G5IoLt/MtNCchejERHC8mL8Blekwk/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/6yad8/hyO5QAuYog/PjCCU7rIXlNbblZuN2azf0/img.jpg?width=1879&amp;amp;height=1024&amp;amp;face=0_0_1879_1024');&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 넥슨 MOD Suppoters Hackathon Chapter 5 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 12일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;Chapter 6 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/137&quot;&gt;https://devdongbaek.tistory.com/137&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657894020406&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 6 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 13일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/137&quot; data-og-url=&quot;https://devdongbaek.tistory.com/137&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/y7lrd/hyO4MZQkU3/s6S1VK7OB51x9xeQFZpv81/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/byBHfg/hyO5TiJ8R6/CY2gzSoKFvua68klFjbyS1/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/c2Q7h8/hyO5EFTQAV/VKiDHur1qeb8LeljDzkMY1/img.jpg?width=600&amp;amp;height=472&amp;amp;face=0_0_600_472&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/137&quot; data-source-url=&quot;https://devdongbaek.tistory.com/137&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/y7lrd/hyO4MZQkU3/s6S1VK7OB51x9xeQFZpv81/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/byBHfg/hyO5TiJ8R6/CY2gzSoKFvua68klFjbyS1/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/c2Q7h8/hyO5EFTQAV/VKiDHur1qeb8LeljDzkMY1/img.jpg?width=600&amp;amp;height=472&amp;amp;face=0_0_600_472');&quot;&gt;&amp;nbsp;&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;Chapter 워크스페이스 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/144&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657894051622&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 워크 스페이스 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 14일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/144&quot; data-og-url=&quot;https://devdongbaek.tistory.com/144&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cXTWrK/hyO5LTt68S/Bao6t1Kw2Nd4PmS71ZfKyK/img.jpg?width=480&amp;amp;height=247&amp;amp;face=322_59_376_118,https://scrap.kakaocdn.net/dn/dONz3O/hyO5Hp0MWL/Kt37Z3E37wdD5XjUjNnRTK/img.jpg?width=480&amp;amp;height=247&amp;amp;face=322_59_376_118,https://scrap.kakaocdn.net/dn/yj2AM/hyO5FFJh2E/62xmwmkLy3NsVzdBiOQiXK/img.jpg?width=1885&amp;amp;height=824&amp;amp;face=709_335_782_414&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/144&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cXTWrK/hyO5LTt68S/Bao6t1Kw2Nd4PmS71ZfKyK/img.jpg?width=480&amp;amp;height=247&amp;amp;face=322_59_376_118,https://scrap.kakaocdn.net/dn/dONz3O/hyO5Hp0MWL/Kt37Z3E37wdD5XjUjNnRTK/img.jpg?width=480&amp;amp;height=247&amp;amp;face=322_59_376_118,https://scrap.kakaocdn.net/dn/yj2AM/hyO5FFJh2E/62xmwmkLy3NsVzdBiOQiXK/img.jpg?width=1885&amp;amp;height=824&amp;amp;face=709_335_782_414');&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 넥슨 MOD Suppoters Hackathon 워크 스페이스 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 14일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;아마 몇몇 분들은 멤버를 초대하는 부분에서 많이들 막혔을 거라 생각이 든다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220627_62b8a6d940d27.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DXsKF/btrHqCW8GWB/NQX1wCYps5LjCSp6PFNjLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DXsKF/btrHqCW8GWB/NQX1wCYps5LjCSp6PFNjLk/img.jpg&quot; data-alt=&quot;수능 수학 29번급 난이도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DXsKF/btrHqCW8GWB/NQX1wCYps5LjCSp6PFNjLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDXsKF%2FbtrHqCW8GWB%2FNQX1wCYps5LjCSp6PFNjLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;393&quot; data-filename=&quot;20220627_62b8a6d940d27.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수능 수학 29번급 난이도&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;필자야 워낙 친구들이 많으니 어렵지는 않았다ㅋㅋㅋㅋ&lt;/span&gt;&lt;/h2&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정말로 ㅋㅋㅋㅋ...&lt;/span&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조금은 어려웠을지ㄷ...?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20160819_57b675925c71f.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PLgge/btrHp65eVDR/fLm4RsRllbjyr22qwBz7MK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PLgge/btrHp65eVDR/fLm4RsRllbjyr22qwBz7MK/img.jpg&quot; data-alt=&quot;ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PLgge/btrHp65eVDR/fLm4RsRllbjyr22qwBz7MK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPLgge%2FbtrHp65eVDR%2FfLm4RsRllbjyr22qwBz7MK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;440&quot; data-filename=&quot;20160819_57b675925c71f.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;딴 소리는 이쯤하고, 오늘은 공동 월드를 제작하는 방법을 함께 배워보겠다.&lt;/h2&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;1. 먼저 그룹 월드를 시작해야 한다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9.JPG&quot; data-origin-width=&quot;1826&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnqTSQ/btrHohULbo2/O34WReyBwa5uXL0izfnBik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnqTSQ/btrHohULbo2/O34WReyBwa5uXL0izfnBik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnqTSQ/btrHohULbo2/O34WReyBwa5uXL0izfnBik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnqTSQ%2FbtrHohULbo2%2FO34WReyBwa5uXL0izfnBik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1826&quot; height=&quot;975&quot; data-filename=&quot;9.JPG&quot; data-origin-width=&quot;1826&quot; data-origin-height=&quot;975&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;홈에서 만들기에 들어간 다음 월드(그룹) 선택 후 이어서 만들기를 누르면 공동 월드로 들어가진다.&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;어제는 내가 시험삼아 아래의 박진영만 만들어놨었는데, 오늘 보니 친구들이 늘어나있다.&lt;/h3&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;8.JPG&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn2j5k/btrHpODNhr2/imfDhqKFIJRduuC8j4cJ90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn2j5k/btrHpODNhr2/imfDhqKFIJRduuC8j4cJ90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn2j5k/btrHpODNhr2/imfDhqKFIJRduuC8j4cJ90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn2j5k%2FbtrHpODNhr2%2FimfDhqKFIJRduuC8j4cJ90%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;241&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;241&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 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;10.JPG&quot; data-origin-width=&quot;1655&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FTqt4/btrHohtEg6Y/J9TbMHCYtVZeUc7oOkokQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FTqt4/btrHohtEg6Y/J9TbMHCYtVZeUc7oOkokQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FTqt4/btrHohtEg6Y/J9TbMHCYtVZeUc7oOkokQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFTqt4%2FbtrHohtEg6Y%2FJ9TbMHCYtVZeUc7oOkokQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1655&quot; height=&quot;796&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;1655&quot; data-origin-height=&quot;796&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;h4 data-ke-size=&quot;size20&quot;&gt;왼쪽은 XX님이 어제 먹은 뿌링클 친구이고, 오른쪽 종이 뭉치는 XX님이 남겨놓으신 편지이다.&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;&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;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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;소중해...&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20190120_5c441914bd4db.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boer83/btrHoOke9pX/LHNkC0bpahwVGy4Q8oqIkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boer83/btrHoOke9pX/LHNkC0bpahwVGy4Q8oqIkk/img.png&quot; data-alt=&quot;카와이..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boer83/btrHoOke9pX/LHNkC0bpahwVGy4Q8oqIkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fboer83%2FbtrHoOke9pX%2FLHNkC0bpahwVGy4Q8oqIkk%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;320&quot; height=&quot;320&quot; data-filename=&quot;20190120_5c441914bd4db.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카와이..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아무리 우리팀이 귀엽다 하더라도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;나의 귀여움이 살짝 더 강하긴 한 것 같다.&lt;/h3&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;XZUTp.webp&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjyriE/btrHohN3xEx/JJl01br1TOWXWZE8dhyYaK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjyriE/btrHohN3xEx/JJl01br1TOWXWZE8dhyYaK/img.webp&quot; data-alt=&quot;죄송합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjyriE/btrHohN3xEx/JJl01br1TOWXWZE8dhyYaK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjyriE%2FbtrHohN3xEx%2FJJl01br1TOWXWZE8dhyYaK%2Fimg.webp&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;490&quot; height=&quot;630&quot; data-filename=&quot;XZUTp.webp&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;죄송합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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;h3 data-ke-size=&quot;size23&quot;&gt;가명으로 뿌링클 팀원과 휴지 팀원이 있다고 가정해보자&lt;/h3&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;만약 뿌링클 팀원이 편집을 진행중이면, 휴지 팀원은 해당 Map을 편집할 수 없다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;뿌링클 팀원이 편집을 마치고, ctrl + s를 눌러서 Check-in을 눌러주어야만 휴지 팀원이 편집을 할 수 있게 된다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220127_61f23bffe4407.gif&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uq97F/btrHoH6LOld/siTDOMBrx2rpbx78sckzgk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uq97F/btrHoH6LOld/siTDOMBrx2rpbx78sckzgk/img.gif&quot; data-alt=&quot;아쉽다 ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uq97F/btrHoH6LOld/siTDOMBrx2rpbx78sckzgk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/uq97F/btrHoH6LOld/siTDOMBrx2rpbx78sckzgk/img.gif&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;300&quot; height=&quot;326&quot; data-filename=&quot;20220127_61f23bffe4407.gif&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아쉽다 ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단 맵마다 편집자가 다르게 편집을 할 수 있기에&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;맵 A를 뿌링클이 편집하고, 맵 B를 휴지가 편집한다면 동시에 편집할 수 있다.&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;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;&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;h3 data-ke-size=&quot;size23&quot;&gt;이제 그룹장의 권력..&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h3 data-ke-size=&quot;size23&quot;&gt;아니 권한에 대해서 설명해보겠다.&lt;/h3&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;1. 그룹장은 그룹 내 새로운 월드를 생성할 수 있다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 버전관리를 할 수 있다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[File] &amp;rarr; [Revisions]에 들어가면 버전관리를 할 수 있다.&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;&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;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;&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;h2 data-ke-size=&quot;size26&quot;&gt;핵심적인 권한이 하나 있다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20161118_582e52850ccf5.gif&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BOe3B/btrHoIdtEPK/SPM9K3MLtsqmqeWGwRUs0k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BOe3B/btrHoIdtEPK/SPM9K3MLtsqmqeWGwRUs0k/img.gif&quot; data-alt=&quot;그룹장 : ㅋㅋㅋㅋ 저 그룹원 재밌네 그래&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BOe3B/btrHoIdtEPK/SPM9K3MLtsqmqeWGwRUs0k/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/BOe3B/btrHoIdtEPK/SPM9K3MLtsqmqeWGwRUs0k/img.gif&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;300&quot; height=&quot;354&quot; data-filename=&quot;20161118_582e52850ccf5.gif&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그룹장 : ㅋㅋㅋㅋ 저 그룹원 재밌네 그래&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20160819_57b5f0f2bff55.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4UAnY/btrHoGGJKzI/GM272Npy00IfkSVvtIX0O1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4UAnY/btrHoGGJKzI/GM272Npy00IfkSVvtIX0O1/img.jpg&quot; data-alt=&quot;그룹장 : 쳐내&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4UAnY/btrHoGGJKzI/GM272Npy00IfkSVvtIX0O1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4UAnY%2FbtrHoGGJKzI%2FGM272Npy00IfkSVvtIX0O1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;691&quot; data-filename=&quot;20160819_57b5f0f2bff55.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그룹장 : 쳐내&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20161118_582e52f9ccffa.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qe49Y/btrHqox4n8u/VnaSyEzpwKKRKWJJiPIgLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qe49Y/btrHqox4n8u/VnaSyEzpwKKRKWJJiPIgLk/img.jpg&quot; data-alt=&quot;그룹원 : ?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qe49Y/btrHqox4n8u/VnaSyEzpwKKRKWJJiPIgLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQe49Y%2FbtrHqox4n8u%2FVnaSyEzpwKKRKWJJiPIgLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;411&quot; data-filename=&quot;20161118_582e52f9ccffa.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그룹원 : ?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20190117_5c3f5a9905c81.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wmxtM/btrHoNFES5D/Ntugz8h4XamIR9LUSf7lU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wmxtM/btrHoNFES5D/Ntugz8h4XamIR9LUSf7lU0/img.jpg&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wmxtM/btrHoNFES5D/Ntugz8h4XamIR9LUSf7lU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwmxtM%2FbtrHoNFES5D%2FNtugz8h4XamIR9LUSf7lU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;223&quot; data-filename=&quot;20190117_5c3f5a9905c81.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/147</guid>
      <comments>https://devdongbaek.tistory.com/147#entry147comment</comments>
      <pubDate>Fri, 15 Jul 2022 23:07:52 +0900</pubDate>
    </item>
    <item>
      <title>DRF JWT 인증</title>
      <link>https://devdongbaek.tistory.com/146</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전 강의에서 배운 Django의 기본 Token은 랜덤 문자열로 구성되어 있기에 Token을 통해서 어떤 유저인지 알 수 없고, Token 유효기간도 없어서 위험하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 기본 Token의 단점을 JWT를 통해서 보완해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token 인증과 JWT 인증&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DRF의 기본 Token&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순한 랜덤 문자열&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;각 User와 1:1 매칭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유효기간이 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token을 받았을 때 어떤 유저의 Token인지 알 수 없음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import binascii
&amp;gt;&amp;gt;&amp;gt; import os
&amp;gt;&amp;gt;&amp;gt; binascii.hexlify(os.urandom(20)).decode()
'ec90f85721dc5f75b6eec47d199e3476c301633f'&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JWT&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;데이터베이스를 조회하지 않아도,&amp;nbsp;&lt;b&gt;로직만으로 인증이 가능&amp;nbsp;&lt;/b&gt;-&amp;gt; JWT 만으로 JSON 형태로 유저 정보를 담고있음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;포맷 : &quot;&lt;b&gt;헤더.내용.서명&lt;/b&gt;&quot;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;서버에서 토큰 발급 시에&amp;nbsp;&lt;b&gt;비밀키로 서명&lt;/b&gt;을 하고, 발급 시간및 원하는 정보를 저장 -&amp;gt; &lt;b&gt;비밀키는 절대 노출되어서는 안된다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;서명은 &lt;u&gt;암호화가 아닙니다.&lt;/u&gt; 누구라도 열어볼 수 있기에, 보안성 데이터는 넣지 말고,&lt;b&gt; 최소한의 필요한 정보&lt;/b&gt;만 넣기.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;Claim&lt;/b&gt; : 담는 정보의 한 조각.&amp;nbsp;key/value형식&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;djangorestframework-jwt에서는 Payload에 user_id, username, email 이름의 claim을 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;위변조가 불가 &amp;rarr; 비밀키를 소중히&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;장고에서는 settings.SECRET_KEY를 활용하거나, 별도로 JWT_SECRET_KEY 설정을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;갱신&lt;/b&gt;(Refresh) 메커니즘을 지원&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JWT는 만료시간이 있고, 갱신을 지원한다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Token 유효기간 내에 갱신하거나,&amp;nbsp;usernames/password를 통해 재인증 (Token 유효기간 내에 갱신 시, username/password가 아닌 기존의 Token을 이용해 갱신이 가능)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;이미 발급된 Token을 폐기(Revoke)하는것은 불가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token과 JWT&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일반 토큰 예시&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8df73dafbde4c669dc37a9ea7620434515b2cc43&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JSON Web Token 예시&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span style=&quot;background-color: #009a87;&quot;&gt;eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFza2RqYW5nbyIsImV4cCI6MTUxNTcyMTIxMSwiZW1haWwiOiIifQ&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;Zf_o3S7Q7-cmUzLWlGEQE5s6XoMguf8SLcF-2VdokJQ&lt;/span&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;Header(헤더)&lt;/span&gt;를 base64 인코딩&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #009a87;&quot;&gt;Payload(내용)&lt;/span&gt;를 base64 인코딩&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;Signature(서명)&lt;/span&gt; = Header/Payload를 조합하고, 비밀키로 서명한 후, base64 인코딩&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;Payload를 변조해서 서버로 보냄 &amp;rarr; 서버에서는 Signature 와 Payload값이 일치하지 않으므로, 무결하지 않다고 판단 후 거부가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;matlab&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from base64 import b64decode
&amp;gt;&amp;gt;&amp;gt; b64decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9')
b'{&quot;typ&quot;:&quot;JWT&quot;,&quot;alg&quot;:&quot;HS256&quot;}'
&amp;gt;&amp;gt;&amp;gt; b64decode('eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFza2RqYW5nbyIsImV4cCI6MTUxNTcyMTIxMSwiZW1haWwiOiIifQ==')
b'{&quot;user_id&quot;:1,&quot;username&quot;:&quot;askdjango&quot;,&quot;exp&quot;:1515721211,&quot;email&quot;:&quot;&quot;}'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JWT를 해독한 결과
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫번째 b는 헤더, 두번째 b는 내용이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token은 안전한 장소에 보관하기&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일반 Token / JWT 토큰 여부에 상관없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스마트폰 앱은, 설치된 앱 별로 안전한 저장공간이 제공되지만, 웹브라우저에는 없습니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token은 앱 환경에서만 권장하기도 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 클라이언트 환경에서는&amp;nbsp;&lt;b&gt;세션 인증이 나은 선택일 수 있습니다.&lt;/b&gt;&amp;nbsp;단 장고/웹클라이언트가 같은 호스트명을 가져야 함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;통신은 필히 https !!!&lt;/b&gt; &lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Let's Encrypt(https보급을 위해 등장한 무료 인증 기관)에서 SSL인증서를 발급받아 서비스하자&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;djangorestframwork-simplejwt&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://github.com/jazzband/djangorestframework-simplejwt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/jazzband/djangorestframework-simplejwt&lt;/a&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1657871942362&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 - jazzband/djangorestframework-simplejwt: A JSON Web Token authentication plugin for the Django REST Framework.&quot; data-og-description=&quot;A JSON Web Token authentication plugin for the Django REST Framework. - GitHub - jazzband/djangorestframework-simplejwt: A JSON Web Token authentication plugin for the Django REST Framework.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jazzband/djangorestframework-simplejwt&quot; data-og-url=&quot;https://github.com/jazzband/djangorestframework-simplejwt&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dGDCP5/hyO5HpGESf/BczOWpNfKAhXQ6aLetKUh1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jazzband/djangorestframework-simplejwt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jazzband/djangorestframework-simplejwt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dGDCP5/hyO5HpGESf/BczOWpNfKAhXQ6aLetKUh1/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 - jazzband/djangorestframework-simplejwt: A JSON Web Token authentication plugin for the Django REST Framework.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A JSON Web Token authentication plugin for the Django REST Framework. - GitHub - jazzband/djangorestframework-simplejwt: A JSON Web Token authentication plugin for the Django REST Framework.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://jiaaan90.tistory.com/152&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jiaaan90.tistory.com/152&lt;/a&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1657872516764&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;[DRF] JWT (simple jwt)&quot; data-og-description=&quot;JWT (Json Web Token) 인증 개발 경험에 대해 적어 보려고 한다. 처음에 구현 했던 방식은 djangorestframework-jwt 를 사용 했었는데 https://pypi.org/project/djangorestframework-jwt/ djangorestframework-jw..&quot; data-og-host=&quot;jiaaan90.tistory.com&quot; data-og-source-url=&quot;https://jiaaan90.tistory.com/152&quot; data-og-url=&quot;https://jiaaan90.tistory.com/152&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Mq90C/hyO5LZU35C/XCDNA92kJAYhTTuR0xVnC0/img.png?width=291&amp;amp;height=151&amp;amp;face=0_0_291_151,https://scrap.kakaocdn.net/dn/bgrbuA/hyO5Paa9YK/2hUQC4ceXTcdoToSx9UrQk/img.png?width=291&amp;amp;height=151&amp;amp;face=0_0_291_151,https://scrap.kakaocdn.net/dn/bIabdl/hyO5Lr56gH/9lwrVTMeLb2swFiDeutgM1/img.png?width=764&amp;amp;height=785&amp;amp;face=0_0_764_785&quot;&gt;&lt;a href=&quot;https://jiaaan90.tistory.com/152&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jiaaan90.tistory.com/152&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Mq90C/hyO5LZU35C/XCDNA92kJAYhTTuR0xVnC0/img.png?width=291&amp;amp;height=151&amp;amp;face=0_0_291_151,https://scrap.kakaocdn.net/dn/bgrbuA/hyO5Paa9YK/2hUQC4ceXTcdoToSx9UrQk/img.png?width=291&amp;amp;height=151&amp;amp;face=0_0_291_151,https://scrap.kakaocdn.net/dn/bIabdl/hyO5Lr56gH/9lwrVTMeLb2swFiDeutgM1/img.png?width=764&amp;amp;height=785&amp;amp;face=0_0_764_785');&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;[DRF] JWT (simple jwt)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JWT (Json Web Token) 인증 개발 경험에 대해 적어 보려고 한다. 처음에 구현 했던 방식은 djangorestframework-jwt 를 사용 했었는데 https://pypi.org/project/djangorestframework-jwt/ djangorestframework-jw..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jiaaan90.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://medium.com/chanjongs-programming-diary/django-rest-framework-drf-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-jwt-%EA%B8%B0%EB%B0%98-authentication-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-with-simplejwt-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-1-e54c3ed2420c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/chanjongs-programming-diary/django-rest-framework-drf-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-jwt-%EA%B8%B0%EB%B0%98-authentication-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-with-simplejwt-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-1-e54c3ed2420c&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1657873380980&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;Django-Rest-Framework(DRF)로 JWT 기반 Authentication 세팅하기(with simplejwt) &amp;mdash; 초기 환경 세팅(1)&quot; data-og-description=&quot;앞서 포스팅했던 소셜 로그인 구현에서 생각보다 많은 개발자 분들이 봐주신 덕분에 상위노출도 되어 기뻤지만, 이전 코드를 다시 보니 많이 부족하단 생각이 들었다. 특히 JWT 부분에서 이해력&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/chanjongs-programming-diary/django-rest-framework-drf-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-jwt-%EA%B8%B0%EB%B0%98-authentication-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-with-simplejwt-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-1-e54c3ed2420c&quot; data-og-url=&quot;https://medium.com/chanjongs-programming-diary/django-rest-framework-drf-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-jwt-%EA%B8%B0%EB%B0%98-authentication-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-with-simplejwt-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-1-e54c3ed2420c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/exL90d/hyO5QfSal3/crj4mbrwnwXgCMi8j1oBgK/img.png?width=566&amp;amp;height=1068&amp;amp;face=0_0_566_1068,https://scrap.kakaocdn.net/dn/dqX5MR/hyO5JOzZ9j/epPUs0uVdwsWve4ko0fv01/img.png?width=566&amp;amp;height=1068&amp;amp;face=0_0_566_1068&quot;&gt;&lt;a href=&quot;https://medium.com/chanjongs-programming-diary/django-rest-framework-drf-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-jwt-%EA%B8%B0%EB%B0%98-authentication-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-with-simplejwt-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-1-e54c3ed2420c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/chanjongs-programming-diary/django-rest-framework-drf-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-jwt-%EA%B8%B0%EB%B0%98-authentication-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-with-simplejwt-%EC%B4%88%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-1-e54c3ed2420c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/exL90d/hyO5QfSal3/crj4mbrwnwXgCMi8j1oBgK/img.png?width=566&amp;amp;height=1068&amp;amp;face=0_0_566_1068,https://scrap.kakaocdn.net/dn/dqX5MR/hyO5JOzZ9j/epPUs0uVdwsWve4ko0fv01/img.png?width=566&amp;amp;height=1068&amp;amp;face=0_0_566_1068');&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;Django-Rest-Framework(DRF)로 JWT 기반 Authentication 세팅하기(with simplejwt) &amp;mdash; 초기 환경 세팅(1)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앞서 포스팅했던 소셜 로그인 구현에서 생각보다 많은 개발자 분들이 봐주신 덕분에 상위노출도 되어 기뻤지만, 이전 코드를 다시 보니 많이 부족하단 생각이 들었다. 특히 JWT 부분에서 이해력&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설치&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;pip3 install djangorestframework-simplejwt&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;&lt;span style=&quot;color: #000000;&quot;&gt;세팅&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 프로젝트/settings.py
from datetime import timedelta

INSTALLED_APPS = [
    # ...
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # 'rest_framework.authentication.BasicAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
        # 'rest_framework.authentication.TokenAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication', # 추가
    ],
}

 SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': False,
    'UPDATE_LAST_LOGIN': False,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,
    'JWK_URL': None,
    'LEEWAY': 0,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',
    'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}



# 프로젝트/urls.py

from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenVerifyView
)

urlpatterns = [
    # ...
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
]&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;rest_framework_jwt의 뷰 구현&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from rest_framework import generics, status
from rest_framework.response import Response

from . import serializers
from .authentication import AUTH_HEADER_TYPES
from .exceptions import InvalidToken, TokenError

class TokenViewBase(generics.GenericAPIView):
    permission_classes = ()
    authentication_classes = ()

    serializer_class = None

    www_authenticate_realm = 'api'

    def get_authenticate_header(self, request):
        return '{0} realm=&quot;{1}&quot;'.format(
            AUTH_HEADER_TYPES[0],
            self.www_authenticate_realm,
        )

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        try:
            serializer.is_valid(raise_exception=True)
        except TokenError as e:
            raise InvalidToken(e.args[0])

        return Response(serializer.validated_data, status=status.HTTP_200_OK)

class TokenObtainPairView(TokenViewBase):
    &quot;&quot;&quot;
    Takes a set of user credentials and returns an access and refresh JSON web
    token pair to prove the authentication of those credentials.
    &quot;&quot;&quot;
    serializer_class = serializers.TokenObtainPairSerializer

token_obtain_pair = TokenObtainPairView.as_view()

class TokenRefreshView(TokenViewBase):
    &quot;&quot;&quot;
    Takes a refresh type JSON web token and returns an access type JSON web
    token if the refresh token is valid.
    &quot;&quot;&quot;
    serializer_class = serializers.TokenRefreshSerializer

token_refresh = TokenRefreshView.as_view()

class TokenObtainSlidingView(TokenViewBase):
    &quot;&quot;&quot;
    Takes a set of user credentials and returns a sliding JSON web token to
    prove the authentication of those credentials.
    &quot;&quot;&quot;
    serializer_class = serializers.TokenObtainSlidingSerializer

token_obtain_sliding = TokenObtainSlidingView.as_view()

class TokenRefreshSlidingView(TokenViewBase):
    &quot;&quot;&quot;
    Takes a sliding JSON web token and returns a new, refreshed version if the
    token's refresh period has not expired.
    &quot;&quot;&quot;
    serializer_class = serializers.TokenRefreshSlidingSerializer

token_refresh_sliding = TokenRefreshSlidingView.as_view()

class TokenVerifyView(TokenViewBase):
    &quot;&quot;&quot;
    Takes a token and indicates if it is valid.  This view provides no
    information about a token's fitness for a particular use.
    &quot;&quot;&quot;
    serializer_class = serializers.TokenVerifySerializer

token_verify = TokenVerifyView.as_view()

class TokenBlacklistView(TokenViewBase):
    &quot;&quot;&quot;
    Takes a token and blacklists it. Must be used with the
    `rest_framework_simplejwt.token_blacklist` app installed.
    &quot;&quot;&quot;
    serializer_class = serializers.TokenBlacklistSerializer

token_blacklist = TokenBlacklistView.as_view()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1657872291933&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 위 코드들이 모두 정상 처리 시에 아래 포맷의 응답을 보냄

{
    &quot;token&quot;: token,
    &quot;user&quot;: user
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTPie를 통한 JWT 발급&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증에 실패할 경우, &quot;400 Bad Request&quot; 응답&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 연결에서는 서버와 HTTPS 통신을 권장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;발급받은 JWT Token을&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;http://jwt.io/&quot;&gt;jwt.io &lt;/a&gt;&lt;/span&gt;서비스를 통해 검증해보세요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;쉘&amp;gt; http POST http://서비스주소/api-jwt-auth/ username=&quot;유저명&quot; password=&quot;암호&quot;
{
    &quot;token&quot;: &quot;인증에 성공할 경우, 토큰응답이 옵니다.&quot;
}

쉘&amp;gt; http POST http://서비스주소/api-jwt-auth/verify/ token=&quot;토큰&quot;
{
    &quot;token&quot;: &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;&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;h2 data-ke-size=&quot;size26&quot;&gt;발급받은 JWT Token으로 포스팅 목록 API 요청&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DRF Token에서는 인증헤더 시작문자열로 Token을 썼지만, 이제 JWT 사용.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;매 요청시마다 인증을 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;쉘&amp;gt; http http://서비스주소/post/ &quot;Authorization: Bearer {{토큰}}&quot;  # djangorestframework-simplejwt&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;h2 data-ke-size=&quot;size26&quot;&gt;JWT Token 유효시간이 지났다면?&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;JWT Token 유효기간 내에 갱신을 해야만 합니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;유효기간이 지난 Token은 아래와 같이 &quot;401 Unauthorized&quot; 응답&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;유효기간 내에는 Token만으로 갱신 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;유효기간이 지나면 다시&amp;nbsp;username/password를 통해 인증받아야만 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;유효기간&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;settings.JWT_AUTH의&amp;nbsp;JWT_EXPIRATION_DELTA참조 &amp;rarr; 디폴트 5분&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;쉘&amp;gt; http http://서비스주소/post/ &quot;Authorization: Bearer 토큰&quot;`
HTTP/1.0 401 Unauthorized
{
    &quot;detail&quot;: &quot;Signature has expired.&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;h2 data-ke-size=&quot;size26&quot;&gt;JWT Token 갱신받기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token 유효기간 내에만 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;settings.JWT_AUTH의 JWT_ALLOW_REFRESH 설정은 디폴트 False&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;True 설정에서만 갱신 지원. False인 경우에는 orig_iat 필드를 찾을 수 없다는 응답&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;쉘&amp;gt; http POST http://서비스주소/api/token/refresh/ refresh=&quot;토큰&quot;
{
    &quot;token&quot;: &quot;갱신받은 JWT 토큰&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/146</guid>
      <comments>https://devdongbaek.tistory.com/146#entry146comment</comments>
      <pubDate>Fri, 15 Jul 2022 17:23:02 +0900</pubDate>
    </item>
    <item>
      <title>DRF Token인증 적용하기</title>
      <link>https://devdongbaek.tistory.com/145</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;DRF에서 지원하는 인증&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;rest_frameworkauthenticationsessionauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;rest_framework.authentication.SessionAuthentication&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 프론트엔드와 장고가 같은 호스트를 쓴다면, 세션 인증을 사용할 수 있습니다.(&lt;b&gt;nginx&lt;/b&gt;&amp;nbsp;등 활용)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;외부 서비스 / 앱에서 세션 인증을 사용할 수 없다. // 안드로이드나 React등에서 사용할 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;rest_frameworkauthenticationbasicauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;rest_framework.authentication.BasicAuthentication&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;외부 서비스/앱에서 매번&amp;nbsp;username/password를 넘기는 것은 보안상 위험하고, 하면 안된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;rest_frameworkauthenticationtokenauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;rest_framework.authentication.&lt;b&gt;TokenAuthentication&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;초기에&amp;nbsp;username/password로 &lt;b&gt;Token&lt;/b&gt;을 발급받고, 이 &lt;b&gt;Token&lt;/b&gt;을 매번 API요청에 담아서 보내어 인증을 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다폴트로 설정되어있지 않기에 설정을 해주어야 함, 추천(세션, 토큰)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Token&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;Token 모델&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/models.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/models.py&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657869263189&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 - encode/django-rest-framework: Web APIs for Django.  &quot; data-og-description=&quot;Web APIs for Django.  . Contribute to encode/django-rest-framework development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/models.py&quot; data-og-url=&quot;https://github.com/encode/django-rest-framework&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lJRCi/hyO5GRNUpW/KbtXAUAk5QwlPBGvIOsUFk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/models.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/models.py&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lJRCi/hyO5GRNUpW/KbtXAUAk5QwlPBGvIOsUFk/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 - encode/django-rest-framework: Web APIs for Django.  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Web APIs for Django.  . Contribute to encode/django-rest-framework 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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;User모델과 1:1 관계&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 User별 Token은 수동으로 생성해줘야 합니다. -&amp;gt; Token 모델 객체를 따로 세팅해줘야 한다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token은 User별로 유일하며, Token만으로 인증을 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class Token(models.Model):
    key = models.CharField(_(&quot;Key&quot;), max_length=40, primary_key=True)
    user = models.OneToOneField(
            settings.AUTH_USER_MODEL, related_name='auth_token',
            on_delete=models.CASCADE, verbose_name=_(&quot;User&quot;))
            created = models.DateTimeField(_(&quot;Created&quot;), auto_now_add=True)

    class Meta:
        abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS

    def save(self, *args, **kwargs):
        if not self.key: # self.key에 값이 없으면, 즉 유저가 Token이 없다면 Key 필드에 랜덤 문자열을 지정.
            self.key = self.generate_key()
        return super().save(*args, **kwargs)

    def generate_key(self):
        return binascii.hexlify(os.urandom(20)).decode()

    def __str__(self):
        return self.key&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;color: #000000;&quot;&gt;Token 생성&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법 1) &lt;b&gt;ObtainAuthToken&lt;/b&gt; 뷰를 통한 획득 및 생성 -&amp;gt; URL Pattern 매핑 필요&lt;/h4&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;# rest_framework/authtoken/views.py
class ObtainAuthToken(APIView):
    def post(self, request, *args, **kwargs):  # post 요청일 때
        # ...
        # 토큰, 생성여부(bool 반환)
        token, created = Token.objects.get_or_create(user=user) # 유저가 있으면 가져오고, 없으면 토큰을 생성한다.
        return Response({'token': token.key})&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ObtainAuthToken&lt;/b&gt; 내부 코드&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657869461823&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ObtainAuthToken(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)
    serializer_class = AuthTokenSerializer
    if coreapi is not None and coreschema is not None:
        schema = ManualSchema(
            fields=[
                coreapi.Field(
                    name=&quot;username&quot;,
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title=&quot;Username&quot;,
                        description=&quot;Valid username for authentication&quot;,
                    ),
                ),
                coreapi.Field(
                    name=&quot;password&quot;,
                    required=True,
                    location='form',
                    schema=coreschema.String(
                        title=&quot;Password&quot;,
                        description=&quot;Valid password for authentication&quot;,
                    ),
                ),
            ],
            encoding=&quot;application/json&quot;,
        )

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data,
                                           context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})


obtain_auth_token = ObtainAuthToken.as_view()&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;방법 2)&amp;nbsp;&lt;b&gt;Signal&lt;/b&gt;을 통한 자동 생성 -&amp;gt; 일종의 콜백과 같이 동작&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token

@receiver(post_save, sender=settings.AUTH_USER_MODEL)  # 유저 모델을 지정해서 해당 모델이 save가 될 때 호출
def create_auth_token(sender, instance=None, created=False, **kwargs): # created 인자를 받는다.
    if created:  # create / update 모두 save이기 때문에, created 일때만 참일 때 동작하도록 수정
        Token.objects.create(user=instance)&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;방법 3)&amp;nbsp;&lt;b&gt; Management&lt;/b&gt; 명령을 통한 생성&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# 본 명령은 생성된 Token을 변경하지 않습니다. 필수는 아님
python3 manage.py drf_create_token &amp;lt;username&amp;gt;

# 강제로 Token 재생성하기
python3 manage.py drf_create_token -r &amp;lt;username&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;color: #000000;&quot;&gt;Token 획득&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Settings에 설정하기&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
    # Django Apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Third-Party Apps
    'rest_framework',
    'rest_framework.authtoken',  # &amp;lt;-- Here

    # Local Apps (Your project's apps)
    'myapi.core',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',  # &amp;lt;-- And here
    ],
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;obtain_auth_token을 노출하기&lt;/h2&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;# settings.py
INSTALLED_APPS = [
    # ...
    'rest_framework.authtoken',
]

# python manage.py migrate

# accounts/urls.py
from rest_framework.authtoken.views import obtain_auth_token

urlpatterns += [
    path('api-token-auth/', obtain_auth_token),
]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;account 프로젝트에 설정하는 것을 추천한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반드시 migrate를 해주어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HTTPie를 통해 Token을 획득하기&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;쉘&amp;gt; http POST http://주소/accounts/api-token-auth/ username=&quot;유저명&quot; password=&quot;암호&quot;
HTTP/1.0 200 OK
Allow: POST, OPTIONS
Content-Type: application/json
Date: Fri, 01 Dec 2017 06:49:35 GMT
Server: WSGIServer/0.2 CPython/3.6.1
{
&quot;token&quot;: &quot;9cdd705c0a0e5adb8671d22bd6c7a99bbacab227&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 토큰을 통해 요청시 더 이상 username과 password를 넘기지 않아도 된다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Token과 HTTPie 활용 (Bash)&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export HOST=&quot;http://localhost:8000&quot;
export TOKEN=&quot;9cdd705c0a0e5adb8671d22bd6c7a99bbacab227&quot;

# Post List
http GET $HOST/api/post/ &quot;Authorization: Token $TOKEN&quot;

# Post Create
http POST $HOST/api/post/ &quot;Authorization: Token $TOKEN&quot; message=&quot;hello&quot;

# Post Create with Photo
http --form POST $HOST/api/post/ &quot;Authorization: Token $TOKEN&quot; message=&quot;hello&quot; photo@&quot;f1.jpg&quot;

# Post#16 Detail
http GET $HOST/api/post/16/ &quot;Authorization: Token $TOKEN&quot;

# Post#16 Update
http PATCH $HOST/api/post/16/ &quot;Authorization: Token $TOKEN&quot; message=&quot;patched&quot;
http PUT $HOST/api/post/16/ &quot;Authorization: Token $TOKEN&quot; message=&quot;updated&quot;

# Post#16 Delete
http DELETE $HOST/api/post/16/ &quot;Authorization: Token $TOKEN&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;h4 data-ke-size=&quot;size20&quot;&gt;파이썬에서의 처리&lt;/h4&gt;
&lt;pre id=&quot;code_1657870419348&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests  # pip install requests

HOST = 'http://localhost:8000'
res = requests.post(HOST + '/api-token-auth/', {
    'username': '유저명', # FIXME: 기입해주세요.
    'password': '암호', # FIXME: 기입해주세요.
})
res.raise_for_status()

token = res.json()['token']
print(token)

&quot;&quot;&quot;이제 인증이 필요한 요청에는 다음 헤더를 붙여주세요&quot;&quot;&quot;
headers = {
    'Authorization': 'Token ' + token, # 필히 띄워쓰기
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;header에 토큰을 담아서 보냄&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# Post List
res = requests.get(HOST + '/api/post/', headers=headers)
res.raise_for_status()
print(res.json())

# Post Create
data = {'message': 'hello requests'}
res = requests.post(HOST + '/api/post/', data=data, headers=headers)
print(res)
print(res.json())

# Post Create with Photo
files = {'photo': open('f1.jpg', 'rb')}
data = {'message': 'hello requests'}
res = requests.post(HOST + '/api/post/', files=files, data=data, headers=headers)
print(res)
print(res.json())

# Post#16 Detail
res = requests.get(HOST + '/api/post/', headers=headers)
res = requests.get(HOST + '/api/post/16/', headers=headers)
res.raise_for_status()
print(res.json())

# Post#16 Patch
res = requests.patch(HOST + '/api/post/16/', headers=headers, data={'message': 'hello'})
res.raise_for_status()
print(res.json())

# Post#16 Update
res = requests.put(HOST + '/api/post/16/', headers=headers, data={'message': 'hello'})
res.raise_for_status()
print(res.json())

# Post#16 Delete
res = requests.delete(HOST + '/api/post/16/', headers=headers, data={'message': 'hello'})
res.raise_for_status()
print(res.ok)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/145</guid>
      <comments>https://devdongbaek.tistory.com/145#entry145comment</comments>
      <pubDate>Fri, 15 Jul 2022 16:35:51 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 워크 스페이스 회고</title>
      <link>https://devdongbaek.tistory.com/144</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 14일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&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;04f4o18npa.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckTiFt/btrHjtzVKAV/bKldY9qpHkLDLwGGmhKHH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckTiFt/btrHjtzVKAV/bKldY9qpHkLDLwGGmhKHH1/img.jpg&quot; data-alt=&quot;너무 더워요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckTiFt/btrHjtzVKAV/bKldY9qpHkLDLwGGmhKHH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckTiFt%2FbtrHjtzVKAV%2FbKldY9qpHkLDLwGGmhKHH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;247&quot; data-filename=&quot;04f4o18npa.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;너무 더워요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;Chapter 1~4 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/132&quot;&gt;https://devdongbaek.tistory.com/132&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657812231692&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1~4 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1주차 11일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WDZjG/hyO5Jf72Ml/TvAoQHg88E0gKNsY4AJH51/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/bFWbYu/hyO5P1JPe0/2rxNnR6K3PmG3lzvoyRUK0/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/cNs2OS/hyO4Bxgkna/3Yh3tknkbLs3UujKs9OF41/img.jpg?width=452&amp;amp;height=401&amp;amp;face=162_115_289_254&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/132&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WDZjG/hyO5Jf72Ml/TvAoQHg88E0gKNsY4AJH51/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/bFWbYu/hyO5P1JPe0/2rxNnR6K3PmG3lzvoyRUK0/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/cNs2OS/hyO4Bxgkna/3Yh3tknkbLs3UujKs9OF41/img.jpg?width=452&amp;amp;height=401&amp;amp;face=162_115_289_254');&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 넥슨 MOD Suppoters Hackathon Chapter 1~4 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1주차 11일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 5 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/136&quot;&gt;https://devdongbaek.tistory.com/136&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657812238400&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 5 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 12일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/136&quot; data-og-url=&quot;https://devdongbaek.tistory.com/136&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dIa5f1/hyO5KlOBSM/G1ykmXKaTKdtHn1oMLmlkK/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/s997W/hyO4A6dfgM/sevTzx2Cc8dzFkqc80DHq1/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/OHxgP/hyO5OaFvnP/cQ3KmZ8y7Qqnuiqkfk6IQ0/img.jpg?width=1879&amp;amp;height=1024&amp;amp;face=0_0_1879_1024&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/136&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dIa5f1/hyO5KlOBSM/G1ykmXKaTKdtHn1oMLmlkK/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/s997W/hyO4A6dfgM/sevTzx2Cc8dzFkqc80DHq1/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/OHxgP/hyO5OaFvnP/cQ3KmZ8y7Qqnuiqkfk6IQ0/img.jpg?width=1879&amp;amp;height=1024&amp;amp;face=0_0_1879_1024');&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 넥슨 MOD Suppoters Hackathon Chapter 5 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 12일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 6 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/137&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/137&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657812248889&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 6 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 13일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/137&quot; data-og-url=&quot;https://devdongbaek.tistory.com/137&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/y7lrd/hyO4MZQkU3/s6S1VK7OB51x9xeQFZpv81/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/byBHfg/hyO5TiJ8R6/CY2gzSoKFvua68klFjbyS1/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/c2Q7h8/hyO5EFTQAV/VKiDHur1qeb8LeljDzkMY1/img.jpg?width=600&amp;amp;height=472&amp;amp;face=0_0_600_472&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/137&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/137&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/y7lrd/hyO4MZQkU3/s6S1VK7OB51x9xeQFZpv81/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/byBHfg/hyO5TiJ8R6/CY2gzSoKFvua68klFjbyS1/img.jpg?width=600&amp;amp;height=450&amp;amp;face=0_0_600_450,https://scrap.kakaocdn.net/dn/c2Q7h8/hyO5EFTQAV/VKiDHur1qeb8LeljDzkMY1/img.jpg?width=600&amp;amp;height=472&amp;amp;face=0_0_600_472');&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 넥슨 MOD Suppoters Hackathon Chapter 6 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 13일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이번주에는 워크 스페이스와 공동 월드 만드는 방법을 배웠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;오늘 배운 학습량이 좀 적어서 아마 분량을 짧을 것 같다.&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;여러분들과 이야기 할 수 있는 순간이 적어져 굉장히 아쉽고, 슬프다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러분들께 MOD의 즐거움을 알려주는게 하루의 낙인데...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;...&lt;/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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;115985403-ab4ddd00-a5e6-11eb-9f30-88d1a87ced0b.jpg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cquJps/btrHlcYxDEO/yOsjliypNqnMv46sl9YrXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cquJps/btrHlcYxDEO/yOsjliypNqnMv46sl9YrXK/img.jpg&quot; data-alt=&quot;아쉬워라&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cquJps/btrHlcYxDEO/yOsjliypNqnMv46sl9YrXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcquJps%2FbtrHlcYxDEO%2FyOsjliypNqnMv46sl9YrXK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;480&quot; data-filename=&quot;115985403-ab4ddd00-a5e6-11eb-9f30-88d1a87ced0b.jpg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아쉬워라&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;워크 스페이스는 폴더 형식의 리소스 관리 공간을 의미한다.&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGfW9m/btrHiWCN9fu/wsKhCBDC0pCIMzY5eLUqv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGfW9m/btrHiWCN9fu/wsKhCBDC0pCIMzY5eLUqv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGfW9m/btrHiWCN9fu/wsKhCBDC0pCIMzY5eLUqv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGfW9m%2FbtrHiWCN9fu%2FwsKhCBDC0pCIMzY5eLUqv0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;323&quot; height=&quot;202&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;워크 스페이스의 구조에 대해서 설명하자면 아래와 같다.&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;BaseEnvironment&lt;/b&gt; : MOD 메이커에서 제공하는 기본 MODComponent, MODService, MODLogic, MODEvent가 저장되어 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;MyDesk&lt;/b&gt; : 크리에이터가 추가한 리소스, BaseEncironment에서 확장, 복제한 모델, 컴포넌트 등이 추가된다. 새롭게 추가한 리소스는 MyDesk 폴더 하위에 저장된다. 필요할 때 폴더를 추가하여 효율적으로 리소스를 관리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;DefaultPlayer&lt;/b&gt; : NativeModel에 있는 Player의 정보를 참조하고 있다. 실제 생성한 플레이어 아바타 엔티티는 World 안에 속한다. 시작 시 스타트 포인트에 플레이어 아바타를 생성한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 다음은 MOD 해커톤의 핵심 공동 제작하기이다.&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MOD에서는 실시간으로 여러명이 협업해서 하나의 콘텐츠를 만들 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;span style=&quot;color: #000000;&quot;&gt;공동 제작하기에 앞서서 먼저 그룹을 만들어야한다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 먼저 그룹을 만들기 위해서는 MOD 포털 웹에 접속해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://mod.nexon.com/profile/SlLtD/home&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mod.nexon.com/profile/SlLtD/home&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657813111848&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;https://signin.nexon.com/signin?redirect_uri=https://mod.nexon.com/profile/SlLtD/home&quot; data-og-description=&quot;&quot; data-og-host=&quot;signin.nexon.com&quot; data-og-source-url=&quot;https://mod.nexon.com/profile/SlLtD/home&quot; data-og-url=&quot;https://signin.nexon.com/signin?redirect_uri=https://mod.nexon.com/profile/SlLtD/home&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mod.nexon.com/profile/SlLtD/home&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mod.nexon.com/profile/SlLtD/home&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;https://signin.nexon.com/signin?redirect_uri=https://mod.nexon.com/profile/SlLtD/home&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;signin.nexon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&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;3.JPG&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biYrsq/btrHfznXOqO/qqtbcSb0bAgDBhrciJKJvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biYrsq/btrHfznXOqO/qqtbcSb0bAgDBhrciJKJvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biYrsq/btrHfznXOqO/qqtbcSb0bAgDBhrciJKJvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiYrsq%2FbtrHfznXOqO%2FqqtbcSb0bAgDBhrciJKJvK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1885&quot; height=&quot;824&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 홈페이지에 들어갔다면 좌측 상단에 있는 만들기 탭에 들어가자. 그럼 아래와 같은 화면을 볼 수 있을 거다.&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;4.JPG&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPl46/btrHj1XtA6U/YTm1nDZWV27LwhuZIlyia1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPl46/btrHj1XtA6U/YTm1nDZWV27LwhuZIlyia1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPl46/btrHj1XtA6U/YTm1nDZWV27LwhuZIlyia1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPl46%2FbtrHj1XtA6U%2FYTm1nDZWV27LwhuZIlyia1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1888&quot; height=&quot;774&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;774&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 만들기 탭 바로 밑에는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;개인 월드&lt;/span&gt;와 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;그룹 월드&lt;/span&gt;가 있다. &lt;span style=&quot;background-color: #dddddd;&quot;&gt;그룹 월드&lt;/span&gt;&amp;nbsp;옆의 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;그룹만들기&lt;/span&gt;&amp;nbsp;버튼을 클릭하자.&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;5.JPG&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJfmfQ/btrHjc6uUl9/QtzwImpDqm5Z0A8ylScgQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJfmfQ/btrHjc6uUl9/QtzwImpDqm5Z0A8ylScgQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJfmfQ/btrHjc6uUl9/QtzwImpDqm5Z0A8ylScgQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJfmfQ%2FbtrHjc6uUl9%2FQtzwImpDqm5Z0A8ylScgQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1910&quot; height=&quot;762&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. &lt;span style=&quot;background-color: #dddddd;&quot;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그룹장과 그룹멤버는 주어진 권한이 다르다.&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정확한 정보는 아래 사진을 참고하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blY1le/btrHiG1o5Qs/NLEF45aul1Uk6400dkLMek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blY1le/btrHiG1o5Qs/NLEF45aul1Uk6400dkLMek/img.png&quot; data-alt=&quot;그렇다 한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blY1le/btrHiG1o5Qs/NLEF45aul1Uk6400dkLMek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblY1le%2FbtrHiG1o5Qs%2FNLEF45aul1Uk6400dkLMek%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;1050&quot; height=&quot;626&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그렇다 한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;멤버 초대는 MOD 프로필 이름을 검색해서 할 수 있다.&lt;/span&gt;&lt;/h3&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;span style=&quot;color: #000000;&quot;&gt;초대할 친구가 없다고..?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;20160813_57ae92e57aa13.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SBnju/btrHiXPliwH/2n9CQOgFIk329NXkDHu1Gk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SBnju/btrHiXPliwH/2n9CQOgFIk329NXkDHu1Gk/img.jpg&quot; data-alt=&quot;ㅠㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SBnju/btrHiXPliwH/2n9CQOgFIk329NXkDHu1Gk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSBnju%2FbtrHiXPliwH%2F2n9CQOgFIk329NXkDHu1Gk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;343&quot; data-filename=&quot;20160813_57ae92e57aa13.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅠㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나도...&lt;/span&gt;&lt;/h3&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;&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;라고 할줄 알았다면 미안하다.. 눈치 빠른 사람들은 알 수 있듯 위 사진에서 나는 팀원분들이 있다.&lt;/h3&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;6.JPG&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBgbdu/btrHlc5h3IF/TpZ9ws8kT3KKQZDaLBk7L0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBgbdu/btrHlc5h3IF/TpZ9ws8kT3KKQZDaLBk7L0/img.jpg&quot; data-alt=&quot;ㅎㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBgbdu/btrHlc5h3IF/TpZ9ws8kT3KKQZDaLBk7L0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBgbdu%2FbtrHlc5h3IF%2FTpZ9ws8kT3KKQZDaLBk7L0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;385&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅎㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #ee2323;&quot;&gt;다르다 당신과 나는&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;그러니까 만약 친구가 없다면 잠깐만 거리 둬주길 바란다.&lt;/h3&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;PuwGY.webp&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccyqaY/btrHlzMWSgS/earbcMJXjfQRsgJYIrjGwK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccyqaY/btrHlzMWSgS/earbcMJXjfQRsgJYIrjGwK/img.webp&quot; data-alt=&quot;저기 왕따인가봐..(수근 수근)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccyqaY/btrHlzMWSgS/earbcMJXjfQRsgJYIrjGwK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccyqaY%2FbtrHlzMWSgS%2FearbcMJXjfQRsgJYIrjGwK%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;828&quot; data-filename=&quot;PuwGY.webp&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저기 왕따인가봐..(수근 수근)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0j7NR/btrHj3VwUtO/VFzKzdMLbYK7PGF6bbR2Uk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0j7NR/btrHj3VwUtO/VFzKzdMLbYK7PGF6bbR2Uk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0j7NR/btrHj3VwUtO/VFzKzdMLbYK7PGF6bbR2Uk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0j7NR%2FbtrHj3VwUtO%2FVFzKzdMLbYK7PGF6bbR2Uk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1069&quot; height=&quot;659&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;659&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w15sV/btrHiXaGrro/cGWpwiYxxhqxBEoFcCPhgk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w15sV/btrHiXaGrro/cGWpwiYxxhqxBEoFcCPhgk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w15sV/btrHiXaGrro/cGWpwiYxxhqxBEoFcCPhgk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw15sV%2FbtrHiXaGrro%2FcGWpwiYxxhqxBEoFcCPhgk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;241&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;241&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 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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&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;oDHijcCv_.webp&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vWdoz/btrHjdj1TnB/YK8XnHfZ1a0TNQSM6pJKkK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vWdoz/btrHjdj1TnB/YK8XnHfZ1a0TNQSM6pJKkK/img.webp&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vWdoz/btrHjdj1TnB/YK8XnHfZ1a0TNQSM6pJKkK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvWdoz%2FbtrHjdj1TnB%2FYK8XnHfZ1a0TNQSM6pJKkK%2Fimg.webp&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;422&quot; height=&quot;300&quot; data-filename=&quot;oDHijcCv_.webp&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/144</guid>
      <comments>https://devdongbaek.tistory.com/144#entry144comment</comments>
      <pubDate>Fri, 15 Jul 2022 00:57:31 +0900</pubDate>
    </item>
    <item>
      <title>DRF Pagination</title>
      <link>https://devdongbaek.tistory.com/143</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DRF에서 기본 지원하는 페이징 방식&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PageNumberPagination&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;page/page_size 인자를 통한 페이징 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;LimitOffsetPagination&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;offset/limit 인자를 통한 페이징 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PageNumberPagination&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;page_size-미지정-상황을-위해-디폴트-지정이-필요&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;page_size 미지정 상황을 위해,&amp;nbsp;&lt;b&gt;디폴트 지정이 필요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;settings.py 내&amp;nbsp;REST_FRAMEWORK = {&quot;PAGE_SIZE&quot;: 10}&amp;nbsp;를 통해 전역 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PageNumberPagination을 상속받아 page_size 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from rest_framework.pagination	import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size = 10
    
# 특정 APIView에서 PageSize를 커스텀하고 싶다면 별도의 PageNumberPagination 클래스를 상속 받은 후 커스텀 지정 가능
class APIViewWithPage(APIView):
    pagination_class = PageNumberPagination&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전역 설정&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;REST_FRAMEWORK	=	{
     'PAGE_SIZE': 10,
     'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/143</guid>
      <comments>https://devdongbaek.tistory.com/143#entry143comment</comments>
      <pubDate>Thu, 14 Jul 2022 18:32:57 +0900</pubDate>
    </item>
    <item>
      <title>DRF Authentication과 Permission</title>
      <link>https://devdongbaek.tistory.com/141</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유입되는 요청을 허용 / 거부하는 것을 결정하는 것이 아니라, &lt;b&gt;단순히 인증 정보로 유저를 식별하는 것입니다.&lt;/b&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;Authentication : 유저 식별(ex: 업주인지 고객 유저인지)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Permissions : 유저의 리소스에 대한 각 요청에 대한 허용/거부(ex: 특정 유저만 글 쓰기)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Throttling : 특정 유저가 일정 시간 동안에 허용할 최대 요청 횟수(ex: 글 쓰기 제한)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증 프로세스&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유저 식별&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 유저가 리소스에 대한 어떤 액션을 취할 때 허용할 것인지, 거부할 것인지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;허용된다면, 특정 리소스에 대한 요청 횟수를 넘어서지 않는지&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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;span style=&quot;color: #000000;&quot;&gt;인증 처리 순서&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;매 요청 시마다&lt;/b&gt;&amp;nbsp;APIView의&amp;nbsp;dispatch(request)&amp;nbsp;호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;APIView의&amp;nbsp;initial(request)&amp;nbsp;호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;APIView의&amp;nbsp;perform_authentication(request)&amp;nbsp;호출&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;세션 인증은 로그인을 할 때만 인증을 하고, 인증을 한 내역을 세션에 담아두고 활용하는데, API에서는 매번 클라이언트가 서버에 요청을 보낼 때 마다 매번 인증을 한다. 즉 매번 인증을 해서 이 요청이 유효한지 검사한다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증 방법은, 매 인증 시 json 토큰을 보내거나, 매번 username/password를 올리는 등 여러가지 방법이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;request의&amp;nbsp;user속성 호출 (rest_framework.request.Request 타입)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;request의&amp;nbsp;_authenticate()&amp;nbsp;호출 - &lt;b&gt;실제 인증 로직&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uRKXs/btrHjyADwK2/nLM0Ke9ZgKU1KqkrQOhLl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uRKXs/btrHjyADwK2/nLM0Ke9ZgKU1KqkrQOhLl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uRKXs/btrHjyADwK2/nLM0Ke9ZgKU1KqkrQOhLl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuRKXs%2FbtrHjyADwK2%2FnLM0Ke9ZgKU1KqkrQOhLl0%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;1280&quot; height=&quot;404&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지원하는 인증 (Authentication)의 종류&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;sessionauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SessionAuthentication&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;세션을 통한 인증, APIView에서 디폴트 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한번만 로그인 하면 그 정보를 세션에 담아두고, 저장된 세션을 통해 인증하는 것&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;basicauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BasicAuthentication&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트가 서버에게 매 요청시마다 요청 헤더에 인증 정보를 보내는 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Base 인증 헤더를 통한 인증 (예 &amp;rarr; Authorization: Basic YWxsaWV1czE6MTAyOXNoYWtl )&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTTPie를 통한 요청 :&amp;nbsp;쉘&amp;gt; http --auth 유저명:암호 --form POST :8000 필드명1:값1 필드명2:값2&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;암호는 base64 인코딩되어 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;http요청일 경우 누구나 스니핑 해서 볼 수 있음. -&amp;gt; 그래서 반드시 https를 사용해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;tokenauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TokenAuthentication&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Basic과 똑같이 요청헤더에 인증 정보를 보내는데 대신, 비밀번호가 아닌 유저마다 Unique한 랜덤한 문자열을 통해 인증한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token 헤더를 통한 인증 (예 &amp;rarr; Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;장점은 구현이 쉽다는 점, 단점은 Token의 만료 기한이 정해지지않은 것과, 유저별 하나의 Token만 제공되는 것(유출될 시 큰일)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마찬가지로 http요청일 경우 누구나 스니핑 해서 볼 수 있음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DRF에서 지원하는 Token은 예시로만 보면 되고, 실 구현시에는 JWT과 세션 인증으로 구현&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;remoteuserauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RemoteUserAuthentication&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;User가 다른 서비스에서 관리될 때, Remote 인증&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Remote-User 헤더를 통한 인증 수행&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ModelView 및 APIVIew에서 인증과 허가를 구현하기 위해서는 아래 예시 코드와 같이 작성하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657786754436&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Blog의 목록, detail 보여주기, 수정하기, 삭제하기 모두 가능
class BlogViewSet(viewsets.ModelViewSet):
    # authentication 추가
    authentication_classes = [BasicAuthentication, SessionAuthentication]
    
    # permission 추가
    permission_classes = [IsAuthenticatedOrReadOnly]
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;14-웹브라우저를-통한-api-접근에서-로그인로그아웃-지원&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹브라우저를 통한 API 접근에서 로그인/로그아웃 지원&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;장고 기본 앱 django.contrib.auth를 통한 지원 &amp;rarr; &lt;b&gt;세션 인증&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;rest_framework/urls.py&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from django.conf.urls import url
from django.contrib.auth import views

app_name = 'rest_framework'
urlpatterns = [
    url(r'^login/$', views.LoginView.as_view(template_name='rest_framework/login.html'),
         name='login'),
    url(r'^logout/$', views.LogoutView.as_view(), name='logout'),
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트 내 urls.py&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;urlpatterns += [
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sessionauthentication&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;14-웹브라우저를-통한-api-접근에서-로그인로그아웃-지원&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;허가와 권한&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;14-웹브라우저를-통한-api-접근에서-로그인로그아웃-지원&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인증과 허가&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개체(정보/코드 등)에 대한 접근을 허용하기 위해서, 인증/식별만으로는 충분하지 않습니다. 추가로 &lt;b&gt;각 개체에 대한 허가가 필요합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oad8o/btrHiXAYhcg/5p6oGPuQSF9VtbLNHMsQ81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oad8o/btrHiXAYhcg/5p6oGPuQSF9VtbLNHMsQ81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oad8o/btrHiXAYhcg/5p6oGPuQSF9VtbLNHMsQ81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOad8o%2FbtrHiXAYhcg%2F5p6oGPuQSF9VtbLNHMsQ81%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;1280&quot; height=&quot;273&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;273&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;22-drf의-permission-시스템&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DRF의 Permission 시스템&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id=&quot;14-웹브라우저를-통한-api-접근에서-로그인로그아웃-지원&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현재 요청에 대한&amp;nbsp;&lt;b&gt;허용/거부를 결정&lt;/b&gt;합니다.&amp;nbsp;&lt;b&gt;APIView 단위&lt;/b&gt;로 지정할 수 있습니다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;AllowAny (&lt;b&gt;디폴트&lt;/b&gt; 전역 설정) : 인증 여부에 상관없이, 뷰 호출 허용 -&amp;gt; 적합하지 않다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;IsAuthenticated&lt;/b&gt; : 인증된 요청에 한해서, 뷰 호출 허용 -&amp;gt; 비로그인자는 조회도 안되게 할 때 전역 디폴트 권고&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 ViewSet에 접근을 위해서는 무조건 로그인 되어있어야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IsAdminUser : Staff 인증 요청에 한해서, 뷰 호출 허용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;is_staff은 admin 페이지에 접근할 수 있는 권한이다. 단 장고 기본 모델에 있는 적절한 Permission이 주어져야 함&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IsAuthenticatedOrReadOnly : 비인증 요청에게는 읽기 권한만 허용 &amp;rarr;&amp;nbsp;&lt;b&gt;최소 전역 디폴트 설정 권고&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DjangoModelPermissions : 인증된 요청에 한해 뷰 호출을 허용하고, 추가로 장고의 모델단위 Permissions 체크&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;장고 Auth의 Permission과 DRF의 Permission은 다르다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 Permission은 Django Auth Permission이다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DjangoModelPermissionsOrAnonReadOnly : DjangoModelPermissions과 유사하나, 비인증 요청에게는 읽기만 허용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DjangoObjectPermissions : 비인증 요청은 거부하고, 인증된 요청은 Object에 대한 권한 체크를 수행&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;permission_classes 지정&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CBV 즉, APIView에는 permission_classes 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from rest_framework.permissions import IsAuthenticated

class ExampleView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        content = { 'status': 'request was permitted' }
        return Response(content)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;FBV 즉, @api_view에는 @permission_classes 장식자 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from rest_framework.decorators import permission_classes

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):
    content = { 'status': 'request was permitted' }
    return Response(content)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;디폴트 전역 설정&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre class=&quot;roboconf&quot;&gt;&lt;code&gt;# settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;color: #000000;&quot;&gt;커스텀 Permission&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 Permission 클래스는 다음 2가지 함수를 선택적으로 구현되어있고, 커스텀 Permission 시 구현해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;has_permission(request, view)&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;u&gt;APIView 접근 시,&lt;/u&gt; 체크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;거의 모든 Permission 클래스에서 구현하며, 로직에 따라 True/False 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;항상 APIView 클래스를 상속받아서 DRF를 사용해야 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;has_object_permission(request, view, obj)&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;APIView의 &lt;u&gt;get_object 함수&lt;/u&gt;를 통해 object 획득 시에 체크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;브라우저를 통한 API 접근에서 CREATE/UPDATE Form 노출 시에 체크&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;DjangoObjectPermissions에서 구현하며, 로직에 따라 True/False 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;특정 Object를 획득할 때는 반드시 해당 APIView에서 self.get_object를 이용하여 object를 얻어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;룰 기반 퍼미션 지원 : &lt;a href=&quot;https://github.com/dbkaplan/dry-rest-permissions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/dbkaplan/dry-rest-permissions&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657787567933&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 - dbkaplan/dry-rest-permissions: Rules based permissions for the Django Rest Framework&quot; data-og-description=&quot;Rules based permissions for the Django Rest Framework - GitHub - dbkaplan/dry-rest-permissions: Rules based permissions for the Django Rest Framework&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dbkaplan/dry-rest-permissions&quot; data-og-url=&quot;https://github.com/dbkaplan/dry-rest-permissions&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IwYvo/hyO4Nda7SU/soeg8lDDtgxko6LsELjeEK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dbkaplan/dry-rest-permissions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dbkaplan/dry-rest-permissions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IwYvo/hyO4Nda7SU/soeg8lDDtgxko6LsELjeEK/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 - dbkaplan/dry-rest-permissions: Rules based permissions for the Django Rest Framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Rules based permissions for the Django Rest Framework - GitHub - dbkaplan/dry-rest-permissions: Rules based permissions for the Django Rest Framework&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DRF의 Permissions 코드 살펴보기&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# https://github.com/encode/django-rest-framework/blob/3.10.1/rest_framework/permissions.py
SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS')

class AllowAny(BasePermission):
    def has_permission(self, request, view):
        return True  # 무조건 허용

class IsAuthenticated(BasePermission):
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated  # 유저가 있고, 로그인 된 유저만 허용

class IsAdminUser(BasePermission):
    def has_permission(self, request, view):
        return request.user and request.user.is_staff  # 스태프 여부 판단&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# https://github.com/encode/django-rest-framework/blob/3.10.1/rest_framework/permissions.py

class DjangoObjectPermissions(DjangoModelPermissions):  # 장고 기본의 퍼미션을 체크한다.
    # ...
    def has_object_permission(self, request, view, obj):
        # authentication checks have already executed via has_permission
        queryset = self._queryset(view)
        model_cls = queryset.model
        user = request.user

        perms = self.get_required_object_permissions(request.method, model_cls)

        if not user.has_perms(perms, obj):
            if request.method in SAFE_METHODS:
                raise Http404

            read_perms = self.get_required_object_permissions('GET', model_cls)
            if not user.has_perms(read_perms, obj):
                raise Http404
            return False

        return True&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장고 기본 Permission은 Django Admin Page에서 유저의 Permission에서 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;커스텀 퍼미션 예시 : 포스팅 작성자가 아니라면, 읽기 권한만 부여하기.&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p id=&quot;포스팅-작성자가-아니라면-읽기-권한만-부여하기&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모델에 author 필드가 있다고 가정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from rest_framework import permissions

class IsAuthorOrReadonly(permissions.BasePermission):
    # 인증된 유저에 한해, 목록조회/포스팅등록을 허용
    def has_permission(self, request, view):
        return request.user.is_authenticated  # 인증이 되야만 허용

    # 작성자에 한해, Record에 대한 수정/삭제 허용
    def has_object_permission(self, request, view, obj):
        # 조회 요청(GET, HEAD, OPTIONS) 에 대해서는 인증여부에 상관없이 허용
        if request.method in permissions.SAFE_METHODS:  # SAFE_METHODS = ('GET', HEAD', 'OPTIONS')
            return True

        # PUT, DELETE 요청에 대해, 작성자일 경우에만 요청 허용
        return obj.author == request.user&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Head method -&amp;gt; 응답 헤더만 받는 것&lt;/li&gt;
&lt;li&gt;Options method -&amp;gt; 엔드포인트에서 어떠한 메소드를 지원하는지 알려주는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;포스팅 작성자에게 수정권한만 부여하고, 삭제는 superuser에게만 가능케 하는 Permission 클래스 정의&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;from rest_framework import permissions

class IsAuthorUpdateOrReadonly(permissions.BasePermission):
    def has_permission(self, request, view):
        return request.user.is_authenticated

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True

        if (request.method == 'DELETE'):
            return request.user.is_superuser  # 또는 request.user.is_staff

        return obj.author == request.user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;권한 확인하기&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Django Shell에서 간단한 비밀번호를 가진 유저 생성하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# python shell
&amp;gt;&amp;gt;&amp;gt; from django.contrib.auth import get_user_model
&amp;gt;&amp;gt;&amp;gt; User = get_user_model()
&amp;gt;&amp;gt;&amp;gt; User.objects.create_user?
Signature:
User.objects.create_user(
    username,
    email=None,
    password=None,
    **extra_fields,
)
Docstring: &amp;lt;no docstring&amp;gt;
...
&amp;gt;&amp;gt;&amp;gt; User.objects.create_user('user2', password='1234')
&amp;lt;User: user2&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;&lt;b&gt;인증된 유저로 요청하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;http --auth user2:1234 http://localhost:8000/post/1/   # 
http --auth user2:1234 POST http://localhost:8000/post/ message=&quot;user2가 지정하는 첫 메시지&quot;
http --auth user2:1234 PATCH http://localhost:8000/post/6 message=&quot;user2가 수정하는 첫 메시지&quot;
http --auth user2:1234 PATCH http://localhost:8000/post/1 message=&quot;수정?&quot;  # author가 다르면, 거부됨
http --auth user2:1234 gethttp://localhost:8000/post/1  # author가 달라도 조회는 가능!&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;h2 data-ke-size=&quot;size26&quot;&gt;ex) 고객 유저 Permission&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1657788392033&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework import permissions

class IsCustomer(permissions.BasePermission):
    # 고객 유저에 한해, 목록조회/포스팅등록을 허용
    def has_permission(self, request, view):
        return request.user.IsCustomer  # Customer 필드가 True 이어야만 허용

    # 고객 유저에 한해, Record에 대한 수정/삭제 허용
    def has_object_permission(self, request, view, obj):
        # 조회 요청(GET, HEAD, OPTIONS) 에 대해서는 인증여부에 상관없이 허용
        if request.method in permissions.SAFE_METHODS:  # SAFE_METHODS = ('GET', HEAD', 'OPTIONS')
            return True

        # PUT, DELETE 요청에 대해, 작성자일 경우에만 요청 허용
        return obj.author == request.user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/141</guid>
      <comments>https://devdongbaek.tistory.com/141#entry141comment</comments>
      <pubDate>Thu, 14 Jul 2022 17:52:15 +0900</pubDate>
    </item>
    <item>
      <title>DRF Serializer를 통한 유효성 검사 및 저장</title>
      <link>https://devdongbaek.tistory.com/140</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer의 생성자&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer는 Django Form과 컨셉 / 사용법이 유사하나, 생성자 차이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# django/forms/forms.py
class BaseModelForm:
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, 
                initial=None, error_class=ErrorList, label_suffix=None, 
                empty_permitted=False, instance=None, use_required_attribute=None):

class Form(BaseForm):
    pass&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Form에서는 인자로 data와 files, instance를 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# rest_framework/serializers.py
class BaseSerializer(Field):
    def __init__(self, instance=None, data=empty, **kwargs):

# instance -&amp;gt; 직렬화 목적
# data -&amp;gt; 유효성 검사

class Serializer(BaseSerializer):
    pass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer에서는 인자로 instance와 data를 받는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;data = 인자가 주어지면&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;.is_valid()가 호출되고 나서야&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;.initial_data&lt;/b&gt;&amp;nbsp;필드에 접근할 수 있고&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;.validated_data&lt;/b&gt;&amp;nbsp;(form에서는 cleaned_data)를 통해 유효성 검증에 통과한 값들이&amp;nbsp;&lt;b&gt;.save()&lt;/b&gt;시에 사용됩니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;form은 cleaned_data라는 똑같은 기능 존재&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;.errors&lt;/b&gt;&amp;nbsp;&amp;rarr; 유효성 검증 수행 후에 오류 내역&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;.data&lt;/b&gt;&amp;nbsp;&amp;rarr; 유효성 검증 후에, 갱신된 인스턴스에 대한 필드값 사전&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;즉 유효성 검사를 마쳐야 위의 기능들을 활용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리가 Serializer를 활용하는 패턴 2가지&lt;/span&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;직렬화가 목적인 경우 instance 인자에 model 객체 혹은 쿼리셋을 넘겨준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Form과 유사하게 입력값에 대한 유효성 검사와 유효성 검사 통과 값들을 사전 형태로 가져오고, DB로 저장하게 하는 것
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;유효성 검사를 위해서는 instance와 data에 인자를 넘겨주어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;3-serializersavekwargs-호출을-할-때&quot;&gt;serializer.save(**kwargs) 호출을 할 때&lt;/h1&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DB에 저장한 관련 instance를 리턴&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;.validated_data와 kwargs사전을 합친 데이터를&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;.update 함수 / .create함수를 통해 관련 필드에 값을 할당하고, DB로의 저장을 시도&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그러면 언제 update와 create를 지원하는지&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;.update() : self.instance 인자를 지정했을 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;.create() : self.instance 인자를 지정하지 않았을 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# Form에서의 데이터 save코드
form = PostForm(request.POST)
if form.is_valid():
    post = form.save(commit=False)
    post.author = request.user
    post.ip = request.META['REMOTE_ADDR']
    post.save()

# Serializer에서의 데이터 save코드
serializer.is_valid(...) # ex)raiseException
# serializer.save에 내가 업데이트 하고 싶은 인자들을 넘겨주면 된다.
serializer.save(author=request.user, ip=request.META['REMOTE_ADDR'])&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;4-from-rest_frameworkvalidators-import-&quot; data-ke-size=&quot;size26&quot;&gt;from rest_framework.validators import ...&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/validators.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/encode/django-rest-framework/blob/master/rest_framework/validators.py&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657780135434&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 - encode/django-rest-framework: Web APIs for Django.  &quot; data-og-description=&quot;Web APIs for Django.  . Contribute to encode/django-rest-framework development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/validators.py&quot; data-og-url=&quot;https://github.com/encode/django-rest-framework&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cagMTo/hyO5IH1ApR/2f3HHcDkNsnk0jV38Lc540/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/validators.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/encode/django-rest-framework/blob/master/rest_framework/validators.py&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cagMTo/hyO5IH1ApR/2f3HHcDkNsnk0jV38Lc540/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 - encode/django-rest-framework: Web APIs for Django.  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Web APIs for Django.  . Contribute to encode/django-rest-framework 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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;DRF에서는 &lt;b&gt;유일성 체크를 도와주는 Validators 제공&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UniqueValidator : 지정 1개 필드가 지정 QuerySet범위에서의 유일성 여부 체크&lt;/li&gt;
&lt;li&gt;UniqueTogetherValidator : UniqueValidator의 다수 필드 버전&lt;/li&gt;
&lt;li&gt;BaseUniqueForValidator&lt;/li&gt;
&lt;li&gt;UniqueForDateValidator (BaseUniqueValidator) : 지정 날짜 범위에서 유일성 여부 체크&lt;/li&gt;
&lt;li&gt;UniqueForMonthValidator (BaseUniqueValidator) : 지정 월 범위에서의 유일성 여부 체크&lt;/li&gt;
&lt;li&gt;UniqueForYearValidator (BaseUniqueValidator) : 지정 년 범위에서 유일성 여부 체크&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;UniqueValidator&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p id=&quot;모델-필드에-uniquetrue를-지정하면-자동-지정&quot; data-ke-size=&quot;size18&quot;&gt;모델 필드에 &lt;b&gt;unique=True&lt;/b&gt;를 지정하면 자동 지정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;queryset(필수) : 대상 쿼리셋의 범위를 지정해줌&lt;/li&gt;
&lt;li&gt;message : 유효성 검사 실패 시의 에러 메세지&lt;/li&gt;
&lt;li&gt;lookup : 디폴트 'exact'
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Serializer 필드에 직접 Validators 지정 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그러나 웬만하면 &lt;b&gt;모델 필드에서 unique=True를 지정함으로써 모델 Serilizer에서 Validator가 자동으로 추가되도록 하는것을 추천&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from rest_framework.validators import UniqueValidator

slug = SlugField(
    max_length=100,
    validators=[UniqueValidator(queryset=BlogPost.objects.all())]
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;UniqueForDateValidator / Month / Year&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;특정 쿼리 셋&lt;/b&gt;에서 &amp;rarr; &lt;b&gt;특정 날짜 범위 내&lt;/b&gt;에서 &amp;rarr; &lt;b&gt;특정 필드가 유니크&lt;/b&gt;한지 검사&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;queryset (필수) : 대상 쿼리셋의 범위&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;field (필수)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;date_field (필수) : Date, Month, Year값이 참조 할&amp;nbsp;&lt;b&gt;날짜 필드 (필드 상에서 연/월/일 중 Validator에 맞게 참조한다.)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;특정 날짜의 범위 안에 있는 / 특정 &lt;b&gt;쿼리셋의 범위 내에서&amp;nbsp; / 특정 필드가 Unique한지에 대해서&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;message&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from rest_framework.validators import UniqueTogetherValidator
class ExampleSerializer(serializers.Serializer):
    # ...
    class Meta:
        validators = [
            UniqueForYearValidator( 
                queryset=BlogPostItem.objects.all(), 
                field='slug', 
                date_field='published'
            ) 
        ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유효성 검사에 실패하면 ValidationError 예외 발생&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;필히 rest_framework.exception.&lt;b&gt;ValidationError&lt;/b&gt;&amp;nbsp;사용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;장고 기본에서는 django.forms.exceptions.&lt;b&gt;ValidationError&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class ValidationError(APIException):
    status_code = status.HTTP_400_BAD_REQUEST
    default_detail = _('Invalid input.')
    default_code = 'invalid'

    def __init__(self, detail=None, code=None):
        if detail is None:
            detail = self.default_detail
        if code is None:
            code = self.default_code

        if not isinstance(detail, dict) and not isinstance(detail, list):
            detail = [detail]

        self.detail = _get_error_details(detail, code)&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 id=&quot;6-serializer에서의-유효성-검사&quot;&gt;Serializer에서의 유효성 검사&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #212529;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Serializer의 유효성 검사하는 2가지 방법&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;필드 정의시에 validators 지정하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;클래스 Meta.validators 지정&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ModelSerializer 같은 경우에는 model 단에 유효성 검사 로직 구현하기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&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;
&lt;h4 id=&quot;field-level-검사-유효성-검사-및-값-변환&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Field Level 검사: 유효성 검사 및 값 변환&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class PostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)

    def validate_title(self, value): # validator_필드명을 구현해서 유효성 검사를 진행할 수 있다. (form에서는 clean_필드명)
        if 'django' not in value:
            raise ValidationError('제목에 필히 django가 포함되어야합니다.')  # 조건에 맞지않으면 rest_framework의 validationError를 발생시킨다. (form에 있는 validationError랑 헷갈리면 안됨)
        return value&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;h4 id=&quot;field-level-검사-유효성-검사-및-값-변환&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Object Level 검사: 유효성 검사 및 값 변환&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class PostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)

    def validate(self, data):  # 2개 이상의 필드에 대해 유효성 검사 로직은 validate를 구현하면 된다.(form에서는 clean)
        if 'django' not in data['title']:
            raise ValidationError('제목에 필히 django가 포함되어야합니다.')
        return data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 id=&quot;7-db로의-반영과-mixins의-perform_-계열-함수&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DB로의 반영과 Mixins의 perform_ 계열 함수&lt;/span&gt;&lt;/h1&gt;
&lt;h1 id=&quot;6-serializer에서의-유효성-검사&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;APIView의 create/update/destroy 멤버함수에서 실질적인 DB처리 로직은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;perform_&lt;/b&gt;create(serializer)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;perform_&lt;/b&gt;update(serializer)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;perform_&lt;/b&gt;destroy(instance)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 통해 이루어진다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class CreateModelMixin:
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()  # 모델 객체가 만들어지고, 모델 객체의 값들이 할당이 다 된 model.save()가 호출이 되는 것이다.

    def get_success_headers(self, data):
        try:
            return {'Location': str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}&lt;/code&gt;&lt;/pre&gt;
&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;h3 id=&quot;create-시에-추가로-저장할-필드가-있다면&quot; data-ke-size=&quot;size23&quot;&gt;create 시에 추가로 저장할 필드가 있다면?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델에 ip 필드가 있고, 유저의 아이피들 저장하고 싶다면?&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# CreateModelMixin에서 상속받은 뷰에서 아래와 같이 사용한다.

def perform_create(self, serializer):  # 실제 APIView구현에서 
   author = self.request.user
   ip = self.request.Meta['REMOTE_ADDR']
   serializer.save(author=author, ip=ip)&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User가 data를 수정이나 읽지 못하게 하는 방법&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Serializer에서 ReadOnly를 걸거나&lt;/li&gt;
&lt;li&gt;model 필드 옵션으로 editable=False로 설정&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/140</guid>
      <comments>https://devdongbaek.tistory.com/140#entry140comment</comments>
      <pubDate>Thu, 14 Jul 2022 16:05:33 +0900</pubDate>
    </item>
    <item>
      <title>From과 Serializer 관점에서 DRF 비교</title>
      <link>https://devdongbaek.tistory.com/139</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer / ModelSeializer&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 변환 / 직렬화 지원&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;querySet / Model객체 &amp;lt;-&amp;gt; Native Python 데이터타입, JSON/XML&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Django의 Form / ModelForm과 유사&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;유효성 검사와 유효성 검사에 통과한 값들을 데이터베이스에 저장 시켜줌&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer는 뷰 응답을 생성하는 데에 범용적이고 강력한 방법을 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ModelSerializer는 Serializer 생성을 위한 Shortcut&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;size18&quot;&gt;&lt;b&gt;Form / ModelForm&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML 입력폼을 위한 입력에 대한 유효성 검사&lt;/li&gt;
&lt;li&gt;주로 Create / Update에 대한 처리에서 활용 &amp;rarr; 장고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;admin&lt;/b&gt;에서 활용&lt;/li&gt;
&lt;li&gt;CreateView / UpdateView CBV를 통한 뷰 처리 &amp;rarr; 단일 뷰&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;size18&quot;&gt;&lt;b&gt;Serializer / ModelSerializer&lt;/b&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;span style=&quot;color: #000000;&quot;&gt;데이터 변환 및 직렬화 지원 (JSON포맷 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주로 JSON 포맷 (주된 Web API 포맷) 입력에 대한&amp;nbsp;&lt;b&gt;유효성 검사&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;List / &lt;b&gt;Create&lt;/b&gt;&amp;nbsp;및 특정 Record(Resource)에 대한 Retrieve / &lt;b&gt;Edit&lt;/b&gt;(update or partial_update) / Delete 등에서 활용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;APIView&lt;/b&gt;를 통한 뷰 처리 &amp;rarr; 단일 뷰&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ViewSet&lt;/b&gt;을 통한 뷰 처리 &amp;rarr; 2개 뷰 &amp;rarr; 2개 URL 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;color: #000000;&quot;&gt;주된 호출 주체 비교&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Form / ModelForm&lt;/b&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;일반적으로 웹 브라우저 상에서&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTML Form Submit (POST 요청)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JavaScript에 의한 비동기 호출&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;물론 Android/iOS앱에 의한 요청/응답도 가능&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모두 http(s) 프로토콜 요청 / 응답이기에&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Serializer / ModelSerializer&lt;/b&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;다양한 Client에 대한 Data위주의 http(s)요청&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;by: Web / Android / iOS 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;color: #000000;&quot;&gt;클래스 정의 비교&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Form / ModelForm : Form은 html 폼을 효율적으로 처리하기 위한 목적을 가진다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657693131507&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django import forms

class PostForm(forms.Form):
    email = forms.EmailField()
    content = forms.CharField(**widget=forms.Textarea**)
    created_at = forms.DateTimeField()

class PostModelForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Serializer / ModelSerializer : &lt;/b&gt;Serializer는 다양한 http 클라이언트로부터의 API 요청을 처리하기 위한 목적을 갖기에, widget과 같은 인자는 없다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from rest_framework import serializers

# 시리얼라이저/디시리얼라이저 되어야 하는 필드 정의 필요
# create(), update() 메소드 정의 필요
# create(): 시리얼라이저를 대상으로 save() 메소드를 호출하여 DB 인스턴스를 생성할 때의 동작 정의
# update(): 시리얼라이저를 대상으로 save() 메소드를 호출하여 DB 인스턴스를 수정하고자 할 때의 동작 정의

class PostSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created_at = serializers.DateTimeField()

# Model과 필드를 정의
class PostModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;24-fbv를-통한-요청응답-비교--form-vs-serializer&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;FBV를 통한 요청 / 응답 비교 &amp;ndash; Form vs Serializer&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Form&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657693413257&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def post_create(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save()
            return redirect(post)
    else:
        form = PostForm()
    return render(request, 'myapp/post_form.html', { 
        'form': form,
    })

def post_list_or_create(request):
    # 새 글 저장을 구현
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save()
            # 커스텀 직렬화 루틴이 필요
            return JsonResponse(post)
        return JsonResponse(form.errors)
    # 목록 응답을 구현
    else:
        qs = Post.objects.all()
        return JsonResponse(qs) # 커스텀 직렬화 루틴이 필요&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Serializer&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657693420721&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def post_list_or_create(request):
    if request.method == 'POST':
        serializer = PostSerializer(data=request.POST)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)
    else:
        qs = Post.objects.all()
        serializer = PostSerializer(qs, many=True)
        return Response(serializer.data)

from rest_framework.response import Response
from rest_framework.views import APIView

class PostListCreateAPIView(APIView):
    def get(self, request):
        serializer = PostSerializer(Post.objects.all(), many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;24-fbv를-통한-요청응답-비교--form-vs-serializer&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CBV를 통한 요청 / 응답 비교 &amp;ndash; Form vs Serializer&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;장고 기본&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657693567473&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.views.generic import ListView, CreateView

post_list = ListView.as_view(model=Post)

post_new = CreateView.as_view(model=Post, form_class=PostModelForm)

# 앱/urls.py
urlpatterns = [
    path('', post_list),
    path('new/', post_new),
]&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
    {% csrf_token %}
    &amp;lt;table&amp;gt;
        {{ form.as_table }}
    &amp;lt;/table&amp;gt;
    &amp;lt;input type=&quot;submit&quot; /&amp;gt;
&amp;lt;/form&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;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;252-drf의-apiview&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DRF의 APIView&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;from rest_framework.generics import ListCreateAPIView
class PostListCreateAPIView(ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostModelSerializer

post_list_create = PostListCreateAPIView.as_view()

# 앱/urls.py
urlpatterns = [
# 단일 URL에서 list/create 요청 처리
    path('api/post/', post_list_create),
]&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유효성 검사 수행 시점 &lt;span style=&quot;color: #000000;&quot;&gt;&amp;ndash; Form vs Serializer&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Form&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657693729945&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ProcessFormView(View):
    def get(self, request, *args, **kwargs):
        return self.render_to_response(self.get_context_data())

    def post(self, request, *args, **kwargs):
        form = self.get_form() # POST 데이터를 통해 Form 객체 생성
        if form.is_valid(): # 유효성 검사를 수행. 실패하면 False를 반환
            return self.form_valid(form) # DB로의 저장을 수행
        else:
            return self.form_invalid(form) # 오류 HTML 응답&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Serializer&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657693745144&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# rest_framework/mixins.py
class CreateModelMixin(object):
    def create(self, request, *args, **kwargs): # POST 요청 -&amp;gt; CREATE 요청이 들어오면,
        serializer = self.get_serializer(data=request.data) # POST데이터를 통해 Serializer 인스턴스를 만들고
        serializer.is_valid(raise_exception=True) # 유효성 검사를 수행. 실패하면 예외발생 !!!
        self.perform_create(serializer) # DB로의 저장을 수행
        headers = self.get_success_headers(serializer.data) # 필요한 헤더를 뽑고
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) # 응답을 합니다.

def perform_create(self, serializer): # CREATE 커스텀은 이 함수를 재정의하세요.
serializer.save()&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;27-커스텀-유효성-검사-루틴---clean_-vs-validate_&quot; data-ke-size=&quot;size26&quot;&gt;커스텀 유효성 검사 루틴 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;clean_*&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;validate_*&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Form -&amp;gt; clean_&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from django import forms
class PostForm(forms.Form):
    title = forms.CharField()

    def clean_title(self):
        value = self.cleaned_data.get('title', '')
        if 'django' not in value:
            raise forms.ValidationError('제목에 필히 django가 포함되어야 합니다.')
        return value&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Serializer&lt;span&gt; -&amp;gt; validate_&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from rest_framework.exceptions import ValidationError

class PostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)

    def validate_title(self, value):
        if 'django' not in value:
            raise ValidationError('제목에 필히 django가 포함되어야 합니다.')
        return value&lt;/code&gt;&lt;/pre&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/139</guid>
      <comments>https://devdongbaek.tistory.com/139#entry139comment</comments>
      <pubDate>Wed, 13 Jul 2022 15:32:28 +0900</pubDate>
    </item>
    <item>
      <title>DRF ViewSet과 Router</title>
      <link>https://devdongbaek.tistory.com/138</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;REST의 규칙에 우리는 맞춰 코딩을 하고있음을 인지하는게 매우 중요하다.&lt;/b&gt;&lt;/h3&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;ViewSet은 &lt;b&gt;REST&lt;/b&gt;의 반복적인 코딩 패턴을 줄여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우리는 일반적으로 REST API를 구현할 때 모델을 기준으로 List와 Detail URL에 대한 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;이 때 List API는 GET, POST 메소드를 구현하며 Detail API 는 GET, PUT, DELETE메소드를 구현한다.&lt;/p&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개의 URL별로 모두 5개의 메소드 구현을 REST의 반복되는 일관된 패턴으로 볼 수도 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DRF에서는 모델을 기준으로 하나의 ViewSet으로 묶어서 위에서 언급한 패턴을 한방에 구현할 수 있다. ViewSet에 queryset과 serializer를 지정만 해주고 Router클래스로 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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ViewSet&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 리소스에서 관련있는 View들을 단일 클래스에서 제공&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 말을 쉽게 설명 하자면 RESST API는 일반적으로 2개의 URL이 필요하다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;list/create, detail/update/partial_update/delete로 나눠지는 2개의 클래스 기반 뷰가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그러나 ViewSet에서는 2개의 구현을 단일 클래스에서 지원해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657686732682&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# https://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/
from rest_framework import viewsets
from rest_framework.response import Response

class PostViewSet(viewsets.ViewSet):
    def list(self, request):  # list
        queryset = Post.objects.all()
        serializer = PostSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk):  # detail
        queryset = Post.objects.all()
        user = get_object_or_404(queryset, pk=pk)
        serializer = PostSerializer(user)
        return Response(serializer.data)

# https://www.django-rest-framework.org/api-guide/routers/
router = DefaultRouter()
router.register('post', PostViewSet, basename='post')  # 2개의 URL을 만들어준다.
router.urls

# urls에 다음과 같이 추가한다. -&amp;gt; path('', include(router.urls)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위는 메소드들을 직접 구현한 것이고, ModelViewSet을 상속받으면 메소드가 전부 구현이 되어있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657686956314&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# https://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/
from rest_framework import ModelViewSet
from rest_framework.response import Response

class PostViewSet(ModelViewSet):
	queryset = Post.objects.all()
    serializer_class = PostSerializer&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ModelViewSet에서는 쿼리셋과 Serializer만 적으면 된다. // 기본 메소드가 모두 구현되어있기에&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ModelViewSet&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2가지 ModelViewSet이 존재한다.&lt;/p&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;size18&quot;&gt;&lt;b&gt;Viewsets.ReadOnlyModelViewSet&lt;/b&gt; -&amp;gt; GET 요청(조회)에만 반응하는 ModelViewSet&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;list 지원 &amp;rarr; 1개의 URL&lt;/li&gt;
&lt;li&gt;detail 지원 &amp;rarr; 1개의 URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Viewsets.ModelViewSet&lt;/b&gt; -&amp;gt; GET뿐만 아니라 모든 요청에 반응하는&amp;nbsp; ModelViewSet&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;list/create 지원 &amp;rarr; 1개의 URL&lt;/li&gt;
&lt;li&gt;detail/update/partial_update/delete 지원 &amp;rarr; 1개의 URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;URL Patterns에 매핑&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from rest_framework import viewsets

class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer&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;size18&quot;&gt;필요한 method만 뽑아서 개별 View를 만들수도있고&lt;/p&gt;
&lt;pre id=&quot;code_1657687373351&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PostViewSet으로부터 필요한것만 뽑아 쓰기

#'입력받은 mehtod' : '출력할 함수' 

post_list = PostViewSet.as_view({
    'get': 'list',
})
post_detail = PostViewSet.as_view({
    'get': 'retrieve',
})

# urls에 하나하나 직접 path를 다 써야한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 예시&lt;/p&gt;
&lt;pre id=&quot;code_1657688617811&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;message_list = MessageViewSet.as_view({
        'get': 'list',
        'post': 'create',
    })

message_detail = MessageViewSet.as_view({
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy'
})

urlpatterns = [
    path('/message', message_list),
    path('/message/&amp;lt;int:pk&amp;gt;', message_detail),
]&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;size18&quot;&gt;Router 통해서 일괄적으로 urlpatterns에 등록할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1657687518583&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Router를 통해 일괄등록을 하면 추가 기능이 있다. 
# http://localhost:8000/post/1.api, http://localhost:8000/post/1.json 등의 포맷 인자(api, json)를 추가로 url_patterns에 추가된다. 포맷 인자로 요청 시 요청에 따라 json, api응답이 온다. 아래 Router 참조

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('post', views.PostViewSet)  # 'post': URL에 사용될 리소스 이름이다. 보통은 모델명 사용

urlpatterns = [
    path('', include(router.urls)),
]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://localhost:8000/post/1.api, http://localhost:8000/post/1.json 등의 &lt;b&gt;포맷 인자&lt;/b&gt;(api, json)를 추가로 url_patterns에 추가된다. 포맷 인자로 요청 시 요청에 따라 json, api(DRF html)응답이 온다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Router&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ReadOnlyModelViewSet과 ModelViewSet에 대해서 동일한 URL Pattern 리스트가 생성된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;list&lt;/b&gt; route&lt;/li&gt;
&lt;li&gt;&lt;b&gt;detaul&lt;/b&gt; route&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657688120165&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('post', views.PostViewSet) # 'post'가 url의 prefix가 된다.

urlpatterns = [
    path('', include(router.urls)),
]



# 아래 URL 패턴들은 위 router 추가시 자동으로 등록되는 주소들이다.
[
    &amp;lt;URLPattern '^post/$' [name='post-list']&amp;gt;, 
    &amp;lt;URLPattern '^post\.(?P&amp;lt;format&amp;gt;[a-z0-9]+)/?$' [name='post-list']&amp;gt;, # 주의) 구분자 &quot;_&quot;가 아니라 &quot;-&quot;이다.
    &amp;lt;URLPattern '^post/(?P&amp;lt;pk&amp;gt;[^/.]+)/$' [name='post-detail']&amp;gt;,
    &amp;lt;URLPattern '^post/(?P&amp;lt;pk&amp;gt;[^/.]+)\.(?P&amp;lt;format&amp;gt;[a-z0-9]+)/?$' [name='post-detail']&amp;gt;,
    &amp;lt;URLPattern '^$' [name='api-root']&amp;gt;,
    &amp;lt;URLPattern '^\.(?P&amp;lt;format&amp;gt;[a-z0-9]+)/?$' [name='api-root']&amp;gt;  
# api-root : 현 Router에 등록된 ViewSet내역을 조회
]&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ViewSet에 새로운 EndPoint 추가하기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EndPoint란&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 URL을 호출하게 되면, 생성되고&lt;/li&gt;
&lt;li&gt;하나의&amp;nbsp;endpoint&amp;nbsp;는 보통 JSON 포맷으로 된 데이터와 동작 가능한&amp;nbsp;HTTP method&amp;nbsp;정보를 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657688683450&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.decorators import action

class PostModelViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

		&quot;&quot;&quot;
    URL Reverse 명: basename-함수명 (언더바는 하이픈으로 변경)
										즉, post-public이 된다.
		&quot;&quot;&quot;
    @action(detail=False, methods=['GET'])  # 특정 포스팅이 아니므로 detail=False
    def public(self, request):
        qs = self.get_queryset().filter(is_public=True)
        serializer = self.get_serializer(qs, many=True)
        return Response(serializer.data)

    @action(detail=True, methods=['PATCH']) # 특정 포스팅이므로 detail=True
    def set_public(self, request, pk):  # public으로 변경하는 api
        instance = self.get_object()
        instance.is_public = True
        instance.save()  # 또는 instance.save(update_fields=['is_public'])
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

    # @action의 detail인자에 따라서 list URL을 탈건지, detail URL을 탈건지 결정된다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;get_serializer(쿼리셋, many=True)에서 many=True는 여러 객체를 가져온다는 것을 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Router 사용시 API를 반환하는 함수 이름으로 자동으로 endpoints가 생성된다.&lt;/h3&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;위 코드를 통해 자동으로 생성된 URL Patterns 리스트&lt;/p&gt;
&lt;pre id=&quot;code_1657688970233&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[
    # ...
    &amp;lt;URLPattern	'^post/public/$' [name='post-public']&amp;gt;,
    &amp;lt;URLPattern	'^post/public\.(?P&amp;lt;format&amp;gt;[a-z0-9]+)/?$' [name='post-public']&amp;gt;,
    # ...
    &amp;lt;URLPattern	'^post/(?P&amp;lt;pk&amp;gt;[^/.]+)/set_public/$' [name='post-set-public']&amp;gt;,
    &amp;lt;URLPattern	'^post/(?P&amp;lt;pk&amp;gt;[^/.]+)/set_public\.(?P&amp;lt;format&amp;gt;[a-z0-9]+)/?$' [name='post-set-public']&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/138</guid>
      <comments>https://devdongbaek.tistory.com/138#entry138comment</comments>
      <pubDate>Wed, 13 Jul 2022 14:24:01 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 6 회고</title>
      <link>https://devdongbaek.tistory.com/137</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 13일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20200929_5f72e13e2969b.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2FQYF/btrHaW2NUZD/Xky2XVpyH2GIrVYcYHQkB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2FQYF/btrHaW2NUZD/Xky2XVpyH2GIrVYcYHQkB1/img.jpg&quot; data-alt=&quot;오늘도 반갑습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2FQYF/btrHaW2NUZD/Xky2XVpyH2GIrVYcYHQkB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2FQYF%2FbtrHaW2NUZD%2FXky2XVpyH2GIrVYcYHQkB1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;450&quot; data-filename=&quot;20200929_5f72e13e2969b.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오늘도 반갑습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 1~4 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/132&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657677475557&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 1주차 회고&quot; data-og-description=&quot;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 &quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8NLg5/hyO3oEE57n/AkldzbyRB0u7WwqwOWUeMk/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/xMTzn/hyO3lOI9Gz/lNd9BJExq6IgQM6nx9Y4cK/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/67NzU/hyO4Ke1jbc/98QohVpi7JWmLpjnObQwsK/img.jpg?width=1329&amp;amp;height=891&amp;amp;face=0_0_1329_891&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/132&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8NLg5/hyO3oEE57n/AkldzbyRB0u7WwqwOWUeMk/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/xMTzn/hyO3lOI9Gz/lNd9BJExq6IgQM6nx9Y4cK/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/67NzU/hyO4Ke1jbc/98QohVpi7JWmLpjnObQwsK/img.jpg?width=1329&amp;amp;height=891&amp;amp;face=0_0_1329_891');&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 넥슨 MOD Suppoters Hackathon 1주차 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 5 회고록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/136&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657677518806&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 5 회고&quot; data-og-description=&quot;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 12일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/136&quot; data-og-url=&quot;https://devdongbaek.tistory.com/136&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qtNUs/hyO4HW84Hs/FsMiIUK3lchqUENki3gce0/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/2lA7A/hyO4AwXCDI/cRLcb7GsO1ys9mJm1pkr91/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/bsf7Sa/hyO4O22SwT/Rf04M7U794rvt6WaVjwYl1/img.jpg?width=1095&amp;amp;height=407&amp;amp;face=0_0_1095_407&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/136&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qtNUs/hyO4HW84Hs/FsMiIUK3lchqUENki3gce0/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/2lA7A/hyO4AwXCDI/cRLcb7GsO1ys9mJm1pkr91/img.jpg?width=480&amp;amp;height=271&amp;amp;face=198_88_263_159,https://scrap.kakaocdn.net/dn/bsf7Sa/hyO4O22SwT/Rf04M7U794rvt6WaVjwYl1/img.jpg?width=1095&amp;amp;height=407&amp;amp;face=0_0_1095_407');&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 넥슨 MOD Suppoters Hackathon Chapter 5 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 12일 회고 부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번 Chapter 6에서는 스크립트에 대해 배워보았다.&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MOD는 Lua라는 언어에 MOD만의 문법이 추가된 형식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// Lua는 파이썬과 같이 동적언어라고 한다.&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Lua 스크립트의 기본적인 문법은 아래와 같다.&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1657677707969&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--출력
log(&quot;Hello World!&quot;)



--변수 선언
local number = 1 
local sum = 0


--반복문 선언
	for count = 1, 10, 1 do  --1부터 10까지 1씩 증가
	
    end


--조건문
	if count%2 == 0 then
		sum = sum + count
	end



--함수
void Sum()
{

}&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;분명 기본으로 제공되는 컴포넌트나 여러 기능이 있는데 왜 코드, 스크립트를 작성해야 할지에 대해 궁금할 수도 있을 것 같다.&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20180918_5ba05884011f6.gif&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHXa3i/btrHaWV32vu/6TIoFfGuuafnvFjnOuvhEk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHXa3i/btrHaWV32vu/6TIoFfGuuafnvFjnOuvhEk/img.gif&quot; data-alt=&quot;흐음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHXa3i/btrHaWV32vu/6TIoFfGuuafnvFjnOuvhEk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dHXa3i/btrHaWV32vu/6TIoFfGuuafnvFjnOuvhEk/img.gif&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;395&quot; height=&quot;214&quot; data-filename=&quot;20180918_5ba05884011f6.gif&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;흐음&lt;/figcaption&gt;
&lt;/figure&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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 이유는 마우스 클릭이나, 드래그등 기본적인 방법만으로는 표현에 한계가 있기에 이를 극복하기 위해서 코드, 스크립트를 작성하게 된다.&lt;/span&gt;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Chapter 5와 마찬가지로 주로 사용하는 스크립트에 대해서 알아보자&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스크립트는 두 가지로 나눌 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Create Component와 Create Logic&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;먼저 &lt;b&gt;Create Component&lt;/b&gt;에 대해서 알아보자&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Component&lt;/b&gt;의 특징은 아래와 같다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;Component는 여러 개 존재할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;코드 작성 이후 해당 Component 탑재를 희망하는 Entity에 반드시 반드시 추가해주어야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;span style=&quot;color: #000000;&quot;&gt;코드 작성 후 Entity에 Component를 추가하지 않고, 왜 적용이 안되지라고 생각하는 경우가 생각보다 많다&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20180929_5baeb7f14ea14.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Y17g/btrG8WW0lsQ/7d2bbJjXR5zSuqttP02Qbk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Y17g/btrG8WW0lsQ/7d2bbJjXR5zSuqttP02Qbk/img.gif&quot; data-alt=&quot;부끄부끄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Y17g/btrG8WW0lsQ/7d2bbJjXR5zSuqttP02Qbk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/9Y17g/btrG8WW0lsQ/7d2bbJjXR5zSuqttP02Qbk/img.gif&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;225&quot; data-filename=&quot;20180929_5baeb7f14ea14.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부끄부끄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;13.JPG&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz09uc/btrG8HsfTcE/pvCFzv2QQvYhn3LXpg84kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz09uc/btrG8HsfTcE/pvCFzv2QQvYhn3LXpg84kk/img.jpg&quot; data-alt=&quot;Create Component의 기본적인 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz09uc/btrG8HsfTcE/pvCFzv2QQvYhn3LXpg84kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz09uc%2FbtrG8HsfTcE%2FpvCFzv2QQvYhn3LXpg84kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;159&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Create Component의 기본적인 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;span style=&quot;color: #000000;&quot;&gt;위 컴포넌트의 구성요소에 대해서 이야기해보겠다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 Property를 설정할 수 있고, 설정한 Property는 Property 창(패널)에 노출되게 된다.&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;&lt;span style=&quot;color: #000000;&quot;&gt;Function은 Component에서 사용될 함수이고, 내가 속한 property나 다른 함수를 가져다 쓸 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;self.컴포넌트명으로 컴포넌트를 불러와 사용할 수 있다.&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;&lt;span style=&quot;color: #000000;&quot;&gt;Entity Event Handler는 해당 Component를 가진 Entity에게 이벤트가 발생했을 경우 실행할 함수이다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;예를 들어)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Entity가 바라보는 방향이 바뀌면 함수를 실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Entity가 포탈을 이용하면 함수를 실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Entity가 채팅을 입력하면 함수를 실행&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자주 사용되는 함수는&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;OnBeginPlay : 컴포넌트가 초기화가 될 때(처음 시작할 때) 처리하는 로직&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OnUpdate : 프레임마다 주기적으로 불리는 함수&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OnEndPlay : 끝날 때 처리하는 로직&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러면 재밌는 예시(?)를 통해 오늘도 Create Component를 배워볼까???&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20190117_5c40404fbe0b7.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brNZo2/btrG7ZfVG6Q/XkUA410OObBKucwtGVij91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brNZo2/btrG7ZfVG6Q/XkUA410OObBKucwtGVij91/img.jpg&quot; data-alt=&quot;레츠꼬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brNZo2/btrG7ZfVG6Q/XkUA410OObBKucwtGVij91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrNZo2%2FbtrG7ZfVG6Q%2FXkUA410OObBKucwtGVij91%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;472&quot; data-filename=&quot;20190117_5c40404fbe0b7.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레츠꼬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;이제는 모두가 우리 중학생 형을 &lt;b&gt;알거라고 가정&lt;/b&gt;하고, 예시를 만들겠다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;알거라고 가정하고&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20160901_57c7ce9428fe6.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGho0/btrG7YOSDqH/vQNto1zkSL9UfUR1EPBnsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGho0/btrG7YOSDqH/vQNto1zkSL9UfUR1EPBnsk/img.jpg&quot; data-alt=&quot;사랑합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGho0/btrG7YOSDqH/vQNto1zkSL9UfUR1EPBnsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGho0%2FbtrG7YOSDqH%2FvQNto1zkSL9UfUR1EPBnsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;367&quot; data-filename=&quot;20160901_57c7ce9428fe6.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실제로 순찰하는 중학생 형과 마주치게 된다면 우리는 어떻게 되겠는가?&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잔뜩 경락 마사지를 받고, 소득세를 지불하지 않겠는가?&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;EPran.webp&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsLr4P/btrG4VxYG4x/B60GCXKt7DdPkgx0Iys9Z1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsLr4P/btrG4VxYG4x/B60GCXKt7DdPkgx0Iys9Z1/img.webp&quot; data-alt=&quot;눙물...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsLr4P/btrG4VxYG4x/B60GCXKt7DdPkgx0Iys9Z1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsLr4P%2FbtrG4VxYG4x%2FB60GCXKt7DdPkgx0Iys9Z1%2Fimg.webp&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;827&quot; data-filename=&quot;EPran.webp&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;눙물...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 게임상에서 구현하여 형과 충돌이 일어날 경우 HP를 닳게 하고, 넉백(뒤로 밀려남)을 구현해보자&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 첫번째로 Create component를 통해 &quot;Bbing&quot;이라는 Component을 만들자.&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;14.JPG&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIVyry/btrG8XVXlpk/R8QpVO0G7Zg3cI4Ppyb6WK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIVyry/btrG8XVXlpk/R8QpVO0G7Zg3cI4Ppyb6WK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIVyry/btrG8XVXlpk/R8QpVO0G7Zg3cI4Ppyb6WK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIVyry%2FbtrG8XVXlpk%2FR8QpVO0G7Zg3cI4Ppyb6WK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;186&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 내 캐릭터에 이 컴포넌트를 적용하기위해 Default Player의 Propery 패널에서 Bbing Component를 Add 해주자.&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;15.JPG&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgjADm/btrG9U5trp1/hDSNwWImtFseHHuhcbdVJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgjADm/btrG9U5trp1/hDSNwWImtFseHHuhcbdVJk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgjADm/btrG9U5trp1/hDSNwWImtFseHHuhcbdVJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgjADm%2FbtrG9U5trp1%2FhDSNwWImtFseHHuhcbdVJk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;225&quot; data-filename=&quot;15.JPG&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;225&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 data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 저번 회고에서 형에게 TweenLinComponent를 추가해줌으로써 반복적인 움직임을 하도록 만들어주었다. 이번에는 나와 충돌하는 걸 형이 인지할 수 있도록 TriggerComponent를 형에게 추가해주자.&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;16.JPG&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dk12Uz/btrHan7p3CL/Nikv2nu7Y5I2dX41JXaF91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dk12Uz/btrHan7p3CL/Nikv2nu7Y5I2dX41JXaF91/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dk12Uz/btrHan7p3CL/Nikv2nu7Y5I2dX41JXaF91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdk12Uz%2FbtrHan7p3CL%2FNikv2nu7Y5I2dX41JXaF91%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;153&quot; data-filename=&quot;16.JPG&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;153&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 이제 Bbing Component에 유저가 충돌이 감지될 때마다 넉백 이벤트와 HP가 감소하도록 만들어주자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추가적으로 우리는 예의 동방 지국에 살기 때문에 충돌하면 형님께 사과를 즉시 드리도록 하자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;17.JPG&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xI5oA/btrHbVvR6yj/olrn6MoaAig7AB9ynYBig0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xI5oA/btrHbVvR6yj/olrn6MoaAig7AB9ynYBig0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xI5oA/btrHbVvR6yj/olrn6MoaAig7AB9ynYBig0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxI5oA%2FbtrHbVvR6yj%2Folrn6MoaAig7AB9ynYBig0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;496&quot; data-filename=&quot;17.JPG&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 코드에 대한 설명을 해보겠다.&lt;/span&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설명이 조금 기니 다들 착석해주길 바란다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;덕후짤모음059.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/syFl6/btrG8IdF67o/8HrKQ6dYL8BcqiJhjwzgC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/syFl6/btrG8IdF67o/8HrKQ6dYL8BcqiJhjwzgC1/img.jpg&quot; data-alt=&quot;착서어억!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/syFl6/btrG8IdF67o/8HrKQ6dYL8BcqiJhjwzgC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsyFl6%2FbtrG8IdF67o%2F8HrKQ6dYL8BcqiJhjwzgC1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;276&quot; data-filename=&quot;덕후짤모음059.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;착서어억!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;먼저 Entity Event Handler 오른쪽 + 버튼을 눌러서 &lt;b&gt;HandlerTriggerEnterEvent&lt;/b&gt; 함수를 추가해주었다.&amp;nbsp;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;이 함수는 TriggerComponent를 가진 Entity와 충돌 이벤트가 발생하였을 경우 감지해주는 함수입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그다음 넉백 이벤드 구현을 위해 if - else문을 작성해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;self.Entity.PlayerControllerComponent는 플레이어 자신의 PlayerControllerComponent를 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PlayerControllerComponent에는 LookDirectionX라는 Property를 가지고 있다. 이 Property는 Entity가 오른쪽을 바라보고 있을 경우 양수의 값을 가지고 왼쪽을 바라보고 있을 경우 음수의 값을 가지게 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 이용해서 오른쪽을 보고있을 때와 왼쪽을 보고있을때의 구문을 따로 작성할 수 있다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;self의 의미는 해당 Entity가 가진 값을 스스로 참조하고 싶을 때 사용하며, 변수를 참조할 때는 self.변수명, 함수를 참조할 때는 self:함수명으로 참조한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RigidbodyComponent는 Addforce라는 함수를 가지고 있다. 함수이기 때문에 세미콜론으로 참조해주었고, Addforce 라는 함수는 함수 인자로 벡터를 받게 된다.&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Vector2는 2차원 벡터로 첫번째 좌표가 x축, 두번째 좌표가 y축을 의미한다고 생각하면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;첫 if문은 유저가 오른쪽을 보고있다면 왼쪽으로 넉백시켜! 그다음 else문은 유저가 왼쪽을 보고있다면 오른쪽으로 넉백시켜! 라는 뜻이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그다음 self.Entity.PlayerComponent.Hp 구절은 충돌 감지시 100씩 체력을 감소하는 구절이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막 구절은 충돌 감지시 유저가 특정 말을 말풍선으로 출력하도록 만드는 구절이다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;영상으로 한번 잘 구현되었나 보도록 하자!&lt;/span&gt;&lt;/h3&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;1401365086166.jpeg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cz4e8D/btrG7Y2paDz/CUi893lzIKlSEFFsuWH281/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cz4e8D/btrG7Y2paDz/CUi893lzIKlSEFFsuWH281/img.jpg&quot; data-alt=&quot;도키 도키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cz4e8D/btrG7Y2paDz/CUi893lzIKlSEFFsuWH281/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcz4e8D%2FbtrG7Y2paDz%2FCUi893lzIKlSEFFsuWH281%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;315&quot; data-filename=&quot;1401365086166.jpeg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도키 도키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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 class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;형과 닿자마자 공손하게 사과드리는 훈훈한 모습이다.&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20160820_57b81f88a0b3b.webp&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qMzpW/btrG9VpQHKu/H7NDeqKUdKjmNpbsFhp09k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qMzpW/btrG9VpQHKu/H7NDeqKUdKjmNpbsFhp09k/img.webp&quot; data-alt=&quot;짜식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qMzpW/btrG9VpQHKu/H7NDeqKUdKjmNpbsFhp09k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqMzpW%2FbtrG9VpQHKu%2FH7NDeqKUdKjmNpbsFhp09k%2Fimg.webp&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;466&quot; height=&quot;292&quot; data-filename=&quot;20160820_57b81f88a0b3b.webp&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;짜식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 마지막으로 &lt;b&gt;Create Logic&lt;/b&gt;에 대해서 알아보자&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Logic은 기본적으로 게임을 만들게 되면 딱 한개만 존재할수있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 Logic은 작성하고나면 따로 추가하지 않아도 자동으로 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Logic은 간단한 코드로만 알아보자!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657682287304&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void OnBeginPlay()
{
	--현재 컴포넌트의 엔티티의 transformComponent의 position 값을 갖고옴
	local myEntityPosition = self.Entity.TransformComponent.Position
	log(myEntityPosition)

	--컴포넌트가 적용된 엔티티의 위치 변경
	for count=1, 10, 1 do
		myEntityPosition.x = myEntityPosition.x + 0.5
		myEntityPosition.y = myEntityPosition.y + 0.5
		wait(1)
	end

	--컴포넌트가 적용된 엔티티의 크기 변경
	self.Entity.TransformComponent.Scale.x = 2
	self.Entity.TransformComponent.Scale.y = 2
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OnBeginPlay는 위에서 설명했듯 컴포넌트가 시작(초기화)하자마자 호출되는 함수이고, 위 코드는 1초 간격으로 TransformComponent를 가지고있는 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;&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;&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;꼭 다시 놀러와주라!&lt;/span&gt;&lt;/h2&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;hgjghjgh.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5KUFU/btrG8ISkJum/nI1soeS2KOY0XORKkA7MU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5KUFU/btrG8ISkJum/nI1soeS2KOY0XORKkA7MU0/img.png&quot; data-alt=&quot;사랑해요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5KUFU/btrG8ISkJum/nI1soeS2KOY0XORKkA7MU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5KUFU%2FbtrG8ISkJum%2FnI1soeS2KOY0XORKkA7MU0%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;387&quot; data-filename=&quot;hgjghjgh.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사랑해요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/137</guid>
      <comments>https://devdongbaek.tistory.com/137#entry137comment</comments>
      <pubDate>Wed, 13 Jul 2022 12:22:08 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 5 회고</title>
      <link>https://devdongbaek.tistory.com/136</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 2주차 12일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&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;yCGZJ.webp&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bThEMT/btrHaoLK38D/YPRFb5snwH6p0F3Fb9arJ0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bThEMT/btrHaoLK38D/YPRFb5snwH6p0F3Fb9arJ0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bThEMT/btrHaoLK38D/YPRFb5snwH6p0F3Fb9arJ0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbThEMT%2FbtrHaoLK38D%2FYPRFb5snwH6p0F3Fb9arJ0%2Fimg.webp&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;271&quot; data-filename=&quot;yCGZJ.webp&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;271&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 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;&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;그럼 오늘도&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이병헌-굴욕-가수-노래-손가락질-흑역사-댄스-춤-레전드-망함.gif&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zNYTc/btrHap4XDD0/j9hatqWPKw2KtZ9AkK7Ex1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zNYTc/btrHap4XDD0/j9hatqWPKw2KtZ9AkK7Ex1/img.gif&quot; data-alt=&quot;달려보자~!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zNYTc/btrHap4XDD0/j9hatqWPKw2KtZ9AkK7Ex1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/zNYTc/btrHap4XDD0/j9hatqWPKw2KtZ9AkK7Ex1/img.gif&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;320&quot; height=&quot;241&quot; data-filename=&quot;이병헌-굴욕-가수-노래-손가락질-흑역사-댄스-춤-레전드-망함.gif&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;달려보자~!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 5은 기본, 그리고 자주 사용하는 컴포넌트들에 대해서 배웠다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배웠던 컴포넌트들을 우리의 PTSD를 일으킬 재밌는 예시들을 보며 쉽게 한번 배워보자&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;내 1주차 회고를 봤던 사람이라면 내가 만든 맵이 무엇인지 알 것이다.&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;...&lt;/h3&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;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;h3 data-ke-size=&quot;size23&quot;&gt;1주차 안봤다고?&lt;/h3&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;거참.JPG&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAlXMU/btrG9LUFxZq/hPdkkFa0zEkgiT9knXn2Hk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAlXMU/btrG9LUFxZq/hPdkkFa0zEkgiT9knXn2Hk/img.jpg&quot; data-alt=&quot;1주차 봐주세요ㅠㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAlXMU/btrG9LUFxZq/hPdkkFa0zEkgiT9knXn2Hk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAlXMU%2FbtrG9LUFxZq%2FhPdkkFa0zEkgiT9knXn2Hk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;314&quot; data-filename=&quot;거참.JPG&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1주차 봐주세요ㅠㅠ&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;&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;&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;그렇지...&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;그럴수도 있지...&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;xiLVl.webp&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUDwze/btrG8solfQo/SnRDbNk2kKYyNvQwYefjsK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUDwze/btrG8solfQo/SnRDbNk2kKYyNvQwYefjsK/img.webp&quot; data-alt=&quot;한 번만 들어와주세요 ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUDwze/btrG8solfQo/SnRDbNk2kKYyNvQwYefjsK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUDwze%2FbtrG8solfQo%2FSnRDbNk2kKYyNvQwYefjsK%2Fimg.webp&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;1087&quot; height=&quot;828&quot; data-filename=&quot;xiLVl.webp&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한 번만 들어와주세요 ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;a href=&quot;https://devdongbaek.tistory.com/132&quot;&gt;https://devdongbaek.tistory.com/132&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657636146395&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 1주차 회고&quot; data-og-description=&quot;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 &quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-url=&quot;https://devdongbaek.tistory.com/132&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8NLg5/hyO3oEE57n/AkldzbyRB0u7WwqwOWUeMk/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/xMTzn/hyO3lOI9Gz/lNd9BJExq6IgQM6nx9Y4cK/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/67NzU/hyO4Ke1jbc/98QohVpi7JWmLpjnObQwsK/img.jpg?width=1329&amp;amp;height=891&amp;amp;face=0_0_1329_891&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/132&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8NLg5/hyO3oEE57n/AkldzbyRB0u7WwqwOWUeMk/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/xMTzn/hyO3lOI9Gz/lNd9BJExq6IgQM6nx9Y4cK/img.jpg?width=800&amp;amp;height=1000&amp;amp;face=135_190_221_781,https://scrap.kakaocdn.net/dn/67NzU/hyO4Ke1jbc/98QohVpi7JWmLpjnObQwsK/img.jpg?width=1329&amp;amp;height=891&amp;amp;face=0_0_1329_891');&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 넥슨 MOD Suppoters Hackathon 1주차 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;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;아래 사진은 1주차 당시 내가 만든 맵이다.&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;21.JPG&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WTj6z/btrHaY0mD1D/H3jnZ5kQsMtkYEHiUD23K0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WTj6z/btrHaY0mD1D/H3jnZ5kQsMtkYEHiUD23K0/img.jpg&quot; data-alt=&quot;우리의 학창 시절이 생각나지 않는가?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WTj6z/btrHaY0mD1D/H3jnZ5kQsMtkYEHiUD23K0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWTj6z%2FbtrHaY0mD1D%2FH3jnZ5kQsMtkYEHiUD23K0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1879&quot; height=&quot;1024&quot; data-filename=&quot;21.JPG&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우리의 학창 시절이 생각나지 않는가?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;위에는 타일, 중학생 형, 너 나 우리 Entity가 존재한다.&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Entity들은 모두 컴포넌트들을 지니고있다.&lt;/h3&gt;
&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;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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wDSNS/btrG8sPp5A8/aZcrmLkFtJ4hUtw2gYXlh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wDSNS/btrG8sPp5A8/aZcrmLkFtJ4hUtw2gYXlh0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wDSNS/btrG8sPp5A8/aZcrmLkFtJ4hUtw2gYXlh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwDSNS%2FbtrG8sPp5A8%2FaZcrmLkFtJ4hUtw2gYXlh0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;309&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;309&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;위의 토끼는 오브젝트이다.&lt;/h4&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;xPlJP.webp&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi679k/btrG8QWtjbQ/tHZbistj3UGk1k05a0WQUK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi679k/btrG8QWtjbQ/tHZbistj3UGk1k05a0WQUK/img.webp&quot; data-alt=&quot;나를 왜불렀었니 토끼야...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi679k/btrG8QWtjbQ/tHZbistj3UGk1k05a0WQUK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi679k%2FbtrG8QWtjbQ%2FtHZbistj3UGk1k05a0WQUK%2Fimg.webp&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;826&quot; height=&quot;828&quot; data-filename=&quot;xPlJP.webp&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;나를 왜불렀었니 토끼야...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;포켓몬스터 게임을 해보면 길가를 걸어가다 NPC를 만나게 되면 강제적으로 이벤트가 발생하게 된다.&lt;/span&gt;&lt;/h4&gt;
&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;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;&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;본인은 잼민이 시절 토끼같은 친구로 인해 자주 뒷골목에 징집되고는 했다.&lt;/h4&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;첫번째 방법으로는 토끼가 나를 못보게 하면 된다.&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TransformComponent&lt;/b&gt;&lt;/h2&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;h4 data-ke-size=&quot;size20&quot;&gt;TransformComponent 는 오브젝트가 월드 어디에 표시되는지 위치 정보를 가지고 있다. 특수한 형태를 제외하고는 모두 지니고있다.&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;&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;TransformComponent은 오브젝트의 크기를 scale값 조정을 통해 조절할 수 있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;y값을 3배 키움으로써 토끼의 키를 3배 크게 만들었다.&lt;/p&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;1.JPG&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baiIHc/btrHahlvoRl/hdLNdCSxdiSOzdnyyLppfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baiIHc/btrHahlvoRl/hdLNdCSxdiSOzdnyyLppfK/img.jpg&quot; data-alt=&quot;애초에 이 크기면 너가 형좀 혼내줘....ㅠㅠㅠㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baiIHc/btrHahlvoRl/hdLNdCSxdiSOzdnyyLppfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaiIHc%2FbtrHahlvoRl%2FhdLNdCSxdiSOzdnyyLppfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1175&quot; height=&quot;354&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애초에 이 크기면 너가 형좀 혼내줘....ㅠㅠㅠㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TransformComponent은 오브젝트의 위치를 Position을 통해 조정할 수 있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 통해서 토끼를 먼 곳으로 보내버리자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;2.JPG&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQZejX/btrG8tHyNJn/FWdxybpkLx0hJzwFF6onr0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQZejX/btrG8tHyNJn/FWdxybpkLx0hJzwFF6onr0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQZejX/btrG8tHyNJn/FWdxybpkLx0hJzwFF6onr0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQZejX%2FbtrG8tHyNJn%2FFWdxybpkLx0hJzwFF6onr0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1095&quot; height=&quot;407&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;1095&quot; data-origin-height=&quot;407&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;토끼도 잡혀버렸다....&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220609_62a177297eae6.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1Bjd/btrG8HS6Fwn/KglhhAlF6Rd3VOtOyNbTn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1Bjd/btrG8HS6Fwn/KglhhAlF6Rd3VOtOyNbTn0/img.jpg&quot; data-alt=&quot;왜 잡혀가지고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1Bjd/btrG8HS6Fwn/KglhhAlF6Rd3VOtOyNbTn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1Bjd%2FbtrG8HS6Fwn%2FKglhhAlF6Rd3VOtOyNbTn0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;276&quot; data-filename=&quot;20220609_62a177297eae6.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왜 잡혀가지고&lt;/figcaption&gt;
&lt;/figure&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;TransformComponent은 오브젝트를 Rotation을 통해 회전시킬 수 있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;World는 절대좌표를 기준으로, Z는 상대좌표를 기준으로 회전한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJQAge/btrG8HFzIcW/GpA8iWLNgZ35jZXff36fk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJQAge/btrG8HFzIcW/GpA8iWLNgZ35jZXff36fk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJQAge/btrG8HFzIcW/GpA8iWLNgZ35jZXff36fk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJQAge%2FbtrG8HFzIcW%2FGpA8iWLNgZ35jZXff36fk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1184&quot; height=&quot;240&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;240&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;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;&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;그렇다면 토끼를 토끼가 아닌 다른 캐릭터로 바꾸면 어떻게 될까?&amp;nbsp; 그렇다면 토끼와 내가 만나지 않게 되는거 아닌가..?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20220605_629c2eaeb98a6.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zLovT/btrG9kXoWRp/wjJvtksEXDPTse9dufOkw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zLovT/btrG9kXoWRp/wjJvtksEXDPTse9dufOkw0/img.jpg&quot; data-alt=&quot;지니어스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zLovT/btrG9kXoWRp/wjJvtksEXDPTse9dufOkw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzLovT%2FbtrG9kXoWRp%2FwjJvtksEXDPTse9dufOkw0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;335&quot; data-filename=&quot;20220605_629c2eaeb98a6.jpeg&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지니어스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 id=&quot;spriterederercomponent&quot; data-ke-size=&quot;size23&quot;&gt;SpriteRedererComponent은 엔티티에 어떤 이미지를 표시할 것인가를 의미한다.&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SpriteRendererComponent에는 SpriteRUID Property가 있는데 이는 오브젝트의 각 고유한 번호를 의미하며, 이미지를 id 형태로 관리하는 것을 말한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;토끼의 &lt;span&gt;SpriteRUID를 다른 오브젝트의 고유한 번호로 바꾸면 &lt;b&gt;우리는 드디어 무시하고 지나갈 수 있을 것이다!!!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;20151201_565cc251c7425.gif&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXXQgf/btrG6XbjPSP/4bKd7S9yN1JRIjx0LZo1k0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXXQgf/btrG6XbjPSP/4bKd7S9yN1JRIjx0LZo1k0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXXQgf/btrG6XbjPSP/4bKd7S9yN1JRIjx0LZo1k0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bXXQgf/btrG6XbjPSP/4bKd7S9yN1JRIjx0LZo1k0/img.gif&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;224&quot; height=&quot;168&quot; data-filename=&quot;20151201_565cc251c7425.gif&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;168&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 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3iK5/btrHaYF5SXr/proosPAFJwku0qwyY3Yoc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3iK5/btrHaYF5SXr/proosPAFJwku0qwyY3Yoc1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3iK5/btrHaYF5SXr/proosPAFJwku0qwyY3Yoc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3iK5%2FbtrHaYF5SXr%2FproosPAFJwku0qwyY3Yoc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1019&quot; height=&quot;363&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;363&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;?????????&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ResMJ/btrG6XvEHBv/Vr1ofZObhcnjNWTL9ktQeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ResMJ/btrG6XvEHBv/Vr1ofZObhcnjNWTL9ktQeK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ResMJ/btrG6XvEHBv/Vr1ofZObhcnjNWTL9ktQeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FResMJ%2FbtrG6XvEHBv%2FVr1ofZObhcnjNWTL9ktQeK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;225&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;225&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;h2 data-ke-size=&quot;size26&quot;&gt;???&lt;/h2&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;6.JPG&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crFLIg/btrHaoyfzk4/kkRmFHBu1reKAK2NGlDwuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crFLIg/btrHaoyfzk4/kkRmFHBu1reKAK2NGlDwuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crFLIg/btrHaoyfzk4/kkRmFHBu1reKAK2NGlDwuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrFLIg%2FbtrHaoyfzk4%2FkkRmFHBu1reKAK2NGlDwuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;147&quot; height=&quot;207&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;xOPWK.webp&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmnIlq/btrG7YnvaPK/jut9EzcnNDeL1hdqnSLJZk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmnIlq/btrG7YnvaPK/jut9EzcnNDeL1hdqnSLJZk/img.webp&quot; data-alt=&quot;아니 토끼는 그대로인데...?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmnIlq/btrG7YnvaPK/jut9EzcnNDeL1hdqnSLJZk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmnIlq%2FbtrG7YnvaPK%2Fjut9EzcnNDeL1hdqnSLJZk%2Fimg.webp&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;332&quot; data-filename=&quot;xOPWK.webp&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아니 토끼는 그대로인데...?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;??? : 아니 잠깐만.... 그냥 토끼가&amp;nbsp; 뒤돌면 되는거 아님???&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;나 : ?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Ephka.webp&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgtRXG/btrG8mPaMoK/NkvbYWBk6oROFGnchctek0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgtRXG/btrG8mPaMoK/NkvbYWBk6oROFGnchctek0/img.webp&quot; data-alt=&quot;그러네요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgtRXG/btrG8mPaMoK/NkvbYWBk6oROFGnchctek0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgtRXG%2FbtrG8mPaMoK%2FNkvbYWBk6oROFGnchctek0%2Fimg.webp&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;480&quot; data-filename=&quot;Ephka.webp&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그러네요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SpriteRendererComponent에는 FlipX / FlipY Property가 있는데 이는 오브젝트를 X축, Y축을 기준으로 뒤집을 수 있는 기능이다.&lt;/h4&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;7.JPG&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAQWXZ/btrG9TSNwX7/r8tqaeYYXACCW33OiPEN3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAQWXZ/btrG9TSNwX7/r8tqaeYYXACCW33OiPEN3k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAQWXZ/btrG9TSNwX7/r8tqaeYYXACCW33OiPEN3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAQWXZ%2FbtrG9TSNwX7%2Fr8tqaeYYXACCW33OiPEN3k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1016&quot; height=&quot;301&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;301&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;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;&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;h2 data-ke-size=&quot;size26&quot;&gt;문제 해결 &amp;gt;3&amp;lt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;86_55169d130fd13_1140.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp2E2i/btrG8WvHNtr/iTpEbgyCnZY4HXUnFEbPZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp2E2i/btrG8WvHNtr/iTpEbgyCnZY4HXUnFEbPZ0/img.jpg&quot; data-alt=&quot;뚜둔!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp2E2i/btrG8WvHNtr/iTpEbgyCnZY4HXUnFEbPZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp2E2i%2FbtrG8WvHNtr%2FiTpEbgyCnZY4HXUnFEbPZ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;410&quot; data-filename=&quot;86_55169d130fd13_1140.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뚜둔!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;근데 여러분 동네의 무서운 형, 누나들은 위 맵의 중학생 형처럼 가만히 있으며 돈을 수금했는가??&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럴수도 있지만 본인 동네의 형님들께서는 부지런히 출장을 자주 다니셨다.&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20160819_57b675925c71f.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XmZIf/btrHaTxWFLp/rBkVqisxqaw6PLuifbekf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XmZIf/btrHaTxWFLp/rBkVqisxqaw6PLuifbekf1/img.jpg&quot; data-alt=&quot;이쯤되면 어떤 삶을 살아온건가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XmZIf/btrHaTxWFLp/rBkVqisxqaw6PLuifbekf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXmZIf%2FbtrHaTxWFLp%2FrBkVqisxqaw6PLuifbekf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;440&quot; data-filename=&quot;20160819_57b675925c71f.jpg&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이쯤되면 어떤 삶을 살아온건가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;과거 애인을 찾듯 우릴 찾아 헤매던 방방곡곡을 다니던 그리운(?) 형님을 구현해보자&lt;/span&gt;&lt;/h3&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;oDHijcCv_.webp&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2MRlM/btrG8rXjz14/hYWdtz4vkQG0oiSWVTtb71/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2MRlM/btrG8rXjz14/hYWdtz4vkQG0oiSWVTtb71/img.webp&quot; data-alt=&quot;형님이 나를 찾을때의 그 미소가 안잊힌다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2MRlM/btrG8rXjz14/hYWdtz4vkQG0oiSWVTtb71/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2MRlM%2FbtrG8rXjz14%2FhYWdtz4vkQG0oiSWVTtb71%2Fimg.webp&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;422&quot; height=&quot;300&quot; data-filename=&quot;oDHijcCv_.webp&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;형님이 나를 찾을때의 그 미소가 안잊힌다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;형님을 움직이게 하기위해 첫번째로 알아볼 컴포넌트는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;tweenlinecomponent&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TweenLineComponent&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;tweenlinecomponent&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TweenLineComponent은 선형 애니메이션을 다루는 컴포넌트라고 생각하면 된다. 목적지 위치를 지정한 다음 종료 방식을 선택하고, 해당 Entity가 원하는 범위를 반복적으로 움직이게 할 수 있다.&lt;/span&gt;&lt;/h4&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;9.JPG&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CkKGA/btrG7XoDGZ4/P5hKfk9KkBEPFyO6WKxnp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CkKGA/btrG7XoDGZ4/P5hKfk9KkBEPFyO6WKxnp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CkKGA/btrG7XoDGZ4/P5hKfk9KkBEPFyO6WKxnp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCkKGA%2FbtrG7XoDGZ4%2FP5hKfk9KkBEPFyO6WKxnp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;335&quot; data-filename=&quot;9.JPG&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;335&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;&lt;span style=&quot;color: #000000;&quot;&gt;여러 property가 있지만 우리는 형님이 왼쪽 방향으로 왕복 순찰(?)을 직선 방향으로 하는 것이 목적이기에 아래 적힌 property들을 수정해준다.&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Position을 x : -5, y : 0으로 설정하면 왼쪽으로 5만큼 이동한 후 원래 자리로 돌아온다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;StopType에는 OneRoundTrip과 RepeatRoundType이 존재하는데, OneRoundTrip은 한번만 반복하는 것, RepeatRoundType은 계속 반복하는 것을 정의한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #000000;&quot;&gt;여담으로 제일 중요한 것은 SyncType, 즉 동기화 방식인데 옵션들은 아래와 같다.&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ClientOnly : 동기화가 안된 상태.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Default : 동기화가 되어 있는 상태.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동기화가 잘 되어 있어야 유저 여러명이 함께 플레이를 할 때 동일한 화면에서 동일하게 플레이 할 수 있음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;목적에 맞게 Sync 조정을 잘해주어야 한다. 예를 들어 중학생 형이 유저들마다 모두 다른 위치에 있는 것으로 보이면 곤란하지않겠는가? 이런 경우&lt;b&gt;&amp;nbsp;SyncType을 Server로 설정하여 모든 플레이어에게 동일하게 보이게끔 만들 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아래는 형님에게 TweenLineComponent를 적용시킨 모습이다.&lt;/h3&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TweenLineComponent 말고도 움직임을 제어하는 컴포넌트들은 정말 많다.&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;uDypo.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qIjRc/btrHao57nSq/mkziZMDdbpxIrno7nNKaQ0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qIjRc/btrHao57nSq/mkziZMDdbpxIrno7nNKaQ0/img.webp&quot; data-alt=&quot;컴포넌트 진짜 너무 많아...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qIjRc/btrHao57nSq/mkziZMDdbpxIrno7nNKaQ0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqIjRc%2FbtrHao57nSq%2FmkziZMDdbpxIrno7nNKaQ0%2Fimg.webp&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;800&quot; height=&quot;520&quot; data-filename=&quot;uDypo.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컴포넌트 진짜 너무 많아...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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;a href=&quot;https://mod-developers.nexon.com/ko/apiReference/Components&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mod-developers.nexon.com/ko/apiReference/Components&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657642368925&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;https://signin.nexon.com/signin?redirect_uri=https://mod-developers.nexon.com/ko/apiReference/Components&quot; data-og-description=&quot;&quot; data-og-host=&quot;signin.nexon.com&quot; data-og-source-url=&quot;https://mod-developers.nexon.com/ko/apiReference/Components&quot; data-og-url=&quot;https://signin.nexon.com/signin?redirect_uri=https://mod-developers.nexon.com/ko/apiReference/Components&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mod-developers.nexon.com/ko/apiReference/Components&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mod-developers.nexon.com/ko/apiReference/Components&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;https://signin.nexon.com/signin?redirect_uri=https://mod-developers.nexon.com/ko/apiReference/Components&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;signin.nexon.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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20160714_5786faad2b985.gif&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AnwYG/btrG6XPXmzU/qwIcRK1j6CNrZ1m6gkuiw1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AnwYG/btrG6XPXmzU/qwIcRK1j6CNrZ1m6gkuiw1/img.gif&quot; data-alt=&quot;봐주세요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AnwYG/btrG6XPXmzU/qwIcRK1j6CNrZ1m6gkuiw1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/AnwYG/btrG6XPXmzU/qwIcRK1j6CNrZ1m6gkuiw1/img.gif&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;264&quot; data-filename=&quot;20160714_5786faad2b985.gif&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;봐주세요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;h2 id=&quot;tweenlinecomponent&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TweenCircularComponent : 회전 움직임을 제어&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WxsXt/btrHaW9mhgv/bPB6TX06LIsQQEmii0EPt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WxsXt/btrHaW9mhgv/bPB6TX06LIsQQEmii0EPt0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WxsXt/btrHaW9mhgv/bPB6TX06LIsQQEmii0EPt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWxsXt%2FbtrHaW9mhgv%2FbPB6TX06LIsQQEmii0EPt0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;199&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;h2 id=&quot;tweenlinecomponent&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TweenFloatingComponent : 부유 운동 방식 설정 가능&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqiIxc/btrG8lW0PLV/Z6MXkTF5ExuFECzdDHFCp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqiIxc/btrG8lW0PLV/Z6MXkTF5ExuFECzdDHFCp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqiIxc/btrG8lW0PLV/Z6MXkTF5ExuFECzdDHFCp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqiIxc%2FbtrG8lW0PLV%2FZ6MXkTF5ExuFECzdDHFCp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;180&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;180&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;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&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;h2 id=&quot;tweenlinecomponent&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;RigidbodyComponent : 강체의 물리적인 속성을 컨트롤 할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;RigidbodyComponent는 중력과 타일이나 벽이 세로로 쌓여있을 경우 지나갈 수 없게 만든다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.JPG&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9WOi8/btrHaokKjzJ/LNwvDPyiJpUkOM7eNIiNE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9WOi8/btrHaokKjzJ/LNwvDPyiJpUkOM7eNIiNE0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9WOi8/btrHaokKjzJ/LNwvDPyiJpUkOM7eNIiNE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9WOi8%2FbtrHaokKjzJ%2FLNwvDPyiJpUkOM7eNIiNE0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;380&quot; data-filename=&quot;12.JPG&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20180904_5b8d66540d5b8.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rmKI5/btrG9k4cvzK/FxdtEl1F63O3n5khWruIvk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rmKI5/btrG9k4cvzK/FxdtEl1F63O3n5khWruIvk/img.jpg&quot; data-alt=&quot;mod component들을 만든 모두에게 존경을&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rmKI5/btrG9k4cvzK/FxdtEl1F63O3n5khWruIvk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrmKI5%2FbtrG9k4cvzK%2FFxdtEl1F63O3n5khWruIvk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;220&quot; data-filename=&quot;20180904_5b8d66540d5b8.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;mod component들을 만든 모두에게 존경을&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;h3 data-ke-size=&quot;size23&quot;&gt;정말 정말 더 많은 컴포넌트들이 있는데&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하나 하나 이야기 다 못한게 좀 아쉽다.&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;다들&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고(&lt;span style=&quot;background-color: #ffffff; color: #202124;&quot;&gt;풀거나 나타내지 않고 억누르다&lt;/span&gt;),&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고 (&lt;span style=&quot;color: #000000;&quot;&gt;살펴서 도움이 될 만한 재료로 삼음&lt;/span&gt;)바란다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&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;&lt;b&gt;정보 : 동음이의어를 사용한 개그&lt;/b&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;&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;FFXyb.webp&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyqOB/btrG8WWNjUr/VEylK6mBS3JaEAHtmW1yVK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyqOB/btrG8WWNjUr/VEylK6mBS3JaEAHtmW1yVK/img.webp&quot; data-alt=&quot;기력이 다했나봅니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyqOB/btrG8WWNjUr/VEylK6mBS3JaEAHtmW1yVK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyqOB%2FbtrG8WWNjUr%2FVEylK6mBS3JaEAHtmW1yVK%2Fimg.webp&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;996&quot; height=&quot;828&quot; data-filename=&quot;FFXyb.webp&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기력이 다했나봅니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 6는 스크립트에 대해서 이야기 해보겠다.&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘도 부족하디 부족한 글 보느라 정말 감사하고, 제발 또 봤으면 좋겠다.&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;꼭 다시 놀러와주라!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;102_8908.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QklK7/btrG9kXra5N/Cv2QdJKhKa7rHbdhuHJaE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QklK7/btrG9kXra5N/Cv2QdJKhKa7rHbdhuHJaE0/img.jpg&quot; data-alt=&quot;제발요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QklK7/btrG9kXra5N/Cv2QdJKhKa7rHbdhuHJaE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQklK7%2FbtrG9kXra5N%2FCv2QdJKhKa7rHbdhuHJaE0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;102_8908.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제발요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1339812103715.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkrTYB/btrHag70EGp/QyMkSKrCrRx6pIZJPktSl0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkrTYB/btrHag70EGp/QyMkSKrCrRx6pIZJPktSl0/img.jpg&quot; data-alt=&quot;또 봐요 여러분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkrTYB/btrHag70EGp/QyMkSKrCrRx6pIZJPktSl0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkrTYB%2FbtrHag70EGp%2FQyMkSKrCrRx6pIZJPktSl0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;574&quot; data-filename=&quot;1339812103715.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;또 봐요 여러분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/136</guid>
      <comments>https://devdongbaek.tistory.com/136#entry136comment</comments>
      <pubDate>Wed, 13 Jul 2022 01:40:42 +0900</pubDate>
    </item>
    <item>
      <title>DRF mixins 상속을 통한 APIView</title>
      <link>https://devdongbaek.tistory.com/134</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Mixin : 전통적인 다중 상속을 클래스의 부분 부분을 쪼개어 조립하는 것&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;DRF에서 지원하는 mixins&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이썬에서는 mixin이라는 문법은 따로 없고, 상속 문법을 사용하여 구현된다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;믹스인 클래스는 직접적으로 사용하는게 아니라 다른 클래스에 의해서 상속이 되어 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;믹스인에는 create(), list() 등의 리소스를 생성하거나 가져오는 로직이 구현되어있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;로직만 구현되어 있을 뿐,&lt;span&gt; http method와 연계하는 부분은 직접 연결&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;해줘야 한다.&lt;/span&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CreateModelMixin : Create를 하는 일반적인 로직이 구현되어 있음.&lt;/li&gt;
&lt;li&gt;ListModelMixin : 목록을 조회하는 로직&lt;/li&gt;
&lt;li&gt;RetrieveModelMixin&lt;/li&gt;
&lt;li&gt;UpdateModelMixin&lt;/li&gt;
&lt;li&gt;DestroyModelMixin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;CreateModelMixin&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657555860300&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CreateModelMixin:
    &quot;&quot;&quot;
    Create a model instance.
    &quot;&quot;&quot;
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        
        # 유효성 검사 통과를 못하면 예외가 발생
        serializer.is_valid(raise_exception=True)  
        
        # serializer 저장
        self.perform_create(serializer) 
        
        # 성공했을 때 응답 해줄 헤더 목록을 헤더에 넣는다.
        headers = self.get_success_headers(serializer.data)  
        
        # 응답을 리턴
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)  

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {'Location': str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Http method에 따른 처리를 따로 구현 해주어야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;method별 로직 연결&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1657556033332&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework import generics
from rest_framework import mixins
class PostListAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):  # generics.GenericAPIView가 가장 마지막에 상속받아야 한다.
    queryset = Post.objects.all()
    serializer_class = PostSerializer
	
    # Http method가 get일 때, self.list를 호출하겠다라고 매핑
    def get(self, request, *args, **kwargs):  
        return self.list(request, *args, **kwargs)  # mixins.ListModelMixin을 상속받아서 사용 가능
	
    # Http method가 post일 때 self.create를 호출하겠다라고 매핑
    def post(self, request, *args, **kwargs):  
        return self.create(request, *args, **kwargs) # mixins.CreateModelMixin을 상속받아서 사용 가능&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ListModelMixin과 CreateModelMixin을 상속 받았기에 list와 create라는 멤버 변수가 생성된다.&lt;/li&gt;
&lt;li&gt;get -&amp;gt; self.list, post -&amp;gt; self.create를 매번 같은 파라미터를 넘겨 연결하려니 번거롭다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657556245002&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework import generics
from rest_framework import mixins
class PostDetailAPIView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixi, generics.GenericAPIView):  # generics.GenericAPIView가 가장 마지막에 상속받아야 한다.
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 Http method마다 직접 연결을 해야하니 번거롭다. 심지어 하나가 늘어남.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;APIView의 일반적인 로직을 섞어서 재사용율을 높인게 mixins&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;mixins들보다 패턴화 한것이 Genenrics&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Genenrics들을 더욱 정리한게 ViewSet이다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;여러 generic APIView (모두 GenericsAPIView 상속)&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;genenrics.APIView이름 : Http method -&amp;gt; 멤버 함수&lt;/li&gt;
&lt;li&gt;generics.CreateAPIView : post &amp;rarr; create&lt;/li&gt;
&lt;li&gt;generics.ListAPIView : get &amp;rarr; list&lt;/li&gt;
&lt;li&gt;generics.RetrieveAPIView : get &amp;rarr; retrieve&lt;/li&gt;
&lt;li&gt;generics.DestroyAPIView : delete &amp;rarr; destroy&lt;/li&gt;
&lt;li&gt;generics.UpdateAPIView : put &amp;rarr; update, patch &amp;rarr; partial_update&lt;/li&gt;
&lt;li&gt;generics.ListCreateAPIView : get &amp;rarr; list, post &amp;rarr; create&lt;/li&gt;
&lt;li&gt;generics.RetrieveUpdateAPIView : get &amp;rarr; retrieve, put &amp;rarr; update, patch &amp;rarr; partial_update&lt;/li&gt;
&lt;li&gt;generics.RetrieveDestroyAPIView : get &amp;rarr; retrieve, delete &amp;rarr; destroy&lt;/li&gt;
&lt;li&gt;generics.RetrieveUpdateDestroyAPIView : get &amp;rarr; retrieve, put &amp;rarr; update, patch &amp;rarr; partial_update, delete &amp;rarr; destroy&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;generic APIView&lt;span&gt;&amp;nbsp; 활용&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1657556684794&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework import generics
class PostListAPIView(generics.ListCreateAPIView):  # 아래 ListCreateAPIView를 상속
    queryset = Post.objects.all()
    serializer_class = PostSerializer

# rest_framework/generics.py
class ListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;generics.ListCreateAPIView를 상속받아서 PostListAPIView를 구현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657556760337&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework import generics
class PostDetailAPIView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

# rest_framework/generics.py
class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, GenericAPIView):
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;generics.RetrieveUpdateDestroyAPIVie를 상속받아서 PostDetailAPIView를 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;적절한 generics APIView를 상속받기만 해도 원하는 기능을 구현할 수 있다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;직접 API View를 만들 수 있을 정도로 공부하기(내부를 이해하기 위해서)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ViewSet이 좋다고, ViewSet만 공부해서는 나중에 응용할 수 없다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/134</guid>
      <comments>https://devdongbaek.tistory.com/134#entry134comment</comments>
      <pubDate>Tue, 12 Jul 2022 01:32:36 +0900</pubDate>
    </item>
    <item>
      <title>DRF로 APIView, Json 응답뷰 만들기</title>
      <link>https://devdongbaek.tistory.com/133</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;ModelSerializer를 통한 JSON 직렬화&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;_Serializer / ModelSerializer은 Form / ModelForm과 유사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; 역할 면에서 Serializer은 POST 요청만 처리하는 Form&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;둘의 공통점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;폼 필드 지정 혹은 모델로부터 읽어오기.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력된 데이터에 대한 유효성 검사를 통해 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;둘의 차이점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Form / ModelForm&amp;nbsp;: Form태그가 포함된 HTML을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer / ModelSerializer&amp;nbsp;: Form 데이터가 포함된 JSON 문자열을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer를 통한 뷰처리(DRF를 사용하지 않을 때)&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1657544855789&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.serializers import ModelSerializer

# Post모델에 대한 ModelSerializer 정의
class PostSerializer(ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

# Views
serializer = PostSerializer(data=request.POST)
if serializer.is_valid():
	# 유효성 검사에 통과한 값들을 전달
	return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Form 생성자의 첫번째 인자는 data이지만, Serializer 생성자의 첫번째 인자는 instance이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DRF의 기본 CBV인 APIView&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;APIView 클래스 혹은&lt;span&gt;&amp;nbsp;&lt;/span&gt;@api_view장식자&lt;/li&gt;
&lt;li&gt;View에 여러 기본 속성을 부여한다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;renderer_classes: 직렬화 class 다수&lt;/li&gt;
&lt;li&gt;parser_classes: 비직렬화 class 다수&lt;/li&gt;
&lt;li&gt;authentication_classes: 인증 class 다수 -&amp;gt; 유저를 식별하는 것&lt;/li&gt;
&lt;li&gt;throttle_classes: 사용량 제한 class 다수(호출 제한)&lt;/li&gt;
&lt;li&gt;permission_classes: 권한 class 다수 -&amp;gt; 유저를 식별하고 나서 각 자원에 대해 접근 레벨을 정의&lt;/li&gt;
&lt;li&gt;content_negotiation_class: 요청에 따라 적절한 직렬화/비직렬화 class를 선택하는 class&lt;/li&gt;
&lt;li&gt;metadata_class: 메타 정보를 처리하는 class&lt;/li&gt;
&lt;li&gt;versioning_class: 요청에서 API버전 정보를 감지하는 class&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;각 옵션의 디폴트 값
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;renderer_classes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rest_framework.renderers.JSONRenderer : JSON 직렬화&lt;/li&gt;
&lt;li&gt;rest_framework.renderers.TemplateHTMLRenderer : HTML 페이지 직렬화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;parser_classes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rest_framework.parsers.JSONParser : JSON 포맷 처리&lt;/li&gt;
&lt;li&gt;rest_framework.parsers.FormParser&lt;/li&gt;
&lt;li&gt;rest_framework.parsers.MultiPartParser&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;authentication_classes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rest_framework.authentication.SessionAuthentication&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 세션에 기반한 인증&lt;/li&gt;
&lt;li&gt;rest_framework.authentication.BasicAuthentication&lt;span&gt;&amp;nbsp;&lt;/span&gt;: HTTP Basic 인증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;throttle_classes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빈 튜플 (디폴트로는 요청 횟수 제한이 설정 되어 있지 않음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;permission_classes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rest_framework.permissions.AllowAny&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 누구라도 접근 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;content_negotiation_class
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rest_framework.negotiation.DefaultContentNegotiation&lt;/li&gt;
&lt;li&gt;같은 URL로의 요청이지만, JSON응답을 요구하는 것이냐 / HTML응답을 요구하는 것인지 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;metadata_class
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rest_framework.metadata.SimpleMetadata&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;versioning_class
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;None: API 버전 정보를 탐지하지 않겠다.&lt;/li&gt;
&lt;li&gt;요청 URL에서, GET인자에서, HEADER에서 버전 정보를 탐지하여 해당 버전의 API뷰가 호출되도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;APIView와 @api_view&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;APIView : 클래스 기반 뷰//상속 받아야 함&lt;/li&gt;
&lt;li&gt;@api_view : 함수 기반 뷰를 위한 장식자&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;APIView&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 CBV 이므로&amp;nbsp; -&amp;gt; 하나의 URL만 처리 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그러나 ApiView를 좀더 표준화-&amp;gt; &lt;span&gt;Generic&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Generic을 좀더 합친 것: ViewSet&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ViewSet은 여러개의 URL의 대응이 가능하다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;즉 ApiView와 Generic은 하나의 get, post, put, delete의 url만 매핑 가능하다면 ViewSet은 두개의 url 매핑 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 method(get, post, put, delete)에 맞게 멤버함수를 구현하면, 해당 method 요청이 들어올 때 호출. 호출 이전 단계(initial)에서 다음을 처리함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;// APIView를 상속받을 때 자동으로 처리되는 작업들&amp;nbsp;&lt;/li&gt;
&lt;li&gt;직렬화 / 비직렬화 처리(JSON 등)&lt;/li&gt;
&lt;li&gt;인증 체크&lt;/li&gt;
&lt;li&gt;사용량 제한 체크: 호출 허용량 범위인지 체크&lt;/li&gt;
&lt;li&gt;권한 클래스 지정: 비인증/인증 유저에 대해 해당 API 호출을 허용할 것인지를 결정&lt;/li&gt;
&lt;li&gt;요청된 API버전 문자열을 탐지하여, request.version에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스 형태) APIView 구현 샘플&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;get, post등을 직접 구현 하였으나 직렬화, 인증 등은 APIView에 포함되어있고, 우리는 그것을 상속 했으므로 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;직접 구현하지 않아도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;011&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/011.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/011.gif&quot; width=&quot;150&quot; /&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;size18&quot;&gt;list / create&lt;/p&gt;
&lt;pre id=&quot;code_1657547292499&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Post
from .serializers import PostSerializer

class PostListAPIView(**APIView**):
    def get(self, request):
        qs = Post.objects.all()
        serializer = PostSerializer(qs, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&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;detail / update / delete&lt;/p&gt;
&lt;pre id=&quot;code_1657546650917&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Post
from .serializers import PostSerializer
class PostDetailAPIView(**APIView**):
    def get_object(self, pk):
        return get_object_or_404(Post, pk=pk)

    def get(self, request, pk, format=None):
        post = self.get_object(pk)
        serializer = PostSerializer(post)
        return Response(serializer.data)

    def put(self, request, pk):
        post = self.get_object(pk)
        serializer = PostSerializer(post, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        post = self.get_object(pk)
        post.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 메소드들은 무슨 프로젝트를 진행하더라도 거의 비슷하게 작성되고, 반복된다. 이를 패턴화 한게 generics이고, generics를 합쳐서 구조화 시킨 것을 viewset이라 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657546983820&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# rest_framework/views.py
from django.views.decorators.csrf import csrf_exempt
class APIView(View):
    # &amp;hellip;
    @classmethod
    def as_view(cls, **initkwargs):
        # &amp;hellip;
        **return csrf_exempt(view)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뷰가 csrf_exempt 장식자로 이미 감싸져있기에 POST 요청에서 csrf token 체크를 하지 않습니다.&lt;/li&gt;
&lt;li&gt;이를 이해하기 위해서 파이썬 장식자를 공부할 필요가 있다!!!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함수 형태) @api_view 장식자 구현 샘플&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 작업만을 구현코자 할 때 @api_view를 쓰면 편리하다.&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;List / create&lt;/p&gt;
&lt;pre id=&quot;code_1657547309868&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.http import get_object_or_404
from rest_framework import status
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Post
from .serializers import PostSerializer

# 나는 어떤 인자를 지원하겠다라고 명시
# 인자를 비우면 매칭되지 않음
**@api_view**(['GET', 'POST'])  
def post_list(request):

    if request.method == 'GET':
        serializer = PostSerializer(Post.objects.all(), many=True)
        return Response(serializer.data)
    else:
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;함수형 뷰에서는 각 요청을 if문으로 처리한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;detail / update / delete&lt;/p&gt;
&lt;pre id=&quot;code_1657547443683&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.decorators import api_view
from rest_framework.response import Response

**@api_view**(['GET', 'PUT', 'DELETE'])
def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)

    if request.method == 'GET':
        serializer = PostSerializer(post)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = PostSerializer(post, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    else:
        post.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/api-guide/fields/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.django-rest-framework.org/api-guide/fields/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657547871506&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;Serializer fields - Django REST framework&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.django-rest-framework.org&quot; data-og-source-url=&quot;https://www.django-rest-framework.org/api-guide/fields/&quot; data-og-url=&quot;https://www.django-rest-framework.org/api-guide/fields/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/api-guide/fields/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.django-rest-framework.org/api-guide/fields/&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;Serializer fields - Django REST framework&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.django-rest-framework.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://velog.io/@kmnkit/drf-rwonly&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@kmnkit/drf-rwonly&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1657547929643&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;Serializer 필드 작성 방법&quot; data-og-description=&quot;Serializer를 쓸 때 헷갈리는 필드 정하는 방법.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@kmnkit/drf-rwonly&quot; data-og-url=&quot;https://velog.io/@kmnkit/drf-rwonly&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ayf7P/hyO3o45AIO/cRonSnCe0561eKmYoMKSIK/img.png?width=1574&amp;amp;height=616&amp;amp;face=0_0_1574_616,https://scrap.kakaocdn.net/dn/b0mhG2/hyO3nykF6y/peyVlKvPsSsknYAEmpKtt0/img.png?width=1574&amp;amp;height=616&amp;amp;face=0_0_1574_616,https://scrap.kakaocdn.net/dn/czysiz/hyO3fG4mhx/HhBOoR9kko3FsR4GrchQxK/img.png?width=1574&amp;amp;height=616&amp;amp;face=0_0_1574_616&quot;&gt;&lt;a href=&quot;https://velog.io/@kmnkit/drf-rwonly&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@kmnkit/drf-rwonly&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ayf7P/hyO3o45AIO/cRonSnCe0561eKmYoMKSIK/img.png?width=1574&amp;amp;height=616&amp;amp;face=0_0_1574_616,https://scrap.kakaocdn.net/dn/b0mhG2/hyO3nykF6y/peyVlKvPsSsknYAEmpKtt0/img.png?width=1574&amp;amp;height=616&amp;amp;face=0_0_1574_616,https://scrap.kakaocdn.net/dn/czysiz/hyO3fG4mhx/HhBOoR9kko3FsR4GrchQxK/img.png?width=1574&amp;amp;height=616&amp;amp;face=0_0_1574_616');&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;Serializer 필드 작성 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Serializer를 쓸 때 헷갈리는 필드 정하는 방법.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;serializer field를 통해 읽기만 해야하는 필드, 쓰기만 해야하는 필드, 둘 다 해야하는 필드로 나눌 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;왜 DRF의 페이지에서는 해당 페이지로 보내진 API(JSON)만 보이고, 기존 Django에서 보이던 페이지들이 왜 안보이지라고 생각했었는데 정말 무지했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DRF의 목적은 프론트단에 API를 보내주는게 목적이거늘&lt;/b&gt; Django처럼 풀스택만을 지원한다고 생각했던 것이 패착이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 이유로 DRF의 view단에서 return response를 보내줄 때 html을 render하지 않고 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;</description>
      <category>강의 정리/Django REST Framework</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/133</guid>
      <comments>https://devdongbaek.tistory.com/133#entry133comment</comments>
      <pubDate>Mon, 11 Jul 2022 23:02:21 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1~4 회고</title>
      <link>https://devdongbaek.tistory.com/132</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon Chapter 1주차 11일 회고&lt;/span&gt;&lt;/h2&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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;부족하지만 멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon에 합격하게되어서 MOD를 먼저 사용해볼 수 있는 감사한 기회를 얻게 되었습니다...! 최선을 다해 공부하고, 리뷰하겠습니다! 부족한 글 보러 와주셔서 감사드립니다!&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;eDzpa (1).webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckbGny/btrG4evHf2k/JDKssA2gqVgt0SyZIC4wGk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckbGny/btrG4evHf2k/JDKssA2gqVgt0SyZIC4wGk/img.webp&quot; data-alt=&quot;시작해봅시다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckbGny/btrG4evHf2k/JDKssA2gqVgt0SyZIC4wGk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckbGny%2FbtrG4evHf2k%2FJDKssA2gqVgt0SyZIC4wGk%2Fimg.webp&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;800&quot; height=&quot;1000&quot; data-filename=&quot;eDzpa (1).webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시작해봅시다!&lt;/figcaption&gt;
&lt;/figure&gt;
&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 1주차 11일 회고&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/szvCU/btrG3jjOQqG/tXpkWlKmzIc2p1OtXF7No0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/szvCU/btrG3jjOQqG/tXpkWlKmzIc2p1OtXF7No0/img.jpg&quot; data-alt=&quot;mod의 기본적인 인터페이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/szvCU/btrG3jjOQqG/tXpkWlKmzIc2p1OtXF7No0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FszvCU%2FbtrG3jjOQqG%2FtXpkWlKmzIc2p1OtXF7No0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1596&quot; height=&quot;923&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;mod의 기본적인 인터페이스&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;&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;span style=&quot;color: #000000;&quot;&gt;1주차에는 MOD 클라이언트의 기능 및 구성에 대해서 배웠다. 위 사진에 볼 수 있다 싶이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적인 홈,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;플레이,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;배경,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;나에게는 필요 없는 친구창,&lt;/b&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;93_3535.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb9X1R/btrGYzPgFbJ/KkKj153vrbBm70H2opXDk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb9X1R/btrGYzPgFbJ/KkKj153vrbBm70H2opXDk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb9X1R/btrGYzPgFbJ/KkKj153vrbBm70H2opXDk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb9X1R%2FbtrGYzPgFbJ%2FKkKj153vrbBm70H2opXDk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;93_3535.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&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&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTpfdV/btrG25TJd07/K0wHk8vqp8w6Fl1dehZqNK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;598&quot; data-filename=&quot;12.JPG&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;span style=&quot;color: #000000;&quot;&gt;그리고 메이플을 한번이라도 했던 유저라면 빼먹을수 없는&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;아바타(일명 메이플 코디 및 룩X)&lt;/b&gt;&lt;/span&gt;가 있다.&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;덕후짤모음059.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xqj63/btrG3JQdf0Z/lkb7SxKpmeVSezr9nFWzT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xqj63/btrG3JQdf0Z/lkb7SxKpmeVSezr9nFWzT1/img.jpg&quot; data-alt=&quot;최고다 MOD!!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xqj63/btrG3JQdf0Z/lkb7SxKpmeVSezr9nFWzT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxqj63%2FbtrG3JQdf0Z%2Flkb7SxKpmeVSezr9nFWzT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;276&quot; data-filename=&quot;덕후짤모음059.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최고다 MOD!!!!&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;아바타를 나는 MOD를 해야만 하는 세가지 이유 중 하나로 뽑았다..!!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;span style=&quot;color: #000000;&quot;&gt;주최측분들께서 멋사 X MOD 해커톤 참여자에게 임의의 캐쉬를 지급하기로 해주셨지만...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아직 내 캐릭터는 30도를 넘는 날씨 때문인지 아니면&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빈 지갑 때문인지&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #000000;&quot;&gt;헐벗어있다.....&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;...&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빈&lt;span&gt;&amp;nbsp;&lt;/span&gt;지갑 때문인지&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빈&lt;span&gt;&amp;nbsp;&lt;/span&gt;지갑 때문인지&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빈&lt;span&gt;&amp;nbsp;&lt;/span&gt;지갑 때문인지&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빈&amp;nbsp;지갑 때문인지&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빈&amp;nbsp;지갑 때문인지&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;죽고싶어..JPG&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQ3Md/btrG2tUVkmr/kZLKfcIxwRzJRbex4ODD7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQ3Md/btrG2tUVkmr/kZLKfcIxwRzJRbex4ODD7K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQ3Md/btrG2tUVkmr/kZLKfcIxwRzJRbex4ODD7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQ3Md%2FbtrG2tUVkmr%2FkZLKfcIxwRzJRbex4ODD7K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;470&quot; data-filename=&quot;죽고싶어..JPG&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;470&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;126&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdS18H/btrGZMARB3p/aU9wJGFEiAsGHcBopyRCa1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdS18H/btrGZMARB3p/aU9wJGFEiAsGHcBopyRCa1/img.jpg&quot; data-alt=&quot;실 본인 헤어스타일과 상당히 유사하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdS18H/btrGZMARB3p/aU9wJGFEiAsGHcBopyRCa1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdS18H%2FbtrGZMARB3p%2FaU9wJGFEiAsGHcBopyRCa1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;126&quot; height=&quot;184&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;126&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실 본인 헤어스타일과 상당히 유사하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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: #000000;&quot;&gt;그래도 지갑이 가난한 유저들을 위해 넥슨은 맘에드는 옷을 몸위에 걸쳐볼 수는 있는 기회를 감사하게 주셔서 테일즈런너와 메이플을 할 때 나름 짬먹은 코디 실력을 살려 꾸며보았다.&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;5.JPG&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/te5H3/btrG4HEk1PV/TJw8Lk5kBSK3KcJQxGv58k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/te5H3/btrG4HEk1PV/TJw8Lk5kBSK3KcJQxGv58k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/te5H3/btrG4HEk1PV/TJw8Lk5kBSK3KcJQxGv58k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fte5H3%2FbtrG4HEk1PV%2FTJw8Lk5kBSK3KcJQxGv58k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1329&quot; height=&quot;891&quot; data-filename=&quot;5.JPG&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;891&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;6.JPG&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7G7zl/btrG2tm00fV/6iRJWJSSVGeqAkmMN9ZV61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7G7zl/btrG2tm00fV/6iRJWJSSVGeqAkmMN9ZV61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7G7zl/btrG2tm00fV/6iRJWJSSVGeqAkmMN9ZV61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7G7zl%2FbtrG2tm00fV%2F6iRJWJSSVGeqAkmMN9ZV61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;206&quot; height=&quot;217&quot; data-filename=&quot;6.JPG&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;진짜별로.JPG&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kw62r/btrG241BpTh/dRipafztoFQ2y3Uld4qx80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kw62r/btrG241BpTh/dRipafztoFQ2y3Uld4qx80/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kw62r/btrG241BpTh/dRipafztoFQ2y3Uld4qx80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKw62r%2FbtrG241BpTh%2FdRipafztoFQ2y3Uld4qx80%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;401&quot; data-filename=&quot;진짜별로.JPG&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;나름 귀여울지도..?&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옷을 입고나서 가난한 나는 쫓겨나듯 옷을 반납(강탈 당)하고 다시 홈으로 돌아왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;FCqsC.webp&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWMU1s/btrG4HdivpL/f3udjnLoKNzCZe763DEuk0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWMU1s/btrG4HdivpL/f3udjnLoKNzCZe763DEuk0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWMU1s/btrG4HdivpL/f3udjnLoKNzCZe763DEuk0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWMU1s%2FbtrG4HdivpL%2Ff3udjnLoKNzCZe763DEuk0%2Fimg.webp&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;253&quot; data-filename=&quot;FCqsC.webp&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;253&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 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;7.JPG&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJX1b/btrGT0FRv1k/tBtfveYKbFl1PzJ9FzsiPK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJX1b/btrGT0FRv1k/tBtfveYKbFl1PzJ9FzsiPK/img.jpg&quot; data-alt=&quot;삐짐을 나름대로 표현했다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJX1b/btrGT0FRv1k/tBtfveYKbFl1PzJ9FzsiPK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJX1b%2FbtrGT0FRv1k%2FtBtfveYKbFl1PzJ9FzsiPK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;147&quot; height=&quot;175&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삐짐을 나름대로 표현했다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;플레이를 나는 MOD를 해야만 하는 세가지 이유 중 하나로 뽑았다..!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;8.JPG&quot; data-origin-width=&quot;1838&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUkjS2/btrG20Y8Ry6/9ieRi1gv2ITuVBKWXRbWE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUkjS2/btrG20Y8Ry6/9ieRi1gv2ITuVBKWXRbWE0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUkjS2/btrG20Y8Ry6/9ieRi1gv2ITuVBKWXRbWE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUkjS2%2FbtrG20Y8Ry6%2F9ieRi1gv2ITuVBKWXRbWE0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1838&quot; height=&quot;927&quot; data-filename=&quot;8.JPG&quot; data-origin-width=&quot;1838&quot; data-origin-height=&quot;927&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: #000000;&quot;&gt;플레이는 위와 같이 구성되어있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;span style=&quot;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정말 랜덤하게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;정말로&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; color: #ee2323;&quot;&gt;&lt;b&gt;사심 없이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;86_55169d096b98d_2640.jpg&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ifTq/btrG3q4rYoq/ktKZK4eSnzxCCfTRiVUQr0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ifTq/btrG3q4rYoq/ktKZK4eSnzxCCfTRiVUQr0/img.jpg&quot; data-alt=&quot;정말 사심없이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ifTq/btrG3q4rYoq/ktKZK4eSnzxCCfTRiVUQr0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ifTq%2FbtrG3q4rYoq%2FktKZK4eSnzxCCfTRiVUQr0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;314&quot; data-filename=&quot;86_55169d096b98d_2640.jpg&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정말 사심없이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JU89j/btrGZKXmZ6x/SK88UBgo4E1k6Qc5CXGLqK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JU89j/btrGZKXmZ6x/SK88UBgo4E1k6Qc5CXGLqK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JU89j/btrGZKXmZ6x/SK88UBgo4E1k6Qc5CXGLqK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJU89j%2FbtrGZKXmZ6x%2FSK88UBgo4E1k6Qc5CXGLqK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;302&quot; data-filename=&quot;10.JPG&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;302&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;룰은 아래와 같다한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;861&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh1BM1/btrG1ya5Wsb/rkMv1N87sBrJIZdYa7OcD0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh1BM1/btrG1ya5Wsb/rkMv1N87sBrJIZdYa7OcD0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh1BM1/btrG1ya5Wsb/rkMv1N87sBrJIZdYa7OcD0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh1BM1%2FbtrG1ya5Wsb%2FrkMv1N87sBrJIZdYa7OcD0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1319&quot; height=&quot;861&quot; data-filename=&quot;11.JPG&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;861&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: #000000;&quot;&gt;사실 좀 설렌다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iOQux.webp&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csviAp/btrGYzPgSnv/9KJVbjtwFmsf2cSkETZzqK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csviAp/btrGYzPgSnv/9KJVbjtwFmsf2cSkETZzqK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csviAp/btrGYzPgSnv/9KJVbjtwFmsf2cSkETZzqK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsviAp%2FbtrGYzPgSnv%2F9KJVbjtwFmsf2cSkETZzqK%2Fimg.webp&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;420&quot; height=&quot;315&quot; data-filename=&quot;iOQux.webp&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;315&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: #000000;&quot;&gt;본인에게 프로듀스란 내 최애그룹&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;아이즈원&quot;을 만들어준 소중한 프로그램이다.&lt;/span&gt;&lt;/h2&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;덕후짤모음059.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuHF28/btrG24tMtp4/yKGl00DDZPDukonoPHp69k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuHF28/btrG24tMtp4/yKGl00DDZPDukonoPHp69k/img.jpg&quot; data-alt=&quot;최고다.. 아니 최고였다 아이즈원!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuHF28/btrG24tMtp4/yKGl00DDZPDukonoPHp69k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuHF28%2FbtrG24tMtp4%2FyKGl00DDZPDukonoPHp69k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;276&quot; data-filename=&quot;덕후짤모음059.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최고다.. 아니 최고였다 아이즈원!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;1869&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgrPhQ/btrG24m3fYA/8nSdrkOVhCL9aAaZXNVn4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgrPhQ/btrG24m3fYA/8nSdrkOVhCL9aAaZXNVn4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgrPhQ/btrG24m3fYA/8nSdrkOVhCL9aAaZXNVn4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgrPhQ%2FbtrG24m3fYA%2F8nSdrkOVhCL9aAaZXNVn4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1869&quot; height=&quot;890&quot; data-filename=&quot;13.JPG&quot; data-origin-width=&quot;1869&quot; data-origin-height=&quot;890&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 style=&quot;color: #000000;&quot;&gt;들어가자 마자 느껴지는 인싸들의 향기에 취한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모두 파티에 온다고 나름대로 꾸민 모습이&lt;/span&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;span style=&quot;font-family: GungSeo, serif; color: #000000;&quot;&gt;&lt;b&gt;애처롭기까지&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한다...&lt;/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;&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;span style=&quot;color: #000000;&quot;&gt;그들은 내가 무대에 들어선 순간 모두 조용해지고, 나만을 위한 무대가 완성된다..&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;566c59163a5b2c3e7bf1ab3e7ca38f8cb1c416f1_hq.gif&quot; data-origin-width=&quot;245&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dATR6Q/btrG2Z61y5E/mkdL7UciCikZBNxilPOeEk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dATR6Q/btrG2Z61y5E/mkdL7UciCikZBNxilPOeEk/img.gif&quot; data-alt=&quot;이 몸 등장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dATR6Q/btrG2Z61y5E/mkdL7UciCikZBNxilPOeEk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dATR6Q/btrG2Z61y5E/mkdL7UciCikZBNxilPOeEk/img.gif&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;245&quot; height=&quot;245&quot; data-filename=&quot;566c59163a5b2c3e7bf1ab3e7ca38f8cb1c416f1_hq.gif&quot; data-origin-width=&quot;245&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 몸 등장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHKxCr/btrG3Khh0m1/3KB9saqPyu7ZDXjK6OHxt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHKxCr/btrG3Khh0m1/3KB9saqPyu7ZDXjK6OHxt0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHKxCr/btrG3Khh0m1/3KB9saqPyu7ZDXjK6OHxt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHKxCr%2FbtrG3Khh0m1%2F3KB9saqPyu7ZDXjK6OHxt0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1891&quot; height=&quot;959&quot; data-filename=&quot;14.JPG&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;959&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 style=&quot;color: #000000;&quot;&gt;참여하고나서 경쟁자들의 용모를 살펴보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;qfrvh.webp&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/orbOk/btrG2tHlQ4M/f7J9MZmGHqYVrWpIJOcZv1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/orbOk/btrG2tHlQ4M/f7J9MZmGHqYVrWpIJOcZv1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/orbOk/btrG2tHlQ4M/f7J9MZmGHqYVrWpIJOcZv1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2ForbOk%2FbtrG2tHlQ4M%2Ff7J9MZmGHqYVrWpIJOcZv1%2Fimg.webp&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;1200&quot; height=&quot;675&quot; data-filename=&quot;qfrvh.webp&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;675&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;17.JPG&quot; data-origin-width=&quot;112&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ErFQ6/btrG4dXRLoO/M2tonVc82ObHu3Axlv2Q5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ErFQ6/btrG4dXRLoO/M2tonVc82ObHu3Axlv2Q5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ErFQ6/btrG4dXRLoO/M2tonVc82ObHu3Axlv2Q5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FErFQ6%2FbtrG4dXRLoO%2FM2tonVc82ObHu3Axlv2Q5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;112&quot; height=&quot;108&quot; data-filename=&quot;17.JPG&quot; data-origin-width=&quot;112&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아름답지만.... 아냐..&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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;19.JPG&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk07aF/btrG25GfQqm/Mb0aQiD2HUbAZWnr9U1JhK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk07aF/btrG25GfQqm/Mb0aQiD2HUbAZWnr9U1JhK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk07aF/btrG25GfQqm/Mb0aQiD2HUbAZWnr9U1JhK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk07aF%2FbtrG25GfQqm%2FMb0aQiD2HUbAZWnr9U1JhK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;88&quot; height=&quot;80&quot; data-filename=&quot;19.JPG&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나름대로 힘을 주었지만 아니 이건 내가 추구하는 것과 달라&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;18.JPG&quot; data-origin-width=&quot;94&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m3spD/btrG24tN3cu/8a5b7bHtKQpKkJYDgEyND1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m3spD/btrG24tN3cu/8a5b7bHtKQpKkJYDgEyND1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m3spD/btrG24tN3cu/8a5b7bHtKQpKkJYDgEyND1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm3spD%2FbtrG24tN3cu%2F8a5b7bHtKQpKkJYDgEyND1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;94&quot; height=&quot;122&quot; data-filename=&quot;18.JPG&quot; data-origin-width=&quot;94&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; 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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다들 내 마음에는 들지 못하였지만 한 친구가 내 눈에 들어왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;16.JPG&quot; data-origin-width=&quot;113&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6xled/btrGZMHCoXo/3FOQ8lptyV4FDNC4IyzZ21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6xled/btrGZMHCoXo/3FOQ8lptyV4FDNC4IyzZ21/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6xled/btrGZMHCoXo/3FOQ8lptyV4FDNC4IyzZ21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6xled%2FbtrGZMHCoXo%2F3FOQ8lptyV4FDNC4IyzZ21%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;113&quot; height=&quot;178&quot; data-filename=&quot;16.JPG&quot; data-origin-width=&quot;113&quot; data-origin-height=&quot;178&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WexCy.webp&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxRfx/btrG3JWZ6M3/h33jwKwdMeHHIVXj6FzD30/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxRfx/btrG3JWZ6M3/h33jwKwdMeHHIVXj6FzD30/img.webp&quot; data-alt=&quot;맘에 들었지만 곁눈질로 계속 스캔해보았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxRfx/btrG3JWZ6M3/h33jwKwdMeHHIVXj6FzD30/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxRfx%2FbtrG3JWZ6M3%2Fh33jwKwdMeHHIVXj6FzD30%2Fimg.webp&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;288&quot; data-filename=&quot;WexCy.webp&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;맘에 들었지만 곁눈질로 계속 스캔해보았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;나름 이 친구 괜찮을지도..?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;resource(16).jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctUAFg/btrG3LtJjhs/pKDlgeb64wwwjfxfyGBZ7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctUAFg/btrG3LtJjhs/pKDlgeb64wwwjfxfyGBZ7k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctUAFg/btrG3LtJjhs/pKDlgeb64wwwjfxfyGBZ7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctUAFg%2FbtrG3LtJjhs%2FpKDlgeb64wwwjfxfyGBZ7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;254&quot; data-filename=&quot;resource(16).jpg&quot; data-origin-width=&quot;300&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나름 옆에 끼고 다닐만한 비주얼을 소유했기에 기꺼이 투표를 눌러주었다. 만약 언젠가 위 유저가 이 글을 보게 된다면 댓글을 달아주길 바란다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;동묘로 같이 옷 사러가자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;99449E355BC738FE3A.dib&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJIpD/btrG24tNRcn/I3G1D9Xy7XlEQXfxkahoTk/tfile.dib&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJIpD/btrG24tNRcn/I3G1D9Xy7XlEQXfxkahoTk/tfile.dib&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJIpD/btrG24tNRcn/I3G1D9Xy7XlEQXfxkahoTk/tfile.dib&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJIpD%2FbtrG24tNRcn%2FI3G1D9Xy7XlEQXfxkahoTk%2Ftfile.dib&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;225&quot; data-filename=&quot;99449E355BC738FE3A.dib&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&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 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;span style=&quot;color: #000000;&quot;&gt;그다음 MOD의 핵심중의 핵심 만들기 기능을 이야기해보겠다..!&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;만들기를 나는 MOD를 해야만 하는 세가지 이유 중 하나로 뽑았다..!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지금 배고파서 글이 안써지기에 밥을 먹고 만들기를 이어서 이야기해보겠다..!!!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;FYpQW.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8LBAb/btrGSTNRGFt/HI4BHNAdPkM4sjK7TqofX0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8LBAb/btrGSTNRGFt/HI4BHNAdPkM4sjK7TqofX0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8LBAb/btrGSTNRGFt/HI4BHNAdPkM4sjK7TqofX0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8LBAb%2FbtrGSTNRGFt%2FHI4BHNAdPkM4sjK7TqofX0%2Fimg.webp&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;800&quot; height=&quot;722&quot; data-filename=&quot;FYpQW.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;722&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 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;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 style=&quot;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;GNTcY.webp&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGVDe/btrGWb1wVH2/nIWvTzckvDmW9wHm0GIrW1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGVDe/btrGWb1wVH2/nIWvTzckvDmW9wHm0GIrW1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGVDe/btrGWb1wVH2/nIWvTzckvDmW9wHm0GIrW1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGVDe%2FbtrGWb1wVH2%2FnIWvTzckvDmW9wHm0GIrW1%2Fimg.webp&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;960&quot; height=&quot;747&quot; data-filename=&quot;GNTcY.webp&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;747&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만들기에 이어 말해보겠다.&lt;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20.JPG&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;1023&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJsig/btrG4GZRpT8/JKxgYnCtMBddP6qR8Vr150/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJsig/btrG4GZRpT8/JKxgYnCtMBddP6qR8Vr150/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJsig/btrG4GZRpT8/JKxgYnCtMBddP6qR8Vr150/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuJsig%2FbtrG4GZRpT8%2FJKxgYnCtMBddP6qR8Vr150%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1893&quot; height=&quot;1023&quot; data-filename=&quot;20.JPG&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;1023&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: #000000;&quot;&gt;여러분은 스타 유즈맵을 만들어본적 있는가...?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만들어본적 없다면....&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;102_11979.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZnU5W/btrG4HqUz4e/Bw303xbA86Tk6SLudecKC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZnU5W/btrG4HqUz4e/Bw303xbA86Tk6SLudecKC0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZnU5W/btrG4HqUz4e/Bw303xbA86Tk6SLudecKC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZnU5W%2FbtrG4HqUz4e%2FBw303xbA86Tk6SLudecKC0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;250&quot; data-filename=&quot;102_11979.jpg&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&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 style=&quot;color: #000000;&quot;&gt;직접 코드를 작성할 수 도 있지만 위 사진의 왼쪽에 위치한 Model List에 위치한 Model들을 끌어다 위치시킬 수 있다.&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;21.JPG&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D8TA6/btrG3q4w3Ui/77Bn9RBOKKtw7At8oxHR2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D8TA6/btrG3q4w3Ui/77Bn9RBOKKtw7At8oxHR2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D8TA6/btrG3q4w3Ui/77Bn9RBOKKtw7At8oxHR2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD8TA6%2FbtrG3q4w3Ui%2F77Bn9RBOKKtw7At8oxHR2k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1879&quot; height=&quot;1024&quot; data-filename=&quot;21.JPG&quot; data-origin-width=&quot;1879&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;span style=&quot;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아니라고?&lt;/span&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;&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;span style=&quot;color: #000000;&quot;&gt;나만 PTSD 떠오르는 거라고?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;LpbiW.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6LtIz/btrG4djeJ8r/PaX3jjXShDK1WNbQKlvJbk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6LtIz/btrG4djeJ8r/PaX3jjXShDK1WNbQKlvJbk/img.webp&quot; data-alt=&quot;나만 맞았나봐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6LtIz/btrG4djeJ8r/PaX3jjXShDK1WNbQKlvJbk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6LtIz%2FbtrG4djeJ8r%2FPaX3jjXShDK1WNbQKlvJbk%2Fimg.webp&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;800&quot; height=&quot;636&quot; data-filename=&quot;LpbiW.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;나만 맞았나봐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;MOD는 내가 만든 맵을 도중도중 PLAY 버튼을 통해 직접 플레이 할 수 있다.&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;22.JPG&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2PlGN/btrG2Z0nqgt/qnWDauDndiN6kNxNNzb8Jk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2PlGN/btrG2Z0nqgt/qnWDauDndiN6kNxNNzb8Jk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2PlGN/btrG2Z0nqgt/qnWDauDndiN6kNxNNzb8Jk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2PlGN%2FbtrG2Z0nqgt%2FqnWDauDndiN6kNxNNzb8Jk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1269&quot; height=&quot;677&quot; data-filename=&quot;22.JPG&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;677&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: #000000;&quot;&gt;위는 내가 만든 MOD world를 직접 실행 버튼을 눌러 실행시킨 모습이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위에서 타일과 중학생형과 맞고있는 우리는 모두 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;&lt;span style=&quot;color: #000000;&quot;&gt;Entity는 모두 컴포넌트를 지니고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트는 엔티티의 성질 및 기능을 결정하는 것이라 간단하게 생각해도 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;color: #000000;&quot;&gt;중학생형은 초반에는 말을 할 수 없다. 왜냐하면 Chat을 도와주는 컴포넌트가 없기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;yXdez.webp&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CkClu/btrG4HLf0Rr/5VuKhLHJGM9PFflyK68g2K/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CkClu/btrG4HLf0Rr/5VuKhLHJGM9PFflyK68g2K/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CkClu/btrG4HLf0Rr/5VuKhLHJGM9PFflyK68g2K/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCkClu%2FbtrG4HLf0Rr%2F5VuKhLHJGM9PFflyK68g2K%2Fimg.webp&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;357&quot; height=&quot;363&quot; data-filename=&quot;yXdez.webp&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;363&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: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;23.JPG&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chg62e/btrG3DoWZ9M/K9X8JevROSN20jsAhRfKcK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chg62e/btrG3DoWZ9M/K9X8JevROSN20jsAhRfKcK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chg62e/btrG3DoWZ9M/K9X8JevROSN20jsAhRfKcK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchg62e%2FbtrG3DoWZ9M%2FK9X8JevROSN20jsAhRfKcK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;310&quot; height=&quot;284&quot; data-filename=&quot;23.JPG&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;284&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 ChatBalloonComponent가 말풍선을 만들어주는 컴포넌트이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 위의 FontColor나 Message를 Property라 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Property는 컴포넌트의 세부적인 작동을 설정할 수 있다.&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;&lt;span style=&quot;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;24.JPG&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7u1zO/btrG2uTW0am/I3bnP5mCKZyziE8MI39ub0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7u1zO/btrG2uTW0am/I3bnP5mCKZyziE8MI39ub0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7u1zO/btrG2uTW0am/I3bnP5mCKZyziE8MI39ub0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7u1zO%2FbtrG2uTW0am%2FI3bnP5mCKZyziE8MI39ub0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;331&quot; data-filename=&quot;24.JPG&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;331&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 style=&quot;color: #000000;&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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;25.JPG&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXvW13/btrG25TRqZh/pIB6XNwvf5MjwfaZcKcKY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXvW13/btrG25TRqZh/pIB6XNwvf5MjwfaZcKcKY0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXvW13/btrG25TRqZh/pIB6XNwvf5MjwfaZcKcKY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXvW13%2FbtrG25TRqZh%2FpIB6XNwvf5MjwfaZcKcKY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;162&quot; data-filename=&quot;25.JPG&quot; data-origin-width=&quot;230&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;............&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;26.JPG&quot; data-origin-width=&quot;116&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4AJnn/btrG3qKew9u/QkShUtjg22MBCQRe0K9YPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4AJnn/btrG3qKew9u/QkShUtjg22MBCQRe0K9YPk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4AJnn/btrG3qKew9u/QkShUtjg22MBCQRe0K9YPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4AJnn%2FbtrG3qKew9u%2FQkShUtjg22MBCQRe0K9YPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;116&quot; height=&quot;150&quot; data-filename=&quot;26.JPG&quot; data-origin-width=&quot;116&quot; data-origin-height=&quot;150&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 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;h2 data-ke-size=&quot;size26&quot;&gt;부족한 글 봐주셔서 감사드립니다.&lt;/h2&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;28.JPG&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjPRtN/btrG1zupHRJ/HbA1XGcJf2Kz5QiqTfbQmK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjPRtN/btrG1zupHRJ/HbA1XGcJf2Kz5QiqTfbQmK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjPRtN/btrG1zupHRJ/HbA1XGcJf2Kz5QiqTfbQmK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjPRtN%2FbtrG1zupHRJ%2FHbA1XGcJf2Kz5QiqTfbQmK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;279&quot; data-filename=&quot;28.JPG&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;279&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 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;h3 data-ke-size=&quot;size23&quot;&gt;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 1주차 11일 회고 정리&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;a href=&quot;https://devdongbaek.tistory.com/130&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/130&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657530161358&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 1주차&quot; data-og-description=&quot;&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/130&quot; data-og-url=&quot;https://devdongbaek.tistory.com/130&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/130&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/130&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;멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 1주차&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;devdongbaek.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;</description>
      <category>해커톤, 개인 프로젝트/Nexon MOD 해커톤</category>
      <category>메이플스토리MOD 새우튀김</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/132</guid>
      <comments>https://devdongbaek.tistory.com/132#entry132comment</comments>
      <pubDate>Mon, 11 Jul 2022 18:55:22 +0900</pubDate>
    </item>
    <item>
      <title>11729번: 하노이 탑 이동 순서</title>
      <link>https://devdongbaek.tistory.com/129</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;&lt;span&gt;하노이 탑 이동 순서&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #5cb85c; color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;256 MB&lt;/td&gt;
&lt;td&gt;57592&lt;/td&gt;
&lt;td&gt;28704&lt;/td&gt;
&lt;td&gt;22195&lt;/td&gt;
&lt;td&gt;49.418%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.&lt;/p&gt;
&lt;ol 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;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림은 원판이 5개인 경우의 예시이다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Qxen/btrCXlsGzfC/KzgNPeRAksd4tG23ZhuMhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Qxen/btrCXlsGzfC/KzgNPeRAksd4tG23ZhuMhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Qxen/btrCXlsGzfC/KzgNPeRAksd4tG23ZhuMhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Qxen%2FbtrCXlsGzfC%2FKzgNPeRAksd4tG23ZhuMhk%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;1280&quot; height=&quot;243&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 &amp;le; N &amp;le; 20)이 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 옮긴 횟수 K를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.&lt;/p&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내 정답 코드&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1653309989006&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# n -&amp;gt; 옮겨야 할 원반의 개수 x -&amp;gt; 시작 기둥의 번호 y -&amp;gt; 목표 기둥의 번호
# k -&amp;gt; 첫째 줄에 옮긴 횟수

# 이미 함수로 넘길 때 이동을 시키기에 1에서 시작
k = 1


# x들이 들어있는 리스트
starts_list = []


# y들이 들어있는 리스트
goals_list = []


&quot;&quot;&quot;
    기본 프로세스
    ex) 원반이 3개일 때
    n : x -&amp;gt; y

    1. 바닥에 있는 원반을 제외한 그룹을 시작 기둥에서 중간 기둥으로 옮깁니다.
        1 -&amp;gt; 3
        1 -&amp;gt; 2
        3 -&amp;gt; 2
    
    2. 바닥에 있는 원반을 시작 기둥에서 목표 기둥으로 옮깁니다.
        1 -&amp;gt; 3

    3. 바닥에 있는 원반을 제외한 그룹을 중간 기둥에서 목표 기둥으로 옮깁니다. 
       2 -&amp;gt; 1
       2 -&amp;gt; 3
       1 -&amp;gt; 3
&quot;&quot;&quot;


def hanoi(n, x, y):
    # 전역변수 k를 함수 내에서 사용하기 위해서 global 선언
    global k
    
    # 1. 바닥에 있는 원반을 제외한 그룹을 시작 기둥에서 중간 기둥으로 옮깁니다.
    if n &amp;gt; 1:
        # (2, 1, 2) -&amp;gt; (1, 1, 3), (1, 3, 2)
        hanoi(n - 1, x , 6 - x - y)
        k += 1
    
    # n = 1, 즉 원반이 1개 남았을 때 시작, 목표 기둥 저장
    # 2. 바닥에 있는 원반을 시작 기둥에서 목표 기둥으로 옮깁니다. 
    # (3, 1, 3)
    starts_list.append(x)
    goals_list.append(y)
    
    # 3. 바닥에 있는 원반을 제외한 그룹을 중간 기둥에서 목표 기둥으로 옮깁니다. 
    if n &amp;gt; 1:
        # (2, 2, 3) -&amp;gt; (1, 2, 1), (1, 1, 3)
        hanoi(n - 1, 6 - x - y  , y)
        k += 1


n = int(input())

hanoi(n, 1, 3)

print(k)

for i in range(len(starts_list)):
    print(f&quot;{starts_list[i]} {goals_list[i]}&quot;)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>백준 11729</category>
      <category>백준 파이썬 11729</category>
      <category>파이썬 11729</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/129</guid>
      <comments>https://devdongbaek.tistory.com/129#entry129comment</comments>
      <pubDate>Mon, 23 May 2022 21:47:52 +0900</pubDate>
    </item>
    <item>
      <title>멋쟁이사자처럼 장고 강의 정리</title>
      <link>https://devdongbaek.tistory.com/128</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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대응이 되는 데이터를 표현해주고 싶을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 예외처리&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;/ul&gt;
&lt;pre id=&quot;code_1652944386453&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; try:
 	# 일단 시도해 볼 것
        # 오류가 생길 여지가 있는 코드
 except 발생 오류:
 	# 발생 오류가 발생했을 때 실행할 코드
 finally:
 	#예외가 발생했든 안했든 최종적으로 실행할 코드&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. 클래스와 객체&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;상태 -&amp;gt; 변수, 동작 -&amp;gt; 함수&lt;/li&gt;
&lt;li&gt;상태와 동작을 한번에 여러 개 정의할 수 있는 방법 -&amp;gt; 객체 지향 프로그래밍&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1652944934542&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Panda():
	hp = 10
    
    def move():
    	pass
    
    def attack():
    	pass
        
        
 # 객체
 
 panda1 = Panda()
 panda2 = Panda()
 panda3 = Panda()&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;4. 모듈, 패키지, 라이브러리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모듈 -&amp;gt; 파이썬으로 정의된 파일 ex) a.py, b.py&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1652945132934&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# a.py
def sum(a, b):
	return a+b
    

# b.py
import a
a.sum(1, 2)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패키지 -&amp;gt; 모듈의 집합(폴더), 모듈의 계층 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1652945254285&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# a.py가 data 폴더에 있을 때 data == 패키지
def sum(a, b):
	return a+b
    

# b.py
import data.a
a.sum(1, 2)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라이브러리 -&amp;gt; 쓸 만한 기능들을 미리 모듈 / 패키지로 만들어 놓은 것 ex) 내장함수, pip&lt;/li&gt;
&lt;li&gt;사람들이 만든 라이브러리는 PyPI에 저장되고, 라이브러리를 설치할 때 pip를 이용한다.&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;웹 -&amp;gt; 정보의 그물망&lt;/li&gt;
&lt;li&gt;URL -&amp;gt; 정보 자원이 어디있는지 나타내는 표식&lt;/li&gt;
&lt;li&gt;HTTP -&amp;gt; 정보 자원으로 접근하고 통신하게 해 주는 약속
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET -&amp;gt; 정보 자원을 가져다줘!&lt;/li&gt;
&lt;li&gt;POST -&amp;gt; 이 데이터를 처리해줘!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTML -&amp;gt; 응답으로서의 정보 자원 자체, a태그를 통한 다른 정보 자원가 연결 매개체&lt;/li&gt;
&lt;li&gt;Server -&amp;gt; 요청을 예상하고, 그에 따른 정보 자원을 미리 저장해놓고 제공하는 것&lt;/li&gt;
&lt;li&gt;웹 서비스란? HTML과 URL을 미리 준비해놓고, 사용자 요청에 대한 응답을 보낼 수 있는 프로그램&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;프레임워크 -&amp;gt; 복잡한 문제를 해결하거나 서술하는데 사용되는 기본 개념 &lt;b&gt;구조&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;더 쉬운 말로 &lt;b&gt;정형화&lt;/b&gt; 되어있는 웹 개발을 반복되는 코드 작업을 효율적으로 하기위해 미리 만들어 놓은 웹개발의 기능, 설계 단위의 집합&lt;/li&gt;
&lt;li&gt;프레임워크(django) -&amp;gt; 명확한 목적을 달성하기 위해 이미 설계까지 만들어진 구조, &lt;b&gt;틀&lt;/b&gt;을 무조건 지켜야함&lt;/li&gt;
&lt;li&gt;라이브러리(react) -&amp;gt; 도구의 모음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC, MTV란?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MVC 디자인 패턴(장고에서는 MTV 패턴이라고 부름)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. DB와 상호작용하는 부분 -&amp;gt; model, model(장고 기준)&lt;/li&gt;
&lt;li&gt;2. 사용자들 눈에 보이는 부분 -&amp;gt; view, templates(장고 기준)&lt;/li&gt;
&lt;li&gt;3. 내부 동작의 논리를 담당하는 부분 -&amp;gt; controller, view(장고 기준)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://beomy.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://beomy.tistory.com/43&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1652946799942&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, MVP, MVVM 비교&quot; data-og-description=&quot;웹 개발자로 일을 하면서 가장 먼저 접한 디자인패턴이 바로 MVC 패턴이었습니다. 그만큼 유명하고 많이 쓰이는 디자인패턴인 MVC 패턴과 MVC 패턴에서 파생되어져 나온 MVP 패턴과 MVVM 패턴을 이야&quot; data-og-host=&quot;beomy.tistory.com&quot; data-og-source-url=&quot;https://beomy.tistory.com/43&quot; data-og-url=&quot;https://beomy.tistory.com/43&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hieyo/hyOsgmvHrg/hV96w8tCmewBtYv5ebiEY0/img.png?width=770&amp;amp;height=573&amp;amp;face=0_0_770_573,https://scrap.kakaocdn.net/dn/lREK8/hyOsfnBbMi/tLYLszD2PKMrDck5KkO15k/img.png?width=770&amp;amp;height=573&amp;amp;face=0_0_770_573,https://scrap.kakaocdn.net/dn/pqYuv/hyOs72xTaj/LJiNL88Ruw41xul81sxQY1/img.png?width=770&amp;amp;height=573&amp;amp;face=0_0_770_573&quot;&gt;&lt;a href=&quot;https://beomy.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://beomy.tistory.com/43&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hieyo/hyOsgmvHrg/hV96w8tCmewBtYv5ebiEY0/img.png?width=770&amp;amp;height=573&amp;amp;face=0_0_770_573,https://scrap.kakaocdn.net/dn/lREK8/hyOsfnBbMi/tLYLszD2PKMrDck5KkO15k/img.png?width=770&amp;amp;height=573&amp;amp;face=0_0_770_573,https://scrap.kakaocdn.net/dn/pqYuv/hyOs72xTaj/LJiNL88Ruw41xul81sxQY1/img.png?width=770&amp;amp;height=573&amp;amp;face=0_0_770_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;[디자인패턴] MVC, MVP, MVVM 비교&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹 개발자로 일을 하면서 가장 먼저 접한 디자인패턴이 바로 MVC 패턴이었습니다. 그만큼 유명하고 많이 쓰이는 디자인패턴인 MVC 패턴과 MVC 패턴에서 파생되어져 나온 MVP 패턴과 MVVM 패턴을 이야&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;beomy.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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;1. 가상환경 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;python -m venv 가상환경이름&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 가상환경 실행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;source myvenv/Scripts/activate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. 가상환경 끄기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;deactivate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장고의 기본 파일들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;__init__.py란&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;__init__.py가 위치한 곳이 패키지라는 것을 알려주는 파일&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;urls.py란&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url들을 매핑해주고, 관리해주는 곳&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;pre id=&quot;code_1653550369962&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django-admin startproject 프로젝트명&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;manage.py란&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 서버 켜기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1653090779958&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py runserver&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2. Application 만들기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Application : 하나의 장고 프로젝트를 이루는 단위 ex) 결제기능앱, 게시판기능앱&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1653090919771&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py startapp 앱이름&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3. Database 초기화 및 변경사항 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1653091225937&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4. 관리자 계정 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1653091249535&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py createsuperuser&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;settings.py란&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url을 효율적으로 매핑시키는 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;include를 사용하는 방법 ex) product로 시작하는 url은 product app의 urls.py에서 담당할 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1653551347523&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;path('product/', include('product.urls'), name='product'),&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;product app의 아래 url은 product/first/로 매핑된다.&lt;/p&gt;
&lt;pre id=&quot;code_1653551649980&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('first/', views.products, name='products'),
]&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Static : 미리 준비된 데이터&lt;/li&gt;
&lt;li&gt;Media : 업로드 된 데이터&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;static 파일을 관리 하는 법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;STATICFILES_DIRS : static 파일들의 경로 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 파일들을 하나의 폴더에서 관리 할 때&lt;/p&gt;
&lt;pre id=&quot;code_1653553894162&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;STATICFILES_DIRS = [
    BASE_DIR / 'static',  
]

# 최상위 디렉토리 아래 static 폴더를 만들겠다는 의미입니다.&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;static 파일들을 앱마다 각자의 폴더에서 관리 할 때&lt;/p&gt;
&lt;pre id=&quot;code_1653554361413&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;STATICFILES_DIRS = [
    os.path.join(BASE_DIR, '앱이름', 'static'),  
    os.path.join(BASE_DIR, '앱이름', 'static'),  
    os.path.join(BASE_DIR, '앱이름', 'static')  
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;STATIC_ROOT : 배포시 static 파일들을 복사하여 모아 놓을 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1653554508619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;STATIC_ROOT = os.path.join('staticfiles')&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1653554552129&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py collectstatic&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;STATIC_URL : static 파일을 제공할 url&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1653554569881&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;STATIC_URL = '/static/'&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;장고에서는 최상위 디렉토리는 Base Directory라고 부른다.&lt;/p&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;템플릿에서 staic 폴더 안의 것을 사용하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1653554043433&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% load static %} &amp;lt;--- {% %}은 템플릿에서 장고 기능을 사용할 수 있는 템플릿 언어이다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1653554129779&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;link rel =&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;{% static 'css/style.css' %}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 언어란?&lt;/p&gt;
&lt;pre id=&quot;code_1653558178363&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'url name' %}&quot;&amp;gt;&amp;lt;/a&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;&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;반복되는 html의 구문을 줄이기 위해서 사용한다.&lt;/li&gt;
&lt;li&gt;주로 부트스트랩의 Nav Var을 사용할 때 사용한다.&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;b&gt;부모 html&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653558360259&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;          중복되는 코드 입력


{% block content %}
	자식의 html의 코드가 들어가는 부분
{% endblock %}


	중복되는 코드 입력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자식 html&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653558365003&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends '부모.html' %}

{% block content %}
	자식 html만의 코드 작성
{% endblock %}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model&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;a href=&quot;https://devdongbaek.tistory.com/65&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/65&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655874568859&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;Django의 모델에 대해서&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/65&quot; data-og-url=&quot;https://devdongbaek.tistory.com/65&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbQOBl/hyOQojScOt/Aq8ff56d07ymO0JDlcoZQk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/Yx5F5/hyOQrVdqpl/2qknUMgFFctZhcKTuHxmK1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/cqP1OR/hyOQpwkN4h/lNFUMKMIUO0RjEkqvIkc8K/img.jpg?width=636&amp;amp;height=367&amp;amp;face=0_0_636_367&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/65&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/65&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbQOBl/hyOQojScOt/Aq8ff56d07ymO0JDlcoZQk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/Yx5F5/hyOQrVdqpl/2qknUMgFFctZhcKTuHxmK1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/cqP1OR/hyOQpwkN4h/lNFUMKMIUO0RjEkqvIkc8K/img.jpg?width=636&amp;amp;height=367&amp;amp;face=0_0_636_367');&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;Django의 모델에 대해서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;b&gt;모델 활용 순서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Django&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;model&lt;/span&gt;을 통해, 데이터베이스 형상을 관리할 경우&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모델 클래스 작성&lt;/li&gt;
&lt;li&gt;모델 클래스로부터 변경사항이 담긴 마이그레이션 파일 생성 -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;makemigrations&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령&lt;/li&gt;
&lt;li&gt;변경사항이 있는 마이그레이션 파일을 데이터베이스에 적용 -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;migrate&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령&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;migrate -&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;admin 사이트에서 object 1, 2, 3이 아닌 object 이름으로 표시되게 하는 법&lt;/p&gt;
&lt;pre id=&quot;code_1655874607007&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Blog(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Html 폼 이용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/81&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655874736119&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;Django HTML Form&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/81&quot; data-og-url=&quot;https://devdongbaek.tistory.com/81&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kqfGJ/hyOQkhu3Dz/E5uaIkdHoGwlQ1wkcZZtM1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/czIjAq/hyOQxnDHqn/VGaFRVApXZ5VzhG4kDSesk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/bVqmuJ/hyOQkohYwz/3wwu8kSauhD0NffkoRQZ8k/img.jpg?width=264&amp;amp;height=200&amp;amp;face=102_90_154_147&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kqfGJ/hyOQkhu3Dz/E5uaIkdHoGwlQ1wkcZZtM1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/czIjAq/hyOQxnDHqn/VGaFRVApXZ5VzhG4kDSesk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/bVqmuJ/hyOQkohYwz/3wwu8kSauhD0NffkoRQZ8k/img.jpg?width=264&amp;amp;height=200&amp;amp;face=102_90_154_147');&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;Django HTML Form&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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_1655875254058&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;{% url 'create' %}&quot; method=&quot;POST&quot;&amp;gt;
    {% csrf_token %}
    &amp;lt;div&amp;gt;
        &amp;lt;label for=&quot;title&quot;&amp;gt;제목&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
        &amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;label for=&quot;body&quot;&amp;gt;제목&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;
        &amp;lt;textarea name=&quot;body&quot; id=&quot;body&quot; cols=&quot;30&quot; rows=&quot;10&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
    &amp;lt;/div&amp;gt;  
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 코드에서는&amp;nbsp;팀 이름을 입력하기 위한 텍스트 필드를 단지 한개만 가지는데, 폼이 가질수 있는 입력 요소와 관련&amp;nbsp;라벨의 갯수에는 제한이 없다. 필드의 &amp;nbsp;type&amp;nbsp;속성은 어떤 종류의 위젯이 표시될지 정의한다.&amp;nbsp; 필드의&amp;nbsp;name과&amp;nbsp;id&amp;nbsp;가 JavaScript/CSS/HTML에 있는 필드를 확인하는데 사용되고&amp;nbsp;value는 필드가 처음 표시될 때의 초기값을 정의한다. 관련 팀 라벨은&amp;nbsp;label태그(&amp;nbsp; 위 코드에서 &quot;제목 : &quot;을 확인)를 이용해 명시된다.&amp;nbsp; 여기서&amp;nbsp;for필드는 관련된&amp;nbsp;input의&amp;nbsp;&amp;nbsp;id값을&amp;nbsp;포함하고 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;submit 타입의 input 태그는 (기본적으로) 사용자가 누를수 있는 버튼으로 표시되는데, 버튼의 동작에 의해 폼의 다른 모든 input 요소의 데이터가 서버로 업로드된다.&amp;nbsp; 폼 속성으로는 데이터를 보내기 위해 사용되는 HTTP method와 서버상에서 데이타의 목적지를 ( action으로) 정의한다:&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;html form을 database에 저장하는 로직&lt;/p&gt;
&lt;pre id=&quot;code_1655876289789&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.shortcuts import render, redirect
from django.utils import timezone
from .models import Blog

def home(request):
    return render(request, 'index.html')

# 블로그 글을 저장하는 함수
def create(request):
    if(request.method == 'POST'):
        post = Blog()
        post.title = request.POST['title']
        post.body = request.POST['body']
        post.date = timezone.now()
        post.save()    
    
    return redirect('home')&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;render&amp;nbsp;는 템플릿을 불러오고,&amp;nbsp;redirect&amp;nbsp;는 URL로 이동합니다. URL 로 이동한다는 건 그 URL 에 맞는 views 가 다시 실행될테고 여기서 render 를 할지 다시 redirect 할지 결정할 것 입니다. 이 점에 유의해서 사용하신다면 상황에 맞게 사용하실 수 있을 겁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c;&quot;&gt;Django Form&lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;html-form의-기본-형태&quot;&gt;Html Form의 기본 형태&lt;/h1&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;form action=&amp;rdquo;데이터가 전달될 주소(요청/이동할 주소)&amp;rdquo; method=&amp;rdquo;http 요청 방식&quot;&amp;gt; &amp;lt;input type=&amp;rdquo;text&amp;rdquo; name=&amp;rdquo;title&amp;rdquo;/&amp;gt;
&amp;lt;button type=&amp;rdquo;submit&amp;rdquo;&amp;gt;입력&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form이라는 태그 내에 input 태그, button 태그들로 구성되어 있고 form이 시작되는 form 태그 내부에서는 action과 method의 속성을 기술하도록 되어있다.&lt;/p&gt;
&lt;h2 id=&quot;action&quot; data-ke-size=&quot;size26&quot;&gt;Action&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력되는 정보들을 받는 url&lt;/p&gt;
&lt;h2 id=&quot;method&quot; data-ke-size=&quot;size26&quot;&gt;Method&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청 방식에는 GET / POST / PUT / DELETE 가 있습니다. 보통은 GET / POST를 사용한다.&lt;/p&gt;
&lt;h3 id=&quot;get&quot; data-ke-size=&quot;size23&quot;&gt;GET&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소가 노출되어도 괜찮고, 다른 사용자에게 공유가 가능한 정보를 처리할 때 사용&lt;/p&gt;
&lt;h3 id=&quot;post&quot; data-ke-size=&quot;size23&quot;&gt;POST&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 클래스의 모델 정보들과 연동할 수 있다. (binding)&lt;/li&gt;
&lt;li&gt;Validation 체크 (입력된 정보들의 유효성 검사)를 쉽게 해준다.&lt;/li&gt;
&lt;li&gt;악의적인 데이터를 필터링 한다. (sanitisation)&lt;/li&gt;
&lt;li&gt;짧고 간결한 코드로 폼 인터페이스를 구현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c;&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/83&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655876466222&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;Django를 더 Django스럽게 만들어주는 Form&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/83&quot; data-og-url=&quot;https://devdongbaek.tistory.com/83&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ci5JAF/hyOQsGCHrh/nY6rraYPWeb6W4OeYduzAk/img.jpg?width=576&amp;amp;height=406&amp;amp;face=0_0_576_406,https://scrap.kakaocdn.net/dn/UomGB/hyOQwCh0td/sDNjJlZe7xt4Yl7ck7LPTK/img.jpg?width=576&amp;amp;height=406&amp;amp;face=0_0_576_406,https://scrap.kakaocdn.net/dn/7RD6s/hyOQqWmoTa/lDppQgAWKvSsXpZaLUmZd1/img.jpg?width=610&amp;amp;height=381&amp;amp;face=0_0_610_381&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/83&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ci5JAF/hyOQsGCHrh/nY6rraYPWeb6W4OeYduzAk/img.jpg?width=576&amp;amp;height=406&amp;amp;face=0_0_576_406,https://scrap.kakaocdn.net/dn/UomGB/hyOQwCh0td/sDNjJlZe7xt4Yl7ck7LPTK/img.jpg?width=576&amp;amp;height=406&amp;amp;face=0_0_576_406,https://scrap.kakaocdn.net/dn/7RD6s/hyOQqWmoTa/lDppQgAWKvSsXpZaLUmZd1/img.jpg?width=610&amp;amp;height=381&amp;amp;face=0_0_610_381');&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;Django를 더 Django스럽게 만들어주는 Form&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;forms&lt;/p&gt;
&lt;pre id=&quot;code_1655878366947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django import forms
from .models import Blog

class BlogForm(forms.Form):
    # 내가 입력받고자 하는 값들
    title = forms.CharField()
    body = forms.CharField(widget=forms.Textarea)&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;views&lt;/p&gt;
&lt;pre id=&quot;code_1655879164584&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# django form을 이용해서 입력값을 받는 함수
# GET 요청(= 입력값을 받을 수 있는 html을 가져다 줌)
# POST 요청(= 입력한 내용을 데이터베이스에 저장. form에서 입력한 내용을 처리)
# 둘 다 처리가 가능한 함수
def formcreate(request):
    # 입력 내용을 DB에 저장
    if request.method == 'POST':
        # BlogForm 객체를 만들고 인자로 입력한 값들을 넘김
        form = BlogForm(request.POST, request.FILES) 
        # 유효성 검사에 통과했다면
        if form.is_valid():
            post = Blog()
            post.title = form.cleaned_data['title']
            post.body = form.cleaned_data['body']
            # DB에 최종 저장
            post.save()
            return redirect('home')
        
    # 입력내용을 받을 수 있는 html 전달
    else:
        form = BlogForm()
    
    # render()의 세번째 인자로 views.py의 데이터를 딕셔너리 자료형으로 html에 넘겨줄 수 있다.
    return render(request, 'form_create.html', {'form':form} )&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;&lt;span style=&quot;background-color: #ffffff; color: #5c5c5c;&quot;&gt;Django ModelForm&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/87&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/87&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655879482330&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;Django ModelForm이란?&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/87&quot; data-og-url=&quot;https://devdongbaek.tistory.com/87&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csoCOi/hyOQpJZk7M/Dwlp5owjmmpKWQK8kri16k/img.jpg?width=191&amp;amp;height=35&amp;amp;face=0_0_191_35,https://scrap.kakaocdn.net/dn/cgmZjL/hyOQxVzJJB/jZv8b9YPBYXRDxAWVeBKJ1/img.jpg?width=191&amp;amp;height=35&amp;amp;face=0_0_191_35,https://scrap.kakaocdn.net/dn/dkQdiF/hyOQmmbAzh/z6ZKJzXwOL2ZOqnzzqXIOk/img.jpg?width=448&amp;amp;height=470&amp;amp;face=0_0_448_470&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/87&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/87&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csoCOi/hyOQpJZk7M/Dwlp5owjmmpKWQK8kri16k/img.jpg?width=191&amp;amp;height=35&amp;amp;face=0_0_191_35,https://scrap.kakaocdn.net/dn/cgmZjL/hyOQxVzJJB/jZv8b9YPBYXRDxAWVeBKJ1/img.jpg?width=191&amp;amp;height=35&amp;amp;face=0_0_191_35,https://scrap.kakaocdn.net/dn/dkQdiF/hyOQmmbAzh/z6ZKJzXwOL2ZOqnzzqXIOk/img.jpg?width=448&amp;amp;height=470&amp;amp;face=0_0_448_470');&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;Django ModelForm이란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;forms&lt;/p&gt;
&lt;pre id=&quot;code_1655880413752&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class BlogModelForm(forms.ModelForm):
    class Meta:
        model = Blog
        #fields = '__all__'
        fields = ['title', 'body']&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;views&lt;/p&gt;
&lt;pre id=&quot;code_1655880515617&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def modelformcreate(request):
    # 입력 내용을 DB에 저장
    if request.method == 'POST':
        # BlogForm 객체를 만들고 인자로 입력한 값들을 넘김
        form = BlogModelForm(request.POST, request.FILES) 
        # 유효성 검사에 통과했다면
        if form.is_valid():
            # DB에 최종 저장
            form.save()
            return redirect('home')
        
    # 입력내용을 받을 수 있는 html 전달
    else:
        form = BlogModelForm()
    
    # render()의 세번째 인자로 views.py의 데이터를 딕셔너리 자료형으로 html에 넘겨줄 수 있다.
    return render(request, 'form_create.html', {'form':form} )&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_1655878798206&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;table&amp;gt;
        {{ form.as_ul }}
    &amp;lt;/table&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;{{ 인자.as_감쌀태그 }}를 통해서views로 부터 넘겨받은 form 인자를 감싸는 태그를 자동으로 생성할 수 있다.&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;model 값 update&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@fregataa/django-QuerySet.update-vs-QuerySet.bulkupdate-vs-Model.save&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@fregataa/django-QuerySet.update-vs-QuerySet.bulkupdate-vs-Model.save&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655875969541&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;[django] model update&quot; data-og-description=&quot;어무해django에서 업데이트, 무엇이 다른가?? QuerySet.bulk_update() QuerySet.update() Model.save()&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@fregataa/django-QuerySet.update-vs-QuerySet.bulkupdate-vs-Model.save&quot; data-og-url=&quot;https://velog.io/@fregataa/django-QuerySet.update-vs-QuerySet.bulkupdate-vs-Model.save&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cUhX1M/hyOQyz6a7q/SvJNYHSB18C0uYWpikbRKk/img.png?width=1200&amp;amp;height=546&amp;amp;face=0_0_1200_546,https://scrap.kakaocdn.net/dn/cF3KzR/hyOQpiRyNx/xpGgzeR2cA0QWLbLIZXBa1/img.png?width=1200&amp;amp;height=546&amp;amp;face=0_0_1200_546,https://scrap.kakaocdn.net/dn/0P2im/hyOQv4sat6/bnjieHXWfIrW20LA2TRJl1/img.png?width=1794&amp;amp;height=856&amp;amp;face=0_0_1794_856&quot;&gt;&lt;a href=&quot;https://velog.io/@fregataa/django-QuerySet.update-vs-QuerySet.bulkupdate-vs-Model.save&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@fregataa/django-QuerySet.update-vs-QuerySet.bulkupdate-vs-Model.save&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cUhX1M/hyOQyz6a7q/SvJNYHSB18C0uYWpikbRKk/img.png?width=1200&amp;amp;height=546&amp;amp;face=0_0_1200_546,https://scrap.kakaocdn.net/dn/cF3KzR/hyOQpiRyNx/xpGgzeR2cA0QWLbLIZXBa1/img.png?width=1200&amp;amp;height=546&amp;amp;face=0_0_1200_546,https://scrap.kakaocdn.net/dn/0P2im/hyOQv4sat6/bnjieHXWfIrW20LA2TRJl1/img.png?width=1794&amp;amp;height=856&amp;amp;face=0_0_1794_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;[django] model update&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어무해django에서 업데이트, 무엇이 다른가?? QuerySet.bulk_update() QuerySet.update() Model.save()&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/56&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/56&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655884825574&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;동백 // Django 모델을 통한 조회 ( 기초 )Q&quot; data-og-description=&quot;&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/56&quot; data-og-url=&quot;https://devdongbaek.tistory.com/56&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/56&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/56&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;동백 // Django 모델을 통한 조회 ( 기초 )Q&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;devdongbaek.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/55&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/55&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655884845302&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;동백 // Django 모델을 통한 조회 ( 기초 )Q&quot; data-og-description=&quot;&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/55&quot; data-og-url=&quot;https://devdongbaek.tistory.com/55&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/55&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/55&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;동백 // Django 모델을 통한 조회 ( 기초 )Q&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;devdongbaek.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;QuerySet -&amp;gt; 데이터베이스로부터 전달받은 데이터 객체 목록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/ko/4.0/ref/models/querysets/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/ko/4.0/ref/models/querysets/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655885892868&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;QuerySet API reference | Django 문서 | Django&quot; data-og-description=&quot;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/ko/4.0/ref/models/querysets/&quot; data-og-url=&quot;https://docs.djangoproject.com/ko/4.0/ref/models/querysets/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/ko/4.0/ref/models/querysets/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/ko/4.0/ref/models/querysets/&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;QuerySet API reference | Django 문서 | Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;쿼리셋은 RDBMS의 SELECT 문을 생각하면 된다.&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디테일 페이지 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/109&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/109&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655886104720&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;Django 포스팅 detail view 구현&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/109&quot; data-og-url=&quot;https://devdongbaek.tistory.com/109&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6K1cU/hyORHWC2sq/oNe3tQZKITuPtPVHhbVBf0/img.jpg?width=800&amp;amp;height=859&amp;amp;face=347_450_454_566,https://scrap.kakaocdn.net/dn/YIHh3/hyOQqhUNkW/SwzSI9IRquWbN9Z2Jwt6h1/img.jpg?width=800&amp;amp;height=859&amp;amp;face=347_450_454_566,https://scrap.kakaocdn.net/dn/ECEEO/hyORPAmszC/wDsTx5KTVrtMgyiPQBni21/img.jpg?width=837&amp;amp;height=899&amp;amp;face=376_309_603_595&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/109&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/109&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6K1cU/hyORHWC2sq/oNe3tQZKITuPtPVHhbVBf0/img.jpg?width=800&amp;amp;height=859&amp;amp;face=347_450_454_566,https://scrap.kakaocdn.net/dn/YIHh3/hyOQqhUNkW/SwzSI9IRquWbN9Z2Jwt6h1/img.jpg?width=800&amp;amp;height=859&amp;amp;face=347_450_454_566,https://scrap.kakaocdn.net/dn/ECEEO/hyORPAmszC/wDsTx5KTVrtMgyiPQBni21/img.jpg?width=837&amp;amp;height=899&amp;amp;face=376_309_603_595');&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;Django 포스팅 detail view 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;Model을 작성할 때 primary key를 등록하지 않았다면, Django는 id 값이라는 pk를 스스로 만들어 primary key로 등록해준다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;id -&amp;gt; 객체가 데이터베이스에 post 된 순서&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655886707210&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'url이름' 변수 %}&quot;&amp;gt;제목 : {{ i.title }}&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url&amp;nbsp; 'url이름'&amp;nbsp; 뒤 오는 변수는 주소 url의 함수에 인자로 넘길 값을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1655886854260&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'detail' i.id %}&quot;&amp;gt;제목 : {{ i.title }}&amp;lt;/a&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;&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는 매개 변수나 인자 값으로 사용되기에 원하는 이름으로 설정가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;!중요한 것은 views나 url에서 사용하는 id는 매개변수이기에 원하는 이름으로 지정가능('url의 &amp;lt;int&amp;gt;:변수'와&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'views의 def detail(request, 변수)' 의 이름이 같다는 전제하에) 그러나 html에서는 반드시 {{ 변수.id }} id나 pk로 적어야 한다.&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;1. url에서 id값이 있는 detail 주소를 받고, detail 함수에 매핑시켜줌&lt;/p&gt;
&lt;pre id=&quot;code_1655887673388&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;path('detail/&amp;lt;int:id&amp;gt;' , views.detail, name='detail'),&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. detail 함수에서 id 값을 인자로 받고, id번째 글을 데이터베이스로부터 가져와서 detail.html으로 전달&lt;/p&gt;
&lt;pre id=&quot;code_1655887954508&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def detail(request, id):
    # id 번째 블로그 글을 데이터베이스에서 가져와서 detail.html로 띄워주는 코드
    # get_object_or_404는 첫번째 인자로 특정 객체를 가져올 데이터베이스,
    # 두번째 인자로는 특정 객체의 pk값을 받습니다.
    blog_detail = get_object_or_404(Blog, pk = id)
    
    return render(request, 'detail.html', {'blog_detail':blog_detail} )&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;get_object_or_404()는 id값을 이용해 특정 모델 객체 하나만 가져온다.&amp;nbsp;&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;3. detail.html에서 해당 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;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Media 파일 업로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/54&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/54&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655965139608&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;동백 // Django media 파일을 다루는 방법&quot; data-og-description=&quot;&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/54&quot; data-og-url=&quot;https://devdongbaek.tistory.com/54&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/54&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/54&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;동백 // Django media 파일을 다루는 방법&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;devdongbaek.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_1655965317379&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

MEDIA_URL = '/media/'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. MEDIA_URL = &quot;&quot;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 media 파일에 대한 URL Prefix&amp;nbsp; #필드명.url 속성에 의해서 참조되는 설정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파일에 대한 url 접근시에 사용된다~!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. MEDIA_ROOT = &quot;&quot;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일필드를 통한 저장 시에, 실제 파일을 저장할 ROOT 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Django에서 media 다루는 순서 요약하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. MEDIA_URL 설정&lt;/p&gt;
&lt;pre id=&quot;code_1655965533522&quot; class=&quot;ini&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# settings.py
MEDIA_URL = &quot;/media/&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. MEDIA_ROOT 설정&lt;/p&gt;
&lt;pre id=&quot;code_1655965533522&quot; class=&quot;ini&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, &quot;media&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. URL 지정&lt;/p&gt;
&lt;pre id=&quot;code_1655965533522&quot; class=&quot;nimrod&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# settings.py 경로의 urls.py
from django.conf.urls.static import static
...
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. pillow 패키지 설치&lt;/p&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. media 파일 저장하기&lt;/p&gt;
&lt;pre id=&quot;code_1655965533523&quot; class=&quot;reasonml&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    photo = models.ImageField(blank=True, upload_to='instagram/post/%Y/%m/%d')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. media 파일 사용하기&lt;/p&gt;
&lt;pre id=&quot;code_1655965533523&quot; class=&quot;xml&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;img src={post.photo.url} style=&quot;width:100px; height:100px&quot; /&amp;gt;
&amp;lt;img src={post.photo.path} style=&quot;width:100px; height:100px&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url은 Django에서 저장한 사진의 주소이고, path는 실제 사진이 저장된 서버 컴퓨터 내에서의 주소이기에 보안상으로 url 사용 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;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://devdongbaek.tistory.com/118&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/118&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655966973712&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;Django 댓글 구현하기&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/118&quot; data-og-url=&quot;https://devdongbaek.tistory.com/118&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4sZH1/hyOQsAymTJ/vVSKdNfQWeAcEZFkBkk2E1/img.jpg?width=601&amp;amp;height=829&amp;amp;face=208_277_398_485,https://scrap.kakaocdn.net/dn/b55W7t/hyORTcdbgi/pN8g2cAdK63gM8p9yhtTM0/img.jpg?width=601&amp;amp;height=829&amp;amp;face=208_277_398_485,https://scrap.kakaocdn.net/dn/bZLy9B/hyORLrHNHr/usg4PPuqDC1cVW4UwyEKrK/img.jpg?width=601&amp;amp;height=829&amp;amp;face=208_277_398_485&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/118&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/118&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4sZH1/hyOQsAymTJ/vVSKdNfQWeAcEZFkBkk2E1/img.jpg?width=601&amp;amp;height=829&amp;amp;face=208_277_398_485,https://scrap.kakaocdn.net/dn/b55W7t/hyORTcdbgi/pN8g2cAdK63gM8p9yhtTM0/img.jpg?width=601&amp;amp;height=829&amp;amp;face=208_277_398_485,https://scrap.kakaocdn.net/dn/bZLy9B/hyORLrHNHr/usg4PPuqDC1cVW4UwyEKrK/img.jpg?width=601&amp;amp;height=829&amp;amp;face=208_277_398_485');&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;Django 댓글 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;pre id=&quot;code_1655967292204&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Blog(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    photo = models.ImageField(blank=True, null=True, upload_to='blog_photo')
    date = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title
    
    
class Comment(models.Model):
    comment = models.CharField(max_length=200)
    date = models.DateTimeField(auto_now_add=True)
    # 1:N 관계에서는 N측에 1의 기본키를 가져와 외래키로 구성한다.
    post = models.ForeignKey(Blog, on_delete=models.CASCADE)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외래키 같은 경우는 데이터베이스 수업 참조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;commit=False를 쓰는 이유는?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어서 필드가 4개가 있는 모델을 모델 폼으로 작성을 받을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;나는 그 중 1개의 필드만 폼으로 작성하고 싶다!!&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;005&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/005.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/005.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 경우에 view 함수에서 유효성 검사 이후 form.save()를 먼저 하면 나머지 필드들은 값을 받지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;못했으므로 오류가 발생합니다!&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;035&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/035.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/035.gif&quot; width=&quot;150&quot; /&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&gt;그러기에 우리는 장고에게 잠시만 저장을 미뤄줘~~! 라는 의미로 commit=False를 적어준 다음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;pre id=&quot;code_1655968539613&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% for comment in blog_detail.comment_set.all %}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1:N에서 1측의 특정 객체를 참조하고있는 N측의 집합을 모두 가져오고 싶을 때 필드_set.all 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인, 로그아웃 구현하기&lt;/p&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;a href=&quot;https://devdongbaek.tistory.com/100&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/100&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655969608317&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;Django 로그인, 로그아웃 구현하기&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/100&quot; data-og-url=&quot;https://devdongbaek.tistory.com/100&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fmB1Z/hyOQjwRfkd/0xQYsbR1pkNrjE1OcqDcH1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/b8OEFp/hyORGqrofF/Qi8M22HOxemtKUhUx7wUYk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/wYIbV/hyORGqrofb/vSli7TYcFIQficHuz4aot0/img.jpg?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/100&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/100&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fmB1Z/hyOQjwRfkd/0xQYsbR1pkNrjE1OcqDcH1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/b8OEFp/hyORGqrofF/Qi8M22HOxemtKUhUx7wUYk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/wYIbV/hyORGqrofb/vSli7TYcFIQficHuz4aot0/img.jpg?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200');&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;Django 로그인, 로그아웃 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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_1655970226059&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;{% url 'login' %}&quot; method=&quot;POST&quot;&amp;gt;
    {% csrf_token %}
    username : &amp;lt;input type=&quot;text&quot; name='username'&amp;gt;
    password : &amp;lt;input type=&quot;text&quot; name='password'&amp;gt;
    &amp;lt;br /&amp;gt;
    &amp;lt;input type=&quot;submit&quot; value='로그인'&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 form&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1655971040786&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.shortcuts import redirect, render
from django.contrib import auth
from django.contrib.auth.models import User

# Create your views here.

def login(request):
    # POST 요청이 들어오면 로그인 처리를 해줌
    if request.method == 'POST':
        # 클라이언트가 입력한 값을 변수에 저장
        username = request.POST['username']
        password = request.POST['password']
        
        # auth.authenticate()은 사용자가 입력한 username과 password가 데이터에 저장되어 있는지 확인 후 
        # 저장되어 있으면 user 객체를 반환하고, 없다면 None을 반환하는 함수
        user = auth.authenticate(request, username=username, password=password)
        
        if user is not None:
            auth.login(request, user)
            return redirect('home')
        else:
            return render(request, 'home')
                
    # GET 요청이 들어오면 login form을 담고있는 login.html을 띄워주는 역할을 함
    else:
        return render(request, 'login.html')&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655971187290&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def logout(request):
    auth.logout(request)
    return redirect('home')&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그아웃 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655971227156&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LOGIN_REDIRECT_URL = &quot;/&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 성공시 이동할 주소를 settings.py에서 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET과 POST의 차이를 잘 이해하자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET은 유저에게 페이지를 보여줄 때&amp;nbsp;&lt;/li&gt;
&lt;li&gt;POST는 유저가 입력한 값을 서버로 전송할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655970514209&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;django.contrib.auth | Django documentation | Django&quot; data-og-description=&quot;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; data-og-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&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;django.contrib.auth | Django documentation | Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익명 게시판&lt;/p&gt;
&lt;p 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_1656580892274&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;div class=&quot;card-body&quot;&amp;gt;
        &amp;lt;div class=&quot;table-responsive&quot;&amp;gt;
            &amp;lt;table class=&quot;table table-bordered&quot; id=&quot;dataTable&quot; width=&quot;100%&quot; cellspacing=&quot;0&quot;&amp;gt;
                &amp;lt;thead&amp;gt;
                    &amp;lt;tr&amp;gt;
                        &amp;lt;th width='70%'&amp;gt;글 제목&amp;lt;/th&amp;gt;
                        &amp;lt;th&amp;gt;작성 날짜&amp;lt;/th&amp;gt;
                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                    &amp;lt;/tr&amp;gt;
                &amp;lt;/thead&amp;gt;
                &amp;lt;tbody&amp;gt;
                    {% for post in posts %}
                    &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;{{ post.title }}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;{{ post.date }}&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;익명&amp;lt;/td&amp;gt;
                    &amp;lt;/tr&amp;gt;
                    {% endfor %}
                &amp;lt;/tbody&amp;gt;
            &amp;lt;/table&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작성자를 표시 하지 않고 그냥 작성자라고 아예 명시함&lt;/li&gt;
&lt;/ul&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;캡처.JPG&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FcyKC/btrGapSypke/AFkkLAovNkuISKO6halrGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FcyKC/btrGapSypke/AFkkLAovNkuISKO6halrGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FcyKC/btrGapSypke/AFkkLAovNkuISKO6halrGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFcyKC%2FbtrGapSypke%2FAFkkLAovNkuISKO6halrGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;494&quot; data-filename=&quot;캡처.JPG&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;494&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_1656581669334&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                &amp;lt;tbody&amp;gt;
                    {% for post in posts %}
                    &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;{% url 'detail' post.id %}&quot;&amp;gt;{{ post.title }}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;{{ post.date }}&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;익명&amp;lt;/td&amp;gt;
                    &amp;lt;/tr&amp;gt;
                    {% endfor %}
                &amp;lt;/tbody&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;&amp;lt;tbody&amp;gt; 태그는 HTML 테이블에서 내용 콘텐츠(body content)들을 하나의 그룹으로 묶을 때 사용합니다.&lt;/p&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;lt;tbody&amp;gt; 요소는 테이블의 각 영역(header, body, footer)을 명시하기 위해 &amp;lt;thead&amp;gt;, &amp;lt;tfoot&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;tbody&amp;gt; 요소는 &amp;lt;table&amp;gt; 요소의 자식 요소로써, 반드시 모든 &amp;lt;caption&amp;gt;, &amp;lt;colgroup&amp;gt;, &amp;lt;thead&amp;gt; 요소 다음에 위치해야 합니다. 또한, &amp;lt;tbody&amp;gt; 요소는 반드시 하나 이상의 &amp;lt;tr&amp;gt; 요소를 포함하고 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;thead&amp;gt;와 &amp;lt;tbody&amp;gt;, &amp;lt;tfoot&amp;gt; 요소는 기본적으로 웹 페이지의 레이아웃에 전혀 영향을 주지 않지만, 이 요소들의 스타일을 CSS를 사용하여 변경할 수는 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;글들을 표현할 때는 table을 이용하여 목록을 구성&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;a href=&quot;https://getbootstrap.com/docs/4.1/content/tables/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://getbootstrap.com/docs/4.1/content/tables/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656581900694&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;Tables&quot; data-og-description=&quot;Documentation and examples for opt-in styling of tables (given their prevalent use in JavaScript plugins) with Bootstrap.&quot; data-og-host=&quot;getbootstrap.com&quot; data-og-source-url=&quot;https://getbootstrap.com/docs/4.1/content/tables/&quot; data-og-url=&quot;https://getbootstrap.com/docs/4.1/content/tables/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rDq3j/hyOW0osP7H/ak9ZmroCs1ZalTVg1Jg1i0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c4MQ4n/hyOVYTkDn1/CQQgc1PLNKX8SmHGxg7uLK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600&quot;&gt;&lt;a href=&quot;https://getbootstrap.com/docs/4.1/content/tables/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://getbootstrap.com/docs/4.1/content/tables/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rDq3j/hyOW0osP7H/ak9ZmroCs1ZalTVg1Jg1i0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c4MQ4n/hyOVYTkDn1/CQQgc1PLNKX8SmHGxg7uLK/img.png?width=600&amp;amp;height=600&amp;amp;face=0_0_600_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;Tables&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Documentation and examples for opt-in styling of tables (given their prevalent use in JavaScript plugins) with Bootstrap.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;getbootstrap.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;pre id=&quot;code_1656583592637&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 댓글 저장
def new_comment(request, pk):
    filled_form = CommentForm(request.POST)
    if filled_form.is_valid():
        filled_form.save(commit=False)
        filled_form.post = get_object_or_404(Post, pk=pk)
        filled_form.save()
    return redirect('detail', pk)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;commit=False를 통해서 Comment의 외래키를 해당 포스트의 글 pk로 지정&amp;nbsp; 후 최종 저장한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 실패시 문구가 뜨게 하는 법&lt;/p&gt;
&lt;pre id=&quot;code_1656587542515&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% if form.errors %}
                    &amp;lt;p style=&quot;color:red;&quot;&amp;gt;아이디, 비밀번호가 일치하지 않습니다. 다시 시도해주세요.&amp;lt;/p&amp;gt;
{% endif %}&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;클래스 뷰(CBV)를 사용해서 로그인, 로그아웃 구현&lt;/p&gt;
&lt;pre id=&quot;code_1656587621859&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.contrib.auth.views import LoginView, LogoutView, logout_then_login


login = LoginView.as_view(template_name= &quot;login.html&quot;)

#def logout(request):
    #return logout_then_login(request)

logout = LogoutView.as_view(next_page = &quot;login&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;Form들에 부트스트랩을 적용하기 위해서는 클래스를 적용해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656592477886&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django import forms
from .models import Post, Comment

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'
    
    def __init__(self, *args, **kwargs):
        super(PostForm, self).__init__(*args, **kwargs)

        self.fields['title'].widget.attrs = {
            'class': 'form-control',
            'placeholder': &quot;글 제목을 입력해주세요&quot;,
            'rows': 20
        }

        self.fields['body'].widget.attrs = {
            'class': 'form-control',
            'placeholder': &quot;글 제목을 입력해주세요&quot;,
            'rows': 20,
            'cols' : 100
        }


class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['comment']

    def __init__(self, *args, **kwargs):
        super(CommentForm, self).__init__(*args, **kwargs)

        self.fields['comment'].widget.attrs = {
            'class': 'form-control',
            'placeholder': &quot;댓글을 입력해주세요&quot;,
            'rows': 10
        }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;widget.attrs은 widget에 클래스를 부여해주고, 아래 처럼 이 클래스를 통해 부트스트랩이나 css를 적용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1656592646669&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; class=&quot;form-control bg-light border-0 small&quot;
                                            placeholder=&quot;Search for...&quot; aria-label=&quot;Search&quot;
                                            aria-describedby=&quot;basic-addon2&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;&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;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/forms/widgets/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/forms/widgets/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656592680939&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;Widgets | Django documentation | Django&quot; data-og-description=&quot;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/forms/widgets/&quot; data-og-url=&quot;https://docs.djangoproject.com/en/4.0/ref/forms/widgets/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/forms/widgets/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/forms/widgets/&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;Widgets | Django documentation | Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;a href=&quot;https://ssungkang.tistory.com/entry/Django-widget-1-widget%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-widget-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B8%80%EC%9E%90%EC%88%98-%ED%91%9C%EC%8B%9C-widget&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ssungkang.tistory.com/entry/Django-widget-1-widget%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-widget-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B8%80%EC%9E%90%EC%88%98-%ED%91%9C%EC%8B%9C-widget&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656592287062&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;[Django] widget (1) widget의 원리와 widget 만들어보기 - 실시간 글자수 표시 widget&quot; data-og-description=&quot;input 태그는 type 속성에 따라 여러 모습을 보여줍니다. text 일 때는 글을 입력할 수 있도록, date 일 때는 날짜를 지정할 수 있도록, password 일 때는 비밀번호를 입력할 수 있도록 하는 등 다양한 type&quot; data-og-host=&quot;ssungkang.tistory.com&quot; data-og-source-url=&quot;https://ssungkang.tistory.com/entry/Django-widget-1-widget%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-widget-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B8%80%EC%9E%90%EC%88%98-%ED%91%9C%EC%8B%9C-widget&quot; data-og-url=&quot;https://ssungkang.tistory.com/entry/Django-widget-1-widget%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-widget-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B8%80%EC%9E%90%EC%88%98-%ED%91%9C%EC%8B%9C-widget&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Z3NPb/hyOV4sAouZ/u1uX2OoCvgRB2rYdTWUEI0/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/baQ8Vq/hyOV5E3MJ6/KvRx7kkKVVcUtXCrXpc8Hk/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/qrSuJ/hyOVUcq0ll/yR8JVvi8cxejFsF2jsAWT0/img.png?width=1856&amp;amp;height=1202&amp;amp;face=0_0_1856_1202&quot;&gt;&lt;a href=&quot;https://ssungkang.tistory.com/entry/Django-widget-1-widget%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-widget-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B8%80%EC%9E%90%EC%88%98-%ED%91%9C%EC%8B%9C-widget&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ssungkang.tistory.com/entry/Django-widget-1-widget%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-widget-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EA%B8%80%EC%9E%90%EC%88%98-%ED%91%9C%EC%8B%9C-widget&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Z3NPb/hyOV4sAouZ/u1uX2OoCvgRB2rYdTWUEI0/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/baQ8Vq/hyOV5E3MJ6/KvRx7kkKVVcUtXCrXpc8Hk/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/qrSuJ/hyOVUcq0ll/yR8JVvi8cxejFsF2jsAWT0/img.png?width=1856&amp;amp;height=1202&amp;amp;face=0_0_1856_1202');&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;[Django] widget (1) widget의 원리와 widget 만들어보기 - 실시간 글자수 표시 widget&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;input 태그는 type 속성에 따라 여러 모습을 보여줍니다. text 일 때는 글을 입력할 수 있도록, date 일 때는 날짜를 지정할 수 있도록, password 일 때는 비밀번호를 입력할 수 있도록 하는 등 다양한 type&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ssungkang.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;pre id=&quot;code_1656593708937&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.contrib.auth.models import User

# 자유 게시물 모델
class FreePost(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    
    def __str__(self):
        return self.title&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User를 외래키로 삼아서 작성자를 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1656594756611&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def freepostcreate(request):
    if request.method == 'POST' or request.method == 'FILES':
        # BlogForm 객체를 만들고 인자로 입력한 값들을 넘김
        form = FreePostForm(request.POST, request.FILES) 
        # 유효성 검사에 통과했다면
        if form.is_valid():           
            # DB에 최종 저장
            finished_form = form.save(commit=False)
            finished_form.author = request.user
            finished_form.save()
            return redirect('freehome')
        
    # 입력내용을 받을 수 있는 html 전달
    else:
        form = FreePostForm()
    
    # render()의 세번째 인자로 views.py의 데이터를 딕셔너리 자료형으로 html에 넘겨줄 수 있다.
    return render(request, 'free_post_form.html', {'form':form})&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 유저를 글 작성자로 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1656594804418&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            finished_form.author = request.user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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://devdongbaek.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/92&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656600616422&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;Django 회원가입, 로그인 구현하기!!!&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/92&quot; data-og-url=&quot;https://devdongbaek.tistory.com/92&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wKZlq/hyOV2auwQF/MiBNi0KAvs6Qdgz4l9rPrk/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/is0Cl/hyOVUXPZDD/IQUKK58GZtuqCgErtNqWrK/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/RF5m7/hyOW2UfAkj/ONajP941wh27Rom5EMboBK/img.jpg?width=906&amp;amp;height=791&amp;amp;face=0_0_906_791&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/92&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wKZlq/hyOV2auwQF/MiBNi0KAvs6Qdgz4l9rPrk/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/is0Cl/hyOVUXPZDD/IQUKK58GZtuqCgErtNqWrK/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/RF5m7/hyOW2UfAkj/ONajP941wh27Rom5EMboBK/img.jpg?width=906&amp;amp;height=791&amp;amp;face=0_0_906_791');&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;Django 회원가입, 로그인 구현하기!!!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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_1656600653036&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.shortcuts import render, redirect
from django.contrib.auth.views import LoginView, LogoutView, logout_then_login
from django.contrib import auth
from django.contrib.auth.models import User

def signup(request):
    if request.method == &quot;POST&quot;:
        # 만약 첫 비밀번호와 나중 비밀번호가 같다면
        if request.POST['password'] == request.POST['repeat']:
            # 회원가입
            new_user = User.objects.create_user(username=request.POST['username'], password=request.POST['password'])
            # 로그인
            auth.login(request, new_user)
            # 홈 리다이렉션
            return redirect('home')
    
    # 같지 않다면 다시 회원가입 페이지로       
    return render(request, 'register.html')&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656600673236&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                            &amp;lt;form class=&quot;user&quot; method=&quot;POST&quot;&amp;gt;
                                {% csrf_token %}
                                &amp;lt;div class=&quot;form-group row&quot;&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;form-group&quot;&amp;gt;
                                    &amp;lt;input type=&quot;text&quot; name=&quot;username&quot; class=&quot;form-control form-control-user&quot; id=&quot;exampleInputEmail&quot;
                                        placeholder=&quot;Enter Your ID...&quot;&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;form-group row&quot;&amp;gt;
                                    &amp;lt;div class=&quot;col-sm-6 mb-3 mb-sm-0&quot;&amp;gt;
                                        &amp;lt;input type=&quot;password&quot; name=&quot;password&quot; class=&quot;form-control form-control-user&quot;
                                            id=&quot;exampleInputPassword&quot; placeholder=&quot;Password&quot;&amp;gt;
                                    &amp;lt;/div&amp;gt;
                                    &amp;lt;div class=&quot;col-sm-6&quot;&amp;gt;
                                        &amp;lt;input type=&quot;password&quot; name=&quot;repeat&quot; class=&quot;form-control form-control-user&quot;
                                            id=&quot;exampleRepeatPassword&quot; placeholder=&quot;Repeat Password&quot;&amp;gt;
                                    &amp;lt;/div&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;br/&amp;gt;
                                &amp;lt;br/&amp;gt;
                                &amp;lt;br/&amp;gt;
                                &amp;lt;input type=&quot;submit&quot; class=&quot;btn btn-success btn-user btn-block&quot; value=&quot;회원가입&quot;&amp;gt;
                                &amp;lt;hr&amp;gt;
                            &amp;lt;/form&amp;gt;
                            &amp;lt;div class=&quot;text-center&quot;&amp;gt;
                                &amp;lt;a class=&quot;small&quot; href=&quot;{% url 'login' %}&quot;&amp;gt;Already have an account? Login!&amp;lt;/a&amp;gt;
                            &amp;lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pagination&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ssungkang.tistory.com/entry/Django-11-Pagination-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ssungkang.tistory.com/entry/Django-11-Pagination-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656759021189&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;[Django] 11. Pagination 을 알아보자&quot; data-og-description=&quot;안녕하세요 강민성입니다. 이번 시간에도 마찬가지로 blog project를 이어서 진행해보도록 하겠습니다. 글을 계속 추가할수록 글은 아래로 쌓이게 됩니다. 하지만 대부분의 웹사이트는 일정 수준 &quot; data-og-host=&quot;ssungkang.tistory.com&quot; data-og-source-url=&quot;https://ssungkang.tistory.com/entry/Django-11-Pagination-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&quot; data-og-url=&quot;https://ssungkang.tistory.com/entry/Django-11-Pagination-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl8dkz/hyOWY6Xzcv/Q1hKwxS6CBUo2zfOJQz2k0/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/brWMmp/hyOYrfmBDX/giykSuVUb04sU02OzLxvNk/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/cLFGLj/hyOW3mRMzV/7RDc6qGPguayfXGOTeC4FK/img.png?width=820&amp;amp;height=814&amp;amp;face=0_0_820_814&quot;&gt;&lt;a href=&quot;https://ssungkang.tistory.com/entry/Django-11-Pagination-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ssungkang.tistory.com/entry/Django-11-Pagination-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl8dkz/hyOWY6Xzcv/Q1hKwxS6CBUo2zfOJQz2k0/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/brWMmp/hyOYrfmBDX/giykSuVUb04sU02OzLxvNk/img.jpg?width=728&amp;amp;height=546&amp;amp;face=0_0_728_546,https://scrap.kakaocdn.net/dn/cLFGLj/hyOW3mRMzV/7RDc6qGPguayfXGOTeC4FK/img.png?width=820&amp;amp;height=814&amp;amp;face=0_0_820_814');&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;[Django] 11. Pagination 을 알아보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 강민성입니다. 이번 시간에도 마찬가지로 blog project를 이어서 진행해보도록 하겠습니다. 글을 계속 추가할수록 글은 아래로 쌓이게 됩니다. 하지만 대부분의 웹사이트는 일정 수준&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ssungkang.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;Pagination -&amp;gt; 객체들의 목록을 페이지 별로 나눠서 보여주도록 하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1656759407110&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.core.paginator import Paginator

def home(request):
    # 최신글 기준으로 order_by
    posts = Post.objects.filter().order_by('-date')
    # Paginator 함수의 첫 인자로는 페이징할 객체, 두번째 인자로는 몇 개씩 끉을 것인지
    paginator = Paginator(posts, 10)
    #  page에 해당되는 value를 가져오면 page의 번호를 리턴 받을 수 있습니다.
    pagenum = request.GET.get('page')
    # 해당 pagenum에 해당하는 posts 객체들을 저장
    posts = paginator.get_page(pagenum)
    return render(request, 'index.html', {'posts':posts} )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;blog_list = Blog.objects.all()&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 전에도 사용한 적 있습니다.&amp;nbsp; Blog 클래스의 모든 객체들을 blog_list에 담아두게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;paginator = Paginator(blog_list, 3)&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 import한&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Paginator&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 인자를 받는데 첫 번째로&amp;nbsp;페이지로 분할될 객체, 두 번째로 한 페이지에 담길 객체의 수를 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;page = request.GET.get('page')&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request는 사용자가 보낸 총체적인 정보를 담고 있습니다.&lt;/p&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;GET은 request 방식 중 하나 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET 방식으로 정보를 받아오는 데이터를 가르키게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get 은 딕셔너리 자료형에서 key값으로 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;그 말인 즉슨, request.GET 으로 받아온 값은 딕셔너리 자료형 이라는 의미죠.&lt;/p&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: #ff0000;&quot;&gt;ex)&lt;/span&gt;&amp;nbsp;http://127.0.0.1:8000/title=first&amp;amp;body=hello&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{'title':first, &quot;body&quot;:hello}&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;여기서 page에 해당되는 value를 가져오면 page의 번호를 리턴 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;posts = paginator.get_page(page&lt;/b&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get_page 메소드는 페이지 번호를 받아 해당 페이지를 리턴하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 이 페이지를 다시 render를 통해 넘겨주게 됩니다.&lt;/p&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;a href=&quot;https://velog.io/@kimkrh/Django-request.GET.get&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@kimkrh/Django-request.GET.get&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656758840856&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;[Django] request.GET.get()&quot; data-og-description=&quot;request.get()과 request.GET.get()의 차이점&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@kimkrh/Django-request.GET.get&quot; data-og-url=&quot;https://velog.io/@kimkrh/Django-request.GET.get&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vjCFx/hyOWZkta1r/xTvS6n1enRK8NCBtP3yvp1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@kimkrh/Django-request.GET.get&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@kimkrh/Django-request.GET.get&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vjCFx/hyOWZkta1r/xTvS6n1enRK8NCBtP3yvp1/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;[Django] request.GET.get()&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;request.get()과 request.GET.get()의 차이점&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;gt; page를 프론트엔드 단에 표시하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1656760731793&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
&amp;lt;!-- Page Heading --&amp;gt;
&amp;lt;!-- DataTales Example --&amp;gt;
&amp;lt;div class=&quot;card shadow mb-4&quot;&amp;gt;
    &amp;lt;div class=&quot;card-header py-3&quot;&amp;gt;
        &amp;lt;h6 class=&quot;m-0 font-weight-bold text-success&quot;&amp;gt;익명게시판&amp;lt;/h6&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;card-body&quot;&amp;gt;
        &amp;lt;div class=&quot;table-responsive&quot;&amp;gt;
            &amp;lt;table class=&quot;table table-bordered&quot; id=&quot;dataTable&quot; width=&quot;100%&quot; cellspacing=&quot;0&quot;&amp;gt;
                &amp;lt;thead&amp;gt;
                    &amp;lt;tr&amp;gt;
                        &amp;lt;th width='70%'&amp;gt;글 제목&amp;lt;/th&amp;gt;
                        &amp;lt;th&amp;gt;작성 날짜&amp;lt;/th&amp;gt;
                        &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
                    &amp;lt;/tr&amp;gt;
                &amp;lt;/thead&amp;gt;
                &amp;lt;tbody&amp;gt;
                    {% for post in posts %}
                    &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a href=&quot;{% url 'detail' post.id %}&quot;&amp;gt;{{ post.title }}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;{{ post.date }}&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;익명&amp;lt;/td&amp;gt;
                    &amp;lt;/tr&amp;gt;
                    {% endfor %}
                &amp;lt;/tbody&amp;gt;
            &amp;lt;/table&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
{% if user.is_authenticated %}
    &amp;lt;a href=&quot;{% url 'postcreate' %}&quot; class=&quot;btn btn-success btn-icon-split&quot;&amp;gt;
        &amp;lt;span class=&quot;icon text-white-50&quot;&amp;gt;
            &amp;lt;i class=&quot;fas fa-flag&quot;&amp;gt;&amp;lt;/i&amp;gt;
        &amp;lt;/span&amp;gt;
        &amp;lt;span class=&quot;text&quot;&amp;gt;글쓰기&amp;lt;/span&amp;gt;
    &amp;lt;/a&amp;gt;
{% endif %}

&amp;lt;!-- 페이지네이션 --&amp;gt;


{% bootstrap_pagination posts size=&quot;small&quot; justify_content=&quot;center&quot; %}


&amp;lt;a href=&quot;?page=1&quot;&amp;gt;첫 페이지&amp;lt;/a&amp;gt;
{% if posts.has_previous %}
    &amp;lt;a href=&quot;?page={{ posts.previous_page_number }}&quot;&amp;gt;이전 페이지&amp;lt;/a&amp;gt;
{% endif %}

&amp;lt;span&amp;gt;현재 페이지 : {{ posts.number }}&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;/&amp;lt;/span&amp;gt;
&amp;lt;span&amp;gt;{{ posts.paginator.num_pages }}&amp;lt;/span&amp;gt;

{% if posts.has_next %}
    &amp;lt;a href=&quot;?page={{ posts.next_page_number }}&quot;&amp;gt;다음 페이지&amp;lt;/a&amp;gt;
    &amp;lt;a href=&quot;?page={{ posts.paginator.num_pages }}&quot;&amp;gt;마지막 페이지&amp;lt;/a&amp;gt;
{% endif %}

{% endblock %}&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 DB 연동하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mariaDB를 Django와 연동하기&lt;/p&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. mariaDB 설치&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;! root 계정 비밀번호와 port번호가 3306인지 확인하기&lt;/li&gt;
&lt;li&gt;mariaDB 설치시 자동으로 HeidiSQL이 설치되는데 이는 mariaDB안 테이블들을 쉽게 확인할 수 있는 SQL이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/mariadb-server-10-6-8/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mariadb.com/kb/en/mariadb-server-10-6-8/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656761744676&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;MariaDB Server 10.6.8&quot; data-og-description=&quot;&amp;lt;div class=&amp;quot;pdl-cta&amp;quot;&amp;gt; Thank you for downloading. Create your MariaDB account to receive download release notifications, product updates an...&quot; data-og-host=&quot;mariadb.com&quot; data-og-source-url=&quot;https://mariadb.com/kb/en/mariadb-server-10-6-8/&quot; data-og-url=&quot;https://mariadb.com/kb/en/mariadb-server-10-6-8/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/mariadb-server-10-6-8/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mariadb.com/kb/en/mariadb-server-10-6-8/&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;MariaDB Server 10.6.8&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;div class=&quot;pdl-cta&quot;&amp;gt; Thank you for downloading. Create your MariaDB account to receive download release notifications, product updates an...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mariadb.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. Django와 연동하기 위해서 mysqlclient를 설치해줘야함&lt;/p&gt;
&lt;pre id=&quot;code_1656762696071&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install mysqlclient&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://victorydntmd.tistory.com/275&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://victorydntmd.tistory.com/275&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656763864472&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;[Python3.6] mysqlclient 설치 에러 해결&quot; data-og-description=&quot;윈도우 환경에서 python&amp;nbsp;mysql을 사용하기 위해&amp;nbsp;pip install mysqlclient&amp;nbsp;으로 mysql을&amp;nbsp;설치하려고 하면, 아래와 같은 에러들이&amp;nbsp;발생하는 경우가 있습니다. 1. 이 메시지는 윈도우에서 Python module을 설..&quot; data-og-host=&quot;victorydntmd.tistory.com&quot; data-og-source-url=&quot;https://victorydntmd.tistory.com/275&quot; data-og-url=&quot;https://victorydntmd.tistory.com/275&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fvJyK/hyOYgEW2Te/0pAsKb59z7YSrdxwiLG621/img.png?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/bALes6/hyOYjVZsSG/DrDPc8pVeRgMKOT9ubA0v1/img.png?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/dWtp8Z/hyOYjBFSk1/lxu5iBiDhDPw4fkOj4j0FK/img.png?width=900&amp;amp;height=294&amp;amp;face=0_0_900_294&quot;&gt;&lt;a href=&quot;https://victorydntmd.tistory.com/275&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://victorydntmd.tistory.com/275&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fvJyK/hyOYgEW2Te/0pAsKb59z7YSrdxwiLG621/img.png?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/bALes6/hyOYjVZsSG/DrDPc8pVeRgMKOT9ubA0v1/img.png?width=800&amp;amp;height=261&amp;amp;face=0_0_800_261,https://scrap.kakaocdn.net/dn/dWtp8Z/hyOYjBFSk1/lxu5iBiDhDPw4fkOj4j0FK/img.png?width=900&amp;amp;height=294&amp;amp;face=0_0_900_294');&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;[Python3.6] mysqlclient 설치 에러 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;윈도우 환경에서 python&amp;nbsp;mysql을 사용하기 위해&amp;nbsp;pip install mysqlclient&amp;nbsp;으로 mysql을&amp;nbsp;설치하려고 하면, 아래와 같은 에러들이&amp;nbsp;발생하는 경우가 있습니다. 1. 이 메시지는 윈도우에서 Python module을 설..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;victorydntmd.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lemontia.tistory.com/756&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://lemontia.tistory.com/756&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656764473391&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-pip] mysqlclient 설치 중 에러날때(mysql.h)&quot; data-og-description=&quot;pip3로 mysqlclient를 설치할때 다음의 에러가 발생할 수 있습니다. mysql.c _mysql.c(29): fatal error C1083: 포함 파일을 열 수 없습니다. 'mysql.h': No such file or directory error: command 'C:\\Program..&quot; data-og-host=&quot;lemontia.tistory.com&quot; data-og-source-url=&quot;https://lemontia.tistory.com/756&quot; data-og-url=&quot;https://lemontia.tistory.com/756&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPeSUB/hyOW1vSxP5/dEHPnUyZqGhOeItHjmAZT0/img.png?width=704&amp;amp;height=473&amp;amp;face=0_0_704_473,https://scrap.kakaocdn.net/dn/bwSnBr/hyOWWnOQbL/p2vABKnm4TN5lUfNXY5D81/img.png?width=704&amp;amp;height=473&amp;amp;face=0_0_704_473,https://scrap.kakaocdn.net/dn/EYzhE/hyOW4F87aJ/GOyRSKaPPV9OAGBsaNLEb0/img.png?width=704&amp;amp;height=473&amp;amp;face=0_0_704_473&quot;&gt;&lt;a href=&quot;https://lemontia.tistory.com/756&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lemontia.tistory.com/756&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPeSUB/hyOW1vSxP5/dEHPnUyZqGhOeItHjmAZT0/img.png?width=704&amp;amp;height=473&amp;amp;face=0_0_704_473,https://scrap.kakaocdn.net/dn/bwSnBr/hyOWWnOQbL/p2vABKnm4TN5lUfNXY5D81/img.png?width=704&amp;amp;height=473&amp;amp;face=0_0_704_473,https://scrap.kakaocdn.net/dn/EYzhE/hyOW4F87aJ/GOyRSKaPPV9OAGBsaNLEb0/img.png?width=704&amp;amp;height=473&amp;amp;face=0_0_704_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;[python-pip] mysqlclient 설치 중 에러날때(mysql.h)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;pip3로 mysqlclient를 설치할때 다음의 에러가 발생할 수 있습니다. mysql.c _mysql.c(29): fatal error C1083: 포함 파일을 열 수 없습니다. 'mysql.h': No such file or directory error: command 'C:\\Program..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lemontia.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;3. settings.py에 DB 관련 설정&lt;/p&gt;
&lt;pre id=&quot;code_1656764899156&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MYDATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql',
        'USER': 'root',
        'PASSWORD': '루트계정암호',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}&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;! settings.py의 DB PASSWORD와 SECRET_KEY는 절대 외부에 노출되어서는 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 보통 my_settings.py라는 파일을 만들고 그곳에 DB PASSWORD와 SECRET_KEY를 저장하고 import한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656764872951&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from .my_settings import MYSECRET_KEY, MYDATABASES

SECRET_KEY = MYSECRET_KEY
DATABASES = MYDATABASES&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소셜 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://django-allauth.readthedocs.io/en/latest/installation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://django-allauth.readthedocs.io/en/latest/installation.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657004242940&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;Installation &amp;mdash; django-allauth 0.43.0 documentation&quot; data-og-description=&quot;Post-Installation In your Django root execute the command below to create your database tables: Now start your server, visit your admin pages (e.g. http://localhost:8000/admin/) and follow these steps: Add a Site for your domain, matching settings.SITE_ID &quot; data-og-host=&quot;django-allauth.readthedocs.io&quot; data-og-source-url=&quot;https://django-allauth.readthedocs.io/en/latest/installation.html&quot; data-og-url=&quot;https://django-allauth.readthedocs.io/en/latest/installation.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://django-allauth.readthedocs.io/en/latest/installation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://django-allauth.readthedocs.io/en/latest/installation.html&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;Installation &amp;mdash; django-allauth 0.43.0 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Post-Installation In your Django root execute the command below to create your database tables: Now start your server, visit your admin pages (e.g. http://localhost:8000/admin/) and follow these steps: Add a Site for your domain, matching settings.SITE_ID&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;django-allauth.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 패키지를 설치&lt;/p&gt;
&lt;pre id=&quot;code_1657004198722&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install django-allauth&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. settings.py에 등록&lt;/p&gt;
&lt;pre id=&quot;code_1657004283114&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
INSTALLED_APPS = [
    ...
    # The following apps are required:
    'django.contrib.auth',
    'django.contrib.messages',
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    # ... include the providers you want to enable:
    'allauth.socialaccount.providers.agave',
    'allauth.socialaccount.providers.amazon',
    'allauth.socialaccount.providers.amazon_cognito',
    'allauth.socialaccount.providers.angellist',
    'allauth.socialaccount.providers.apple',
    'allauth.socialaccount.providers.asana',
    'allauth.socialaccount.providers.auth0',
    'allauth.socialaccount.providers.authentiq',
    'allauth.socialaccount.providers.azure',
    'allauth.socialaccount.providers.baidu',
    'allauth.socialaccount.providers.basecamp',
    'allauth.socialaccount.providers.battlenet',
    'allauth.socialaccount.providers.bitbucket',
    'allauth.socialaccount.providers.bitbucket_oauth2',
    'allauth.socialaccount.providers.bitly',
    'allauth.socialaccount.providers.box',
    'allauth.socialaccount.providers.cern',
    'allauth.socialaccount.providers.cilogon',
    'allauth.socialaccount.providers.clever',
    'allauth.socialaccount.providers.coinbase',
    'allauth.socialaccount.providers.dataporten',
    'allauth.socialaccount.providers.daum',
    'allauth.socialaccount.providers.digitalocean',
    'allauth.socialaccount.providers.discord',
    'allauth.socialaccount.providers.disqus',
    'allauth.socialaccount.providers.douban',
    'allauth.socialaccount.providers.doximity',
    'allauth.socialaccount.providers.draugiem',
    'allauth.socialaccount.providers.drip',
    'allauth.socialaccount.providers.dropbox',
    'allauth.socialaccount.providers.dwolla',
    'allauth.socialaccount.providers.edmodo',
    'allauth.socialaccount.providers.edx',
    'allauth.socialaccount.providers.eventbrite',
    'allauth.socialaccount.providers.eveonline',
    'allauth.socialaccount.providers.evernote',
    'allauth.socialaccount.providers.exist',
    'allauth.socialaccount.providers.facebook',
    'allauth.socialaccount.providers.feedly',
    'allauth.socialaccount.providers.figma',
    'allauth.socialaccount.providers.fivehundredpx',
    'allauth.socialaccount.providers.flickr',
    'allauth.socialaccount.providers.foursquare',
    'allauth.socialaccount.providers.frontier',
    'allauth.socialaccount.providers.fxa',
    'allauth.socialaccount.providers.gitea',
    'allauth.socialaccount.providers.github',
    'allauth.socialaccount.providers.gitlab',
    'allauth.socialaccount.providers.globus',
    'allauth.socialaccount.providers.google',
    'allauth.socialaccount.providers.gumroad',
    'allauth.socialaccount.providers.hubic',
    'allauth.socialaccount.providers.instagram',
    'allauth.socialaccount.providers.jupyterhub',
    'allauth.socialaccount.providers.kakao',
    'allauth.socialaccount.providers.keycloak',
    'allauth.socialaccount.providers.lemonldap',
    'allauth.socialaccount.providers.line',
    'allauth.socialaccount.providers.linkedin',
    'allauth.socialaccount.providers.linkedin_oauth2',
    'allauth.socialaccount.providers.mailchimp',
    'allauth.socialaccount.providers.mailru',
    'allauth.socialaccount.providers.mediawiki',
    'allauth.socialaccount.providers.meetup',
    'allauth.socialaccount.providers.microsoft',
    'allauth.socialaccount.providers.naver',
    'allauth.socialaccount.providers.nextcloud',
    'allauth.socialaccount.providers.odnoklassniki',
    'allauth.socialaccount.providers.openid',
    'allauth.socialaccount.providers.openstreetmap',
    'allauth.socialaccount.providers.orcid',
    'allauth.socialaccount.providers.patreon',
    'allauth.socialaccount.providers.paypal',
    'allauth.socialaccount.providers.persona',
    'allauth.socialaccount.providers.pinterest',
    'allauth.socialaccount.providers.pocket',
    'allauth.socialaccount.providers.quickbooks',
    'allauth.socialaccount.providers.reddit',
    'allauth.socialaccount.providers.robinhood',
    'allauth.socialaccount.providers.salesforce',
    'allauth.socialaccount.providers.sharefile',
    'allauth.socialaccount.providers.shopify',
    'allauth.socialaccount.providers.slack',
    'allauth.socialaccount.providers.snapchat',
    'allauth.socialaccount.providers.soundcloud',
    'allauth.socialaccount.providers.spotify',
    'allauth.socialaccount.providers.stackexchange',
    'allauth.socialaccount.providers.steam',
    'allauth.socialaccount.providers.stocktwits',
    'allauth.socialaccount.providers.strava',
    'allauth.socialaccount.providers.stripe',
    'allauth.socialaccount.providers.telegram',
    'allauth.socialaccount.providers.trainingpeaks',
    'allauth.socialaccount.providers.trello',
    'allauth.socialaccount.providers.tumblr',
    'allauth.socialaccount.providers.twentythreeandme',
    'allauth.socialaccount.providers.twitch',
    'allauth.socialaccount.providers.twitter',
    'allauth.socialaccount.providers.untappd',
    'allauth.socialaccount.providers.vimeo',
    'allauth.socialaccount.providers.vimeo_oauth2',
    'allauth.socialaccount.providers.vk',
    'allauth.socialaccount.providers.weibo',
    'allauth.socialaccount.providers.weixin',
    'allauth.socialaccount.providers.windowslive',
    'allauth.socialaccount.providers.xing',
    'allauth.socialaccount.providers.yahoo',
    'allauth.socialaccount.providers.yandex',
    'allauth.socialaccount.providers.ynab',
    'allauth.socialaccount.providers.zoho',
    'allauth.socialaccount.providers.zoom',
    'allauth.socialaccount.providers.okta',
    'allauth.socialaccount.providers.feishu',
    ...
]

SITE_ID = 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;3. urls.py에 등록&lt;/p&gt;
&lt;pre id=&quot;code_1657004499809&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    ...
    path('accounts/', include('allauth.urls')),
    ...
]&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;4. migrate 진행&lt;/p&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. admin단 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1231233.JPG&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV9c5I/btrGuTOaJpX/OdhjfEy9lqd52mLvvqukpK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV9c5I/btrGuTOaJpX/OdhjfEy9lqd52mLvvqukpK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV9c5I/btrGuTOaJpX/OdhjfEy9lqd52mLvvqukpK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV9c5I%2FbtrGuTOaJpX%2FOdhjfEy9lqd52mLvvqukpK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;930&quot; height=&quot;704&quot; data-filename=&quot;1231233.JPG&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;704&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;412421.JPG&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1uf4f/btrGurKAGnK/67k3Er5O28LQsZTHe3pdt1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1uf4f/btrGurKAGnK/67k3Er5O28LQsZTHe3pdt1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1uf4f/btrGurKAGnK/67k3Er5O28LQsZTHe3pdt1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1uf4f%2FbtrGurKAGnK%2F67k3Er5O28LQsZTHe3pdt1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;917&quot; data-filename=&quot;412421.JPG&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/welcome?project=northern-center-355407&quot;&gt;https://console.cloud.google.com/welcome?project=northern-center-355407&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1657005150566&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;Google 클라우드 플랫폼&quot; data-og-description=&quot;로그인 Google 클라우드 플랫폼으로 이동&quot; data-og-host=&quot;accounts.google.com&quot; data-og-source-url=&quot;https://console.cloud.google.com/welcome?project=northern-center-355407&quot; data-og-url=&quot;https://accounts.google.com/v3/signin/identifier?dsh=S1963670586%3A1657005150011942&amp;amp;continue=https%3A%2F%2Fconsole.cloud.google.com%2Fwelcome%3Fproject%3Dnorthern-center-355407&amp;amp;followup=https%3A%2F%2Fconsole.cloud.google.com%2Fwelcome%3Fproject%3Dnorthern-center-355407&amp;amp;osid=1&amp;amp;passive=1209600&amp;amp;service=cloudconsole&amp;amp;flowName=WebLiteSignIn&amp;amp;flowEntry=ServiceLogin&amp;amp;ifkv=AX3vH3-VsKjp_n49JYxAOw8TQtFK0sfYE-ulKNpm8cH2BAfncYUtHqfnXtOchmF5ESYicxFqMx5J&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/welcome?project=northern-center-355407&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://console.cloud.google.com/welcome?project=northern-center-355407&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;Google 클라우드 플랫폼&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;로그인 Google 클라우드 플랫폼으로 이동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;accounts.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;client id와 Secret Key는 구글 콘솔 사이트에서 입력받음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 새 프로젝트 생성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. API 및 서비스에 들어간 후 사용자 인증 정보 만들기 -&amp;gt; OAuth 클라이언트 ID 만들기 -&amp;gt; 사용자 인증정보 만들기 -&amp;gt; OAuth 클라이언트 ID 만들기 -&amp;gt; 어플리케이션 유형(웹 어플리케이션), 승인된 자바스크립트 원본(http://127.0.0.1:8000), 승인된 리다이렉션(&lt;span style=&quot;background-color: #ffffff; color: #e74c3c;&quot;&gt;http://127.0.0.1:8000/accounts/google/login/callback/&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 클라이언트 아이디와 비밀번호를 admin에 이어서 작성&lt;/p&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. settngs.py 이어서 작성&lt;/p&gt;
&lt;pre id=&quot;code_1657005926558&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 어떤 수단을 통해서 로그인 할 것인지에 대해서
AUTHENTICATION_BACKENDS = [
   
    # Needed to login by username in Django admin, regardless of `allauth`
    # 기존 장고의 내장되어있는 인증 기능
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    # 소셜 로그인 기능
    'allauth.account.auth_backends.AuthenticationBackend',
    
]

LOGIN_REDIRECT_URL = '/'&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_1657006357336&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% load socialaccount %}

&amp;lt;a href=&quot;{% provider_login_url 'google' %}&quot; class=&quot;btn btn-google btn-user btn-block&quot;&amp;gt;
                                        &amp;lt;i class=&quot;fab fa-google fa-fw&quot;&amp;gt;&amp;lt;/i&amp;gt; 구글 계정으로 가입 &amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api 연동하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657009173191&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;블로그 - Search API&quot; data-og-description=&quot;블로그 NAVER Developers - 검색 API 블로그 검색 개발가이드 검색 &amp;gt; 블로그 네이버 블로그 검색 결과를 출력해주는 REST API입니다. 비로그인 오픈 API이므로 GET으로 호출할 때 HTTP Header에 애플리케이션 &quot; data-og-host=&quot;developers.naver.com&quot; data-og-source-url=&quot;https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8&quot; data-og-url=&quot;https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8&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;블로그 - Search API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;블로그 NAVER Developers - 검색 API 블로그 검색 개발가이드 검색 &amp;gt; 블로그 네이버 블로그 검색 결과를 출력해주는 REST API입니다. 비로그인 오픈 API이므로 GET으로 호출할 때 HTTP Header에 애플리케이션&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.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;!api 문서를 보는게 매우 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1.&amp;nbsp; API를 사용하기 위해서는 오픈 API 이용 신청을 하는게 중요 -&amp;gt; 클라이언트 ID와 클라이언트 Secret Key를 받기 위해서&lt;/p&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. API를 응답받을 URL을 지정 ex) &lt;span style=&quot;background-color: #ffffff; color: #323332;&quot;&gt;https://openapi.naver.com/v1/search/movie.json&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;3. 요청 변수는 위 URL 뒤에 ?key='value' 에서 key이며 value를 가져온다.&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;4. 필수 요청 변수는 반드시 적어주어야 한다. ex)query&lt;/p&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;pre id=&quot;code_1657009894656&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl &quot;https://openapi.naver.com/v1/search/movie.xml?query=%EC%A3%BC%EC%8B%9D&amp;amp;display=10&amp;amp;start=1&amp;amp;genre=1&quot; \
    -H &quot;X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 client id 값}&quot; \
    -H &quot;X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 client secret 값}&quot; -v&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한글이 url에 표시될때는 %EC%로 표시된다.&lt;/li&gt;
&lt;li&gt;&amp;amp;은 and를 의미한다.&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;API 요청 예시&lt;/p&gt;
&lt;pre id=&quot;code_1657009911616&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; GET /v1/search/movie.xml?query=%EC%A3%BC%EC%8B%9D&amp;amp;display=10&amp;amp;start=1&amp;amp;genre=1 HTTP/1.1
&amp;gt; Host: openapi.naver.com
&amp;gt; User-Agent: curl/7.49.1
&amp;gt; Accept: */*
&amp;gt; X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 client id 값}
&amp;gt; X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 client secret 값}&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;pre id=&quot;code_1657009925248&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt; HTTP/1.1 200 OK
&amp;lt; Server: nginx
&amp;lt; Date: Wed, 28 Sep 2016 07:40:17 GMT
&amp;lt; Content-Type: text/xml;charset=utf-8
&amp;lt; Transfer-Encoding: chunked
&amp;lt; Connection: keep-alive
&amp;lt; Keep-Alive: timeout=5
&amp;lt; Vary: Accept-Encoding
&amp;lt; X-Powered-By: Naver
&amp;lt; Cache-Control: no-cache, no-store, must-revalidate
&amp;lt; Pragma: no-cache
&amp;lt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;rss version=&quot;2.0&quot;&amp;gt;
    &amp;lt;channel&amp;gt;
        &amp;lt;title&amp;gt;Naver Open API - movie ::'주식'&amp;lt;/title&amp;gt;
        &amp;lt;link&amp;gt;http://search.naver.com&amp;lt;/link&amp;gt;
        &amp;lt;description&amp;gt;Naver Search Result&amp;lt;/description&amp;gt;
        &amp;lt;lastBuildDate&amp;gt;Wed, 28 Sep 2016 16:40:17 +0900&amp;lt;/lastBuildDate&amp;gt;
        &amp;lt;total&amp;gt;2&amp;lt;/total&amp;gt;
        &amp;lt;start&amp;gt;1&amp;lt;/start&amp;gt;
        &amp;lt;display&amp;gt;2&amp;lt;/display&amp;gt;
        &amp;lt;item&amp;gt;
            &amp;lt;title&amp;gt;주마등&amp;amp;lt;b&amp;amp;gt;주식&amp;amp;lt;/b&amp;amp;gt;회사&amp;lt;/title&amp;gt;
            &amp;lt;link&amp;gt;http://openapi.naver.com/l?AAADWLQQvCIBzFP83f48h0zh08uK1B0S2IOm7mUEIts0F9+vQQPN77vQfv+dbxI2DXgyTQ9QV4B+2ATNSLMCk9gEjYjlkurFZXflp1rFRw/yXnbEspNk8vqypvPJBRhZsGMrSMY4ySwLSpN5RT3NSYIScO5nxhdzc18cjq0958w8LneKUy8fz6AdRxjD6YAAAA&amp;lt;/link&amp;gt;&amp;lt;image&amp;gt;http://imgmovie.naver.com/mdi/mit110/0968/96811_P01_142155.jpg&amp;lt;/image&amp;gt;
            &amp;lt;subtitle&amp;gt;走馬&amp;amp;amp;amp;#28783;株式&amp;amp;amp;amp;#20250;社&amp;lt;/subtitle&amp;gt;
            &amp;lt;pubDate&amp;gt;2012&amp;lt;/pubDate&amp;gt;
            &amp;lt;director&amp;gt;미키 코이치로|&amp;lt;/director&amp;gt;
            &amp;lt;actor&amp;gt;카시이 유우|쿠보타 마사타카|카지와라 히카리|치요 쇼타|요코야마 메구미|카시와바라 슈지|&amp;lt;/actor&amp;gt;
            &amp;lt;userRating&amp;gt;4.50&amp;lt;/userRating&amp;gt;
        &amp;lt;/item&amp;gt;
        ...
    &amp;lt;/channel&amp;gt;
&amp;lt;/rss&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 API 호출 예제&lt;/p&gt;
&lt;pre id=&quot;code_1657010125543&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys

# 특정 url에 request를 보낼 수 있도록 해주는 라이브러리
import urllib.request

# API 이용 신청을 통해 받은 id와 secret 입력
client_id = &quot;YOUR_CLIENT_ID&quot;
client_secret = &quot;YOUR_CLIENT_SECRET&quot;

# 검색할 단어를 입력받을 변수
# urllib.parse.quote()는 아스키코드 형식이 아닌 글자를 URL 인코딩 시켜줍니다.
encText = urllib.parse.quote(&quot;검색할 단어&quot;)

# 위에서 알아본 것처럼 query={value}에서 value에 위 encText 변수를 삽입
# encText라는 검색어를 담고있는 url 변수 작성
url = &quot;https://openapi.naver.com/v1/search/blog?query=&quot; + encText # json 결과
# url = &quot;https://openapi.naver.com/v1/search/blog.xml?query=&quot; + encText # xml 결과

# request.Request는 URL 요청의 추상화
request = urllib.request.Request(url)

# url을 요청할 때 보안을 위해 헤더에 추가적인 정보를 요청하는 API들이 있다.
request.add_header(&quot;X-Naver-Client-Id&quot;,client_id)
request.add_header(&quot;X-Naver-Client-Secret&quot;,client_secret)

# urlopen은 request를 보낼 인자를 받고, request를 보내 response를 반환한다.
response = urllib.request.urlopen(request)

# 응답 코드를 받는다.
rescode = response.getcode()

# 200(성공 코드)를 받는다면 response를 출력한다.
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print(&quot;Error Code:&quot; + rescode)&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;a href=&quot;https://incomeplus.tistory.com/254&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://incomeplus.tistory.com/254&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657010761958&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;파이썬 urllib.request VS requests 차이점?&quot; data-og-description=&quot;파이썬으로 웹사이트를 크롤링 할 때 가장 많이 사용되는 함수가 urllib.request와 requests다. 분명히 두 개함수가 차이가 있고, 필요한 상황에 맞춰 사용할 줄 알아야 할 것이다. 먼저 크롤링을 하기 &quot; data-og-host=&quot;incomeplus.tistory.com&quot; data-og-source-url=&quot;https://incomeplus.tistory.com/254&quot; data-og-url=&quot;https://incomeplus.tistory.com/254&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2SmCo/hyOZys7Qxo/KgD2DvKWlP9t6Y0oZKQO11/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jnZRg/hyOZMLk2te/GQ61LRmx7mkKV1IKHFO3Gk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://incomeplus.tistory.com/254&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://incomeplus.tistory.com/254&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2SmCo/hyOZys7Qxo/KgD2DvKWlP9t6Y0oZKQO11/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jnZRg/hyOZMLk2te/GQ61LRmx7mkKV1IKHFO3Gk/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;파이썬 urllib.request VS requests 차이점?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬으로 웹사이트를 크롤링 할 때 가장 많이 사용되는 함수가 urllib.request와 requests다. 분명히 두 개함수가 차이가 있고, 필요한 상황에 맞춰 사용할 줄 알아야 할 것이다. 먼저 크롤링을 하기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;incomeplus.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;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Status&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657011023260&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;HTTP 상태 코드 - HTTP | MDN&quot; data-og-description=&quot;HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5Ex0E/hyOYkboyW8/iL5JEyYOfMQsKshie8VW10/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/Web/HTTP/Status&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5Ex0E/hyOYkboyW8/iL5JEyYOfMQsKshie8VW10/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;HTTP 상태 코드 - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고&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;response에 저장된 api 객체를 JSON 형식으로 저장하고 싶을 때&lt;/p&gt;
&lt;pre id=&quot;code_1657027464483&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys

import json

# 특정 url에 request를 보낼 수 있도록 해주는 라이브러리
import urllib.request

# API 이용 신청을 통해 받은 id와 secret 입력
client_id = &quot;YOUR_CLIENT_ID&quot;
client_secret = &quot;YOUR_CLIENT_SECRET&quot;

# 검색할 단어를 입력받을 변수
# urllib.parse.quote()는 아스키코드 형식이 아닌 글자를 URL 인코딩 시켜줍니다.
encText = urllib.parse.quote(&quot;검색할 단어&quot;)

# 위에서 알아본 것처럼 query={value}에서 value에 위 encText 변수를 삽입
# encText라는 검색어를 담고있는 url 변수 작성
url = &quot;https://openapi.naver.com/v1/search/blog?query=&quot; + encText # json 결과
# url = &quot;https://openapi.naver.com/v1/search/blog.xml?query=&quot; + encText # xml 결과

# request.Request는 URL 요청의 추상화
request = urllib.request.Request(url)

# url을 요청할 때 보안을 위해 헤더에 추가적인 정보를 요청하는 API들이 있다.
request.add_header(&quot;X-Naver-Client-Id&quot;,client_id)
request.add_header(&quot;X-Naver-Client-Secret&quot;,client_secret)

# urlopen은 request를 보낼 인자를 받고, request를 보내 response를 반환한다.
response = urllib.request.urlopen(request)

# 응답 코드를 받는다.
rescode = response.getcode()

# 200(성공 코드)를 받는다면 response를 출력한다.
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print(&quot;Error Code:&quot; + rescode)

resjson = response_body.decode('utf-8')

with open('movie.json', 'w', encoading='UTF-8-sig') as file:
	file.write(json.dumps(resjson, ensure_ascii=False))&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;JSON 각 key에 접근하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1657027619218&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pydata = json.loads(resdata)
data = pydata['items']&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;a href=&quot;https://www.daleseo.com/python-json/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.daleseo.com/python-json/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657027657182&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;파이썬의 json 모듈로 JSON 데이터 다루기&quot; data-og-description=&quot;Engineering Blog by Dale Seo&quot; data-og-host=&quot;www.daleseo.com&quot; data-og-source-url=&quot;https://www.daleseo.com/python-json/&quot; data-og-url=&quot;https://www.daleseo.com/python-json/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brDguj/hyOZNDQraF/HZkxTDPjCH4dWRy65IsWXk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.daleseo.com/python-json/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.daleseo.com/python-json/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brDguj/hyOZNDQraF/HZkxTDPjCH4dWRy65IsWXk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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 모듈로 JSON 데이터 다루기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Engineering Blog by Dale Seo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.daleseo.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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 기능 구현하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/57&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657092480809&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;동백 // QuerySet을 통한 간단 검색 구현&quot; data-og-description=&quot;&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/57&quot; data-og-url=&quot;https://devdongbaek.tistory.com/57&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/57&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;동백 // QuerySet을 통한 간단 검색 구현&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;devdongbaek.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ghqls0210.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ghqls0210.tistory.com/53&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657092657185&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;django / 검색 기능&quot; data-og-description=&quot;이번에는 검색 기능을 만들어보겠습니다. 검색 기능 또한 직전 포스팅인 정렬과 같은 html에 만들면 좋지만 그러면 강제적으로 만들어 놓은 url을 수정해야되서 새로 url을 만들어서 하겠습니다. u&quot; data-og-host=&quot;ghqls0210.tistory.com&quot; data-og-source-url=&quot;https://ghqls0210.tistory.com/53&quot; data-og-url=&quot;https://ghqls0210.tistory.com/53&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8vfJA/hyOZNjZdOG/yzkqb3Yp7Z62XitA6Q7McK/img.png?width=629&amp;amp;height=432&amp;amp;face=0_0_629_432,https://scrap.kakaocdn.net/dn/vMOp8/hyO0Dz17Xo/mZCcV3ZeMSzNaQ4NIKuLD0/img.png?width=629&amp;amp;height=432&amp;amp;face=0_0_629_432,https://scrap.kakaocdn.net/dn/bh1eDj/hyOZIpmZIf/eJ1kFIIigAhNE2tFjwO910/img.png?width=629&amp;amp;height=432&amp;amp;face=0_0_629_432&quot;&gt;&lt;a href=&quot;https://ghqls0210.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ghqls0210.tistory.com/53&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8vfJA/hyOZNjZdOG/yzkqb3Yp7Z62XitA6Q7McK/img.png?width=629&amp;amp;height=432&amp;amp;face=0_0_629_432,https://scrap.kakaocdn.net/dn/vMOp8/hyO0Dz17Xo/mZCcV3ZeMSzNaQ4NIKuLD0/img.png?width=629&amp;amp;height=432&amp;amp;face=0_0_629_432,https://scrap.kakaocdn.net/dn/bh1eDj/hyOZIpmZIf/eJ1kFIIigAhNE2tFjwO910/img.png?width=629&amp;amp;height=432&amp;amp;face=0_0_629_432');&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;django / 검색 기능&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 검색 기능을 만들어보겠습니다. 검색 기능 또한 직전 포스팅인 정렬과 같은 html에 만들면 좋지만 그러면 강제적으로 만들어 놓은 url을 수정해야되서 새로 url을 만들어서 하겠습니다. u&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ghqls0210.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@mongle/Django-Web-Project-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%804-%EA%B2%80%EC%83%89-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@mongle/Django-Web-Project-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%804-%EA%B2%80%EC%83%89-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657093712911&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;Django Web Project 개발일지4) 검색 기능 추가&quot; data-og-description=&quot;djangoWeb searh 기능 추가&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@mongle/Django-Web-Project-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%804-%EA%B2%80%EC%83%89-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80&quot; data-og-url=&quot;https://velog.io/@mongle/Django-Web-Project-개발일지4-검색-기능-추가&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tC0F7/hyOZHqsRjI/KLO3M4vCqLvbIHTvj2VA01/img.png?width=569&amp;amp;height=641&amp;amp;face=0_0_569_641,https://scrap.kakaocdn.net/dn/dblC1C/hyOZLGtaaU/5JbAGpegzXKS94yTbUcKH1/img.png?width=569&amp;amp;height=641&amp;amp;face=0_0_569_641,https://scrap.kakaocdn.net/dn/0Yo0C/hyOZLGtada/pat04o1oHEmtoZbiklWxG1/img.png?width=719&amp;amp;height=735&amp;amp;face=0_0_719_735&quot;&gt;&lt;a href=&quot;https://velog.io/@mongle/Django-Web-Project-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%804-%EA%B2%80%EC%83%89-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@mongle/Django-Web-Project-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%804-%EA%B2%80%EC%83%89-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tC0F7/hyOZHqsRjI/KLO3M4vCqLvbIHTvj2VA01/img.png?width=569&amp;amp;height=641&amp;amp;face=0_0_569_641,https://scrap.kakaocdn.net/dn/dblC1C/hyOZLGtaaU/5JbAGpegzXKS94yTbUcKH1/img.png?width=569&amp;amp;height=641&amp;amp;face=0_0_569_641,https://scrap.kakaocdn.net/dn/0Yo0C/hyOZLGtada/pat04o1oHEmtoZbiklWxG1/img.png?width=719&amp;amp;height=735&amp;amp;face=0_0_719_735');&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;Django Web Project 개발일지4) 검색 기능 추가&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;djangoWeb searh 기능 추가&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;a href=&quot;https://devdongbaek.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/91&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657095005095&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;Django 빌트인 CBV를 통한 Form 처리&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/91&quot; data-og-url=&quot;https://devdongbaek.tistory.com/91&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/caUQ7G/hyOZBKAR1v/ypgUkXKFjSSeIcB63FdaI1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/cXQYLl/hyOZDuPUU1/c9dLrfJs3XPnjdVAPdc7xk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/s9Dur/hyOZJV8xjL/qf8OUpRYzKf68PQqQ83vD0/img.jpg?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/91&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/caUQ7G/hyOZBKAR1v/ypgUkXKFjSSeIcB63FdaI1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/cXQYLl/hyOZDuPUU1/c9dLrfJs3XPnjdVAPdc7xk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/s9Dur/hyOZJV8xjL/qf8OUpRYzKf68PQqQ83vD0/img.jpg?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200');&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;Django 빌트인 CBV를 통한 Form 처리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;formview는 form을 보여주는 로직의 view&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657096270576&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;Generic editing views | Django documentation | Django&quot; data-og-description=&quot;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView&quot; data-og-url=&quot;https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView&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;Generic editing views | Django documentation | Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;urls.py&lt;/p&gt;
&lt;pre id=&quot;code_1657093673856&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;path('search/', views.search.as_view(), name='search'),&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;forms.py&lt;/p&gt;
&lt;pre id=&quot;code_1657092805853&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django import forms

class SearchForm(forms.Form):
	search = forms.CharField(label='검색할 단어를 입력하세요', max_length=100)&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;views.py&lt;/p&gt;
&lt;pre id=&quot;code_1657092999012&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from .forms import SearchForm

class search(Formview):
	form_class = SearchForm
    templates_name = 'blog/post_search.html'
	
    # form 입력이 성공했을 때
    def form_valid(self, form):
    	# form field 이름과 동일해야 함
    	searchWord = form.cleaned_data['search']
        post_list = Post.objects.filter(Q(title__icontains=searchWord) | Q(description__icontains=searchWord) | Q(content__icontains=searchWord)).distinct()
		
        # 딕셔너리 형식으로 값 저장
        &quot;&quot;&quot;
        form = context.form
        searchWord = context.search_term
        post_list = context.object_list
        
        &quot;&quot;&quot;
        context = {}
        context['form'] = form
        context['search_term'] = searchWord
        context['object_list'] = post_list

        return render(self.request, self.template_name, context)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. context라는 딕셔너리를 통해 템플릿에 인자를 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;templates&lt;/p&gt;
&lt;pre id=&quot;code_1657093098566&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends &quot;base.html&quot; %}

{% block title %}post_search.html{% endblock %}

{% block content %}
&amp;lt;h1&amp;gt;Blog Search&amp;lt;/h1&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;form action=&quot;.&quot; method=&quot;post&quot;&amp;gt; {% csrf_token %}
    {{ form.as_table }} &amp;lt;!-- form을 테이블 형식으로 표시, 여기서 form은 views에서 넘겨준 PostSearchForm 객체임--&amp;gt;
    &amp;lt;input type=&quot;submit&quot; value=&quot;Submit&quot; class=&quot;btn btn-primary btn-sm&quot;&amp;gt;
&amp;lt;/form&amp;gt;

&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;

{% if object_list %}
    {% for post in object_list %}
        &amp;lt;h2&amp;gt;&amp;lt;a href='{{ post.get_absolute_url }}'&amp;gt;{{ post.title }}&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;
        {{ post.modify_date|date:&quot;N d, Y&quot; }}
        &amp;lt;p&amp;gt;{{ post.description }}&amp;lt;/p&amp;gt;
    {% endfor %}
{% elif search_term %}&amp;lt;!-- 검색란이 공란인지 확인--&amp;gt;
    &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;Search Word({{ search_term }}) Not Found&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;
{% endif %}
{% endblock %}&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;a href=&quot;https://velog.io/@jxxwon/Django-Q-%EA%B0%9D%EC%B2%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@jxxwon/Django-Q-%EA%B0%9D%EC%B2%B4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657093629956&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;Django Q 객체&quot; data-og-description=&quot;장고 Q객체&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@jxxwon/Django-Q-%EA%B0%9D%EC%B2%B4&quot; data-og-url=&quot;https://velog.io/@jxxwon/Django-Q-객체&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cplXEk/hyO0LSmIo4/hfahKFzI8a8pIfbVlM6oVk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/uT7l6/hyO0G4BkhC/bPOzxhZ93DbIgDcN874BI1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/iBoRH/hyO0FdysEo/KSusUk8nrnaGMqZ5yIBkH1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://velog.io/@jxxwon/Django-Q-%EA%B0%9D%EC%B2%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@jxxwon/Django-Q-%EA%B0%9D%EC%B2%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cplXEk/hyO0LSmIo4/hfahKFzI8a8pIfbVlM6oVk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/uT7l6/hyO0G4BkhC/bPOzxhZ93DbIgDcN874BI1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/iBoRH/hyO0FdysEo/KSusUk8nrnaGMqZ5yIBkH1/img.jpg?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;Django Q 객체&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;장고 Q객체&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;CBV&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/9623&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/9623&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657097280868&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;02) 클래스형 뷰 (CBV)&quot; data-og-description=&quot;[TOC] # 클래스형 뷰 (CBV, Class-Based View) 클래스형 뷰는 상속과 믹스인 기능을 이용하여 코드 재사용하고 뷰를 체계적으로 구성할 수 있다. ## ...&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/9623&quot; data-og-url=&quot;https://wikidocs.net/9623&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SnTyh/hyOZBDQ2j1/l1bCv5u6LcMca8kEBleac0/img.png?width=100&amp;amp;height=45&amp;amp;face=0_0_100_45&quot;&gt;&lt;a href=&quot;https://wikidocs.net/9623&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/9623&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SnTyh/hyOZBDQ2j1/l1bCv5u6LcMca8kEBleac0/img.png?width=100&amp;amp;height=45&amp;amp;face=0_0_100_45');&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;02) 클래스형 뷰 (CBV)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[TOC] # 클래스형 뷰 (CBV, Class-Based View) 클래스형 뷰는 상속과 믹스인 기능을 이용하여 코드 재사용하고 뷰를 체계적으로 구성할 수 있다. ## ...&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>해커톤, 개인 프로젝트/멋쟁이사자처럼 10기 해커톤</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/128</guid>
      <comments>https://devdongbaek.tistory.com/128#entry128comment</comments>
      <pubDate>Thu, 19 May 2022 16:53:26 +0900</pubDate>
    </item>
    <item>
      <title>17478번: 재귀함수가 뭔가요?</title>
      <link>https://devdongbaek.tistory.com/127</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;&lt;span&gt;재귀함수가 뭔가요?&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #5cb85c; color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;256 MB&lt;/td&gt;
&lt;td&gt;17549&lt;/td&gt;
&lt;td&gt;6861&lt;/td&gt;
&lt;td&gt;5613&lt;/td&gt;
&lt;td&gt;37.980%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소에 질문을 잘 받아주기로 유명한 중앙대학교의&amp;nbsp;JH 교수님은&amp;nbsp;학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대학교가 자신과 맞는가에 대한 고민을 항상 해왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중앙대학교와 자신의 길이 맞지 않다고 생각한 JH 교수님은&amp;nbsp;결국 중앙대학교를 떠나기로&amp;nbsp;결정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;떠나기 전까지도 제자들을 생각하셨던 JH 교수님은 재귀함수가 무엇인지&amp;nbsp;물어보는 학생들을 위한 작은 선물로 자동 응답 챗봇을 준비하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JH 교수님이 만들 챗봇의 응답을 출력하는 프로그램을 만들어보자.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교수님이 출력을 원하는 재귀&amp;nbsp;횟수 N(1&amp;nbsp;&amp;le; N &amp;le; 50)이 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 예시를 보고 재귀 횟수에 따른 챗봇의 응답을 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;재귀 함수를 사용하지 않은 내 정답 코드&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1652776308825&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;under_bar = &quot;____&quot;

def factorial(i):
    print((i * under_bar) + '''&quot;재귀함수가 뭔가요?&quot;''')
    print((i * under_bar) + '''&quot;잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n''' + (i * under_bar) + &quot;마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n&quot; + (i * under_bar) + '''그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.&quot;''')
    
    
n = int(input())

print(&quot;어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.&quot;)

for i in range(n): # 0, 1, 2
    factorial(i)

    
for i in range(n, -1, -1):
    if i == n:
        print((i*under_bar)+ '''&quot;재귀함수가 뭔가요?&quot;''')
        print((i*under_bar)+ '''&quot;재귀함수는 자기 자신을 호출하는 함수라네&quot;''')
    print((i*under_bar)+ &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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;재귀 함수를 사용한 내 정답 코드&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1652789998501&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;under_bar = &quot;____&quot;

ans_list = []

def factorial(n):
    ans_list.append((n * under_bar) + '''그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.&quot;''')
    ans_list.append((n * under_bar) + &quot;마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.&quot;)
    ans_list.append((n * under_bar) + '''&quot;잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.''' )
    ans_list.append((n * under_bar) + '''&quot;재귀함수가 뭔가요?&quot;''')
    
    if n &amp;gt; 0:
        factorial(n - 1)
    else:
        return 1
    

n = int(input())

print(&quot;어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.&quot;)

# 0, 1, 2
factorial(n-1)

ans_list.reverse()

for i in range(len(ans_list)):
    print(ans_list[i])


for i in range(n, -1 ,-1):
    if i == n:
        print((i*under_bar)+ '''&quot;재귀함수가 뭔가요?&quot;''')
        print((i*under_bar)+ '''&quot;재귀함수는 자기 자신을 호출하는 함수라네&quot;''')
    print((i*under_bar)+ &quot;라고 답변하였지.&quot;)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>백준 17478</category>
      <category>파이썬 17478</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/127</guid>
      <comments>https://devdongbaek.tistory.com/127#entry127comment</comments>
      <pubDate>Tue, 17 May 2022 17:33:39 +0900</pubDate>
    </item>
    <item>
      <title>백준 파이썬 3009: 네 번째 점</title>
      <link>https://devdongbaek.tistory.com/126</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;&lt;span&gt;네 번째 점&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #5cb85c; color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;span style=&quot;background-color: #777777; color: #ffffff;&quot;&gt;다국어&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;&lt;span&gt;한국어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;128 MB&lt;/td&gt;
&lt;td&gt;31100&lt;/td&gt;
&lt;td&gt;22474&lt;/td&gt;
&lt;td&gt;20247&lt;/td&gt;
&lt;td&gt;73.260%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직사각형의 네 번째 점의 좌표를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내 정답 코드&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1651401457397&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x = []
y = []

# x와 y 좌표들을 입력받습니다!
for i in range(3):
    a, b = map(int, input().split())
    x.append(a)
    y.append(b)
 
# x와 y 좌표들중 중복된 것이 있다면 변수에 저장해줍니다!
for j in range(3):
    if x.count(x[j]) &amp;gt; 1:
        xrepeated_num = x[j]

    if y.count(y[j]) &amp;gt; 1:
        yrepeated_num = y[j]
        

# x와 y중 중복된 것들을 제거해줍니다!
while xrepeated_num in x:
    x.remove(xrepeated_num)

while yrepeated_num in y:
    y.remove(yrepeated_num)

print(&quot;{0} {1}&quot;.format(x[0], y[0]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 평행한 직사각형의 특징을 이용하여 해당 문제를 해결하였습니다. 입력 예시를 통해서 위 코드를 설명해드리겠습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;입력 예시는 아래와 같습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1번째&amp;nbsp; &amp;nbsp;x: 5,&amp;nbsp; &amp;nbsp; y: 5&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2번째&amp;nbsp; &amp;nbsp;x: 5,&amp;nbsp; &amp;nbsp; y: 7&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3번째&amp;nbsp; &amp;nbsp;x: 7,&amp;nbsp; &amp;nbsp; y: 5&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;font-family: 'Noto Serif KR';&quot;&gt;위를 좌표 형식으로 생각한다면 x의 점들은 5와 7 위에 위치할 것이고, y의 점또한 5와 7에 위치할 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 때 중요한 것은 평행한 직사각형의 좌표이기에 이미 두개가 표시된(=중복된) 좌표는 새로운 좌표가 올 수 없기에 제거해주면 x는 7, y는 7이 남아 답이 됩니다!!!&lt;/span&gt;&lt;/p&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>백준3009번</category>
      <category>백준파이썬3009번</category>
      <category>파이썬3009번</category>
      <category>파이썬백준3009번</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/126</guid>
      <comments>https://devdongbaek.tistory.com/126#entry126comment</comments>
      <pubDate>Sun, 1 May 2022 19:44:14 +0900</pubDate>
    </item>
    <item>
      <title>백준 파이썬 9020: 골드바흐의 추측</title>
      <link>https://devdongbaek.tistory.com/125</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;&lt;span&gt;골드바흐의 추측&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #5cb85c; color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;span style=&quot;background-color: #777777; color: #ffffff;&quot;&gt;다국어&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;&lt;span&gt;한국어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2 초&lt;/td&gt;
&lt;td&gt;256 MB&lt;/td&gt;
&lt;td&gt;53440&lt;/td&gt;
&lt;td&gt;22452&lt;/td&gt;
&lt;td&gt;17139&lt;/td&gt;
&lt;td&gt;40.620%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1보다 큰 자연수&amp;nbsp;중에서 &amp;nbsp;1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 &amp;times; 3 이기 때문에 소수가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은&amp;nbsp;모든 짝수 n에 대한 골드바흐 파티션은 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고 짝수 n이 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스에 대해서 주어진 n의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제한&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_limit&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4 &amp;le; n &amp;le; 10,000&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내 정답 코드&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1648519891526&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 테스트 케이스 총 범위
num = int(input())

n = 10000 


# 에라토스테네스의 체
a = [False,False] + [True]*(n-1)
primes=[]

for i in range(2,n+1):
    if a[i]:
        primes.append(i)
        for j in range(2*i, n+1, i):
            a[j] = False



for i in range(num):
    ans1 = 0
    ans2 = 0
    even = int(input())

    even_first = even // 2

    ans1 = even_first
    ans2 = even_first
    
    if ans1 not in primes and ans2 not in primes:
        while True:
            ans1 -= 1
            ans2 += 1
            
            if ans1 in primes and ans2 in primes:
                break
        
    print(&quot;{0} {1}&quot;.format(ans1, ans2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_ 에라토스테네스의 체와 소수 문제를 풀어보셨던 분들은 아마 비교적 쉽게 푸실 수 있는 문제였을 것이라 생각이 듭니다. 먼저 위 코드를 Devide 하여서 자세히 살펴보겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648519925149&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 에라토스테네스의 체
a = [False,False] + [True]*(n-1)
primes=[]

for i in range(2,n+1):
    if a[i]:
        primes.append(i)
        for j in range(2*i, n+1, i):
            a[j] = False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_ 위 코드들은 에라토스테네스의 체를 이용해 소수를 구하는 코드입니다. 소수들은 primes 리스트에 저장되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648520044647&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in range(num):
    ans1 = 0
    ans2 = 0
    even = int(input())

    even_first = even // 2

    ans1 = even_first
    ans2 = even_first
    
    if ans1 not in primes and ans2 not in primes:
        while True:
            ans1 -= 1
            ans2 += 1
            
            if ans1 in primes and ans2 in primes:
                break
        
    print(&quot;{0} {1}&quot;.format(ans1, ans2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_ 위의 반복문을 Devide 해봅시다!&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648520068856&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in range(num):
    ans1 = 0
    ans2 = 0
    even = int(input())

    even_first = even // 2

    ans1 = even_first
    ans2 = even_first&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_ ans1과 ans2는 주어진 짝수(even)의 골드 파티션을 담을 변수들이며, ans1이 더 작은 소수에 속합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_ 짝수(even)을 2로 나눈 값을 각 ans1과 ans2에 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;pre id=&quot;code_1648520273623&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    if ans1 not in primes and ans2 not in primes:
        while True:
            ans1 -= 1
            ans2 += 1
            
            if ans1 in primes and ans2 in primes:
                break
        
    print(&quot;{0} {1}&quot;.format(ans1, ans2))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_ 만약 짝수(even)을 2로 나눈 값이 primes 리스트에 속한다면, 즉 소수에 속한다면 그 값을 ans1과 ans2에 바로 저장해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 짝수(even)이 10이고 2로 나눈 값은 5이고, 소수에 속하기에 ans1과 ans2에 각 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;_ 만약 소수에 속하지 않았다면 속하게 될 때 까지 ans1이 더 작은 값이기에 2로 나눈 값에서 1을 빼주고, ans2는 2로 나눈 값에서 1을 더해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 짝수(even)이 8이고 2로 나눈 값은 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ans1 = 4, ans 2 = 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;span&gt;ans1이 더 작은 값이기에 2로 나눈 값에서 1을 빼주고, ans2는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;2로 나눈 값에서 1을 더해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ans1 = 3, ans2 = 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;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;010&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>백준 9020</category>
      <category>백준 골드바흐의 추측</category>
      <category>백준 파이썬 9020</category>
      <category>파이썬 9020</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/125</guid>
      <comments>https://devdongbaek.tistory.com/125#entry125comment</comments>
      <pubDate>Tue, 29 Mar 2022 11:21:49 +0900</pubDate>
    </item>
    <item>
      <title>백준 파이썬 4948: 베르트랑 공준</title>
      <link>https://devdongbaek.tistory.com/124</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;&lt;span&gt;베르트랑 공준&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #5cb85c; color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;span style=&quot;background-color: #777777; color: #ffffff;&quot;&gt;다국어&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;&lt;span&gt;한국어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;256 MB&lt;/td&gt;
&lt;td&gt;61963&lt;/td&gt;
&lt;td&gt;24574&lt;/td&gt;
&lt;td&gt;19945&lt;/td&gt;
&lt;td&gt;39.874%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연수 n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하는 한 줄로 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력의 마지막에는 0이 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스에 대해서, n보다 크고, 2n보다 작거나 같은 소수의 개수를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시간 초과가 났던 내 처음 코드&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1648273996166&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;&quot;&quot;
    
    시간 초과

&quot;&quot;&quot;

# 테스트 케이스 총 범위
n=246912

# 에라토스테네스의 체
a = [False,False] + [True]*(n-1)
primes=[]

for i in range(2,n+1):
    if a[i]:
        primes.append(i)
        for j in range(2*i, n+1, i):
            a[j] = False

ans_cnt = []


while True:
    num = int(input())
    
    # 0을 입력받으면 종료    
    if num == 0:
        for i in ans_cnt:
            print(i)
        break
    
    # cnt들을 모아둔 리스트
    cnt = 0
    
    # 만약 범위내에 소수가 있으면 cnt에 1을 더해라
    for i in range(num+1, 2*num+1):
        if i in primes:
            cnt += 1
        
    # ans_cnt에 cnt를 추가해줌.
    ans_cnt.append(cnt)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내 정답 코드&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1648274160633&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 테스트 케이스 총 범위
n=123456

# 에라토스테네스의 체
def prime_list(n):
    if n == 1:
        return False
    for i in range(2,int(n**0.5)+1):
        if n%i == 0:
            return False
    return True		

primes_list = list(range(2,246912))
ans_list = []

for i in primes_list:
    # 만약 소수에 해당하면 prime_list 함수에서 true를 반환 받을 것입니다.
    if prime_list(i):
        # true를 반환 받는다면 ans_list에 해당 원소(i)를 추가해줍니다.
        ans_list.append(i)
        
        
while True:
    
    cnt = 0

    num = int(input())

    # 0을 입력받으면 종료    
    if num == 0:
        break
    
    for i in ans_list:
        if num &amp;lt; i &amp;lt; 2*num+1:
            cnt += 1
            
    print(cnt)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 소수를 구하는 공식 에라토스테네스의 체를 아예 함수로 만들어주고, 모든 원소에 소수, 소수가 아닌 값인 True, False를 넣어주는 게 아닌 소수인 값만 ans_list에 저장함으로 불필요한 반복문 사용을 줄여주었다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>백준 4948번</category>
      <category>백준 파이썬 4948번</category>
      <category>파이썬 4948번</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/124</guid>
      <comments>https://devdongbaek.tistory.com/124#entry124comment</comments>
      <pubDate>Sat, 26 Mar 2022 14:58:08 +0900</pubDate>
    </item>
    <item>
      <title>Django JSON 직렬화</title>
      <link>https://devdongbaek.tistory.com/123</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출처 :&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Django JSON 직렬화(Serialization)&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;직렬화(serialization)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_모든 프로그래밍 언어의 통신에서 데이터는 필히 문자열로 표현되어야만 합니다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;송신자(백엔드)&lt;/b&gt; : 객체를 문자열로 변환하여, 데이터 전송 -&amp;gt; 직렬화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;수신자(프론트엔드)&lt;/b&gt; : 수신한 문자열을 다시 객체로 변환하여, 활용 -&amp;gt; 비직렬화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_각 언어에서 모두 지원하는 직렬화 포맷 (&lt;b&gt;JSON&lt;/b&gt;, XML 등)이 있고, 특정 언어에서만 지원하는 직렬화 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;포맷이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;ex) 파이썬의 Pickle&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;JSON 변환&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터는 같지만, 응답 형식이 다를 수는 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;_보통의 웹에서는 GET 요청에 대해 HTML 포맷으로 응답하고, POST 요청을 application/x-www-form-urlencoded 인코딩으로 요청하고, HTML 포맷으로 응답합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;_요즘의 API 서버에서는 대부분 JSON 인코딩으로 요청 / 응답합니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;JSON 포맷과 PICKLE 포맷&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;JSON 포맷&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;다른 언어 / 플랫폼과 통신할 때 주로 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표준 라이브러리 json 제공 // 파이썬 기본 타입에 대해서는 지원을 하지만, Django나 커스텀 타입은 지원을 제공하지않음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pickle에 비해서 직렬화를 지원하는 데이터 타입의 수가 적지만, 커스텀 Rule도 지정 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.w3schools.com/python/python_json.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.w3schools.com/python/python_json.asp&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647927213618&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;Python JSON&quot; data-og-description=&quot;W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.&quot; data-og-host=&quot;www.w3schools.com&quot; data-og-source-url=&quot;https://www.w3schools.com/python/python_json.asp&quot; data-og-url=&quot;https://www.w3schools.com/python/python_json.asp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bU5rBM/hyNNj3RZ0J/ocAgp9b9j0UuAeSvppeumK/img.png?width=436&amp;amp;height=228&amp;amp;face=0_0_436_228&quot;&gt;&lt;a href=&quot;https://www.w3schools.com/python/python_json.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.w3schools.com/python/python_json.asp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bU5rBM/hyNNj3RZ0J/ocAgp9b9j0UuAeSvppeumK/img.png?width=436&amp;amp;height=228&amp;amp;face=0_0_436_228');&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 JSON&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.w3schools.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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;Pickle 포맷&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;파이썬 전용 포맷으로서 파이썬 시스템끼리만 통신할 때 사용 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표준 라이브러리 pickle 제공 -&amp;gt; json 라이브러리가 유사한 사용 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주의) 파이썬 버전 특성을 타는 경우가 있습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://wayhome25.github.io/cs/2017/04/04/cs-04/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wayhome25.github.io/cs/2017/04/04/cs-04/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647927282948&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;강의노트 04. 파이썬 pickle 모듈 &amp;middot; 초보몽키의 개발공부로그&quot; data-og-description=&quot;패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.&quot; data-og-host=&quot;wayhome25.github.io&quot; data-og-source-url=&quot;https://wayhome25.github.io/cs/2017/04/04/cs-04/&quot; data-og-url=&quot;https://wayhome25.github.io/cs/2017/04/04/cs-04/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://wayhome25.github.io/cs/2017/04/04/cs-04/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wayhome25.github.io/cs/2017/04/04/cs-04/&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;강의노트 04. 파이썬 pickle 모듈 &amp;middot; 초보몽키의 개발공부로그&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;wayhome25.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ json / pickle 모두 파이썬 기본 라이브러리로 제공이 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;그러나 장고 타입 (Model / QuerySet 등)에 대해서는 직렬화 Rule이 없습니다. -&amp;gt; 오류 발생&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 그러면 어떻게 해결 할 수 있을까요?&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 직접 변환하는 방법이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;QuerySet을 JSON 형식으로 직접 바꿔준 다음 json.dumps를 통해 json으로 써줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647928414853&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data = [
    {'id': post.id, 'title':post.title, 'content': post.content}
    for post in Post.objects.all()
]
    
json.dumps(data, ensure_ascii=False).encode('utf8') # ensure_ascii에 False값을 주면, json.dumps()값을 UTF-8로 수동으로 인코딩할 수 있다.&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;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_DjangoJSONEncoder를 통해 아래 타입들에 대한 Rule을 추가로 구현할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;datetime.datetime, datetime.date, datetime.time, datetime.delta&lt;/li&gt;
&lt;li&gt;decimal.Decimal, uuid.UUID, Promise&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1647929090504&quot; class=&quot;pgsql&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import json
from django.core.serializers.json import DjangoJSONEncoder&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;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 그러나 매번 직접 변환하기는 너무 번거로우니 -&amp;gt; 직접 변환 Rule을 지정하거나 DRF의 JSONRender, DRF의 serializers.py를 이용하는 방법들이 있습니다. -&amp;gt; 그러나 이러한 방법들을 Model에 대한 변환 Rule은 지원하지 않습니다 ㅠㅠ&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;035&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/035.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/035.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span&gt;ModelSerializer를 통한 JSON 직렬화&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_Serializer / ModelSerializer은 Form / ModelForm과 유사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; 역할 면에서 Serializer은 POST 요청만 처리하는 Form&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;둘의 공통점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;폼 필드 지정 혹은 모델로부터 읽어오기.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력된 데이터에 대한 유효성 검사를 통해 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;둘의 차이점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Form / ModelForm&amp;nbsp;: Form태그가 포함된 HTML을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serializer / ModelSerializer&amp;nbsp;: Form 데이터가 포함된 JSON 문자열을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ModelSerializer&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647930205702&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.serializers import ModelSerializer

# Post모델에 대한 ModelSerializer 정의
class PostSerializer(ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

post = Post.objects.first() # Post 타입

serializer = PostSerializer(post)
serializer.data # -&amp;gt; ReturnDict 타입&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/api-guide/serializers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.django-rest-framework.org/api-guide/serializers/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647929953068&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;Serializers - Django REST framework&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.django-rest-framework.org&quot; data-og-source-url=&quot;https://www.django-rest-framework.org/api-guide/serializers/&quot; data-og-url=&quot;https://www.django-rest-framework.org/api-guide/serializers/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/api-guide/serializers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.django-rest-framework.org/api-guide/serializers/&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;Serializers - Django REST framework&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.django-rest-framework.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ Model 객체나 쿼리셋에 대해 ReturnDict type으로 변환 할 수 있습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647930428983&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from .serializers import PostSerializer
from .models import Post

# 한개의 모델만 넘기기
serializer = PostSerializer(Post.objects.first())
serializer.data # {'id': 1, 'message': '첫번째 포스팅' ... }

# 쿼리셋을 넘기기
serializer = PostSerializer(Post.objects.all(), many=True)
serializer.data # [OrderDict([('id', 1), ...)]), OrderDict([('id': 2), ...)]) ...]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ Model 객체에 대해서는 필히&lt;b&gt; many=False&lt;/b&gt;(디폴트)를 지정해주어야 하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&amp;nbsp; 쿼리셋 객체에 대해서는 필히&lt;b&gt; many=True&lt;/b&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: #000000;&quot;&gt;-&amp;gt; 지정이 맞지 않으면 변환 에러가 발생하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;View에서의 JSON 응답&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;모든 View는 HttpResponse 타입의 응답을 해야 하고, 일반적으로 다음 2가지 방법을 사용합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;직접 json.dumps를 통해 직렬화된 문자열을 획득하여, HttpResponse를 통해 응답합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1번을 정리하여 JsonResponse를 지원합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;DRF를 통한 JSON 응답&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;DRF Response를 활용합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647931022111&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;qs = Post.objects.all()

serializer = PostModelSerializer(qs, many=True)

from rest_framework.response import Response

response = Response(serializer.data) # Content-type : text/html이 디폴트 지정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;br /&gt;_ Response에서는 &quot;JSON 직렬화&quot; 가 Lazy하게 동작합니다. 실제 응답 생성시에 .rendered_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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Response와 APIView&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;_ DRF의 모든 뷰는 APIView를 상속 받습니다. APIView를 통해서 Response에 다양한 속성이 지정됩니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647931269823&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.views import APIView

renderer_cls = APIView.renderer_classes[0]
renderer_obj = renderer_cls()
response.accepted_renderer = renderer_obj # JSON 변환을 위한 JSONRenderer 인스턴스

response.accepted_media_type = renderer_obj.media_type # 'application/json'
response.renderer_context = {'view': None, 'args': (), 'kwargs': {}, 'request': None}

response # &amp;lt;Response status_code=200, &quot;application/json&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 DRF Serializer 사용&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#views.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647931618540&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework import generics

class PostListAPIView(generics.ListAPIView): # 만약 list, create, detail, update, delete등을 모두 사용하려면 ViewSet을 이용
    queryset = Post.objects.all()
    serializer_class = PostSerializer

post_list = PostListAPIView.as_view()&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#urls.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647932037721&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('public/', views.PostListAPIView.as_view()),
]&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;7.JPG&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tBxxU/btrwUjGPU64/YGY4t9IAAIz1hdC9z7lyZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tBxxU/btrwUjGPU64/YGY4t9IAAIz1hdC9z7lyZ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tBxxU/btrwUjGPU64/YGY4t9IAAIz1hdC9z7lyZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtBxxU%2FbtrwUjGPU64%2FYGY4t9IAAIz1hdC9z7lyZ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;552&quot; data-filename=&quot;7.JPG&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;포스팅 조회 응답에 username 응답을 하려면?&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ author = FK(User) 필드가 있을 때, Serializer에서는 FK 키값으로 응답&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;serializer.ReadOnlyField를 통해서 FK의 필드값을 읽어 올 수 있습니다.&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#models.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647932345457&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.conf import settings
from django.db import models

# Create your models here.

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#serializers.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647932187512&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
    username = serializers.ReadOnlyField(source='author.username') # 추가

    class Meta:
        model = Post
        fields = ['pk', 'username', 'title', 'cotnent'] # 'username' 추가&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 또는 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;StringRelatedField, SlugRelatedField 등 뿐만 아니라, 중첩된 Serializer를 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;통해서도 구현 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#serializers.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647932466272&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import Post
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = ['username']

class PostSerializer(serializers.ModelSerializer):
    author = AuthorSerializer()

    class Meta:
        model = Post
        fields = '__all__'&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;도움 받은 글들&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sss20-02.tistory.com/65&quot;&gt;https://sss20-02.tistory.com/65&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647929008524&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;[Django] JSON 직렬화 - Serializer&quot; data-og-description=&quot;(Model)Form vs (Model)Serializer Django Djnago Rest Framework Form/ModelForm Serializer/ModelSerializer Model로부터 Field 읽어옴 유효성 검사 HTML Form 생성 JSON 문자열 생성 django와 django rest fra..&quot; data-og-host=&quot;sss20-02.tistory.com&quot; data-og-source-url=&quot;https://sss20-02.tistory.com/65&quot; data-og-url=&quot;https://sss20-02.tistory.com/65&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dedxvK/hyNLTMt3hA/4psIzd0iOTQxWioROpSbp0/img.png?width=800&amp;amp;height=330&amp;amp;face=0_0_800_330,https://scrap.kakaocdn.net/dn/zszh0/hyNNhdUsWt/3D8tKm1Cq85kHnculBnlkk/img.png?width=800&amp;amp;height=330&amp;amp;face=0_0_800_330,https://scrap.kakaocdn.net/dn/bxwjFx/hyNLPi0EZP/5mdsiLTzfCK3PSkdCHNqHk/img.jpg?width=756&amp;amp;height=756&amp;amp;face=0_0_756_756&quot;&gt;&lt;a href=&quot;https://sss20-02.tistory.com/65&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sss20-02.tistory.com/65&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dedxvK/hyNLTMt3hA/4psIzd0iOTQxWioROpSbp0/img.png?width=800&amp;amp;height=330&amp;amp;face=0_0_800_330,https://scrap.kakaocdn.net/dn/zszh0/hyNNhdUsWt/3D8tKm1Cq85kHnculBnlkk/img.png?width=800&amp;amp;height=330&amp;amp;face=0_0_800_330,https://scrap.kakaocdn.net/dn/bxwjFx/hyNLPi0EZP/5mdsiLTzfCK3PSkdCHNqHk/img.jpg?width=756&amp;amp;height=756&amp;amp;face=0_0_756_756');&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;[Django] JSON 직렬화 - Serializer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(Model)Form vs (Model)Serializer Django Djnago Rest Framework Form/ModelForm Serializer/ModelSerializer Model로부터 Field 읽어옴 유효성 검사 HTML Form 생성 JSON 문자열 생성 django와 django rest fra..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sss20-02.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@joje/JSON-%EC%A7%81%EB%A0%AC%ED%99%94-%EB%B0%8F-API-%EC%9D%91%EB%8B%B5-Django-vs-DRF&quot;&gt;https://velog.io/@joje/JSON-%EC%A7%81%EB%A0%AC%ED%99%94-%EB%B0%8F-API-%EC%9D%91%EB%8B%B5-Django-vs-DRF&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647929020787&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 직렬화 및 API 응답 (Django vs DRF)&quot; data-og-description=&quot;직렬화의 개념 및 방법에 대해서 알아본다. 또한 Django와 DRF에서 직렬화 룰을 추가하고 수행하는 예제를 살펴보고 JSON API 응답을 비교해본다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@joje/JSON-%EC%A7%81%EB%A0%AC%ED%99%94-%EB%B0%8F-API-%EC%9D%91%EB%8B%B5-Django-vs-DRF&quot; data-og-url=&quot;https://velog.io/@joje/JSON-직렬화-및-API-응답-Django-vs-DRF&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yjjtF/hyNLG0HFJe/8ipCxD6TKyaTvXo42hVwnK/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@joje/JSON-%EC%A7%81%EB%A0%AC%ED%99%94-%EB%B0%8F-API-%EC%9D%91%EB%8B%B5-Django-vs-DRF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@joje/JSON-%EC%A7%81%EB%A0%AC%ED%99%94-%EB%B0%8F-API-%EC%9D%91%EB%8B%B5-Django-vs-DRF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yjjtF/hyNLG0HFJe/8ipCxD6TKyaTvXo42hVwnK/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;JSON 직렬화 및 API 응답 (Django vs DRF)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;직렬화의 개념 및 방법에 대해서 알아본다. 또한 Django와 DRF에서 직렬화 룰을 추가하고 수행하는 예제를 살펴보고 JSON API 응답을 비교해본다.&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;a href=&quot;https://brownbears.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://brownbears.tistory.com/82&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647931881060&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;[Django REST framework] ViewSet&quot; data-og-description=&quot;ViewSets Django REST framework는 단일 클래스에서 관련있는 view들의 집합을 위해 logic의 결합을 허용합니다. 이를&amp;nbsp;ViewSet이라 합니다. 또한 다른 framework에서 resource 또는 controller같이 이름이&amp;nbsp;개념..&quot; data-og-host=&quot;brownbears.tistory.com&quot; data-og-source-url=&quot;https://brownbears.tistory.com/82&quot; data-og-url=&quot;https://brownbears.tistory.com/82&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bK6zgQ/hyNNcRfrcK/8XZH3GPkAYdxkEAXekvuVk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cVLbcs/hyNM73tlGx/yoJtXmxJ7r67wKtCe7HiS1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://brownbears.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brownbears.tistory.com/82&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bK6zgQ/hyNNcRfrcK/8XZH3GPkAYdxkEAXekvuVk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cVLbcs/hyNM73tlGx/yoJtXmxJ7r67wKtCe7HiS1/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;[Django REST framework] ViewSet&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ViewSets Django REST framework는 단일 클래스에서 관련있는 view들의 집합을 위해 logic의 결합을 허용합니다. 이를&amp;nbsp;ViewSet이라 합니다. 또한 다른 framework에서 resource 또는 controller같이 이름이&amp;nbsp;개념..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brownbears.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>강의 정리/Django REST Framework</category>
      <category>django json</category>
      <category>Django 직렬화</category>
      <category>장고 JSON</category>
      <category>장고 직렬화</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/123</guid>
      <comments>https://devdongbaek.tistory.com/123#entry123comment</comments>
      <pubDate>Tue, 22 Mar 2022 16:02:34 +0900</pubDate>
    </item>
    <item>
      <title>Django JSON 응답뷰</title>
      <link>https://devdongbaek.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;Django JSON 응답뷰 만들기&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;REST API 스타일로 포스팅 API 서비스를 제공할 때&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;/post/ 주소&lt;/span&gt;&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;GET 방식 요청 : 목록 응답&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;POST 방식 요청 : 새 글 생성하고, 확인 응답&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #ef5369;&quot;&gt;&lt;b&gt;&lt;i&gt;예시 코드&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647055530188&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def post_list(request):
    if request.method == 'POST':
        # POST 일시 새 글 저장을 구현
        form = PostForm(request.Post, request.FILES)
        if form.is_valid():
            post = form.save()
            # JsonResponse은 json 응답을 만드는데 사용합니다.
            # 유효성 검사에 통과했다면
            return JsonResponse(post)
        # 유효성 검사에 통과하지못했다면    
        return JsonResponse(form.errors)
    else:
        # GET 일시 목록 응답을 구현
        return JsonResponse(Post.objects.all())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;/post/10/ 주소&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;GET 방식 요청 : 10번 글 내용 응답&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PUT 방식 요청 : 10번 글 수정 / 저장하고, 확인 응답&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DELETE 방식 요청 : 10번 글 삭제하고, 확인 응답&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;i&gt;예시 코드&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647056073517&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 특정 pk에 대해 접근
def post_detail(request, pk):
    if request.method == 'PUT':
        # PUT 일시 해당 PK글 수정, 갱신을 구현
        # QueryDict은 사전형 타입의 클래스로 같은 키에 대해 복수의 값을 갖도록 커스터마이즈하게 해준다.
        put_data = QueryDict(request.body)
       
        # 해당 pk글을 수정할 instance로 둡니다.
        form = PostForm(put_data, instance=post)
        if form.is_valid():
            post = form.save()
            # JsonResponse은 json 응답을 만드는데 사용합니다.
            # 유효성 검사에 통과했다면
            return JsonResponse(post)
        # 유효성 검사에 통과하지못했다면    
        return JsonResponse(form.errors)
    
    elif request.method == 'DELETE':
        # DELETE 일시 해당 PK글 삭제를 구현
        post.delete()
        return HTTPResponse()
    
    else:
        # GET 일시 해당 PK글 내용 응답을 구현
        return JsonResponse(Post.objects.all())&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;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;총 5개의 뷰 처리가 필요해집니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 만약 다른 모델에 대해서 동일한 기능을 구현한다면, Model/Form을 제외하고는 위 코드와 같이 거의 정형화된 패턴입니다. Django REST Framework (=DRF)는 이런 &lt;b&gt;정형화 된 중복을 줄일 수 있도록&lt;/b&gt; 도와주는 CBV를 비롯해 다양한 기능을 지원합니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;i&gt;참고&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;HTTP 동사(메소드)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;_&lt;b&gt;GET&lt;/b&gt;&amp;nbsp;메서드는 특정 리소스의 표시를 요청합니다. GET을 사용하는 요청은 오직 데이터를 받기만(조회) 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;_&lt;b&gt;POST&lt;/b&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;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;_&lt;b&gt;PUT&lt;/b&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;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;_&lt;b&gt;DELETE&lt;/b&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;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;_&lt;b&gt;PATCH&lt;/b&gt;&amp;nbsp;메서드는 리소스의 부분만을 수정하는 데 쓰입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647055055018&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;HTTP 요청 메서드 - HTTP | MDN&quot; data-og-description=&quot;HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 &amp;quot;HTTP 동사&amp;quot;라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hJt6Y/hyNGHKDfGg/hFN3dmCJu7mw2FHXWLbYyK/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/Web/HTTP/Methods&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hJt6Y/hyNGHKDfGg/hFN3dmCJu7mw2FHXWLbYyK/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;HTTP 요청 메서드 - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 &quot;HTTP 동사&quot;라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;DRF 설치하기&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.django-rest-framework.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647062653513&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;Home - Django REST framework&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.django-rest-framework.org&quot; data-og-source-url=&quot;https://www.django-rest-framework.org/&quot; data-og-url=&quot;https://www.django-rest-framework.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.django-rest-framework.org/&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;Home - Django REST framework&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.django-rest-framework.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;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;0. 터미널에 아래 코드를 입력해줌으로서 설치를 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647056340692&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install djangorestframework~=3.11.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;추가로 항상 requirements.txt를 통해서 사용하고 있는 skill들을 기록해놓아야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647058203412&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django~=3.0.0
djangorestframewrok~=3.11.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;1. settings.INSTALLED_APPS에 &quot;rest_framework&quot;를 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647056413604&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
    # Django Apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.humanize',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Third Apps
    'debug_toolbar',
    'bootstrap4',
    'django_pydenticon',
    'easy_thumbnails',
    'rest_framework', # 추가

    # Local Apps
    'accounts',
    'insta',
  
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;2. ulrpatterns 다음 패턴에 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647056481076&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('api-auth', include('restframework.ulrs')), # 추가
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;i&gt;DRF 샘플 구현하기&amp;nbsp; (매우 기본 샘플)&lt;/i&gt;&lt;/b&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;myapp/models.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647060893220&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.db import models

# Create your models here.

class Post(models.Model):
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;myapp/serializers.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647060902683&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.serializers import ModelSerializer
from .models import Post

class PostSerializer(ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;myapp/views.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647060916067&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from rest_framework.viewsets import ModelViewSet

from .serializers import PostSerializer
from .models import Post

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer





&quot;&quot;&quot;
DRF를 사용하지 않았을 때의 작업 방법

def post_list(request):
    # 최소 2개의 분기 ex) POST, GET
    pass

def def_detail(request, pk):
    # request.method # =&amp;gt; 최소 3개 분기 ex) GET, PUT, DELETE
    pass
&quot;&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;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;myapp/urls.py&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647060937243&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.urls import path, include
from rest_framework.routers import DefaultRouter

from . import views

# 1개의 CBV에서 2개의 url을 만드는 코드
router = DefaultRouter()
router.register('post', views.PostViewSet) # 2개의 URL을 만들어줌.
# 위의 과정까지 마치면
# router.urls에 리스트 형태로 url들이 저장되어있음.


urlpatterns = [
    path('', include(router.urls)),
]&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;0.JPG&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw8Z5n/btrvOgkaIxT/cI6XYy1aHkDQ7awBsHK1g0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw8Z5n/btrvOgkaIxT/cI6XYy1aHkDQ7awBsHK1g0/img.jpg&quot; data-alt=&quot;root 페이지의 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw8Z5n/btrvOgkaIxT/cI6XYy1aHkDQ7awBsHK1g0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw8Z5n%2FbtrvOgkaIxT%2FcI6XYy1aHkDQ7awBsHK1g0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;488&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;root 페이지의 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj94PT/btrvMHo0o0d/yH3wLhAxkgvvIHphE10ziK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj94PT/btrvMHo0o0d/yH3wLhAxkgvvIHphE10ziK/img.jpg&quot; data-alt=&quot;/post/ 페이지의 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj94PT/btrvMHo0o0d/yH3wLhAxkgvvIHphE10ziK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj94PT%2FbtrvMHo0o0d%2FyH3wLhAxkgvvIHphE10ziK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;645&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;/post/ 페이지의 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpED90/btrvKKGZvtB/aK8D5KFOwgjkgGlRgHHzdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpED90/btrvKKGZvtB/aK8D5KFOwgjkgGlRgHHzdK/img.jpg&quot; data-alt=&quot;DRF에서 기본 제공되는 로그인 페이지 // django의 auth를 이용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpED90/btrvKKGZvtB/aK8D5KFOwgjkgGlRgHHzdK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpED90%2FbtrvKKGZvtB%2FaK8D5KFOwgjkgGlRgHHzdK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;767&quot; height=&quot;628&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DRF에서 기본 제공되는 로그인 페이지 // django의 auth를 이용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHs5a6/btrvLgTcKgr/lSKnkkzqlWC6pQKQoCHtZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHs5a6/btrvLgTcKgr/lSKnkkzqlWC6pQKQoCHtZ0/img.jpg&quot; data-alt=&quot;/post/ 페이지에서 POST를 했을 때 JSON 형태로 저장이 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHs5a6/btrvLgTcKgr/lSKnkkzqlWC6pQKQoCHtZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHs5a6%2FbtrvLgTcKgr%2FlSKnkkzqlWC6pQKQoCHtZ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;547&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;/post/ 페이지에서 POST를 했을 때 JSON 형태로 저장이 된다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;다양한 HTTP 클라이언트 프로젝트&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 유저가 웹브라우저를 통해 웹페이지간 이동할때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 웹 프론트엔드에서 JavaScripts를 통해 호출 할 때 ex) Ajax&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ Android/ios 앱 코드를 통한 호출 할 때&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 웹 요청 개발 프로그램을 통한 호출 할 때 ex) Postman, request ,&lt;i&gt;&lt;b&gt;HTTPie&lt;/b&gt;&lt;/i&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;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;그 중 HTTPie를 통한 HTTP 요청&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;a href=&quot;https://codermun-log.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://codermun-log.tistory.com/144&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647061905176&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;TIL.54 Httpie를 이용해 통신해보기(Django, MySQL)&quot; data-og-description=&quot;Django_CRUD_2 이전 CRUD_1에서는 모델과 데이터베이스간에 다뤘던 Django QuerySetAPI를 사용하고 연습해봄으로써 손에 익히기 위한 공부였다면 CRUD_2에서는 위에서 배운 내용1의 기본기를 통해서 실제로 &quot; data-og-host=&quot;codermun-log.tistory.com&quot; data-og-source-url=&quot;https://codermun-log.tistory.com/144&quot; data-og-url=&quot;https://codermun-log.tistory.com/144&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZy5we/hyNFzU1hcw/ZBbFzK1dFLfIRNel8O2h30/img.png?width=800&amp;amp;height=408&amp;amp;face=0_0_800_408,https://scrap.kakaocdn.net/dn/n3gXX/hyNFKI0bz2/89oEufV0IPYh97CdWtikuk/img.png?width=800&amp;amp;height=408&amp;amp;face=0_0_800_408,https://scrap.kakaocdn.net/dn/r9lHW/hyNFEouvdY/5KgqmmgZ1JE3PMoB0iJ6t0/img.png?width=1903&amp;amp;height=658&amp;amp;face=0_0_1903_658&quot;&gt;&lt;a href=&quot;https://codermun-log.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codermun-log.tistory.com/144&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZy5we/hyNFzU1hcw/ZBbFzK1dFLfIRNel8O2h30/img.png?width=800&amp;amp;height=408&amp;amp;face=0_0_800_408,https://scrap.kakaocdn.net/dn/n3gXX/hyNFKI0bz2/89oEufV0IPYh97CdWtikuk/img.png?width=800&amp;amp;height=408&amp;amp;face=0_0_800_408,https://scrap.kakaocdn.net/dn/r9lHW/hyNFEouvdY/5KgqmmgZ1JE3PMoB0iJ6t0/img.png?width=1903&amp;amp;height=658&amp;amp;face=0_0_1903_658');&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;TIL.54 Httpie를 이용해 통신해보기(Django, MySQL)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django_CRUD_2 이전 CRUD_1에서는 모델과 데이터베이스간에 다뤘던 Django QuerySetAPI를 사용하고 연습해봄으로써 손에 익히기 위한 공부였다면 CRUD_2에서는 위에서 배운 내용1의 기본기를 통해서 실제로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codermun-log.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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;설치는 아래 코드와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647061849184&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install httpie&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;HTTPie 명령어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://ssungkang.tistory.com/entry/Web-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%B9%9C%ED%99%94%EC%A0%81%EC%9D%B8-http-client-Httpie&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ssungkang.tistory.com/entry/Web-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%B9%9C%ED%99%94%EC%A0%81%EC%9D%B8-http-client-Httpie&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647062128554&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] 사용자 친화적인 http client, Httpie&quot; data-og-description=&quot;우리는 직접 웹사이트에 들어가지 않고도 정보를 얻을 수 있습니다. CLI 를 통해 명령어를 입력하는 것으로만으로 말이죠. 앞으로 공부할 django restful API 처럼 API 를 테스트 하는데도 사용할 수 있&quot; data-og-host=&quot;ssungkang.tistory.com&quot; data-og-source-url=&quot;https://ssungkang.tistory.com/entry/Web-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%B9%9C%ED%99%94%EC%A0%81%EC%9D%B8-http-client-Httpie&quot; data-og-url=&quot;https://ssungkang.tistory.com/entry/Web-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%B9%9C%ED%99%94%EC%A0%81%EC%9D%B8-http-client-Httpie&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/be5kjy/hyNFNeHJze/FW7UTNqpfEg7Bt6or7Oxdk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bZpPOI/hyNGF0n1gy/odMMePr9pgZrOmBZhKxUZk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/mX4kq/hyNGJhqaNS/wEKk3HiMuJWTKgGFOe7d9k/img.jpg?width=1052&amp;amp;height=1248&amp;amp;face=267_380_686_838&quot;&gt;&lt;a href=&quot;https://ssungkang.tistory.com/entry/Web-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%B9%9C%ED%99%94%EC%A0%81%EC%9D%B8-http-client-Httpie&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ssungkang.tistory.com/entry/Web-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%B9%9C%ED%99%94%EC%A0%81%EC%9D%B8-http-client-Httpie&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/be5kjy/hyNFNeHJze/FW7UTNqpfEg7Bt6or7Oxdk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bZpPOI/hyNGF0n1gy/odMMePr9pgZrOmBZhKxUZk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/mX4kq/hyNGJhqaNS/wEKk3HiMuJWTKgGFOe7d9k/img.jpg?width=1052&amp;amp;height=1248&amp;amp;face=267_380_686_838');&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] 사용자 친화적인 http client, Httpie&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;우리는 직접 웹사이트에 들어가지 않고도 정보를 얻을 수 있습니다. CLI 를 통해 명령어를 입력하는 것으로만으로 말이죠. 앞으로 공부할 django restful API 처럼 API 를 테스트 하는데도 사용할 수 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ssungkang.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;span style=&quot;color: #000000;&quot;&gt;쉘 &amp;gt; http &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;GET&lt;/b&gt; &lt;/span&gt;요청할주소 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;GET인자명&lt;/b&gt;&lt;/span&gt;==값 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;GET인자명&lt;/b&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;span style=&quot;color: #000000;&quot;&gt;쉘 &amp;gt; http --json &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;POST&lt;/b&gt;&lt;/span&gt; 요청할주소&lt;span style=&quot;color: #0593d3;&quot;&gt; &lt;b&gt;GET인자명&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;==값&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;GET인자명&lt;/span&gt;&lt;/b&gt;==값&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;POST인자명&lt;/b&gt;&lt;/span&gt;==값 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;POST인자명&lt;/span&gt;&lt;/b&gt;==값&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 옵션 지정 : application/json -&amp;gt; 요청 데이터를 JSON 직렬화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;쉘 &amp;gt; http --form&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;POST&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요청할주소&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;GET인자명&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;==값&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;GET인자명&lt;/span&gt;&lt;/b&gt;==값&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;POST인자명&lt;/b&gt;&lt;/span&gt;==값&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;POST인자명&lt;/span&gt;&lt;/b&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;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 옵션 지정 : multipart/form-data&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: #000000;&quot;&gt;쉘 &amp;gt; http&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;PUT&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요청할주소&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;GET인자명&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;==값&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;GET인자명&lt;/b&gt;&lt;/span&gt;==값 &lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;PUT&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;인자명&lt;/b&gt;&lt;/span&gt;==값&lt;span style=&quot;color: #6164c6;&quot;&gt; &lt;b&gt;PUT&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;인자명&lt;/b&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: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;쉘 &amp;gt; http &lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;DELETE&lt;/b&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요청할주소&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;GET인자명&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;==값&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;GET인자명&lt;/b&gt;&lt;/span&gt;==값&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>강의 정리/Django REST Framework</category>
      <category>장고 JSON</category>
      <category>장고 JSON 응답뷰</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/122</guid>
      <comments>https://devdongbaek.tistory.com/122#entry122comment</comments>
      <pubDate>Sat, 12 Mar 2022 14:27:40 +0900</pubDate>
    </item>
    <item>
      <title>Django로 인스타그램 클론 코딩시 필요한 Skill</title>
      <link>https://devdongbaek.tistory.com/93</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 요약 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/94&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1644032455568&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;동백 // Django User 모델 커스텀 및 회원가입 구현&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/94&quot; data-og-url=&quot;https://devdongbaek.tistory.com/94&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bsjCOE/hyNjD92fE4/lhwMacNKIVZw0xCryD8Emk/img.jpg?width=800&amp;amp;height=772&amp;amp;face=0_0_800_772,https://scrap.kakaocdn.net/dn/NIKCY/hyNjJbkVhV/IhdsmC6E2Viq660CmqVirk/img.jpg?width=800&amp;amp;height=772&amp;amp;face=0_0_800_772,https://scrap.kakaocdn.net/dn/cQLMW1/hyNjRNZmAt/c6zxHI50YSkn0bZcdjO75K/img.jpg?width=913&amp;amp;height=882&amp;amp;face=0_0_913_882&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/94&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bsjCOE/hyNjD92fE4/lhwMacNKIVZw0xCryD8Emk/img.jpg?width=800&amp;amp;height=772&amp;amp;face=0_0_800_772,https://scrap.kakaocdn.net/dn/NIKCY/hyNjJbkVhV/IhdsmC6E2Viq660CmqVirk/img.jpg?width=800&amp;amp;height=772&amp;amp;face=0_0_800_772,https://scrap.kakaocdn.net/dn/cQLMW1/hyNjRNZmAt/c6zxHI50YSkn0bZcdjO75K/img.jpg?width=913&amp;amp;height=882&amp;amp;face=0_0_913_882');&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;동백 // Django User 모델 커스텀 및 회원가입 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/97&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1644057606321&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;동백 // Django 회원 가입 이메일 보내기&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/97&quot; data-og-url=&quot;https://devdongbaek.tistory.com/97&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5QGqV/hyNjPXhrCB/KBIPRV47JLlh6amUDbZm6k/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/n5aLa/hyNjIjzwKm/6vvMLgkKEQtUCxBFOIMs1K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/97&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/97&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5QGqV/hyNjPXhrCB/KBIPRV47JLlh6amUDbZm6k/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/n5aLa/hyNjIjzwKm/6vvMLgkKEQtUCxBFOIMs1K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_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;동백 // Django 회원 가입 이메일 보내기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;/h4&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;a href=&quot;https://devdongbaek.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://devdongbaek.tistory.com/92&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;동백 // Django 회원가입, 로그인 구현하기!!!&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/92&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/io7gZ/hyNdkvWt6x/fYknunivN7Qr95889wBnQ1/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/bQxCTk/hyNdrhxkCQ/ept9lgW7wq3uLTCTcDOKW1/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/2EMzE/hyNdpxfZaW/ULFxkG4XGsm5UllKjKN40K/img.jpg?width=906&amp;amp;height=791&amp;amp;face=0_0_906_791&quot; data-og-url=&quot;https://devdongbaek.tistory.com/92&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/92&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/io7gZ/hyNdkvWt6x/fYknunivN7Qr95889wBnQ1/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/bQxCTk/hyNdrhxkCQ/ept9lgW7wq3uLTCTcDOKW1/img.jpg?width=670&amp;amp;height=326&amp;amp;face=0_0_670_326,https://scrap.kakaocdn.net/dn/2EMzE/hyNdpxfZaW/ULFxkG4XGsm5UllKjKN40K/img.jpg?width=906&amp;amp;height=791&amp;amp;face=0_0_906_791');&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;동백 // Django 회원가입, 로그인 구현하기!!!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/100&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/100&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1644208413754&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;동백 // Django 로그인, 로그아웃 구현하기&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/100&quot; data-og-url=&quot;https://devdongbaek.tistory.com/100&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHYzY1/hyNjH66ekC/ZOhQKHylKa9QFqMFr8V4DK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/bYQaLn/hyNjQXhwlQ/Rilsa4etlsm26hrUPXPEz0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/100&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/100&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHYzY1/hyNjH66ekC/ZOhQKHylKa9QFqMFr8V4DK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/bYQaLn/hyNjQXhwlQ/Rilsa4etlsm26hrUPXPEz0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_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;동백 // Django 로그인, 로그아웃 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;유저 프로필 수정 및 암호 재설정&lt;/h4&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;a href=&quot;https://devdongbaek.tistory.com/104&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/104&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1644822381698&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;동백 // Django 유저 프로필 수정&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/104&quot; data-og-url=&quot;https://devdongbaek.tistory.com/104&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xkDgF/hyNo92VvaE/KV18poHa4Y9m6RkFGiq1KK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/JRJrx/hyNplPPKQv/MdijlJv97fKdnSHyoOvamK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/beIDqO/hyNpggE4YV/rrk2dNFGjxunLanKBRMDQK/img.jpg?width=860&amp;amp;height=319&amp;amp;face=0_0_860_319&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/104&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/104&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xkDgF/hyNo92VvaE/KV18poHa4Y9m6RkFGiq1KK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/JRJrx/hyNplPPKQv/MdijlJv97fKdnSHyoOvamK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/beIDqO/hyNpggE4YV/rrk2dNFGjxunLanKBRMDQK/img.jpg?width=860&amp;amp;height=319&amp;amp;face=0_0_860_319');&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;동백 // Django 유저 프로필 수정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/105&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1644822406215&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;동백 // Django 암호 수정 구현하기&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/105&quot; data-og-url=&quot;https://devdongbaek.tistory.com/105&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/81TBj/hyNqwIXpEf/e46KrMqVD1F5FnRo2GxnB0/img.jpg?width=792&amp;amp;height=582&amp;amp;face=0_0_792_582,https://scrap.kakaocdn.net/dn/xdMGV/hyNpfIP790/kn3N0pGzpA3wF4LpUkzhkK/img.jpg?width=792&amp;amp;height=582&amp;amp;face=0_0_792_582,https://scrap.kakaocdn.net/dn/CL8Bv/hyNqviYNfN/k5JqOchXt4BGT32CXLFAlk/img.jpg?width=792&amp;amp;height=582&amp;amp;face=0_0_792_582&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/105&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/81TBj/hyNqwIXpEf/e46KrMqVD1F5FnRo2GxnB0/img.jpg?width=792&amp;amp;height=582&amp;amp;face=0_0_792_582,https://scrap.kakaocdn.net/dn/xdMGV/hyNpfIP790/kn3N0pGzpA3wF4LpUkzhkK/img.jpg?width=792&amp;amp;height=582&amp;amp;face=0_0_792_582,https://scrap.kakaocdn.net/dn/CL8Bv/hyNqviYNfN/k5JqOchXt4BGT32CXLFAlk/img.jpg?width=792&amp;amp;height=582&amp;amp;face=0_0_792_582');&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;동백 // Django 암호 수정 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;포스팅 쓰기 (사진 및 caption, 다수 태크, location 등록)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devdongbaek.tistory.com/108&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1644822412633&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;동백 // Django 포스팅 쓰기 구현하기&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/108&quot; data-og-url=&quot;https://devdongbaek.tistory.com/108&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WjIiM/hyNpbTY48y/RPulUiUdZbt76IOCx31nC0/img.jpg?width=581&amp;amp;height=689&amp;amp;face=0_0_581_689,https://scrap.kakaocdn.net/dn/Yxqcz/hyNqJVPTTC/OGDWrWZqARhGQAEUkn0EO1/img.jpg?width=581&amp;amp;height=689&amp;amp;face=0_0_581_689,https://scrap.kakaocdn.net/dn/Z7qw1/hyNqFy8tNT/pINE67QjcMSIK7T5uHKn2K/img.jpg?width=664&amp;amp;height=321&amp;amp;face=0_0_664_321&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/108&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WjIiM/hyNpbTY48y/RPulUiUdZbt76IOCx31nC0/img.jpg?width=581&amp;amp;height=689&amp;amp;face=0_0_581_689,https://scrap.kakaocdn.net/dn/Yxqcz/hyNqJVPTTC/OGDWrWZqARhGQAEUkn0EO1/img.jpg?width=581&amp;amp;height=689&amp;amp;face=0_0_581_689,https://scrap.kakaocdn.net/dn/Z7qw1/hyNqFy8tNT/pINE67QjcMSIK7T5uHKn2K/img.jpg?width=664&amp;amp;height=321&amp;amp;face=0_0_664_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;동백 // Django 포스팅 쓰기 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.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;유저 페이지 구현&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;타임라인 : Follow 구현, Following 하는 User들의 포스팅 목록, 포스팅 좋아요, 댓글&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python 가상환경을 사용하면 프로젝트별 라이브러리 관리가 아주 용이해 진다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;가상환경 설치 및 실행하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@full_accel/python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://velog.io/@full_accel/python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;python - 가상환경&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;python은 생태계가 잘 구축된 언어이다. 즉, 유용한 라이브러리와 패키지들이 아주 많다. 이미지를 처리하고 싶으면 pillow를 쓰면 된다. 마크다운을 다뤄야 한다면 markdownx가 있다. 웹 페이지를 만&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@full_accel/python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OX4a0/hyNdfakM8O/Vn6eWlvBlWpu3YcVZODyP0/img.jpg?width=750&amp;amp;height=400&amp;amp;face=0_0_750_400,https://scrap.kakaocdn.net/dn/HORG1/hyNdsOhBj1/ci91138E1QNSwktSU25mvK/img.jpg?width=750&amp;amp;height=400&amp;amp;face=0_0_750_400&quot; data-og-url=&quot;https://velog.io/@full_accel/python-가상환경&quot;&gt;&lt;a href=&quot;https://velog.io/@full_accel/python-가상환경&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@full_accel/python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OX4a0/hyNdfakM8O/Vn6eWlvBlWpu3YcVZODyP0/img.jpg?width=750&amp;amp;height=400&amp;amp;face=0_0_750_400,https://scrap.kakaocdn.net/dn/HORG1/hyNdsOhBj1/ci91138E1QNSwktSU25mvK/img.jpg?width=750&amp;amp;height=400&amp;amp;face=0_0_750_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;python - 가상환경&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;python은 생태계가 잘 구축된 언어이다. 즉, 유용한 라이브러리와 패키지들이 아주 많다. 이미지를 처리하고 싶으면 pillow를 쓰면 된다. 마크다운을 다뤄야 한다면 markdownx가 있다. 웹 페이지를 만&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;br /&gt;설치하기&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; python -m venv django_project&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실행하기&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D:\venvs\django_project&amp;gt;cd Scripts &amp;gt;&amp;gt;&amp;gt; D:\venvs\django_project\Scripts&amp;gt;activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;가상환경이 실행되었는지 확인하기&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;(django_instagram) C:\Users\yardy\Desktop\DjangoPractice\django_instagram\Scripts&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;where django-admin&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출력값이 가상환경 위치와 같아야한다. #혹 다를 경우 터미널을 재시작하여 다시 activate 해보자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@hanmin_ss/Django-01.-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD%EA%B3%BC-%EC%9E%A5%EA%B3%A0%EC%84%A4%EC%B9%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@hanmin_ss/Django-01.-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD%EA%B3%BC-%EC%9E%A5%EA%B3%A0%EC%84%A4%EC%B9%98&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;!!반드시 가상환경을 먼저 설치 한 후에&amp;nbsp; 그 안에 Django 파일을&amp;nbsp; 설치해야합니다.!!!&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;a href=&quot;https://devdongbaek.tistory.com/48?category=1032015&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://devdongbaek.tistory.com/48?category=1032015&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;동백 // Django 설치 및 프로젝트 생성&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&quot; data-og-host=&quot;devdongbaek.tistory.com&quot; data-og-source-url=&quot;https://devdongbaek.tistory.com/48?category=1032015&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/i070g/hyNdiLFzSS/kAUFlUgmoE4fkUv5NakVd1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/fE1js/hyNdnMYX50/rqlIkSo16T6WFqX1cyVHMK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/QHqfX/hyNdfBqwAr/uYh4mihFq1kBTm6RSWlnx1/img.jpg?width=942&amp;amp;height=573&amp;amp;face=0_0_942_573&quot; data-og-url=&quot;https://devdongbaek.tistory.com/48&quot;&gt;&lt;a href=&quot;https://devdongbaek.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devdongbaek.tistory.com/48?category=1032015&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/i070g/hyNdiLFzSS/kAUFlUgmoE4fkUv5NakVd1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/fE1js/hyNdnMYX50/rqlIkSo16T6WFqX1cyVHMK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=318_386_464_544,https://scrap.kakaocdn.net/dn/QHqfX/hyNdfBqwAr/uYh4mihFq1kBTm6RSWlnx1/img.jpg?width=942&amp;amp;height=573&amp;amp;face=0_0_942_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;동백 // Django 설치 및 프로젝트 생성&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출처 :&amp;nbsp;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard 장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devdongbaek.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Django 프로젝트 설치 후 해야할 일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;0. requirements 폴더 생성 후 작업&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;requirements&lt;/b&gt; 폴더 생성후 폴더 아래에&lt;/li&gt;
&lt;li&gt;commom.txt, dev.txt, prod.txt를 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; commom.txt&lt;/b&gt; : 공통 라이브러리를 붙여넣는 곳&lt;/li&gt;
&lt;li&gt;&lt;b&gt;dev.txt&lt;/b&gt; : 개발용 라이브러리를 붙여넣는 곳&lt;/li&gt;
&lt;li&gt;&lt;b&gt;prod.txt&lt;/b&gt; : 배포용 라이브러리를 붙여넣는 곳&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;162&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdPOKG/btrrF6124EK/kZK8W7MeEqiUrRbuL5qWOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdPOKG/btrrF6124EK/kZK8W7MeEqiUrRbuL5qWOK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdPOKG/btrrF6124EK/kZK8W7MeEqiUrRbuL5qWOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdPOKG%2FbtrrF6124EK%2FkZK8W7MeEqiUrRbuL5qWOK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;162&quot; height=&quot;174&quot; data-origin-width=&quot;162&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;commom.txt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;django~=3.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;dev.txt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;-r common.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;prod.txt&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;-r common.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 템플릿 폴더, Static 폴더 생성 후 작업&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿들과 Static 파일들을 모아놓을 폴더를 생성한다. #보통 프로젝트의 제일 바깥에 둔다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ZKKj/btrrJU7XFiy/Lwf4ZnkT9MYQcKeR5cuOn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ZKKj/btrrJU7XFiy/Lwf4ZnkT9MYQcKeR5cuOn1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ZKKj/btrrJU7XFiy/Lwf4ZnkT9MYQcKeR5cuOn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ZKKj%2FbtrrJU7XFiy%2FLwf4ZnkT9MYQcKeR5cuOn1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;159&quot; height=&quot;374&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. settings.py 작업&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settings.py에 아래 코드들을 적어준다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;TEMPLATES = [ { &quot;&quot;&quot; 중략 &quot;&quot;&quot; 'DIRS': [ os.path.join(BASE_DIR, 'django_instagram' ,'templates'), ], &quot;&quot;&quot; 중략 &quot;&quot;&quot; } STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'instagram' , 'static'), ] STATIC_ROOT = os.path.join(BASE_DIR, 'static') MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') INTERNAL_IPS = ['127.0.0.1']&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DIRS&lt;/b&gt;에 &lt;b&gt;프로젝트 이름&lt;/b&gt;과 1번 단계에서 만들어준 &lt;b&gt;템플릿 폴더의 이름&lt;/b&gt;을 넣음&lt;/li&gt;
&lt;li&gt;위 코드들을 통해서 model에서 &lt;b&gt;FileField&lt;/b&gt;나 &lt;b&gt;ImageField&lt;/b&gt;를 통해서 업로드 된 파일은 &lt;b&gt;MEDIA&lt;/b&gt; 설정을 통해서 처리된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;static&lt;/b&gt;을 통해서 업로드 된 파일들을 &lt;b&gt;STATIC&lt;/b&gt; 설정을 통해 처리된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;# VSC에서 Django의 코드의 색깔이 그냥 하얗게 나온다면?&lt;br /&gt;VSC의 확장에서 Django를 설치하자!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTJAxp/btrrJUNd4R7/OFk9akB4XwTOF36cG4DUYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTJAxp/btrrJUNd4R7/OFk9akB4XwTOF36cG4DUYk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTJAxp/btrrJUNd4R7/OFk9akB4XwTOF36cG4DUYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTJAxp%2FbtrrJUNd4R7%2FOFk9akB4XwTOF36cG4DUYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;703&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. urls.py 작업&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from django.conf import settings from django.contrib import admin from django.urls import path, include from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), ] if settings.DEBUG: import debug_toolbar urlpatterns += [ path('__debug__/', include('debug_toolbar.urls')), ] urlpatterns += static(settings.MEDIA_URL, doucument_root =settings.MEDIA_ROOT)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 추가 pip 설치&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;pip install django-debug-toolbar&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pip 설치 후 꼭!! settings.py의 INSTALLED_APPS와 MIDDLEWARE에 추가해줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;INSTALLED_APPS = [ # Django Apps # Third Apps 'debug-toolbar', # Local Apps ] MIDDLEWARE = [ &quot;debug_toolbar.middleware.DebugToolbarMiddleware&quot;, ] INTERNAL_IPS = ['127.0.0.1']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. settings 폴더 생성 및 코드 작성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settings.py를 settings 폴더로 옮기고 이름을 commons.py로 변경 시켜준다. 그리고&lt;br /&gt;0단계에서 만들었던 파일들의 이름과 똑같은 py 파일들을 settings 폴더 밑에 만들어준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Emv20/btrrPpslvCA/jxBjfqqkqpOmqKjb9zbvc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Emv20/btrrPpslvCA/jxBjfqqkqpOmqKjb9zbvc1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Emv20/btrrPpslvCA/jxBjfqqkqpOmqKjb9zbvc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEmv20%2FbtrrPpslvCA%2FjxBjfqqkqpOmqKjb9zbvc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;159&quot; height=&quot;374&quot; data-origin-width=&quot;159&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;현 commons.py 전settings.py에 추가 코드 작업을 해준다&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import os from os.path import abspath, dirname # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = dirname(dirname(dirname(abspath(__file__))))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;dev.py&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from .commons import *&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baiQvn/btrr7pGKXGR/gOYFPax8pMfvDm6Ly408B1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baiQvn/btrr7pGKXGR/gOYFPax8pMfvDm6Ly408B1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baiQvn/btrr7pGKXGR/gOYFPax8pMfvDm6Ly408B1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaiQvn%2Fbtrr7pGKXGR%2FgOYFPax8pMfvDm6Ly408B1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;398&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>강의 정리/Django 기초</category>
      <category>Django 가상환경 설치</category>
      <category>django 설치</category>
      <category>장고 가상환경 설치</category>
      <category>장고 설치</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/93</guid>
      <comments>https://devdongbaek.tistory.com/93#entry93comment</comments>
      <pubDate>Sat, 12 Mar 2022 13:19:01 +0900</pubDate>
    </item>
    <item>
      <title>Django API와 REST</title>
      <link>https://devdongbaek.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;Django API와 REST&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;API 서버란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_앱 / 웹 서비스를 만드는 개발자들이 이용하는&lt;b&gt; &lt;i&gt;데이터 위주의 서비스 // request를 받으면, 서버측에서 주로 json으로 응답합니다.&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_시간이 지나도 호환성을 유지해야 합니다.&lt;/span&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;span style=&quot;color: #000000;&quot;&gt;앱 등의 유저가 사용하는 &lt;b&gt;UI&lt;/b&gt;는 &lt;b&gt;&lt;i&gt;유저가 원할 때 업데이트&lt;/i&gt;&lt;/b&gt;가 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유저층이 사용하는 앱의 버전이 다양하기에, API에도 버전 개념을 둡니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그에 반해, &lt;b&gt;&lt;i&gt;웹 서비스를 이용하는 유저는 항상 최신 버전&lt;/i&gt;&lt;/b&gt;을 사용합니다.&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 이유는 웹 브라우저로 접속한 유저는 앱을 사용하는 유저와 다르게 웹브라우저에 접속할 때 최신버전의 HTML, css, js, static files를 다운받기 때문입니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;REST란?&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;b&gt;_&lt;span style=&quot;color: #ef5369;&quot;&gt;Re&lt;/span&gt;&lt;/b&gt;presentational &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;S&lt;/b&gt;&lt;/span&gt;tate &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;ransfer : &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;HTTP URI(Uniform Resource Identifier)를 통해 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;i&gt;자원(Resource)&lt;/i&gt;&lt;/span&gt;을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 &lt;span style=&quot;color: #ef5369;&quot;&gt;해당 &lt;i&gt;자원에 대한 CRUD Operation을 적용&lt;/i&gt;&lt;/span&gt;하는 것을 의미한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_아키텍쳐 스타일을 REST라고 부르며, 프로토콜에 독립적입니다. 즉 어떠한 프로토콜에도 아키텍쳐를 적용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_일반적인 REST 구현에서는 HTTP를 많이 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_RESTful API의 몇가지 디자인 원칙&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;리소스&lt;/span&gt;를 중심으로 디자인&amp;nbsp;&lt;/b&gt;&lt;/i&gt;-&amp;gt; ex) 장고 모델, 포스팅, 댓글, 프로필 사진 등등&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리소스를 중심으로 한 API 구성 예시&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/orders/ 로의 POST 요청 -&amp;gt; &lt;i&gt;리소스를 직접 명시해주는 것이 좋다.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;s&gt;/create-order/ 로의 POST 요청&amp;nbsp;&amp;nbsp;&lt;/s&gt;&amp;nbsp; -&amp;gt; &lt;i&gt;동사는 url에 적합하지않다.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/customers/ -&amp;gt; &lt;i&gt;고객 컬렉션&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/customers/5/ -&amp;gt;&lt;i&gt; pk가 5인 고객 -&amp;gt; 직관적인 웹 API&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/customers/5/orders/ -&amp;gt; &lt;i&gt;고객 5에 대한 모든 주문&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/orders/99/customers/ -&amp;gt; &lt;i&gt;주문 99의 고객&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;심플하게 URL를 구성하기&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/customers/1/orders/99/products/ -&amp;gt; &lt;i&gt;유연성이 떨어짐.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/customers/1/orders/ 를 통해서 고객 1의 모든 주문을 찾은 후에 주소를 /orders/99/products/ 로 변경해서 동일한 처리를 해줌 // &lt;i&gt;즉 주소가 길어질 시 분할해줌&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트에서 액세스할 수 있는 모든 종류의 개체/서비스가 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;리소스&lt;/b&gt;&lt;/span&gt;에 포함함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;리소스&lt;/span&gt;마다 해당 리소스를 고유하게 식별하는 식별자&lt;/i&gt;&lt;/b&gt; -&amp;gt; ex) pk, id&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;https://adventure-works.com/orders/&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요청/응답 포맷으로 흔히 JSON을 사용함 // 과거에는 xml을 사용했었음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;균일한 인터페이스를 적용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리소스에 표준 HTTP 동사 (GET, POST, PUT, PATCH, DELETE)를 적용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;HTTP 동사(메소드)&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_&lt;b&gt;GET&lt;/b&gt; 메서드는 특정 리소스의 표시를 요청합니다. GET을 사용하는 요청은 오직 데이터를 받기만(조회) 합니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_&lt;b&gt;POST&lt;/b&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_&lt;b&gt;PUT&lt;/b&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_&lt;b&gt;DELETE&lt;/b&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;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_&lt;b&gt;PATCH&lt;/b&gt;&amp;nbsp;메서드는 리소스의 부분만을 수정하는 데 쓰입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646877237915&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;HTTP 요청 메서드 - HTTP | MDN&quot; data-og-description=&quot;HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 &amp;quot;HTTP 동사&amp;quot;라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/62TWl/hyNEntuO5s/6flYewBTLG95ZDQPk2yG5k/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/Web/HTTP/Methods&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/62TWl/hyNEntuO5s/6flYewBTLG95ZDQPk2yG5k/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;HTTP 요청 메서드 - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 &quot;HTTP 동사&quot;라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;요청 / 응답 형식 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_요청 : Content-Type 헤더&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;ex) application/json, image/jpeg, application/pdf 등 요청시에 처리를 원하는 형식을 url에 지정하면, 서버에서는 해당 형식으로 응답합니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_서버에서 해당 형식을 지원하지 않는다면 HTTP 상태 코드 415 (지원하지 않는 미디어 유형)을 반환합니다.&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;django-rest-framework&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 장고의 패러다임 하에 빠르고 관리하기 쉬운 API를 만들 수 있습니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ DRF는 REST API 컨셉을 쉽게 만들 수 있도록 도와줍니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ Serializer / ModelSerializer를 통한 데이터 유효성 검증 및 데이터 직렬화 -&amp;gt; Json&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 각종 Parser를 통한 데이터 처리&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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ APIView / Generic / ViewSet / ModelViewSets 를 통한 요청 처리&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 각종 Render를 통한 다양한 응답 포맷 지원 -&amp;gt; xml, pdf, excel etc...&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ 인증(Authentication) / 권한(Permission) 체계 -&amp;gt; 써트파티를 통한 JWT 지원&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;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ Throttling (최대 호출 횟수 제한)&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.django-rest-framework.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646878513565&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;Home - Django REST framework&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.django-rest-framework.org&quot; data-og-source-url=&quot;https://www.django-rest-framework.org/&quot; data-og-url=&quot;https://www.django-rest-framework.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.django-rest-framework.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.django-rest-framework.org/&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;Home - Django REST framework&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.django-rest-framework.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;REST API는 단순히 URL 형식만 맞춰준다고 REST API가 되는게, 아닙니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_URL은 'http://{serviceRoot}/{collection}/{id}' 형식이어야 합니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ GET, PUT, DELETE, POST, HEAD, PATCH, OPTIONS를 지원해야합니다.&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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_ API 버저닝은 Major.minor로 하고, URL에 버전 정보를 포함시킵니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;프레임워크를 쓴다는 것은, 그 프레임워크가 제시하는 길을&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;명확히 이해하고 존중하는 것에서 시작합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;참고 문서 및 추가 용어 정리&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646876122812&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;웹 API 디자인 모범 사례 - Azure Architecture Center&quot; data-og-description=&quot;플랫폼 독립성과 서비스 진화를 지원하는 웹 API 설계를 위한 모범 사례를 알아봅니다.&quot; data-og-host=&quot;docs.microsoft.com&quot; data-og-source-url=&quot;https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design&quot; data-og-url=&quot;https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcFtme/hyNEeXEn6K/9Q8sSEzR5NTKouhXFbItyK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcFtme/hyNEeXEn6K/9Q8sSEzR5NTKouhXFbItyK/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;웹 API 디자인 모범 사례 - Azure Architecture Center&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;플랫폼 독립성과 서비스 진화를 지원하는 웹 API 설계를 위한 모범 사례를 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_아키텍쳐란??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최적화를 목표로 두고, 스템 구성과 동작원리 그리고 시스템의 구성환경등을 설명 및 설계하는 청사진 또는 설계도&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://tuhbm.github.io/2019/04/24/architecture/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tuhbm.github.io/2019/04/24/architecture/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646875652076&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;tuhbm.github.io&quot; data-og-source-url=&quot;https://tuhbm.github.io/2019/04/24/architecture/&quot; data-og-url=&quot;https://tuhbm.github.io/2019/04/24/architecture/index.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rS0N0/hyNEmuzxdy/Qus5UKBjHKNhJKc6UpIRY1/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/L4T38/hyNEf93cSg/QpS41WF1Ht30ecdrwkiFkk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://tuhbm.github.io/2019/04/24/architecture/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tuhbm.github.io/2019/04/24/architecture/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rS0N0/hyNEmuzxdy/Qus5UKBjHKNhJKc6UpIRY1/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/L4T38/hyNEf93cSg/QpS41WF1Ht30ecdrwkiFkk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;tuhbm.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_아키텍쳐 스타일이란??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;b&gt;아키텍처 설계에서 반복해서 나타나는 문제를 해결하고 아키텍처가 만족 시켜야하는 시스템 품질 속성을 달성할 수 있는 방법을 정리한 문서&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://itpenote.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://itpenote.tistory.com/76&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646875704750&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;소프트웨어 아키텍처 스타일(Software Architecture Style)&quot; data-og-description=&quot;MVC (Model, View, Control), 저장소, 클라이언트-서버, 데이터플로우, 계층형 I. 시스템 품질 향상을 위한 패턴, 소프트웨어 아키텍처 스타일의 개요 가. 소프트웨어 아키텍처 스타일(Software Architecture Sty&quot; data-og-host=&quot;itpenote.tistory.com&quot; data-og-source-url=&quot;https://itpenote.tistory.com/76&quot; data-og-url=&quot;https://itpenote.tistory.com/76&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Pq237/hyNEo6Zvop/IyMAuwt05QgQKD3ODTFvkk/img.png?width=444&amp;amp;height=250&amp;amp;face=0_0_444_250,https://scrap.kakaocdn.net/dn/V4bVY/hyNEprh1gu/EXkdkNUcXZ2qra02iJcEB0/img.png?width=444&amp;amp;height=250&amp;amp;face=0_0_444_250,https://scrap.kakaocdn.net/dn/bqGnYk/hyNFE1tevD/dvOO7u73l2d7bKezQPqtHK/img.png?width=444&amp;amp;height=250&amp;amp;face=0_0_444_250&quot;&gt;&lt;a href=&quot;https://itpenote.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://itpenote.tistory.com/76&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Pq237/hyNEo6Zvop/IyMAuwt05QgQKD3ODTFvkk/img.png?width=444&amp;amp;height=250&amp;amp;face=0_0_444_250,https://scrap.kakaocdn.net/dn/V4bVY/hyNEprh1gu/EXkdkNUcXZ2qra02iJcEB0/img.png?width=444&amp;amp;height=250&amp;amp;face=0_0_444_250,https://scrap.kakaocdn.net/dn/bqGnYk/hyNFE1tevD/dvOO7u73l2d7bKezQPqtHK/img.png?width=444&amp;amp;height=250&amp;amp;face=0_0_444_250');&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;소프트웨어 아키텍처 스타일(Software Architecture Style)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MVC (Model, View, Control), 저장소, 클라이언트-서버, 데이터플로우, 계층형 I. 시스템 품질 향상을 위한 패턴, 소프트웨어 아키텍처 스타일의 개요 가. 소프트웨어 아키텍처 스타일(Software Architecture Sty&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;itpenote.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;</description>
      <category>강의 정리/Django REST Framework</category>
      <category>Django Rest Framework</category>
      <category>장고 api</category>
      <category>장고 api 앱</category>
      <category>장고 REST</category>
      <category>장고 rest framework</category>
      <category>장고 RESTful</category>
      <category>장고 아키텍쳐</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/121</guid>
      <comments>https://devdongbaek.tistory.com/121#entry121comment</comments>
      <pubDate>Thu, 10 Mar 2022 11:25:36 +0900</pubDate>
    </item>
    <item>
      <title>Django 댓글 구현하기</title>
      <link>https://devdongbaek.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Django 댓글 구현하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;models.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645585071661&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class BaseModel(models.Model):

    class Meta:
        # 아래 코드를 통해 실제 DB에 적용되지 않고, 추상 클래스로 만들어진다.
        abstract = True


class Comment(BaseModel):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    message = models.TextField()

    class Meta:
        ordering = ['-id']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 항상 모델단에 ordering을 통해 정렬을 하는것을 추천합니다.&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ Django에서는 정수나 날짜등을 사람이 보기 보다 편하게 해주는 템플릿 필터가 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ex) 예를 들어 숫자에 컴마를 찍어준다거나, 날짜를 today, yesterday등으로 바꿔줍니다.&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645585223802&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;django.contrib.humanize | Django documentation | Django&quot; data-og-description=&quot;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/&quot; data-og-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/&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;django.contrib.humanize | Django documentation | Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;font-family: 'Noto Serif KR';&quot;&gt;_반드시 humanize를 INSTALLED_APPS에 먼저 추가 시켜주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645585813132&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
    # Django Apps

    'django.contrib.humanize', # 추가

]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/insta/&lt;span style=&quot;color: #953b34;&quot;&gt;_post_card.html&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1645586674445&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% load bootstrap4 humanize insta_tags  %}

&amp;lt;div class=&quot;card&quot;&amp;gt;
    &amp;lt;div class=&quot;card-header&quot;&amp;gt;    
        &amp;lt;img src= &quot;{{ user.profile_url }}&quot; style=&quot;width: 24px; height: 24px;&quot;/&amp;gt;
        &amp;lt;a href=&quot;{% url &quot;insta:user_page&quot; post.author.username %}&quot; style=&quot;text-decoration:none&quot;&amp;gt;
            {{ post.author }}    
        &amp;lt;/a&amp;gt;                
    &amp;lt;/div&amp;gt;
    
    &amp;lt;div class=&quot;card-body&quot;&amp;gt;   
        {% if post.photo.url %}
            &amp;lt;img src=&quot;{{ post.photo.url  }}&quot; style=&quot;width: 100%;&quot;/&amp;gt;
        {% endif %}  
        &amp;lt;div&amp;gt;
            {% if post|is_like_user:user %}
                &amp;lt;a href=&quot;{% url 'insta:post_unlike' post.pk %}&quot; style=&quot;text-decoration:none&quot;&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;#FF0000&quot; class=&quot;bi bi-heart-fill&quot; viewBox=&quot;0 0 16 16&quot;&amp;gt;
                        &amp;lt;path fill-rule=&quot;evenodd&quot; d=&quot;M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z&quot;/&amp;gt;
                    &amp;lt;/svg&amp;gt;
                &amp;lt;/a&amp;gt;
            {% else %}
                &amp;lt;a href=&quot;{% url 'insta:post_like' post.pk %}&quot; style=&quot;text-decoration:none&quot;&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;#FF0000&quot; class=&quot;bi bi-heart&quot; viewBox=&quot;0 0 16 16&quot;&amp;gt;
                        &amp;lt;path d=&quot;m8 2.748-.717-.737C5.6.281 2.514.878 1.4 3.053c-.523 1.023-.641 2.5.314 4.385.92 1.815 2.834 3.989 6.286 6.357 3.452-2.368 5.365-4.542 6.286-6.357.955-1.886.838-3.362.314-4.385C13.486.878 10.4.28 8.717 2.01L8 2.748zM8 15C-7.333 4.868 3.279-3.04 7.824 1.143c.06.055.119.112.176.171a3.12 3.12 0 0 1 .176-.17C12.72-3.042 23.333 4.867 8 15z&quot;/&amp;gt;
                    &amp;lt;/svg&amp;gt; 
                &amp;lt;/a&amp;gt;
            {% endif %}
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;comment-list mt-3 mb-3&quot;&amp;gt;
            {% for comment in post.comment_set.all %}
            &amp;lt;div class=&quot;comment&quot;&amp;gt;
                &amp;lt;strong&amp;gt;{{ comment.author }}&amp;lt;/strong&amp;gt;
                {{ comment.message }}
                &amp;lt;small class=&quot;text-muted&quot;&amp;gt;{{ comment.created_at|naturaltime }}&amp;lt;/small&amp;gt;
            &amp;lt;/div&amp;gt;
            {% endfor %}
        &amp;lt;/div&amp;gt;

        &amp;lt;div&amp;gt;
            {% for tag in post.tag_set.all %}
                &amp;lt;span class=&quot;badge badge-primary&quot; style=&quot;color: #fff;
                background-color: #007bff;&quot;&amp;gt;                        
                    #{{ tag.name }}
                &amp;lt;/span&amp;gt;
            {% endfor %}  
        &amp;lt;/div&amp;gt;         
        
        &amp;lt;div&amp;gt;
            &amp;lt;a href=&quot;{{ post.get_absolute_url }}&quot; style=&quot;text-decoration:none&quot; class=&quot;text-muted&quot;&amp;gt;
                &amp;lt;small&amp;gt;
                    {{ post.created_at|naturaltime }}
                &amp;lt;/small&amp;gt;
            &amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;    
    &amp;lt;/div&amp;gt;
    
    &amp;lt;div class=&quot;card-footer&quot;&amp;gt;                           
        &amp;lt;a href=&quot;{% url 'insta:comment_new' post.pk %}&quot;&amp;gt;
            댓글 쓰기
        &amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;_반드시 템플릿 최상단에 humanize를 load 해주어야 오류가 안납니다!&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ne6Zb/btrt1KbgFzH/SCptzIhO6IPNlRKjO5Rwyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ne6Zb/btrt1KbgFzH/SCptzIhO6IPNlRKjO5Rwyk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ne6Zb/btrt1KbgFzH/SCptzIhO6IPNlRKjO5Rwyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fne6Zb%2Fbtrt1KbgFzH%2FSCptzIhO6IPNlRKjO5Rwyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;377&quot; height=&quot;465&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;forms.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645589083438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django import forms
from .models import Post, Comment


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields =  [
            'photo', 'caption', 'location'
        ]

        # 장고에서는 widgets 를 통해 특정 필드 위젯을 변경할 수 있다.
        widgets = {
            &quot;caption&quot; : forms.Textarea,
        }


class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = [&quot;message&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;urls.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645587327996&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [

    # 아래 path에서는 comment가 주인공이기에 post_pk로 작성
    path('post/&amp;lt;int:post_pk&amp;gt;/comment/new/', views.comment_new, name='comment_new'),

    ]&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645587579609&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 댓글 쓰기
@login_required
def comment_new(request, post_pk):
    post = get_object_or_404(Post, pk=post_pk)

    if request.method == 'POST':
        form = CommentForm(request.POST, request.FILES)
        if form.is_valid():
            # 내부적으로 comment가 save되는 것을 막음 
            # 그 이유는 댓글 폼은 message 필드만 받기 때문에, 나머지 필드에서 오류가 생기기 때문이다.
            # 그러기에 나머지 필드를 채워준 상태에서 form을 저장 시켜야한다.
            comment = form.save(commit=False)
            comment.post = post
            comment.author = request.user
            comment.save()
            return redirect(comment.post)    
    else:
        form = CommentForm()
    return render(request, &quot;insta/comment_form.html&quot;, {
        &quot;form&quot; : form,
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ commit=False를 쓰는 이유는?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어서 필드가 4개가 있는 모델을 모델 폼으로 작성을 받을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;나는 그 중 1개의 필드만 폼으로 작성하고 싶다!!&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;005&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/005.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/005.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 경우에 view 함수에서 유효성 검사 이후 form.save()를 먼저 하면 나머지 필드들은 값을 받지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;못했으므로 오류가 발생합니다!&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;035&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/035.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/035.gif&quot; width=&quot;150&quot; /&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;font-family: 'Noto Serif KR';&quot;&gt;그러기에 우리는 장고에게 잠시만 저장을 미뤄줘~~! 라는 의미로 commit=False를 적어준 다음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/insta/&lt;span style=&quot;color: #953b34;&quot;&gt;comment_form.html&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645587837136&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends &quot;insta/layout.html&quot; %}
{% load bootstrap4 %}

{% block content %}
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col-sm-6 offset-sm-3&quot;&amp;gt;
                {% include &quot;_form.html&quot; with form_title=&quot;새 댓글 쓰기&quot; submit_label=&quot;새 댓글 쓰기&quot;  %}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;  
{% endblock %}&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;3.JPG&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKcxhr/btrt6uFa8hb/I6H6sNKgMBBb8c4K6fyfB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKcxhr/btrt6uFa8hb/I6H6sNKgMBBb8c4K6fyfB1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKcxhr/btrt6uFa8hb/I6H6sNKgMBBb8c4K6fyfB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKcxhr%2Fbtrt6uFa8hb%2FI6H6sNKgMBBb8c4K6fyfB1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;829&quot; data-filename=&quot;3.JPG&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;829&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>강의 정리/Django</category>
      <category>Django 댓글</category>
      <category>Django 댓글 구현하기</category>
      <category>장고 댓글</category>
      <category>장고 댓글 구현하기</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/118</guid>
      <comments>https://devdongbaek.tistory.com/118#entry118comment</comments>
      <pubDate>Wed, 23 Feb 2022 13:05:53 +0900</pubDate>
    </item>
    <item>
      <title>Django 포스팅 좋아요 기능 구현하기</title>
      <link>https://devdongbaek.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Django 포스팅 좋아요 / 취소 구현하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;models.py&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645506576042&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Post(BaseModel):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name=&quot;my_post_set&quot;, on_delete=models.CASCADE)
    # 중략
    like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name=&quot;like_post_set&quot;, blank=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_필드의 related_name 옵션을 설정해주면, 쿼리셋시에 related_name을 이용하여 모델 객체를 불러올 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ex)&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기존 -&amp;gt; Post.objects.filter(author=user)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;related_name&lt;span&gt; -&amp;gt; user.my_post_set.all()&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_related_name 이란&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; font-family: 'Noto Serif KR';&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ManyToManyField 란??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jiffydev/Django-9.-ManyToManyField-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@jiffydev/Django-9.-ManyToManyField-1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645506108076&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;Django 9. ManyToManyField 1&quot; data-og-description=&quot;1. Many-to-Many relationship 데이터베이스의 Many-to-Many relationship(이하 다대다 관계)는 처음 접하는 사람들을 힘들게 한다. 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 연결되어 있는 관계&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@jiffydev/Django-9.-ManyToManyField-1&quot; data-og-url=&quot;https://velog.io/@jiffydev/Django-9.-ManyToManyField-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DWGhx/hyNvlAMXhf/AChK7K47rNgKCQt11NS8Jk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@jiffydev/Django-9.-ManyToManyField-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@jiffydev/Django-9.-ManyToManyField-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DWGhx/hyNvlAMXhf/AChK7K47rNgKCQt11NS8Jk/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;Django 9. ManyToManyField 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Many-to-Many relationship 데이터베이스의 Many-to-Many relationship(이하 다대다 관계)는 처음 접하는 사람들을 힘들게 한다. 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 연결되어 있는 관계&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_user.my_post_set은 유저가 작성한 포스팅에 접근하게 되고, user.like_post_set은 유저가 좋아요를 누른 포스팅에 접근하게 됩니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;urls.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645506984896&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [    
    path('post/&amp;lt;int:pk&amp;gt;/like', views.post_like, name='post_like'),
    path('post/&amp;lt;int:pk&amp;gt;/unlike', views.post_unlike, name='post_unlike'),
    ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ post_detail에 맞게 즉 포스팅 디테일뷰가 보여지는 url과 똑같이 매핑합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645507789917&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 포스팅 좋아요
@login_required
def post_like(request, pk):
    post = get_object_or_404(Post, pk=pk)
    
    post.user_like_set.add(request.user)
    
    messages.success(request, f&quot;{post}를 좋아합니다.&quot;)
    
    redirect_url = request.META.get(&quot;HTTP_REFERER&quot;, &quot;root&quot;) # HTTP_REFERER은 request 요청을 한 웹페이지의 주소를 보여준다.
    # 만약 HTTP_REFERER가 없으면 root 주소를 가져온다.
    return redirect(redirect_url)


# 포스팅 싫어요
@login_required
def post_unlike(request, pk):
    post = get_object_or_404(Post, pk=pk)
    
	post.user_like_set.remove(request.user)


	messages.success(request, f&quot;{post}를 좋아요를 취소합니다.&quot;)
    
    redirect_url = request.META.get(&quot;HTTP_REFERER&quot;, &quot;root&quot;) # HTTP_REFERER은 request 요청을 한 웹페이지의 주소를 보여준다.
    # 만약 HTTP_REFERER가 없으면 root 주소를 가져온다.
    return redirect(redirect_url)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ request.META.get()이란??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #3e3e40; font-family: 'Noto Serif KR';&quot;&gt;request.META는 사용자의 IP 주소와 사용자 Agent(일반적으로 웹 브라우저의 이름과 버전)를 포함해 지정된 요청에 대해 사용할 수 있는 모든 HTTP 헤더가 들어있는 파이썬 딕셔너리 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #3e3e40;&quot;&gt;출처 : &lt;a href=&quot;https://yonghyunlee.gitlab.io/python/django-master-6/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yonghyunlee.gitlab.io/python/django-master-6/&lt;/a&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;템플릿단&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/&lt;span&gt;insta/&lt;span style=&quot;color: #953b34;&quot;&gt;_post_card.html&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645513952878&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% load bootstrap4 %}
{% load insta_tags %}


&amp;lt;div class=&quot;card&quot;&amp;gt;
    &amp;lt;div class=&quot;card-header&quot;&amp;gt;    
        &amp;lt;img src= &quot;{{ user.profile_url }}&quot; style=&quot;width: 24px; height: 24px;&quot;/&amp;gt;
        &amp;lt;a href=&quot;{% url &quot;insta:user_page&quot; post.author.username %}&quot; style=&quot;text-decoration:none&quot;&amp;gt;
            {{ post.author }}    
        &amp;lt;/a&amp;gt;                
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;card-body&quot;&amp;gt;   
        {% if post.photo.url %}
            &amp;lt;img src=&quot;{{ post.photo.url  }}&quot; style=&quot;width: 100%;&quot;/&amp;gt;
        {% endif %}  
        {% for tag in post.tag_set.all %}
            &amp;lt;span class=&quot;badge badge-primary&quot; style=&quot;color: #fff;
            background-color: #007bff;&quot;&amp;gt;                        
                #{{ tag.name }}
            &amp;lt;/span&amp;gt;
        {% endfor %}                         
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;card-footer&quot;&amp;gt;                           
        
        {% if post|is_like_user:user %}
            &amp;lt;a href=&quot;{% url 'insta:post_unlike' post.pk %}&quot; style=&quot;text-decoration:none&quot;&amp;gt;
                &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;#FF0000&quot; class=&quot;bi bi-heart-fill&quot; viewBox=&quot;0 0 16 16&quot;&amp;gt;
                    &amp;lt;path fill-rule=&quot;evenodd&quot; d=&quot;M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z&quot;/&amp;gt;
                &amp;lt;/svg&amp;gt;
            &amp;lt;/a&amp;gt;
        {% else %}
            &amp;lt;a href=&quot;{% url 'insta:post_like' post.pk %}&quot; style=&quot;text-decoration:none&quot;&amp;gt;
                &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;#FF0000&quot; class=&quot;bi bi-heart&quot; viewBox=&quot;0 0 16 16&quot;&amp;gt;
                    &amp;lt;path d=&quot;m8 2.748-.717-.737C5.6.281 2.514.878 1.4 3.053c-.523 1.023-.641 2.5.314 4.385.92 1.815 2.834 3.989 6.286 6.357 3.452-2.368 5.365-4.542 6.286-6.357.955-1.886.838-3.362.314-4.385C13.486.878 10.4.28 8.717 2.01L8 2.748zM8 15C-7.333 4.868 3.279-3.04 7.824 1.143c.06.055.119.112.176.171a3.12 3.12 0 0 1 .176-.17C12.72-3.042 23.333 4.867 8 15z&quot;/&amp;gt;
                &amp;lt;/svg&amp;gt; 
            &amp;lt;/a&amp;gt;
        {% endif %}
    &amp;lt;/div&amp;gt;
&amp;lt;/div&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;&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_1645513730440&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ post|is_like_user:user }}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;_ Pipe(='|') 앞의 인자&quot;post&quot;는 tags.py 함수의 첫번째 인자로 넘어가고, &quot;user&quot;은 두번째 인자로 넘어갑니다.&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;아래 코드는 위 이해를 돕기위한 tags.py의 함수입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645513834879&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@register.filter
def is_like_user(post, user):
    # 해당 글의 is_like_user를 반환 하여줍니다.
    return post.is_like_user(user)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;_위 tags.py 함수는 모델단의 함수를 호출시켜줍니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645514056087&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    # 만약 유저가 포스팅을 좋아한다면(=like_user_set에 유저 pk가 있다면) True를 반환
    def is_like_user(self, user):
        return self.like_user_set.filter(pk=user.pk).exists()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;템플릿에서 -&amp;gt; tags.py 함수 호출 -&amp;gt; tags.py에서 model단 함수 호출&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://icons.getbootstrap.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://icons.getbootstrap.kr/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645508304642&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;Bootstrap Icons&quot; data-og-description=&quot;Bootstrap을 위한 공식 오픈 소스 SVG 아이콘 라이브러리&quot; data-og-host=&quot;icons.getbootstrap.kr&quot; data-og-source-url=&quot;https://icons.getbootstrap.kr/&quot; data-og-url=&quot;https://icons.getbootstrap.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cvNtBc/hyNugnCeqQ/ZkhgzzaETFXawv7rO1nGTk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://icons.getbootstrap.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://icons.getbootstrap.kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cvNtBc/hyNugnCeqQ/ZkhgzzaETFXawv7rO1nGTk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;Bootstrap Icons&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Bootstrap을 위한 공식 오픈 소스 SVG 아이콘 라이브러리&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;icons.getbootstrap.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://fontawesome.com/icons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fontawesome.com/icons&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645508159432&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;Font Awesome&quot; data-og-description=&quot;The world&amp;rsquo;s most popular and easiest to use icon set just got an upgrade. More icons. More styles. More Options.&quot; data-og-host=&quot;fontawesome.com&quot; data-og-source-url=&quot;https://fontawesome.com/icons&quot; data-og-url=&quot;https://fontawesome.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/X76Mq/hyNufPKN0w/JOtA6lEk05EiEIBK5z9Vr0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://fontawesome.com/icons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fontawesome.com/icons&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/X76Mq/hyNufPKN0w/JOtA6lEk05EiEIBK5z9Vr0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Font Awesome&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The world&amp;rsquo;s most popular and easiest to use icon set just got an upgrade. More icons. More styles. More Options.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fontawesome.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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_장고 템플릿 단에서 함수를 호출하고, 인자를 넘기고 싶다면 Django custom templates filter를&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;적용해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/ko/4.0/howto/custom-template-tags/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/ko/4.0/howto/custom-template-tags/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645512972012&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;How to create custom template tags and filters | Django 문서 | Django&quot; data-og-description=&quot;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/ko/4.0/howto/custom-template-tags/&quot; data-og-url=&quot;https://docs.djangoproject.com/ko/4.0/howto/custom-template-tags/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/ko/4.0/howto/custom-template-tags/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/ko/4.0/howto/custom-template-tags/&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;How to create custom template tags and filters | Django 문서 | Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;font-family: 'Noto Serif KR';&quot;&gt;0. 해당 앱에 templatestags 라는 폴더를 만들어줍니다.&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;font-family: 'Noto Serif KR';&quot;&gt;1. templatestags 폴더 안에 '__init__.py'와 'app이름_tags.py'를 만들어줍니다.&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;0.JPG&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjJ75K/btrt1I4v4OC/TZMxJNCW1d1CvKdhthOcY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjJ75K/btrt1I4v4OC/TZMxJNCW1d1CvKdhthOcY0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjJ75K/btrt1I4v4OC/TZMxJNCW1d1CvKdhthOcY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjJ75K%2Fbtrt1I4v4OC%2FTZMxJNCW1d1CvKdhthOcY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;163&quot; height=&quot;71&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;71&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 style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templatetags/&lt;span style=&quot;color: #006dd7;&quot;&gt;insta_tags.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645513357392&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django import template

register = template.Library()


@register.filter
def is_like_user(post, user):
    # 해당 글의 is_like_user를 반환 하여줍니다.
    return post.is_like_user(user)&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;2.JPG&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw7r9h/btrtYUR1Ibk/b8qluX4JkbbdyLiBHqkIwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw7r9h/btrtYUR1Ibk/b8qluX4JkbbdyLiBHqkIwK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw7r9h/btrtYUR1Ibk/b8qluX4JkbbdyLiBHqkIwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw7r9h%2FbtrtYUR1Ibk%2Fb8qluX4JkbbdyLiBHqkIwK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;913&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>강의 정리/Django 기초</category>
      <category>Django 인스타 좋아요</category>
      <category>Django 좋아요 기능 구현</category>
      <category>장고 인스타 좋아요</category>
      <category>장고 좋아요 기능 구현</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/117</guid>
      <comments>https://devdongbaek.tistory.com/117#entry117comment</comments>
      <pubDate>Tue, 22 Feb 2022 22:44:31 +0900</pubDate>
    </item>
    <item>
      <title>Django 인스타그램 글에 기간 설정하기</title>
      <link>https://devdongbaek.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Django 인스타그램 포스팅 글에 기간 설정하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;models.py&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1645433295843&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    # auto_now_add 는 생성 시간이 자동으로 DB에 저장된다.
    created_at = models.DateField(auto_now_add=True)
    # auto_now는 수정 시간이 DB에 자동으로 저장된다.
    updated_at = models.DateField(auto_now=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# 생성 시각 필드를 만들어준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 위 필드들과 같이 매번 모델에 들어가는 필드들이면 부모 추상 클래스를 통해서 코드 작성 시간을 줄일 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645433567760&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class BaseModel(models.Model):

    class Meta:
        # 아래 코드를 통해 실제 DB에 적용되지 않고, 추상 클래스로 만들어진다.
        abstract = True

class Post(BaseModel):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    photo = models.ImageField(upload_to=&quot;insta/post/%Y%m%d&quot;)
    # 내용
    caption = models.TextField()
    tag_set = models.ManyToManyField('Tag', blank=True)
    location = models.CharField(max_length=100) 
    created_at = models.DateField(auto_now_add=True)
    updated_at = models.DateField(auto_now=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_후 Terminal에서 아래와 같이 필수 필드 여부에 대해서 작성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645433351009&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(django_instagram) C:\django_instagram&amp;gt;python manage.py makemigrations insta
You are trying to add the field 'created_at' with 'auto_now_add=True' to post without a default; the database needs something to populate existing rows.

 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value.
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
[default: timezone.now] &amp;gt;&amp;gt;&amp;gt; timezone.now
Migrations for 'insta':
  insta\migrations\0004_auto_20220221_1747.py
    - Add field created_at to post
    - Add field updated_at to post&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# timezone.now를 default 값으로 넣어준다는 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645433903327&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import timedelta
from django.utils import timezone

@login_required
def index(request):
    # 현재를 기준으로 3일 이내라면
    timesince = timezone.now() - timedelta(days=3)

    # TimeLine에 Follow하는 유저들의 포스팅 만을 노출하기
    post_list = Post.objects.all()\
        .filter( 
            Q(author=request.user) | 
            Q(author__in=request.user.following_set.all())
            )\
        .filter(
            created_at__lte = timesince # 3일 이내의 게시글
            #created_at__gte = timesince # 3일 이외의 게시글
        )&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;&lt;a href=&quot;https://velog.io/@may_soouu/Django-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@may_soouu/Django-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645446491834&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;  Django 메소드 정리&quot; data-og-description=&quot;장고의 메소드에 대해 정리해보자일치하는 조건을 입력할 때 사용언더바 두개 (\_\_)\-조건을 사용할 경우 \-외부 모델 필드를 사용할 경우 부분 일치 조건 입력할 때 사용여러 조건을 포함할 경&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@may_soouu/Django-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%A0%95%EB%A6%AC&quot; data-og-url=&quot;https://velog.io/@may_soouu/Django-메소드-정리&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HRShy/hyNujDCzt0/BkDE7sor2a9Hpikqmxn4Fk/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@may_soouu/Django-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@may_soouu/Django-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%A0%95%EB%A6%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HRShy/hyNujDCzt0/BkDE7sor2a9Hpikqmxn4Fk/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;  Django 메소드 정리&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.slideshare.net/EunhyangKim2/ss-118560530&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.slideshare.net/EunhyangKim2/ss-118560530&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1645447139606&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;slideshare:presentation&quot; data-og-title=&quot;Django의 배신(주니어 개발자의 Django 삽질기)&quot; data-og-description=&quot;Dev Django Korea 2018에서 발표한 자료입니다. 주니어 개발자가 Django로 개발하며 삽질한 내용을 담았습니다.&quot; data-og-host=&quot;www.slideshare.net&quot; data-og-source-url=&quot;https://www.slideshare.net/EunhyangKim2/ss-118560530&quot; data-og-url=&quot;https://www.slideshare.net/EunhyangKim2/ss-118560530&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pwCYH/hyNukP4man/izBULmyoHbaXFi6CqIVTR0/img.jpg?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432&quot;&gt;&lt;a href=&quot;https://www.slideshare.net/EunhyangKim2/ss-118560530&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.slideshare.net/EunhyangKim2/ss-118560530&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pwCYH/hyNukP4man/izBULmyoHbaXFi6CqIVTR0/img.jpg?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432');&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;Django의 배신(주니어 개발자의 Django 삽질기)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Dev Django Korea 2018에서 발표한 자료입니다. 주니어 개발자가 Django로 개발하며 삽질한 내용을 담았습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.slideshare.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>Django created_at__gte</category>
      <category>Django created_at__lte</category>
      <category>장고 created_at__gte</category>
      <category>장고 created_at__lte</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/115</guid>
      <comments>https://devdongbaek.tistory.com/115#entry115comment</comments>
      <pubDate>Mon, 21 Feb 2022 18:00:38 +0900</pubDate>
    </item>
    <item>
      <title>Django 인스타그램 follow 기능 구현</title>
      <link>https://devdongbaek.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Instagram Follow-Unfollow 기능 구현&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#accounts/&lt;span style=&quot;color: #006dd7;&quot;&gt;models.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1645086228632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class User(AbstractUser):
	    follower_set = models.ManyToManyField(&quot;self&quot;, blank=True) # 현재 유저를 팔로우 하는 사람의 목록
    	# &quot;self&quot;를 통해서 대상을 User간의 관계로 지정할 수 있다.
    	following_set = models.ManyToManyField(&quot;self&quot;, blank=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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#accounts/&lt;span style=&quot;color: #006dd7;&quot;&gt;urls.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645087375992&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   urlpatterns = [
       re_path(r'^(?P&amp;lt;username&amp;gt;[\w.@+-]+)/follow/$', views.user_follow, name='user_follow'),  
       re_path(r'^(?P&amp;lt;username&amp;gt;[\w.@+-]+)/unfollow/$', views.user_unfollow, name='user_unfollow'),      
    ]&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#accounts/&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645089582850&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 팔로우 기능 
@login_required
def user_follow(request, username):
    follow_user = get_object_or_404(get_user_model(), username=username, is_active=True)
    
    # request.user -&amp;gt; follow_user를 팔로우 하려고 함.
    request.user.following_set.add(follow_user)
    # 반대로 팔로잉 된 유저의 follower_set에 현재 유저 추가
    follow_user.follower_set.add(request.user)

    messages.success(request, f&quot;{follow_user}님을 팔로우 하였습니다.&quot;)
    redirect_url = request.META.get(&quot;HTTP_REFERER&quot;, &quot;root&quot;) # HTTP_REFERER은 request 요청을 한 웹페이지의 주소를 보여준다.
    # 만약 HTTP_REFERER가 없으면 root 주소를 가져온다.
    return redirect(redirect_url)


# 언팔로우 기능
@login_required
def user_unfollow(request, username):
    unfollow_user = get_object_or_404(get_user_model(), username=username, is_active=True)

    # request.user -&amp;gt; follow_user를 팔로우 하려고 함.
    request.user.following_set.remove(unfollow_user)
    # 반대로 팔로잉 된 유저의 follower_set에 현재 유저 추가
    unfollow_user.follower_set.remove(request.user)

    messages.success(request, f&quot;{unfollow_user}님을 언팔로우 하였습니다.&quot;)
    redirect_url = request.META.get(&quot;HTTP_REFERER&quot;, &quot;root&quot;)
    return redirect(redirect_url)&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;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/request-response/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/request-response/&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645086815024&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
@login_required
def index(request):
    suggested_user_list = get_user_model().objects.all()\
        .exclude(pk=request.user.pk)\
        .exclude(pk__in=request.user.following_set.all())[:3] # 이미 팔로잉 하고 있는 유저들을 제외함.
        
    # 유저 본인 pk를 제외하고 나머지 유저가 suggested_user이다.
    return render(request, &quot;insta/index.html&quot;, {
        &quot;suggested_user_list&quot; : suggested_user_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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;템플릿 단&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/&lt;span&gt;insta&lt;/span&gt;/timeline_sidebar.html&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645086929240&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;card mb-2&quot;&amp;gt;
    &amp;lt;div class=&quot;card-header text-muted&quot;&amp;gt;
        Suggestions for you
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;card-body text-muted&quot;&amp;gt;
        {% for suggested_user in suggested_user_list %}
            {% include 'insta/timeline_sidebar_user_follow.html'%}
        {% empty %}
            추천 친구가 없습니다.
        {% endfor %} 
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/&lt;span&gt;insta&lt;/span&gt;/timeline_sidebar_user_follow.html&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645086984928&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;d-flex&quot;&amp;gt;
    &amp;lt;div class=&quot;mr-3&quot;&amp;gt;
        &amp;lt;img src=&quot;{{ suggested_user.profile_url }}&quot; style=&quot;width: 32px; height: 32px;&quot; class=&quot;rounded-circle&quot;/&amp;gt;}
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;p-2&quot;&amp;gt;
        {{ suggested_user.username }}
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;ml-auto&quot;&amp;gt;
        &amp;lt;a href=&quot;{% url &quot;user_follow&quot; suggested_user.username %}&quot;&amp;gt;Follow&amp;lt;/a&amp;gt;
        &amp;lt;a href=&quot;{% url &quot;user_unfollow&quot; suggested_user.username %}&quot;&amp;gt;Unfollow&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/&lt;span&gt;insta&lt;/span&gt;/index.html&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645091517403&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends &quot;insta/layout.html&quot; %}

{% block content %}
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col-sm-12&quot;&amp;gt;
                &amp;lt;a href=&quot;{% url 'insta:post_new' %}&quot; class=&quot;btn btn-primary&quot;&amp;gt;새 포스팅 쓰기&amp;lt;/a&amp;gt;             
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col-sm-8&quot;&amp;gt;     
                Timeline        
                &amp;lt;hr /&amp;gt;
                {{ user.following_set.all }}   
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;col-sm-4&quot;&amp;gt;
                {% include &quot;insta/timeline_sidebar.html&quot; %}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
{% endblock %}&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;1659&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pKBzi/btrtyei5iIw/AmHtcLkIQBukhNaYiceGWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pKBzi/btrtyei5iIw/AmHtcLkIQBukhNaYiceGWK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pKBzi/btrtyei5iIw/AmHtcLkIQBukhNaYiceGWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpKBzi%2Fbtrtyei5iIw%2FAmHtcLkIQBukhNaYiceGWK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1659&quot; height=&quot;773&quot; data-filename=&quot;4.JPG&quot; data-origin-width=&quot;1659&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>강의 정리/Django 기초</category>
      <category>Django 인스타</category>
      <category>Django 인스타 팔로우</category>
      <category>장고 인스타</category>
      <category>장고 인스타 팔로우</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/114</guid>
      <comments>https://devdongbaek.tistory.com/114#entry114comment</comments>
      <pubDate>Thu, 17 Feb 2022 18:53:06 +0900</pubDate>
    </item>
    <item>
      <title>Django  인스타그램 Timeline sidebar 구현하기</title>
      <link>https://devdongbaek.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Instagram Timeline sidebar 구현&lt;/span&gt;&lt;/h2&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 style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645079530424&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@login_required
def index(request):
    return render(request, &quot;insta/index.html&quot;, {
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;urls.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645079546991&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('', views.index, name='index'), #추가

    path('post/new', views.post_new, name='post_new'),
    path('post/&amp;lt;int:pk&amp;gt;', views.post_detail, name='post_detail'),


    re_path(r'^(?P&amp;lt;username&amp;gt;[\w.@+-]+)/$', views.user_page, name='user_page'),    
    ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#프로젝트&lt;span style=&quot;color: #006dd7;&quot;&gt;/urls.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645079578215&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/' , include('accounts.urls')),
   #path('', include('insta.urls')), 기존 주소 
    path('insta', include('insta.urls')), # 추가

    path('', login_required(TemplateView.as_view(template_name='root.html')), name='root' ), # re_path를 사용하면 모든 주소에 매칭이 된다.
    path('identicon/images/&amp;lt;path:data&amp;gt;/', pydenticon_image, name='pydenticon_image'),

]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# 프로젝트 urls.py에서 &lt;span&gt;기존 root 주소(=' ')를 가지고있던 &lt;/span&gt;instagram의 주소를&amp;nbsp; 'instagram/' 으로 지정해주므로&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;주소가 동일해지는 충돌을 피할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#프로젝트/templates/프로젝트/root.html -&amp;gt; insta/&lt;span&gt;templates/&lt;span&gt;insta&lt;/span&gt;/index.html 으로 이동&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645082278706&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends &quot;insta/layout.html&quot; %}

{% block content %}
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col-sm-12&quot;&amp;gt;
                &amp;lt;a href=&quot;{% url 'insta:post_new' %}&quot; class=&quot;btn btn-primary&quot;&amp;gt;새 포스팅 쓰기&amp;lt;/a&amp;gt;             
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col-sm-8&quot;&amp;gt;     
                Timeline           
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;col-sm-4&quot;&amp;gt;
                {% include &quot;insta/timeline_sidebar.html&quot; %}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
{% endblock %}&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&lt;span&gt;insta/&lt;/span&gt;&lt;span&gt;templates/&lt;span&gt;insta&lt;/span&gt;/timeline_sidebar.html&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645082286265&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;d-flex p-2&quot;&amp;gt;
    &amp;lt;div class=&quot;mr-4&quot;&amp;gt;
        &amp;lt;img src=&quot;{{ user.profile_url }}&quot; style=&quot;width: 40px; height: 40px;&quot; class=&quot;rounded-circle&quot;/&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
        {{ user.username }}&amp;lt;br/&amp;gt;
        &amp;lt;small class=&quot;text-muted&quot;&amp;gt;{{ user.name }}&amp;lt;/small&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div class=&quot;card mb-3&quot;&amp;gt;
    &amp;lt;div class=&quot;card-header text-muted&quot;&amp;gt;
        Stories
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;card-body text-muted&quot;&amp;gt;
        Stories from people you follow will show up
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
            
&amp;lt;div class=&quot;card mb-2&quot;&amp;gt;
    &amp;lt;div class=&quot;card-header text-muted&quot;&amp;gt;
        Suggestions for you
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;card-body text-muted&quot;&amp;gt;
        {% include 'insta/timeline_sidebar_user_follow.html' with friend_user=user%}
        {% include 'insta/timeline_sidebar_user_follow.html' with friend_user=user%}
        {% include 'insta/timeline_sidebar_user_follow.html' with friend_user=user%}
    &amp;lt;/div&amp;gt;
&amp;lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;# with friend_user=user의 의미는 user(=현재 로그인 유저)를 friend_user로 넘기겠다는 의미입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span&gt;# 템플릿 내에서 반복되는 문장이 있다면 따로 템플릿을 만들어 include로 불러오는 방법을 추천합니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&lt;span&gt;insta/&lt;/span&gt;&lt;span&gt;templates/&lt;span&gt;insta&lt;/span&gt;/timeline_sidebar_user_follow.html&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645082295209&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;d-flex&quot;&amp;gt;
    &amp;lt;div class=&quot;mr-3&quot;&amp;gt;
        &amp;lt;img src=&quot;{{ friend_user.profile_url }}&quot; style=&quot;width: 32px; height: 32px;&quot; class=&quot;rounded-circle&quot;/&amp;gt;}
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;p-2&quot;&amp;gt;
        {{ friend_user.username }}
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;ml-auto&quot;&amp;gt;
        &amp;lt;a href=&quot;#&quot;&amp;gt;Follow&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>강의 정리/Django 기초</category>
      <category>Django sidebar</category>
      <category>장고 sidebar</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/113</guid>
      <comments>https://devdongbaek.tistory.com/113#entry113comment</comments>
      <pubDate>Thu, 17 Feb 2022 16:18:31 +0900</pubDate>
    </item>
    <item>
      <title>Django 유저 썸네일 구현</title>
      <link>https://devdongbaek.tistory.com/112</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;easy-thumbnail을 활용하여 프로필 디폴트 이미지 구현&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/SmileyChris/easy-thumbnails&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/SmileyChris/easy-thumbnails&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644988192398&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 - SmileyChris/easy-thumbnails: Easy thumbnails for Django&quot; data-og-description=&quot;Easy thumbnails for Django. Contribute to SmileyChris/easy-thumbnails development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/SmileyChris/easy-thumbnails&quot; data-og-url=&quot;https://github.com/SmileyChris/easy-thumbnails&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cziWhV/hyNqI5cziT/ZC0YpLAm9iOtL06bA04Oz1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/SmileyChris/easy-thumbnails&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/SmileyChris/easy-thumbnails&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cziWhV/hyNqI5cziT/ZC0YpLAm9iOtL06bA04Oz1/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 - SmileyChris/easy-thumbnails: Easy thumbnails for Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Easy thumbnails for Django. Contribute to SmileyChris/easy-thumbnails 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;&lt;a href=&quot;https://wikidocs.net/10485&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/10485&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644989248238&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;[TOC] # 패키지 선택 [Django 썸네일 이미지 라이브러리 비교](https://djangopackages.org/grids/g/thumbnails/) 사이트에서 ...&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/10485&quot; data-og-url=&quot;https://wikidocs.net/10485&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/B8Vh2/hyNqIqD89k/6nDcGZKFsfqVmkKRyqrpnK/img.png?width=100&amp;amp;height=45&amp;amp;face=0_0_100_45&quot;&gt;&lt;a href=&quot;https://wikidocs.net/10485&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/10485&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/B8Vh2/hyNqIqD89k/6nDcGZKFsfqVmkKRyqrpnK/img.png?width=100&amp;amp;height=45&amp;amp;face=0_0_100_45');&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;[TOC] # 패키지 선택 [Django 썸네일 이미지 라이브러리 비교](https://djangopackages.org/grids/g/thumbnails/) 사이트에서 ...&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#Terminal&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644988273055&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install easy-thumbnails&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#commons.py(=settings.py)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644988329798&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
    # Django Apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Third Apps
    'debug_toolbar',
    'bootstrap4',
    'django_pydenticon',
    'django_easythumbnails', # 추가

    # Local Apps
    'accounts',
    'insta',
  
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 후에 migrate를 해주어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1644988505279&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate easy_thumbnails&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# 템플릿 단에서 사용하기&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/insta/user_page.html&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644989113975&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        &amp;lt;div class=&quot;row mt-3&quot;&amp;gt;
            {% for post in post_list %}
                &amp;lt;div class=&quot;col-sm-4 mb-3&quot;&amp;gt;
                    &amp;lt;img src=&quot;{% thumbnail post.photo 256x256 crop %}&quot; alt=&quot;{{ post.caption }}&quot; style=&quot;width: 100%;%&quot; /&amp;gt;
                &amp;lt;/div&amp;gt;
            {% endfor %}
        &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# thumbnail을 사용하면 url까지 작성하지 않아도 되고, 파일의 크기를 지정할 수 있다.&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;2.JPG&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5NnCB/btrtlq5SMQf/uRRK4O02fNfW9winp6PaQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5NnCB/btrtlq5SMQf/uRRK4O02fNfW9winp6PaQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5NnCB/btrtlq5SMQf/uRRK4O02fNfW9winp6PaQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5NnCB%2Fbtrtlq5SMQf%2FuRRK4O02fNfW9winp6PaQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;551&quot; data-filename=&quot;2.JPG&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;551&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;</description>
      <category>Django easy-thumbnail</category>
      <category>Django 썸네일</category>
      <category>장고 easy-thumbnail</category>
      <category>장고 썸네일</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/112</guid>
      <comments>https://devdongbaek.tistory.com/112#entry112comment</comments>
      <pubDate>Wed, 16 Feb 2022 14:28:54 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 해시법</title>
      <link>https://devdongbaek.tistory.com/111</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해시법&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해시법이란 '데이터를 저장할 위치 = 인덱스'를 간단한 연산으로 구하는 것을 의미한다. &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&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;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 40px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 27.1802%; height: 20px;&quot; colspan=&quot;3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;키&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;14&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;21&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;25&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 27.1802%; height: 20px;&quot; colspan=&quot;3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;해시값(6으로 나눈 나머지)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이렇게 키의 값을 배열의 크기(길이)나 특정 기준으로 나눈 것을 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;해시값&lt;/b&gt;&lt;/span&gt;이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;해시값&lt;/span&gt;&lt;/b&gt;은 데이터에 접근할 때 기준 &lt;b&gt;인덱스&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위에서 구한 해시값을 인덱스로 하여 원소를 새로 저장한 배열을&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 해시 테이블&lt;/b&gt;&lt;/span&gt;이라고하며, 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;25&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;14&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;21&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;34&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-키를 해시값으로 변환하는 과정(나누는 과정)을 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;해시 함수&lt;/b&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;font-family: 'Noto Serif KR';&quot;&gt;_해시 테이블에서 만들어진 원소(=배열 한 칸)를&lt;b&gt; &lt;span style=&quot;color: #ef5369;&quot;&gt;버킷&lt;/span&gt;&lt;/b&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_만약 위의 해시 테이블에 18이라는 키값을 추가하고 싶을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;18의 나머지는 0 즉 해시값이 0이므로, 0에는 이미 6이라는 값이 들어있습니다.&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;font-family: 'Noto Serif KR';&quot;&gt;이때 저장할 버킷이 중복되는 현상을&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 충돌&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해시법에서 충돌을 해결하는 방법은 총 2가지가 있습니다.&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;font-family: 'Noto Serif KR';&quot;&gt;1. 체인법 : 해시값이 같은 원소를 연결리스트로 관리하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 오픈 주소법 : 빈 버킷을 찾을 때 까지 해시를 반복하는 것&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;먼저 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;체인법&lt;/b&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;font-family: 'Noto Serif KR';&quot;&gt;_&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;체인법&lt;/span&gt;&lt;/b&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#해시법에서 해시값을 각 버킷에 저장할 때는 해시값 인덱스에 바로 저장하는 것이 아닌 인덱스를 해시값으로 하는 연결 리스트의 앞쪽 노드를 참조하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;q.JPG&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6xYCb/btrtlTzCInL/hk7gKUikERuLQbUVtm2fU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6xYCb/btrtlTzCInL/hk7gKUikERuLQbUVtm2fU0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6xYCb/btrtlTzCInL/hk7gKUikERuLQbUVtm2fU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6xYCb%2FbtrtlTzCInL%2Fhk7gKUikERuLQbUVtm2fU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;315&quot; data-filename=&quot;q.JPG&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;체인법을 파이썬으로 구현하기 위해서는 먼저 Node 클래스와 ChainedHash 클래스를 만들어야 합니다.&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;font-family: 'Noto Serif KR';&quot;&gt;먼저 Node 클래스는 개별 버킷을 나타내며 키에 해시 함수를 적용하여 해시값을 구합니다.&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;font-family: 'Noto Serif KR';&quot;&gt;_Node 클래스&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644917585239&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from typing import Any, Sequence

class Node:
    # 해시를 구성하는 노드

    def __init__(self, key: Any, value: Any, next: Node) -&amp;gt; None:
        &quot;&quot;&quot; 초기화 &quot;&quot;&quot;

        self.key = key     # 키
        self.value = value # 해시값
        self.next = next   # 뒤쪽 노드를 참조&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ChainedHash 클래스&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644917769447&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from typing import Any, Sequence

class ChainedHash:
    # 해시를 구성하는 노드

    def __init__(self, capacity: int) -&amp;gt; None:
        &quot;&quot;&quot; 초기화 &quot;&quot;&quot;

        self.capacity = capacity                # 해시 테이블의 길이 지정
        self.table = [None] * self.capacity     # 해시 테이블(리스트) 선언


    def hash_value(self, key: Any) -&amp;gt; int:
        &quot;&quot;&quot; 해시 값을 구하는 해시 함수 &quot;&quot;&quot;

        if isinstance(key, int):
            return key % self.capacity&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;키로 원소 검색하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 파이썬 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644918176712&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    def search(self, key: Any) -&amp;gt; Any:
        &quot;&quot;&quot; 키가 key인 원소를 발견하면 값을 반환 &quot;&quot;&quot;
        hash = self.hash_value(key) # 해시 함수로 만든 해시 값
        p = self.table[hash]        # 해시 값의 인덱스를 p로 지정

        while p is not None:
            if p.key == key:        
                return p.value      # 검색 성공 
            p = p.next              # 뒤쪽 노드로 이동

        return None # 끝까지 찾지 못하였으므로 실패 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코드 프로세스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 해시 함수를 사용하여 키를 해시값으로 변환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 해시값을 인덱스로하는 버킷에 주목(=변수로 지정)합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 버킷이 참조하는 연결 리스트를 맨 앞부터 차례로 스캔하며, 키와 같은 값이 발견되면 검색에 성공하고, 원소의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원소를 추가하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 파이썬 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644918621151&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    def add(self, key: Any, value: Any) -&amp;gt; bool:
        &quot;&quot;&quot; 키가 key이고 값이 value인 원소를 추가 &quot;&quot;&quot;

        hash = self.hash_value(key) # 해시 함수로 만든 해시 값
        p = self.table[hash]        # 해시 값의 인덱스를 p로 지정

        while p is not None:
            if p.key == key:        
                return False        # 검색 성공 
            p = p.next              # 뒤쪽 노드로 이동

        temp = Node(key, value, self.table[hash]) # temp라는 노드 만들기
        self.table[hash] = temp                   # 만든 노드 해시값에 참조 시키기
        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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코드 프로세스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 해시 함수를 사용하여 키를 해시값으로 변환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 해시값을 인덱스로 하는 버킷에 주목합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 버킷이 참조하는 연결리스트를 맨 앞부터 차례로 선형검색합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;키와 같은 값이 발견되면 이미 키가 등록되어있는 경우이기에 추가에 실패합니다.&lt;/span&gt;&lt;span&gt;만약 원소 끝까지 발견 되지 않으면 해시값인 리스트의&lt;span style=&quot;color: #ef5369;&quot;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원소를 삭제하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;_ 파이썬 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644919305521&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    def remove(self, key: Any) -&amp;gt; bool:
        &quot;&quot;&quot; 키가 key인 원소를 삭제 &quot;&quot;&quot;

        hash = self.hash_value(key) # 해시 함수로 만든 해시 값
        p = self.table[hash]        # 해시 값의 인덱스를 p로 지정
        pp = None                   # 바로 앞의 노드를 주목

        while p is not None:
            if p.key == key:        # 키를 발견하면 아래를 실행
                if pp is None:        
                    self.table[hash] = p.next   # 뒤쪽 노드가 삭제할 값을 무시하고 해시값에 참조하게 합니다.
                else:
                    pp.next = p.next # 뒤쪽 노드가 가리키는 곳을 앞의 노드가 참조하게 한다.
                return True
            pp = p        
            p = p.next               # 뒤쪽 노드를 주목
        
        return False                 # 삭제 실패&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코드 프로세스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 해시 함수를 사용하여 키를 해시값으로 변환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 해시값을 인덱스로 하는 버킷에 주목합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 버킷이 참조하는 연결 리스트를 맨 앞부터 차례로 선형 검색합니다. 키와 같은 값이 발견되면 그 노드를 리스트에서 삭제합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;삭제를 이해하기 쉽게 하는 이미지 설명&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjypK/btrtqf9E2kK/eG9LeJ4M3Kp7xT1p2gtFh1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjypK/btrtqf9E2kK/eG9LeJ4M3Kp7xT1p2gtFh1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjypK/btrtqf9E2kK/eG9LeJ4M3Kp7xT1p2gtFh1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjypK%2Fbtrtqf9E2kK%2FeG9LeJ4M3Kp7xT1p2gtFh1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;408&quot; data-filename=&quot;0.JPG&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z2QYE/btrtlsIAMlY/qJEGtKNwviQalwMtQk53SK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z2QYE/btrtlsIAMlY/qJEGtKNwviQalwMtQk53SK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z2QYE/btrtlsIAMlY/qJEGtKNwviQalwMtQk53SK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz2QYE%2FbtrtlsIAMlY%2FqJEGtKNwviQalwMtQk53SK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;412&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;552&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# 한마디로 삭제라는 단어보다 무시라는 단어 즉 참조하는 곳을 바꿔주면서 없애고싶은 원소를 외톨이로 만들어버린다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 이해하시면 편할 것 같습니다!!!&lt;/span&gt;&lt;/p&gt;</description>
      <category>컴퓨터 사이언스/Algorithm</category>
      <category>파이썬 해시 체인법</category>
      <category>파이썬 해시법</category>
      <category>파이썬 해시법 체인법</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/111</guid>
      <comments>https://devdongbaek.tistory.com/111#entry111comment</comments>
      <pubDate>Tue, 15 Feb 2022 19:05:05 +0900</pubDate>
    </item>
    <item>
      <title>Django 유저 페이지 구현하기</title>
      <link>https://devdongbaek.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Django 유저 페이지 구현하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;urls.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644902222711&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.urls import path, re_path
from django.contrib.auth.validators import UnicodeUsernameValidator

from . import views

# reverse에 사용할 이름
app_name = 'insta'

# 주소에 오는 username이 Unicode 형태인지 확인하는 Validator 
# username_regax = UnicodeUsernameValidator.regex.lstrip('^').strip('$')

urlpatterns = [
    
    path('post/new', views.post_new, name='post_new'),
    path('post/&amp;lt;int:pk&amp;gt;', views.post_detail, name='post_detail'),


    re_path(r'^(?P&amp;lt;username&amp;gt;[\w.@+-]+)/$', views.user_page, name='user_page'),    
    ]&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;pre id=&quot;code_1644902131920&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@deconstructible
class UnicodeUsernameValidator(validators.RegexValidator):
    regex = r&quot;^[\w.@+-]+\Z&quot;
    message = _(
        &quot;Enter a valid username. This value may contain only letters, &quot;
        &quot;numbers, and @/./+/-/_ characters.&quot;
    )
    flags = 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://github.com/django/django/blob/main/django/contrib/auth/validators.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/django/django/blob/main/django/contrib/auth/validators.py&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#UnicodeUsernameValidator은 username이 Unicode 형태의 문자인지 검사하는 Validator입니다.&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644901385779&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;django.contrib.auth | Django documentation | Django&quot; data-og-description=&quot;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&quot; data-og-host=&quot;docs.djangoproject.com&quot; data-og-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; data-og-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.djangoproject.com/en/4.0/ref/contrib/auth/&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;django.contrib.auth | Django documentation | Django&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About &amp;hearts; Donate&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.djangoproject.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;font-family: 'Noto Serif KR';&quot;&gt;#정규 표현식에 익숙해지자!&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://wikidocs.net/4308&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/4308&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644901980457&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;07-2 정규 표현식 시작하기&quot; data-og-description=&quot;[TOC] ## 정규 표현식의 기초, 메타 문자 정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다. &amp;gt; ※ 메타 문자란 원래 ...&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/4308&quot; data-og-url=&quot;https://wikidocs.net/4308&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/G8GVb/hyNqFzExNt/gvAXjfIS38BabJDtksrhO0/img.jpg?width=95&amp;amp;height=130&amp;amp;face=0_0_95_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/4308&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/4308&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/G8GVb/hyNqFzExNt/gvAXjfIS38BabJDtksrhO0/img.jpg?width=95&amp;amp;height=130&amp;amp;face=0_0_95_130');&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;07-2 정규 표현식 시작하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[TOC] ## 정규 표현식의 기초, 메타 문자 정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다. &amp;gt; ※ 메타 문자란 원래 ...&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#accounts/&lt;span style=&quot;color: #006dd7;&quot;&gt;forms.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644902557231&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    # username 중복 방지 함수
    def clean_username(self):
        username = self.cleaned_data.get('username')

        if username:
            qs = User.objects.filter(username='post')
            if qs.exists():
                raise forms.ValidationError(&quot;지정할 수 없는 아이디입니다.&quot;)
            
            return username&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# username이 혹시 다른 url의 이름과 겹치면 오류가 발생하기에 사전에 방지해줍니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644902875119&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 유저 페이지
def user_page(request, username):
    page_user = get_object_or_404(get_user_model(), username=username, is_active=True)
    # 해당 유저가 쓴 글만을 filter 처리하여서 저장
    post_list = Post.objects.filter(author=page_user)
    return render(request, &quot;insta/user_page.html&quot;, {
        &quot;page_user&quot;: page_user,
        &quot;post_list&quot;: post_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;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;#get_object_or_404의 코드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644903448896&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def get_object_or_404(klass, *args, **kwargs):
    &quot;&quot;&quot;
    Use get() to return an object, or raise an Http404 exception if the object
    does not exist.
    klass may be a Model, Manager, or QuerySet object. All other passed
    arguments and keyword arguments are used in the get() query.
    Like with QuerySet.get(), MultipleObjectsReturned is raised if more than
    one object is found.
    &quot;&quot;&quot;
    queryset = _get_queryset(klass)
    if not hasattr(queryset, &quot;get&quot;):
        klass__name = (
            klass.__name__ if isinstance(klass, type) else klass.__class__.__name__
        )
        raise ValueError(
            &quot;First argument to get_object_or_404() must be a Model, Manager, &quot;
            &quot;or QuerySet, not '%s'.&quot; % klass__name
        )
    try:
        return queryset.get(*args, **kwargs)
    except queryset.model.DoesNotExist:
        raise Http404(
            &quot;No %s matches the given query.&quot; % queryset.model._meta.object_name
        )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;#is_active는 접근이 허용된 사람만 확인하게 해주는 옵션입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span&gt;templates/&lt;span&gt;insta&lt;/span&gt;&lt;span&gt;/user_page.html&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644906651924&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends &quot;insta/layout.html&quot; %}

{% block content %}
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;row pt-5 pb-5&quot;&amp;gt;
            &amp;lt;div class=&quot;col-sm-3&quot; style=&quot;text-align: center;&quot;&amp;gt;
                &amp;lt;img src=&quot;{{ page_user.profile_url }}&quot; class=&quot;rounded-circle&quot; style=&quot;width: 160px;&quot; /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;col-sm-9&quot;&amp;gt;
                {{ page_user.username }}
                &amp;lt;a href=&quot;{% url &quot;profile_edit&quot; %}&quot; class=&quot;btn btn-secondary btn-sm&quot;&amp;gt;
                    Edit Profile
                &amp;lt;/a&amp;gt;
                &amp;lt;hr/&amp;gt;
                0 posts, 0 followers, 0 following
                &amp;lt;hr/&amp;gt;
                {{ page_user.name }}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row mt-3&quot;&amp;gt;
            {% for post in post_list %}
                &amp;lt;div class=&quot;col-sm-4&quot;&amp;gt;
                    &amp;lt;img src=&quot;{{ post.photo.url }}&quot; alt=&quot;{{ post.caption }}&quot; style=&quot;width: 100%;%&quot; /&amp;gt;
                &amp;lt;/div&amp;gt;
            {% endfor %}
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

{% endblock %}&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;h.JPG&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4UR5r/btrtq9nkyJF/1wrm3cIyGlFbxDFlSCz100/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4UR5r/btrtq9nkyJF/1wrm3cIyGlFbxDFlSCz100/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4UR5r/btrtq9nkyJF/1wrm3cIyGlFbxDFlSCz100/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4UR5r%2Fbtrtq9nkyJF%2F1wrm3cIyGlFbxDFlSCz100%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;736&quot; data-filename=&quot;h.JPG&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Django 유저페이지</category>
      <category>장고 유저페이지</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/110</guid>
      <comments>https://devdongbaek.tistory.com/110#entry110comment</comments>
      <pubDate>Tue, 15 Feb 2022 15:38:01 +0900</pubDate>
    </item>
    <item>
      <title>Django 포스팅 detail view 구현</title>
      <link>https://devdongbaek.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&quot;&gt;https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard&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;i&gt;&lt;b&gt;장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Django 포스팅 detail view 구현하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;urls.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644824154415&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.urls import path
from . import views

app_name = 'insta'

urlpatterns = [
    path('post/new', views.post_new, name='post_new'),
    path('post/&amp;lt;int:pk&amp;gt;', views.post_detail, name='post_detail'),
    ]&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;views.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644824063463&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.shortcuts import redirect, get_object_or_404


# 포스팅 detail
def post_detail(request, pk):
    # 해당 pk의 포스팅 객체가 없을 경우 404 에러 반환
    post = get_object_or_404(Post, pk=pk)
    return render(request, &quot;insta/post_detail.html&quot;, {
        &quot;post&quot; : post,
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# 항상 디테일을 구현하면 관련 모델에 get_absolute_url을 지정해주어야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/&lt;span style=&quot;color: #006dd7;&quot;&gt;models.py&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644824381944&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    photo = models.ImageField(upload_to=&quot;insta/post/%Y%m%d&quot;)
    # 내용
    caption = models.TextField()
    tag_set = models.ManyToManyField('Tag', blank=True)
    location = models.CharField(max_length=100) 

	# detail view
    def get_absolute_url(self):
        return reverse(&quot;insta:post_detail&quot;, args=[self.pk])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# &lt;span&gt;만약 이름으로 접근하게 되면 이름 형태로 반환해주게끔&amp;nbsp;&lt;/span&gt;accounts/models.py에서 설정해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1644825484186&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @property
    def name(self):
        return f&quot;{self.first_name} {self.last_name}&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;# 유저가 프로필이 있으면, 유저의 프로필을 보여주고, 없으면 기본 프로필을 보여주는 함수를 &lt;span&gt;accounts/models.py에서 설정해준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644826816146&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    # profile이 있는지 검사하고 알맞은 값을 반환하는 로직
    @property
    def profile_url(self):
        if self.profile:
            return self.profile.url
        else:
            return resolve_url('pydenticon_image', self.username)&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#insta/templates/insta/&lt;span style=&quot;color: #953b34;&quot;&gt;post_detail.html&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644826892161&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% extends &quot;insta/layout.html&quot; %}
{% load bootstrap4 %}

{% block content %}
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col-sm-12&quot;&amp;gt;
                &amp;lt;div class=&quot;card&quot;&amp;gt;
                    &amp;lt;div class=&quot;card-header&quot;&amp;gt;    
                        &amp;lt;img src= &quot;{{ user.profile_url }}&quot; style=&quot;width: 24px; height: 24px;&quot;/&amp;gt;
                        {{ post.author }}                    
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;card-body&quot;&amp;gt;   
                        {% if post.photo.url %}
                            &amp;lt;img src=&quot;{{ post.photo.url  }}&quot; style=&quot;width: 100%;&quot;/&amp;gt;
                        {% endif %}                     
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;card-footer&quot;&amp;gt;                           
                        {% for tag in post.tag_set.all %}
                            &amp;lt;span class=&quot;badge badge-primary&quot; style=&quot;color: #fff;
                            background-color: #007bff;&quot;&amp;gt;                        
                                #{{ tag.name }}
                            &amp;lt;/span&amp;gt;
                        {% endfor %}                     
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;    
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;  
{% endblock %}&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;g.JPG&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cemdcg/btrtk9H7jBm/G4Sn0yWi4iITaDjUdT3UWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cemdcg/btrtk9H7jBm/G4Sn0yWi4iITaDjUdT3UWK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cemdcg/btrtk9H7jBm/G4Sn0yWi4iITaDjUdT3UWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcemdcg%2Fbtrtk9H7jBm%2FG4Sn0yWi4iITaDjUdT3UWK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;899&quot; data-filename=&quot;g.JPG&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;899&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;</description>
      <category>Django 디테일뷰</category>
      <category>Django 포스팅 detail</category>
      <category>장고 디테일뷰</category>
      <category>장고 포스팅 detail</category>
      <author>개발자Dongbaek</author>
      <guid isPermaLink="true">https://devdongbaek.tistory.com/109</guid>
      <comments>https://devdongbaek.tistory.com/109#entry109comment</comments>
      <pubDate>Mon, 14 Feb 2022 17:21:41 +0900</pubDate>
    </item>
  </channel>
</rss>