<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>위험한자식</title>
    <link>https://youngmon.tistory.com/</link>
    <description>최적화변태</description>
    <language>ko</language>
    <pubDate>Thu, 23 Jul 2026 14:10:46 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>영모니</managingEditor>
    <image>
      <title>위험한자식</title>
      <url>https://tistory1.daumcdn.net/tistory/4731810/attach/a29e0328f1fa4ccfa9d581e2bf63bdf0</url>
      <link>https://youngmon.tistory.com</link>
    </image>
    <item>
      <title>JAVA) Enum과 인터페이스를 통한 리팩토링</title>
      <link>https://youngmon.tistory.com/entry/JAVA-%08Enum%EA%B3%BC-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 프로젝트의 일부 설계를 리팩토링 한 경험이 있는데,  리팩토링 과정에서 겪었던 고민과 해결을 말로 풀어하려니 어려워서 글로 정리해 보고자 작성합니다..&lt;br&gt;&amp;nbsp;&lt;br&gt;우선 리팩토링 전부터 보겠습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;1208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zeIqL/btsF12b0yrK/MiGqX970H25GTcpiS8Kek1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zeIqL/btsF12b0yrK/MiGqX970H25GTcpiS8Kek1/img.png&quot; data-alt=&quot;Image.java&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zeIqL/btsF12b0yrK/MiGqX970H25GTcpiS8Kek1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzeIqL%2FbtsF12b0yrK%2FMiGqX970H25GTcpiS8Kek1%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; alt=&quot;기존 코드&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;677&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;1208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Image.java&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;프로젝트에는 &lt;b&gt;ImageClient라는 객체&lt;/b&gt;가 있는데, 해당 객체가 각 플랫폼에 이미지 생성을 위한 프롬프트와 응답 포맷을 전송합니다.&lt;br&gt;이후 &lt;b&gt;다양한 포맷&lt;/b&gt;으로 받은 응답 데이터를 담는데에 사용되는 객체입니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2nRVh/btsF2SmktqP/V2vtkl9tjO3WjG20McUnPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2nRVh/btsF2SmktqP/V2vtkl9tjO3WjG20McUnPk/img.png&quot; data-alt=&quot;이미지 생성 API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2nRVh/btsF2SmktqP/V2vtkl9tjO3WjG20McUnPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2nRVh%2FbtsF2SmktqP%2FV2vtkl9tjO3WjG20McUnPk%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; alt=&quot;고영희&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;242&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 생성 API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTTNTB/btsF1i0URfL/n7TkrgkTFiJhmjlPhk58B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTTNTB/btsF1i0URfL/n7TkrgkTFiJhmjlPhk58B0/img.png&quot; data-alt=&quot;response_format&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTTNTB/btsF1i0URfL/n7TkrgkTFiJhmjlPhk58B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTTNTB%2FbtsF1i0URfL%2Fn7TkrgkTFiJhmjlPhk58B0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;83&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response_format&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 API 설명에 따르면 response_format에 url 또는 b64_json을 넣어 응답 객체를 선택할 수 있는데, 이를 기반으로 Image 클래스가 설계된 것 같습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;문제는 다른 모듈에서도 해당 클래스를 사용하고 있다는 것으로,&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMk9GW/btsF16ZIlJd/66IxL8bWMMge4oLwbJHEKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMk9GW/btsF16ZIlJd/66IxL8bWMMge4oLwbJHEKk/img.png&quot; data-alt=&quot;주석이 무슨 뜻인지 한참 고민했습니다..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMk9GW/btsF16ZIlJd/66IxL8bWMMge4oLwbJHEKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMk9GW%2FbtsF16ZIlJd%2F66IxL8bWMMge4oLwbJHEKk%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; alt=&quot;하&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;66&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주석이 무슨 뜻인지 한참 고민했습니다..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI의 API에 맞추어 설계된 Image 객체를 사용하기 위해, url 필드를 byte[](e.g. png, jpeg) 값을 담는 용도로 사용하고 있었습니다..&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot;&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제점 파악&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;구조를 수정해야겠다고 생각하고, 정확한 문제점을 파악하기 위해 관련 코드를 다 읽어보았습니다.&lt;br&gt;우선 해당 클래스에서 파악한 문제는 다음과 같습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;&lt;li&gt;각 Provider의 다른 API를 반영하지 못함&lt;/li&gt;&lt;li&gt;Setter를 통해 잠재적인 문제 발생 가능&lt;/li&gt;&lt;li&gt;생성자에서 여러 필드에 대한 값을 한꺼번에 받음&lt;/li&gt;&lt;li&gt;추가적인 포맷에 대한 확장이 발생했을 때, 이를 반영하기 어려움&lt;/li&gt;&lt;/ol&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;API 반영&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Image 객체를 통해, 데이터를 받더라도 데이터를 제대로 처리하지 못할 수 있는 문제가 있었습니다.&lt;br&gt;예를 들어 OpenAI의 b64_json을 통해 받은 결과물과, StabilityAi의 base64를 통해 받은 결과물은 모두 base64를 통해 인코딩 되어있습니다.&lt;br&gt;하지만 OpenAI의 경우, 이미지 데이터를 담고있는 json을 인코딩했으며 StabilityAI는 이미지 자체를 인코딩한 결과를 반환합니다.&lt;br&gt;나중에 이미지를 처리하는 모듈이 별도로 분리된다면 디코딩 이후 추가적인 분기가 발생하게 되며, 이러한 점이 장애물이 될 수 있다고 생각했습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;객체 불변성&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;해당 객체는 Setter를 통해 수정이 가능한 객체로, 잘못 사용할 경우 동시성 문제를 야기할 수 있습니다.&lt;br&gt;해당 부분은 별도의 Issue를 통해 따로 해결했습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;생성자와 Getter 동작 방식&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;해당 객체는 생성자에서 url과 base64에 대한 값을 동시에 받습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Image image = new Image(&quot;https://..&quot;, null);

if (image.getUrl() != null) ...
else if (image.getBase64() != null) ...
else throw new RuntimeException(); ...&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이는 null 체크에 대한 책임을 위와 같이 호출자에게 전가하게 됩니다.&lt;b&gt;&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;추가적인 포맷에 대한 확장성&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;위 생성자와 관련해 새로운 포맷이 추가될 경우 생성자의 인자도 추가되어야 하며, null 체크를 해야 할 메서드도 증가하게 됩니다.&lt;br&gt;만약 StabilityAI의 API만 새로 적용한다고 해도 생성자는 4개의 인자를 받게되는데, 새로운 포맷이 한 개 추가된다면 기존 Image의 생성자가 호출되는 모든 부분에 null을 추가해야 합니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설계의 방향에 대한 고민&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 문제들을 해결하기 위해 다음과 같이 해결하고자 했습니다.&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;&lt;li&gt;Image 클래스를 인터페이스로 변경, 각 모듈에서 해당 인터페이스를 구현&lt;/li&gt;&lt;li&gt;Enum을 사용해  Request의 response_format 속성과 Image를 더욱 안전하고 효율적으로 사용하도록 설계&lt;/li&gt;&lt;li&gt;확장성을 고려해 제네릭을 사용, base64 또는 url과 같은 String 이외의 값도 담을 수 있도록 설계&lt;/li&gt;&lt;/ol&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;위 방향성을 적용해서&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public interface Image&amp;lt;T&amp;gt; {

	/**
	 * Returns the image data. The type of the data is determined by the type parameter
	 * {@code T} of this interface.
	 * @return Image data of type T.
	 */
	T getData();

	/**
	 * Returns the type of the image. The image type is defined by the {@link ImageType}.
	 * Through this method, it's possible to know the type of the image.
	 * @return The {@link ImageType} of the image.
	 */
	ImageType getType();

}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;우선 기존 클래스를 인터페이스로 변경하고 기존의 다양한 getter를 getData 하나로 합쳤습니다.&lt;br&gt;이를 통해 포맷이 추가되더라도, ImageType에 대해서만 수정이 발생하고 getData에는 아무런 변경이 발생하지 않습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;이어서 ImageType입니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public interface ImageType&amp;lt;T extends Enum&amp;lt;T&amp;gt; &amp;amp; ImageType&amp;lt;T, E&amp;gt;, E&amp;gt; {

	/**
	 * Returns the value associated with the enum constant.
	 * @return The value of the enum constant of type {@code E}.
	 */
	E getValue();

}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Enum을 사용하여 안정성을 추구하면서, 확장을 위해 Type을 인터페이스로 만들었습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;타입 인자의 바운더리에 대해 꽤 고민을 많이 했던 것 같습니다.&lt;br&gt;Enum 타입을 강제하지 않으면서 람다나 메소드 참조를 사용할 수 있도록 확장성을 추구할지, 아니면 Enum을 강제할지에 대한 고민이 가장 컸는데요&lt;br&gt;확장성을 조금 포기하더라도 Enum 타입의 정의를 강제하면 &lt;b&gt;문서화를 강제&lt;/b&gt;할 수 있다는 생각이 들어, 결국은 Enum에 대한 바운더리를 설정했습니다. 이게 가장 컸습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;해당 프로젝트가 오픈소스인 만큼 많은 사람들이 사용하게 될 텐데, 코드의 &quot;b64_json&quot; 같은 속성을 각 플랫폼의 API 문서가 아닌 &lt;b&gt;코드 내에서 확인&lt;/b&gt;할 수 있으면 좋지 않을까라는 생각을 했습니다.&lt;br&gt;또한 재귀적 타입 바운딩을 통해 T getDefault() 등의 메소드가 필요할 때, 더욱 안전하게 사용할 수 있도록 설계했습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;실제 구현된 예시 ImageType은 다음과 같습니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public enum OpenAiImageType implements ImageType&amp;lt;OpenAiImageType, String&amp;gt; {

	URL(&quot;url&quot;), BASE64(&quot;b64_json&quot;);

	private final String value;

	OpenAiImageType(final String value) {
		this.value = value;
	}

	@Override
	public String getValue() {
		return this.value;
	}

	public static OpenAiImageType fromValue(final String value) {
		return Arrays.stream(values())
			.filter(v -&amp;gt; v.value.equals(value))
			.findAny()
			.orElseThrow(() -&amp;gt; new IllegalArgumentException(&quot;Invalid Value&quot;));
	}

}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이미지의 타입을 확인하고, 요청을 보내는 부분에서도 response_format의 값을 기존 String이 아닌 Enum으로 대체할 수 있도록 했습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public abstract class AbstractImage&amp;lt;T&amp;gt; implements Image&amp;lt;T&amp;gt; {

	private final T data;

	private final ImageType type;

	/**
	 * Constructs an AbstractImage with the specified data and image type.
	 * @param data the image data of this image.
	 * @param type the type of the image, as defined by the implementation of the
	 * ImageType interface.
	 */
	protected AbstractImage(final T data, final ImageType type) {
		this.data = data;
		this.type = type;
	}

	@Override
	public T getData() {
		return this.data;
	}

	@Override
	public ImageType getType() {
		return this.type;
	}
	...
}&lt;/code&gt;&lt;/pre&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class OpenAiBase64Image extends AbstractImage&amp;lt;String&amp;gt; {

	public OpenAiBase64Image(final String b64Json) {
		super(b64Json, OpenAiImageType.BASE64);
	}

}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;+ 추상 클래스를 각 모듈에서 구현하여 각 모듈의 이미지들에 대해서도 문서화를 유도하였습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;자바 경험이 많지 않았는데, 이번 기회에 제네릭과 enum에 대해 알아볼 수 있어 유익했던 것 같습니다..&lt;/p&gt;</description>
      <category>WEB/Refactoring</category>
      <category>OOP</category>
      <category>리팩토링</category>
      <category>자바</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/111</guid>
      <comments>https://youngmon.tistory.com/entry/JAVA-%08Enum%EA%B3%BC-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81#entry111comment</comments>
      <pubDate>Sat, 23 Mar 2024 03:31:13 +0900</pubDate>
    </item>
    <item>
      <title>JAVA) 초보자를 위한 제네릭 설명회</title>
      <link>https://youngmon.tistory.com/entry/JAVA-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tvpw4/btsF0l90191/wvqiD4DNMgXcnOq0PfYWrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tvpw4/btsF0l90191/wvqiD4DNMgXcnOq0PfYWrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tvpw4/btsF0l90191/wvqiD4DNMgXcnOq0PfYWrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftvpw4%2FbtsF0l90191%2FwvqiD4DNMgXcnOq0PfYWrK%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; alt=&quot;Java&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;286&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;제네릭이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;유연한 객체를 설계하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;다형성(Polymorphism)&lt;/b&gt;이라는 개념이 사용됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; 다형성을 통해 복잡한 객체 나 메서드를 추상화할 수 있으며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;상속&lt;/b&gt;을 통한 서브클래스의 구현,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;인터페이스&lt;/b&gt;를 통한 여러 구현체의 동일한 제어 및 &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;메소드 오버로딩&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등이 이에 속합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제네릭&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;역시 다형성의 한 형태로 객체가 특정 타입에 국한되지 않고 다양한 타입 을 다룰 수 있도록 하는데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;이러한 추상화를 통해 객체 내부에서 다루어지는 타입을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;사용자가 결정&lt;/b&gt;할 수 있도록 유연성을 부여합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예시로 자바의 &lt;b&gt;List&amp;lt;T&amp;gt;&lt;/b&gt;처럼 타입이 결정되지 않았기 때문에, 다양한 타입을 저장하여 재사용성과 확장성을 높일 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;C++의 템플릿&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또 다른 객체지향 언어인 C++ 역시 제네릭과 같이 유연한 타입 추상화를 위한&amp;nbsp;&lt;b&gt;템플릿&lt;/b&gt;이라는 개념이 존재하는데, C++의 템플릿은 컴파일 시점에 타입의 정보를 이용해 코드를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711118849752&quot; class=&quot;cpp&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

template&amp;lt;typename T&amp;gt;
class A {
public:
	T val;
	A(T val): val(val) {}

	T getT() {
		return val;
	}
};

int main() {
	A&amp;lt;int&amp;gt; a(1);
	A&amp;lt;string&amp;gt; b(&quot;test&quot;);
	cout &amp;lt;&amp;lt; a.getT() &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; b.getT() &amp;lt;&amp;lt; endl;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;템플릿을 사용한 위와 같은 클래스가 있을 때, Cpp 컴파일러는 컴파일 시점에&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;int 타입의 val을 가지는 A&lt;/li&gt;
&lt;li&gt;string 타입의 val을 가지는 A&lt;/li&gt;
&lt;li&gt;int를 반환하는 getT()&lt;/li&gt;
&lt;li&gt;string을 반환하는 getT()&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;에 대해 각각 별도의 코드를 생성합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;템플릿 인스턴스화&lt;/b&gt;라고 하며 런타임에 타입 체크가 필요하지 않고, inline화를 통한 최적화 등이 가능하지만 잘못 사용할 경우 메모리 낭비가 발생할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Code_bloat&quot;&gt;https://en.wikipedia.org/wiki/Code_bloat&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711118849755&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/Code_bloat&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/Code_bloat&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Production of unnecessarily long, slow or wasteful program code In computer programming, code bloat is the production of program code (source code or machine code) that is perceived as unnecessarily long, slow, or othe&quot; data-og-title=&quot;Code bloat - Wikipedia&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://en.wikipedia.org/wiki/Code_bloat&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/Code_bloat&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Code bloat - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;From Wikipedia, the free encyclopedia Production of unnecessarily long, slow or wasteful program code In computer programming, code bloat is the production of program code (source code or machine code) that is perceived as unnecessarily long, slow, or othe&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동작 원리&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 자바의 제네릭의 동작원리와 C++ 템플릿과의 차이는 뭘까요?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제네릭과 템플릿은 유사한 동작을 수행하는 것처럼 보이지만, 내부 구현에는 큰 차이가 있습니다. 우선 Cpp 컴파일러가 컴파일 타임에 각 타입에 대한 코드를 생성하는 것과는 다르게 자바의 제네릭은 컴파일 시점에 타입 소거를 통해 타입을 제거하게 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;타입 소거(Type erasure)&lt;/b&gt;란 컴파일 시점에 타입 파라미터를 제거하는 것으로, 런타임에는 타입에 대한 정보가 남아있지 않게 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴파일 시점에 타입이 제거되면, 런타임에 여러 다른 타입들은 어떻게 유연하게 사용되는 것일까요?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우선 제네릭의 선언부를 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711118849756&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class MyClass&amp;lt;T&amp;gt; {
	private final T value;
    
    MyClass(T value) { this.value = value; }
    T getValue() { return this.value; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 MyClass를 정의할 때,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;lt;T&amp;gt;가 타입 파라미터&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;역할을 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 클래스에서 T라는 타입을 사용한다는 뜻인데, 생성자에서는 T라는 타입의 value를 받아서 초기화를 하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;getValue&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드는 T라는 타입을 반환하는 구조입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 파일이 컴파일 될 때, 컴파일러는 T라는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;타입을 Object로 대체&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;List 객체를 사용할 때, 원시 타입인 int, long, double을 사용하지 못해 Integer, Long, Double이라는 래퍼 클래스로 감싸는 이유가 이 때문인데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모든 객체&lt;/b&gt;는 최상위 클래스로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Object를 상속&lt;/b&gt;받지만 원시 타입의 경우에는 Object가 대체할 수 없기 때문에 사용할 수 없습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 타입 소거를 거치면&lt;/p&gt;
&lt;pre id=&quot;code_1711118849757&quot; class=&quot;cs&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class MyClass {
	private final Object value;
    
    MyClass(Object value) { this.value = value; }
    Object getValue() { return this.value; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 Object라는 객체를 다루고, Object를 반환하는 메소드가 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 컴파일러는 사라진 타입을 런타임에 안전하게 사용하기 위해, 필요한 부분에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;타입 캐스팅&lt;/b&gt;을 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711118849758&quot; class=&quot;vbnet&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;String value = (String) myClass.getValue();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 과정을 거쳐 런타임에 타입에 대한 정보가 없더라도 &lt;b&gt;타입 안전성&lt;/b&gt;과 제네릭이 존재하기 이전의 자바 코드와의 &lt;b&gt;호환 성&lt;/b&gt;을 높일 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 자바 제네릭에 대해 알아보았습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본문에서는 다루지 않았지만 브릿지 메소드, 타입 바운드 등에 대해서도 찾아보면 좋을 것 같습니다.&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>Generic</category>
      <category>template</category>
      <category>자바</category>
      <category>제네릭</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/110</guid>
      <comments>https://youngmon.tistory.com/entry/JAVA-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%84%A4%EB%AA%85%ED%9A%8C#entry110comment</comments>
      <pubDate>Fri, 22 Mar 2024 23:51:06 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] 3천원으로 실내 곰팡이 방지한 후기 -2</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글에서 곰팡이가 발생하는 원인과, 이를 방지하기 위한 기초적인 모니터링 시스템을 구축해 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 수집된 데이터를 보기 좋게 시각화하고, 습도가 올라가면 외부로 알림을 전송하는 로직을 만들어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글은 아래에서 참고할 수 있습니다.&lt;/p&gt;
&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://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.01.26 - [WEB] - [서비스] 3천원으로 실내 곰팡이 방지한 후기 -1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706260380240&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;[서비스] 3천원으로 실내 곰팡이 방지한 후기 -1&quot; data-og-description=&quot;겨울철이 되면 실내와 바깥의 온도 차이로 인해 결로현상이 발생하고, 실내 습도가 올라가 곰팡이가 번식하기 좋은 환경이 됩니다. 물론 제 방도 예외는 아니구요. 한 2주 전부터 초기 값을 (0, 0,&quot; data-og-host=&quot;youngmon.tistory.com&quot; data-og-source-url=&quot;https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-1&quot; data-og-url=&quot;https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/w6r0N/hyVb8U4fB1/AqY1EOgic96582MoY2Ota0/img.jpg?width=402&amp;amp;height=450&amp;amp;face=149_78_322_267,https://scrap.kakaocdn.net/dn/v1m2n/hyVcffArfL/d6v9XaWSWnLzLLnac7a8K1/img.jpg?width=402&amp;amp;height=450&amp;amp;face=149_78_322_267,https://scrap.kakaocdn.net/dn/vr80P/hyVb5xhHxP/OU72xinNBkreCHbDaKGVt0/img.png?width=2064&amp;amp;height=912&amp;amp;face=0_0_2064_912&quot;&gt;&lt;a href=&quot;https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/w6r0N/hyVb8U4fB1/AqY1EOgic96582MoY2Ota0/img.jpg?width=402&amp;amp;height=450&amp;amp;face=149_78_322_267,https://scrap.kakaocdn.net/dn/v1m2n/hyVcffArfL/d6v9XaWSWnLzLLnac7a8K1/img.jpg?width=402&amp;amp;height=450&amp;amp;face=149_78_322_267,https://scrap.kakaocdn.net/dn/vr80P/hyVb5xhHxP/OU72xinNBkreCHbDaKGVt0/img.png?width=2064&amp;amp;height=912&amp;amp;face=0_0_2064_912');&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;[서비스] 3천원으로 실내 곰팡이 방지한 후기 -1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;겨울철이 되면 실내와 바깥의 온도 차이로 인해 결로현상이 발생하고, 실내 습도가 올라가 곰팡이가 번식하기 좋은 환경이 됩니다. 물론 제 방도 예외는 아니구요. 한 2주 전부터 초기 값을 (0, 0,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;youngmon.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;바로 수집한 데이터를 시각화하기 위한 Grafana 설정을 시작하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 쿠버네티스 클러스터에 grafana 리소스를 만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그라파나는 옵션이므로 굳이 안 볼 것 같으면 넘어가도 괜찮을 듯합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Grafana&lt;/b&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;pre id=&quot;code_1706260947506&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# deployment Pod Template
          image: grafana/grafana:latest
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: monitoring
spec:
  ports:
    - port: 3000
      protocol: TCP
      targetPort: web
  selector:
    app: grafana&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 쿠버네티스에 적용하며, 프로메테우스와 동일한 네임스페이스에 생성했습니다.&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-filename=&quot;Screenshot 2024-01-26 at 6.25.28 PM.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pf0RK/btsD4je8JHU/Y6nS9ra5EG8j7e9BkWtb8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pf0RK/btsD4je8JHU/Y6nS9ra5EG8j7e9BkWtb8k/img.png&quot; data-alt=&quot;그라파나와 프로메테우스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pf0RK/btsD4je8JHU/Y6nS9ra5EG8j7e9BkWtb8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpf0RK%2FbtsD4je8JHU%2FY6nS9ra5EG8j7e9BkWtb8k%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; alt=&quot;서비스&quot; loading=&quot;lazy&quot; width=&quot;1470&quot; height=&quot;170&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.25.28 PM.png&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;170&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;grafana에 접속해 봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.27.23 PM.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/18TQo/btsDZKFKt0O/pYrlvUB1VEB0yGy2zRa3VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/18TQo/btsDZKFKt0O/pYrlvUB1VEB0yGy2zRa3VK/img.png&quot; data-alt=&quot;로그인 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/18TQo/btsDZKFKt0O/pYrlvUB1VEB0yGy2zRa3VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F18TQo%2FbtsDZKFKt0O%2FpYrlvUB1VEB0yGy2zRa3VK%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; alt=&quot;그라파나 홈&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;430&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.27.23 PM.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;956&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;초기 username과 password는 둘 다 admin으로 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.30.01 PM.png&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doK7uf/btsD3lYRCvm/MyDXAFipI2dwYrXsqOGGCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doK7uf/btsD3lYRCvm/MyDXAFipI2dwYrXsqOGGCK/img.png&quot; data-alt=&quot;시각화를 위한 대시보드 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doK7uf/btsD3lYRCvm/MyDXAFipI2dwYrXsqOGGCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoK7uf%2FbtsD3lYRCvm%2FMyDXAFipI2dwYrXsqOGGCK%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; alt=&quot;대시보드 설정&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;312&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.30.01 PM.png&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시각화를 위한 대시보드 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.39.48 PM.png&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWT1Z/btsD4kd47ph/2oTC0ByZVLy3McRpgd6l5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWT1Z/btsD4kd47ph/2oTC0ByZVLy3McRpgd6l5k/img.png&quot; data-alt=&quot;create Dashboard&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWT1Z/btsD4kd47ph/2oTC0ByZVLy3McRpgd6l5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWT1Z%2FbtsD4kd47ph%2F2oTC0ByZVLy3McRpgd6l5k%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; alt=&quot;대시보드 설정&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;184&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.39.48 PM.png&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;create Dashboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2024-01-26 at 6.40.14 PM.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDxOZB/btsD3j01J1v/qLenv2piV5vPkHlU7PPcz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDxOZB/btsD3j01J1v/qLenv2piV5vPkHlU7PPcz1/img.png&quot; data-alt=&quot;데이터 소스 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDxOZB/btsD3j01J1v/qLenv2piV5vPkHlU7PPcz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDxOZB%2FbtsD3j01J1v%2FqLenv2piV5vPkHlU7PPcz1%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; alt=&quot;데이터 소스 가져오기&quot; loading=&quot;lazy&quot; width=&quot;1914&quot; height=&quot;384&quot; data-filename=&quot;edited_Screenshot 2024-01-26 at 6.40.14 PM.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;384&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;대시보드에 표시될 데이터 소스를 가져와야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.40.26 PM.png&quot; data-origin-width=&quot;2408&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b54AaL/btsD4mJI3hL/ztIDkcbr20NsYDgrT6hfz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b54AaL/btsD4mJI3hL/ztIDkcbr20NsYDgrT6hfz0/img.png&quot; data-alt=&quot;데이터 소스 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b54AaL/btsD4mJI3hL/ztIDkcbr20NsYDgrT6hfz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb54AaL%2FbtsD4mJI3hL%2FztIDkcbr20NsYDgrT6hfz0%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; alt=&quot;데이터 소스 - 프로메테우스&quot; loading=&quot;lazy&quot; width=&quot;2408&quot; height=&quot;462&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.40.26 PM.png&quot; data-origin-width=&quot;2408&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 소스 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.42.04 PM.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVVHtX/btsD4uAUfhz/DHKYSn6q8GHpJpG7c8XVv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVVHtX/btsD4uAUfhz/DHKYSn6q8GHpJpG7c8XVv1/img.png&quot; data-alt=&quot;데이터 소스 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVVHtX/btsD4uAUfhz/DHKYSn6q8GHpJpG7c8XVv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVVHtX%2FbtsD4uAUfhz%2FDHKYSn6q8GHpJpG7c8XVv1%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; alt=&quot;데이터 소스 설정&quot; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;411&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.42.04 PM.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;1038&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;kubectl을 통해 prometheus와 grafana 서비스의 정보를 얻었는데, &lt;b&gt;쿠버네티스의 CoreDNS&lt;/b&gt;를 통해 간단하게 서비스 명과 포트로 접근할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그꾸&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 데이터를 통해 대시보드를 꾸밀 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.58.32 PM.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BmFOw/btsD4EQVIEy/jn9D9G1iMpPb4hhR2NksvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BmFOw/btsD4EQVIEy/jn9D9G1iMpPb4hhR2NksvK/img.png&quot; data-alt=&quot;기준이 되는 임계점을 70, 80으로 잡고 표시해줍니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BmFOw/btsD4EQVIEy/jn9D9G1iMpPb4hhR2NksvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBmFOw%2FbtsD4EQVIEy%2Fjn9D9G1iMpPb4hhR2NksvK%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; alt=&quot;임계점&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;658&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.58.32 PM.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기준이 되는 임계점을 70, 80으로 잡고 표시해줍니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 쿼리를 통해 프로메테우스로부터 데이터를 가져옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.52.06 PM.png&quot; data-origin-width=&quot;2832&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y44GK/btsD1aw1Gns/jc9VmMkAFtGZNtQcbXxLwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y44GK/btsD1aw1Gns/jc9VmMkAFtGZNtQcbXxLwk/img.png&quot; data-alt=&quot;우선 습도를 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y44GK/btsD1aw1Gns/jc9VmMkAFtGZNtQcbXxLwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy44GK%2FbtsD1aw1Gns%2Fjc9VmMkAFtGZNtQcbXxLwk%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; alt=&quot;그래프&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;357&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.52.06 PM.png&quot; data-origin-width=&quot;2832&quot; data-origin-height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우선 습도를 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.54.12 PM.png&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;1154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MV8Rp/btsD3LQtljr/BOT8vuB80rmU8e8IuUS2b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MV8Rp/btsD3LQtljr/BOT8vuB80rmU8e8IuUS2b1/img.png&quot; data-alt=&quot;온도도 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MV8Rp/btsD3LQtljr/BOT8vuB80rmU8e8IuUS2b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMV8Rp%2FbtsD3LQtljr%2FBOT8vuB80rmU8e8IuUS2b1%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; alt=&quot;그래프&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;423&quot; data-filename=&quot;Screenshot 2024-01-26 at 6.54.12 PM.png&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;1154&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;변화를 한눈에 보기 위한 그래프를 저장해 주고, 현재 값을 한눈에 볼 수 있는 패널을 하나 더 만들어 줍시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.04.29 PM.png&quot; data-origin-width=&quot;1988&quot; data-origin-height=&quot;1370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1ISD/btsD4u10CXL/KTW72LajveEg7vloeAckXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1ISD/btsD4u10CXL/KTW72LajveEg7vloeAckXK/img.png&quot; data-alt=&quot;페라리인줄〰️&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1ISD/btsD4u10CXL/KTW72LajveEg7vloeAckXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1ISD%2FbtsD4u10CXL%2FKTW72LajveEg7vloeAckXK%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; alt=&quot;게이지&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;433&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.04.29 PM.png&quot; data-origin-width=&quot;1988&quot; data-origin-height=&quot;1370&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;온도도 그냥 하나 더 만들면 깔끔하지만, 저는 그냥 합쳤습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.09.45 PM.png&quot; data-origin-width=&quot;2870&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVfoa2/btsD3GhpvaQ/AkjzhBtSyvLvy9fqOT8gw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVfoa2/btsD3GhpvaQ/AkjzhBtSyvLvy9fqOT8gw0/img.png&quot; data-alt=&quot;홈 대시보드 완성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVfoa2/btsD3GhpvaQ/AkjzhBtSyvLvy9fqOT8gw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVfoa2%2FbtsD3GhpvaQ%2FAkjzhBtSyvLvy9fqOT8gw0%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; alt=&quot;대시보드&quot; loading=&quot;lazy&quot; width=&quot;2870&quot; height=&quot;846&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.09.45 PM.png&quot; data-origin-width=&quot;2870&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;홈 대시보드 완성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.12.26 PM.png&quot; data-origin-width=&quot;1762&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDTDor/btsDZNbqFED/c2vo5FntWh1AwnLiWvzbNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDTDor/btsDZNbqFED/c2vo5FntWh1AwnLiWvzbNK/img.png&quot; data-alt=&quot;들어오자마자 바로 볼 수 있도록 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDTDor/btsDZNbqFED/c2vo5FntWh1AwnLiWvzbNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDTDor%2FbtsDZNbqFED%2Fc2vo5FntWh1AwnLiWvzbNK%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; alt=&quot;홈 설정&quot; loading=&quot;lazy&quot; width=&quot;709&quot; height=&quot;394&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.12.26 PM.png&quot; data-origin-width=&quot;1762&quot; data-origin-height=&quot;980&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;아래 Users and access 등을 통해 viewer 권한의 서비스 계정 등을 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 해당 그라파나 서비스를 호스팅 해서 외부에서도 확인할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 이것만 계속 보고 있을 수는 없겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;창문을 열어서 5분 정도만 환기시켜 줘도 습도가 40% 대로 떨어지곤 하는데, 계속 그래프, 게이지만 지켜보고 있는 건 너무 비효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;습도가 너무 높아졌을 때마다 한 번씩 창문을 열어주면 2시간 정도는 습도가 40-60% 사이에서 유지됩니다.&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;AlertManager&lt;/b&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;/li&gt;
&lt;li&gt;메트릭의 저장&lt;/li&gt;
&lt;li&gt;알림 발생을 위한 메트릭의 평가&lt;/li&gt;
&lt;li&gt;grafana 등 외부 툴을 위한 메트릭의 노출&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;프로메테우스는 알림을 생성하고 Alertmanager로 전달하는데, Alertmanager는 외부로 알림을 전송하는 웹훅의 역할 이외에도 알림의 그룹화, 중복 제거 및 억제 등 추가적인 역할을 수행합니다.&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: #0f0f0f; text-align: start;&quot;&gt;알림은 slack, sms, 메일 또는 다른 웹훅으로 전달될 수 있지만, 저는 텔레그램을 사용해 받도록 설정하겠습니다.&lt;br /&gt;먼저 프로메테우스에서 메트릭을 평가하고 알림을 발생할 수 있도록 rule을 설정합니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.44.20 PM.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ryegu/btsD4VZpEcE/8l59pUz9iqYjiMZPA8RLhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ryegu/btsD4VZpEcE/8l59pUz9iqYjiMZPA8RLhk/img.png&quot; data-alt=&quot;PrometheusRule&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ryegu/btsD4VZpEcE/8l59pUz9iqYjiMZPA8RLhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRyegu%2FbtsD4VZpEcE%2F8l59pUz9iqYjiMZPA8RLhk%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; alt=&quot;PrometheusRule&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;430&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.44.20 PM.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PrometheusRule&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 리소스는 PrometheusRule라는 Prometheus Operator의 CRD이지만, Prometheus의 Config을 기반으로 만들어졌기 때문에 프로메테우스 Config을 구성할 때도 참고하시면 좋을 듯합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 룰을 설명하자면, HumidAlert70과 HumidAlert80은 humid라는 그룹으로 묶이며, humid라는 레이블을 가집니다.&lt;br /&gt;promQL의 수행결과인 습도가 5분 동안 70 이상이면 HumidAlert70, 80 이상이면 HumidAlert80이 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;룰을 설정했으니 AlertManager 서버도 띄워줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.37.07 AM.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mBWcN/btsD2INR9V1/mHvkDkYkBFrPQqToSoNmUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mBWcN/btsD2INR9V1/mHvkDkYkBFrPQqToSoNmUK/img.png&quot; data-alt=&quot;Label selector&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mBWcN/btsD2INR9V1/mHvkDkYkBFrPQqToSoNmUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmBWcN%2FbtsD2INR9V1%2FmHvkDkYkBFrPQqToSoNmUK%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; alt=&quot;Alertmanager yaml&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;271&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.37.07 AM.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Label selector&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이따가 AlertmanagerConfig이라는 리소스를 등록할 때, alert=humid 라벨을 달아놓으면 Alertmanager의 config으로 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 리소스도 CRD이며, 해당 리소스를 등록하면 Prometheus Operator가 해당 리소스를 찾아서 StatefulSet, Service 등 필요한 리소스를 생성해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.56.28 PM.png&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2rtyo/btsD4rK1TaA/KhT4v9jhLpja9YYLSjtnH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2rtyo/btsD4rK1TaA/KhT4v9jhLpja9YYLSjtnH1/img.png&quot; data-alt=&quot;생성된 Alertmanager&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2rtyo/btsD4rK1TaA/KhT4v9jhLpja9YYLSjtnH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2rtyo%2FbtsD4rK1TaA%2FKhT4v9jhLpja9YYLSjtnH1%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; alt=&quot;생성된 Alertmanager&quot; loading=&quot;lazy&quot; width=&quot;1630&quot; height=&quot;178&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.56.28 PM.png&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성된 Alertmanager&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 해당 AlertRule과 AlertManager를 연결하기 위해 Prometheus 서버를 수정해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.58.31 PM.png&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFNfsi/btsD3NnhZe6/eh4Kzrjmgm74zUMK77GaX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFNfsi/btsD3NnhZe6/eh4Kzrjmgm74zUMK77GaX1/img.png&quot; data-alt=&quot;서버 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFNfsi/btsD3NnhZe6/eh4Kzrjmgm74zUMK77GaX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFNfsi%2FbtsD3NnhZe6%2Feh4Kzrjmgm74zUMK77GaX1%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; alt=&quot;프로메테우스 서버 yaml&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;209&quot; data-filename=&quot;Screenshot 2024-01-26 at 7.58.31 PM.png&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;322&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;ruleSelector에서 prometheus=alert-rule이라는 라벨을 가진 룰을 찾고, monitoring namespace의 alertmanager-operated:web을 통해 알림을 전송합니다.&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-filename=&quot;Screenshot 2024-01-26 at 8.01.03 PM.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QUUOG/btsD29xFIr5/EpOlE1AHwUYGkMSOL45DAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QUUOG/btsD29xFIr5/EpOlE1AHwUYGkMSOL45DAk/img.png&quot; data-alt=&quot;룰 적용 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QUUOG/btsD29xFIr5/EpOlE1AHwUYGkMSOL45DAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQUUOG%2FbtsD29xFIr5%2FEpOlE1AHwUYGkMSOL45DAk%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; alt=&quot;프로메테우스 룰&quot; loading=&quot;lazy&quot; width=&quot;339&quot; height=&quot;391&quot; data-filename=&quot;Screenshot 2024-01-26 at 8.01.03 PM.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;1070&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;룰 적용 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 8.02.47 PM.png&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;1076&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOMyAf/btsD4VrAuCx/SQYmqQZCBT6p0vneE355b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOMyAf/btsD4VrAuCx/SQYmqQZCBT6p0vneE355b0/img.png&quot; data-alt=&quot;Alertmanager 적용 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOMyAf/btsD4VrAuCx/SQYmqQZCBT6p0vneE355b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOMyAf%2FbtsD4VrAuCx%2FSQYmqQZCBT6p0vneE355b0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;322&quot; height=&quot;436&quot; data-filename=&quot;Screenshot 2024-01-26 at 8.02.47 PM.png&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;1076&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Alertmanager 적용 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프로메테우스에서 메트릭을 평가해 알림을 생성하고, 이를 Alertmanager에게 전달할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Alertmanager에서 알림을 받았을 때 어떻게 처리할지를 설정할 차례입니다.&lt;br /&gt;저는 텔레그램을 통해 알림을 전달할 것이라 텔레그램 봇을 먼저 만들도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;텔레그램 봇&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 11.57.17 PM.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buQqgs/btsD26Vogmb/ZP5cIDXq47PeHHpsloww31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buQqgs/btsD26Vogmb/ZP5cIDXq47PeHHpsloww31/img.png&quot; data-alt=&quot;botFather&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buQqgs/btsD26Vogmb/ZP5cIDXq47PeHHpsloww31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuQqgs%2FbtsD26Vogmb%2FZP5cIDXq47PeHHpsloww31%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; alt=&quot;봇파더&quot; loading=&quot;lazy&quot; width=&quot;386&quot; height=&quot;169&quot; data-filename=&quot;Screenshot 2024-01-26 at 11.57.17 PM.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;botFather&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;봇 생성을 위해 BotFather를 검색해 줍니다. 짭이 많은데 블루첵 봇파더가 진짜입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.05.37 AM.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JlxTA/btsD0IHCtSk/CNZGQPfhZkHNznfpyh4KY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JlxTA/btsD0IHCtSk/CNZGQPfhZkHNznfpyh4KY1/img.png&quot; data-alt=&quot;봇 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JlxTA/btsD0IHCtSk/CNZGQPfhZkHNznfpyh4KY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJlxTA%2FbtsD0IHCtSk%2FCNZGQPfhZkHNznfpyh4KY1%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; alt=&quot;봇 생성&quot; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;164&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.05.37 AM.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;260&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;봇을 생성하려고 하면 봇의 이름을 정하라고 하는데, 봇의 이름은 기존 봇들의 이름과 중복되지 않으면서 마지막에 bot으로 끝나야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;봇을 만드는 데 성공하면 API를 사용하기 위한 토큰과, API 문서의 링크를 줍니다.&lt;br /&gt;봇을 통해 메시지를 받아야하니 메세지를 보내는 방법을 알아봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서를 보면 메세지를 보내기 위해&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; style=&quot;background-color: #ecf3f8; color: #546172; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;https://api.telegram.org/bot&amp;lt;TOKEN&amp;gt;/METHOD_NAME&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 요청하라고 쓰여있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://core.telegram.org/bots/api#sendmessage&quot;&gt;https://core.telegram.org/bots/api#sendmessage&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706283685324&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;Telegram Bot API&quot; data-og-description=&quot;The Bot API is an HTTP-based interface created for developers keen on building bots for Telegram. To learn how to create&amp;hellip;&quot; data-og-host=&quot;core.telegram.org&quot; data-og-source-url=&quot;https://core.telegram.org/bots/api#sendmessage&quot; data-og-url=&quot;https://core.telegram.org/bots/api#sendmessage&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://core.telegram.org/bots/api#sendmessage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://core.telegram.org/bots/api#sendmessage&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;Telegram Bot API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Bot API is an HTTP-based interface created for developers keen on building bots for Telegram. To learn how to create&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;core.telegram.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendMessage를 보내기 위해 chatID와 text 파라미터는 필수라고 나오는군요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chatID는 채팅을 전달받을 목적지로 유저는 양수, 그룹은 음수로 구분됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.44.35 AM.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wGxl9/btsD3I0Nv2v/kuOzjPdflOGZ2WwpSNEd91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wGxl9/btsD3I0Nv2v/kuOzjPdflOGZ2WwpSNEd91/img.png&quot; data-alt=&quot;다수에게 뿌리기 위해 그룹을 만들어줍니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wGxl9/btsD3I0Nv2v/kuOzjPdflOGZ2WwpSNEd91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwGxl9%2FbtsD3I0Nv2v%2FkuOzjPdflOGZ2WwpSNEd91%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; alt=&quot;그룹 생성&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;189&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.44.35 AM.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;238&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;그룹에 봇을 초대해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.48.37 AM.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjBle9/btsD28FGI8X/W8o8j8wgHNBIsR8dLPahX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjBle9/btsD28FGI8X/W8o8j8wgHNBIsR8dLPahX0/img.png&quot; data-alt=&quot;아까 만든 봇 이름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjBle9/btsD28FGI8X/W8o8j8wgHNBIsR8dLPahX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjBle9%2FbtsD28FGI8X%2FW8o8j8wgHNBIsR8dLPahX0%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; alt=&quot;봇 초대&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;122&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.48.37 AM.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아까 만든 봇 이름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.49.03 AM.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n0QWC/btsD1o9XJt6/AGBiV3NsQVKIkl7LNI9c2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n0QWC/btsD1o9XJt6/AGBiV3NsQVKIkl7LNI9c2K/img.png&quot; data-alt=&quot;나의 집사봇&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n0QWC/btsD1o9XJt6/AGBiV3NsQVKIkl7LNI9c2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn0QWC%2FbtsD1o9XJt6%2FAGBiV3NsQVKIkl7LNI9c2K%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; alt=&quot;집사봇&quot; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;221&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.49.03 AM.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;560&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;만들어둔 봇이 그룹 초기멤버로 설정되었으니 아무 메시지나 하나 날려줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.50.42 AM.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHcYt/btsD4sXyQm9/IMkwcDkvTUTdpWpoNGKkb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHcYt/btsD4sXyQm9/IMkwcDkvTUTdpWpoNGKkb0/img.png&quot; data-alt=&quot;ping&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHcYt/btsD4sXyQm9/IMkwcDkvTUTdpWpoNGKkb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHcYt%2FbtsD4sXyQm9%2FIMkwcDkvTUTdpWpoNGKkb0%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; alt=&quot;ACK&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;167&quot; data-filename=&quot;Screenshot 2024-01-27 at 12.50.42 AM.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ping&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 봇으로 메시지가 온 것을 확인해야 하는데,&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; style=&quot;background-color: #ecf3f8; color: #546172; text-align: start;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;https://api.telegram.org/bot&amp;lt;TOKEN&amp;gt;/getUpdates&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 요청을 보내면 채팅을 보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.13.04 AM.png&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVfZn8/btsD2If3Rx8/I458QzRu0bk8QQQgYdI8H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVfZn8/btsD2If3Rx8/I458QzRu0bk8QQQgYdI8H0/img.png&quot; data-alt=&quot;chat id&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVfZn8/btsD2If3Rx8/I458QzRu0bk8QQQgYdI8H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVfZn8%2FbtsD2If3Rx8%2FI458QzRu0bk8QQQgYdI8H0%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; alt=&quot;응답&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;390&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.13.04 AM.png&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;chat id&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;어디서 누가 메시지를 보냈는지&lt;span&gt;&amp;nbsp;확인할&lt;/span&gt;&lt;/span&gt;&amp;nbsp;수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.07.51 AM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWGY2w/btsD2xlrIVq/lwWhJKjHvqrrAV7iIHKEg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWGY2w/btsD2xlrIVq/lwWhJKjHvqrrAV7iIHKEg0/img.png&quot; data-alt=&quot;57로 시작하고 1로 끝나는 chat_id에 하나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWGY2w/btsD2xlrIVq/lwWhJKjHvqrrAV7iIHKEg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWGY2w%2FbtsD2xlrIVq%2FlwWhJKjHvqrrAV7iIHKEg0%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;1132&quot; height=&quot;74&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.07.51 AM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;57로 시작하고 1로 끝나는 chat_id에 하나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.16.37 AM.png&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bytNWZ/btsDZZXiOoL/KW2KcaFulzvZNF1vxw6gAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bytNWZ/btsDZZXiOoL/KW2KcaFulzvZNF1vxw6gAK/img.png&quot; data-alt=&quot;-41로 시작하고 0으로 끝나는 chat_id에 하나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bytNWZ/btsDZZXiOoL/KW2KcaFulzvZNF1vxw6gAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbytNWZ%2FbtsDZZXiOoL%2FKW2KcaFulzvZNF1vxw6gAK%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;1130&quot; height=&quot;74&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.16.37 AM.png&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;-41로 시작하고 0으로 끝나는 chat_id에 하나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendMessage API로 chat_id와 text 파라미터를 채워서 보내봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.19.13 AM.png&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/donJWu/btsDZ2sMUOk/tjfKMY1sqZkpyjfkbj7GL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/donJWu/btsDZ2sMUOk/tjfKMY1sqZkpyjfkbj7GL1/img.png&quot; data-alt=&quot;갠톡 잘 왔고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/donJWu/btsDZ2sMUOk/tjfKMY1sqZkpyjfkbj7GL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdonJWu%2FbtsDZ2sMUOk%2FtjfKMY1sqZkpyjfkbj7GL1%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; alt=&quot;갠톡&quot; loading=&quot;lazy&quot; width=&quot;182&quot; height=&quot;191&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.19.13 AM.png&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;갠톡 잘 왔고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.19.29 AM.png&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WAumS/btsD0It9tkw/3CCo2L8fd6QkJBDY2KqYLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WAumS/btsD0It9tkw/3CCo2L8fd6QkJBDY2KqYLK/img.png&quot; data-alt=&quot;그룹에도 잘 왔네요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WAumS/btsD0It9tkw/3CCo2L8fd6QkJBDY2KqYLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWAumS%2FbtsD0It9tkw%2F3CCo2L8fd6QkJBDY2KqYLK%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; alt=&quot;그룹톡&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;225&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.19.29 AM.png&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;364&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;너무 멀리 돌아온 것 같지만, 이제 이 토큰과 chat_id를 이용해 Alertmanager가 대신 알림을 메시지로 보내줄 겁니다.&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;AlertmanagerConfig&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.29.59 AM.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OkrPL/btsD3ouBXBN/y5SQ61l2F3XOPXp1bKmyAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OkrPL/btsD3ouBXBN/y5SQ61l2F3XOPXp1bKmyAk/img.png&quot; data-alt=&quot;토큰을 base64 인코딩&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OkrPL/btsD3ouBXBN/y5SQ61l2F3XOPXp1bKmyAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOkrPL%2FbtsD3ouBXBN%2Fy5SQ61l2F3XOPXp1bKmyAk%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; alt=&quot;인코딩&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;88&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.29.59 AM.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰을 base64 인코딩&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화된 토큰을 Secret으로 등록해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.31.54 AM.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMbLEp/btsD5weeSWF/B1IC3gQxPdjOibhBLK1mY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMbLEp/btsD5weeSWF/B1IC3gQxPdjOibhBLK1mY1/img.png&quot; data-alt=&quot;등록 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMbLEp/btsD5weeSWF/B1IC3gQxPdjOibhBLK1mY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMbLEp%2FbtsD5weeSWF%2FB1IC3gQxPdjOibhBLK1mY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;225&quot; data-filename=&quot;Screenshot 2024-01-27 at 1.31.54 AM.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;등록 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1706286988612&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
  name: amconfig
  namespace: monitoring
  labels:
    alert: humid		# 위 Alertmanager에 등록해둔 label
spec:
  inhibitRules:
    - sourceMatch:
        - name: humid
          value: '80'
      targetMatch:
        - name: humid
          value: '70'
      equal:
        - job
  receivers:
    - name: telegram
      telegramConfigs:
        - chatID: $CHAT_ID
          sendResolved: false
          botToken:
            name: telegram
            key: token
          message: |-
            {{ range .Alerts }}
            {{ .Annotations.summary }}
            {{ .Annotations.description }}
            {{ end }}
  route:
    groupBy: [topic]
    groupWait: 10s
    groupInterval: 10s
    receiver: telegram
    repeatInterval: 1h&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 route와 receivers, inhibitRule로 나뉘어 있는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;route에서는 topic을 기준으로 알림 들을 그룹화하고, 습도 70임을 알리는 알림이 전달된 후 바로 습도 80짜리 알림이 전달되지 않도록 10초 동안 알림이 더 안 오나 기다렸다가 telegram이라는 receiver를 호출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;receivers의 telegram 리시버는 알림의 Annotation을 통해 메시지를 생성하고, chatID와 봇 토큰을 통해 텔레그램으로 메세지를 전송합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inhibitRule은 알림을 억제하는 역할을 하는데, 만약 습도가 80% 이상이 된다면 PrometheusRule 리소스에 정의한 expr인&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$value &amp;gt; 70&lt;/li&gt;
&lt;li&gt;$value &amp;gt; 80&lt;/li&gt;
&lt;/ul&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;이 경우 하위 레벨의 Alert인 HumidAlert70를 억제하기 위해, humid:80인 Alert가 있을 경우 해당 Alert는 무시되게 설정합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;적용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위 리소스까지 적용하면, 습도가 임계점 이상으로 높아졌을 때 텔레그램으로 알려주게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;창문을 열어 &lt;b&gt;실내 온도가 낮아지는 것을 최소화&lt;/b&gt;하면서 &lt;b&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;KakaoTalk_Photo_2024-01-27-04-51-57.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCbbGA/btsDZWGhVgk/SYUoadzreViZn9kvt3RkLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCbbGA/btsDZWGhVgk/SYUoadzreViZn9kvt3RkLk/img.jpg&quot; data-alt=&quot;네&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCbbGA/btsDZWGhVgk/SYUoadzreViZn9kvt3RkLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCbbGA%2FbtsDZWGhVgk%2FSYUoadzreViZn9kvt3RkLk%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; alt=&quot;텔레그램 메시지&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;157&quot; data-filename=&quot;KakaoTalk_Photo_2024-01-27-04-51-57.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;402&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;창문을 약 2분 정도 열어놓고 변화량을 보니 실내 온도는 0.3도 떨어졌고, 습도는 약 20%가량 줄어든 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 5.00.28 AM.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSENwY/btsD4GVIzgM/KAuXBefjeI2rx3RUShKf3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSENwY/btsD4GVIzgM/KAuXBefjeI2rx3RUShKf3k/img.png&quot; data-alt=&quot;2분 열어두면 습도 약 20% 감소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSENwY/btsD4GVIzgM/KAuXBefjeI2rx3RUShKf3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSENwY%2FbtsD4GVIzgM%2FKAuXBefjeI2rx3RUShKf3k%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; alt=&quot;그래프&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;363&quot; data-filename=&quot;Screenshot 2024-01-27 at 5.00.28 AM.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2분 열어두면 습도 약 20% 감소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-27 at 5.08.26 AM.png&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwY9pD/btsD286McU4/CfBxvPZPiWrLD4bOxXrHwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwY9pD/btsD286McU4/CfBxvPZPiWrLD4bOxXrHwk/img.png&quot; data-alt=&quot;10분 열어두었을 때, 습도 약 35% 감소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwY9pD/btsD286McU4/CfBxvPZPiWrLD4bOxXrHwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwY9pD%2FbtsD286McU4%2FCfBxvPZPiWrLD4bOxXrHwk%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; alt=&quot;10분 열기&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;291&quot; data-filename=&quot;Screenshot 2024-01-27 at 5.08.26 AM.png&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;10분 열어두었을 때, 습도 약 35% 감소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;창문을 열어두는 시간과 온도, 습도 등의 데이터로 GPT를 파인튜닝해서 최적의 창성비를 찾는 것도 재미있을 것 같네요.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CDB6097D-7EB4-45AF-B68F-89D1F4BCD85E-14234-0000041405E8FB31_file.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IIJ70/btsD3dUq89Y/i1scmjN0KapDI07aCzVqpk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IIJ70/btsD3dUq89Y/i1scmjN0KapDI07aCzVqpk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IIJ70/btsD3dUq89Y/i1scmjN0KapDI07aCzVqpk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIIJ70%2FbtsD3dUq89Y%2Fi1scmjN0KapDI07aCzVqpk%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; alt=&quot;따봉&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;468&quot; data-filename=&quot;CDB6097D-7EB4-45AF-B68F-89D1F4BCD85E-14234-0000041405E8FB31_file.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;캐리어, LG, 롯데알미늄, 위닉스, 홈플래닛, 한경희에게 본 포스팅을 바칩니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>grafana</category>
      <category>IOT</category>
      <category>K8S</category>
      <category>Prometheus Operator</category>
      <category>겨울철 곰팡이</category>
      <category>벽지 곰팡이</category>
      <category>스마트 제습기</category>
      <category>실내 제습</category>
      <category>쿠버네티스</category>
      <category>텔레그램</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/109</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-2#entry109comment</comments>
      <pubDate>Sat, 27 Jan 2024 05:29:51 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] 3천원으로 실내 곰팡이 방지한 후기 -1</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;겨울철이 되면 실내와 바깥의 온도 차이로 인해 결로현상이 발생하고, 실내 습도가 올라가 곰팡이가 번식하기 좋은 환경이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 제 방도 예외는 아니구요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;마빡탁.jpeg&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drK0Iu/btsDY9rU9wO/ysO9zEDoWGGXsG2O2Ceup1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drK0Iu/btsDY9rU9wO/ysO9zEDoWGGXsG2O2Ceup1/img.jpg&quot; data-alt=&quot;하..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drK0Iu/btsDY9rU9wO/ysO9zEDoWGGXsG2O2Ceup1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrK0Iu%2FbtsDY9rU9wO%2FysO9zEDoWGGXsG2O2Ceup1%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; alt=&quot;실내 곰팡이&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;382&quot; data-filename=&quot;마빡탁.jpeg&quot; data-origin-width=&quot;402&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;한 2주 전부터 초기 값을 (0, 0, 0)으로 가지는 곰팡이가 너비 우선 탐색을 시작했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ㅂㅈㄷ.jpeg&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3SVYc/btsDXFdtmsl/1wPNJnu5GWaAj7GQMOIbBk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3SVYc/btsDXFdtmsl/1wPNJnu5GWaAj7GQMOIbBk/img.jpg&quot; data-alt=&quot;이해를 돕기 위한 사진으로, 제 방 아닙니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3SVYc/btsDXFdtmsl/1wPNJnu5GWaAj7GQMOIbBk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3SVYc%2FbtsDXFdtmsl%2F1wPNJnu5GWaAj7GQMOIbBk%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; alt=&quot;벽지 곰팡이&quot; loading=&quot;lazy&quot; width=&quot;367&quot; height=&quot;489&quot; data-filename=&quot;ㅂㅈㄷ.jpeg&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이해를 돕기 위한 사진으로, 제 방 아닙니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떻게 막아야 할까요..&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 3.30.00 PM.png&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NEq1Y/btsD28E1abY/FNCiAZXzM3it1FWjnLtSa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NEq1Y/btsD28E1abY/FNCiAZXzM3it1FWjnLtSa1/img.png&quot; data-alt=&quot;얼어죽겠는데요?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NEq1Y/btsD28E1abY/FNCiAZXzM3it1FWjnLtSa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNEq1Y%2FbtsD28E1abY%2FFNCiAZXzM3it1FWjnLtSa1%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; alt=&quot; 온습도 유지 팁&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;169&quot; data-filename=&quot;Screenshot 2024-01-26 at 3.30.00 PM.png&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;406&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;곰팡이를 막기 위한 방법을 찾아보니 실내 온도를 18~21도, 습도는 40~60%로 유지하라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼어 죽지 않기 위해 온도는 어쩔 수 없더라도 습도라도 낮게 유지한다면, 곰팡이 번식을 막을 수 있을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;습도를 낮추는 가장 쉬운 방법은 제습기를 사는 것이죠.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 3.32.33 PM.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv59hL/btsDZXxInW8/KgUyV6R5v2KvKkBuoAyIK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv59hL/btsDZXxInW8/KgUyV6R5v2KvKkBuoAyIK1/img.png&quot; data-alt=&quot;가성비 제습기가 20만원?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv59hL/btsDZXxInW8/KgUyV6R5v2KvKkBuoAyIK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv59hL%2FbtsDZXxInW8%2FKgUyV6R5v2KvKkBuoAyIK1%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; alt=&quot;제습기 가격&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;337&quot; data-filename=&quot;Screenshot 2024-01-26 at 3.32.33 PM.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가성비 제습기가 20만원?&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;LG나 캐리어 같은 네임드는 40만 원에 육박하고, 저렴한 중소기업의 제습기도 20만 원을 호가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유명해져서 제습기 협찬을 받았으면 좋겠지만, 더 싸게 해결할 수 있으면 좋을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실내 온/습도 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 현재 실내 온도를 확인하기 위한 준비물이 필요합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biHxMR/btsDXDNwbTJ/Kn7PN5uxTdcKhNEZCAOC6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biHxMR/btsDXDNwbTJ/Kn7PN5uxTdcKhNEZCAOC6k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;443&quot; data-filename=&quot;edited_Screenshot 2024-01-26 at 3.40.20 PM.png&quot; width=&quot;220&quot; data-widthpercent=&quot;49.66&quot; style=&quot;width: 49.0817%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biHxMR/btsDXDNwbTJ/Kn7PN5uxTdcKhNEZCAOC6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiHxMR%2FbtsDXDNwbTJ%2FKn7PN5uxTdcKhNEZCAOC6k%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;443&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wN3gb/btsDZHILWKF/sO45F6NtXLoHHhx7JFeuW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wN3gb/btsDZHILWKF/sO45F6NtXLoHHhx7JFeuW1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;437&quot; data-filename=&quot;edited_Screenshot 2024-01-26 at 3.39.52 PM.png&quot; width=&quot;231&quot; height=&quot;337&quot; data-widthpercent=&quot;50.34&quot; style=&quot;width: 49.7555%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wN3gb/btsDZHILWKF/sO45F6NtXLoHHhx7JFeuW1/img.png&quot; alt=&quot;준비물&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwN3gb%2FbtsDZHILWKF%2FsO45F6NtXLoHHhx7JFeuW1%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;437&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;센서의 데이터를 보내줄 MCU와 습도를 수집할 센서&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;준비물은 알리 익스프레스에서 3천 원 정도로 구매할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;센서 데이터를 수신할 브로커를 띄우고, 센서를 사용하기 위한 간단한 코드를 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 3.57.14 PM.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coPRlx/btsDZJTZLJx/kBlbUBk6X67QRjJi3XWUL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coPRlx/btsDZJTZLJx/kBlbUBk6X67QRjJi3XWUL1/img.png&quot; data-alt=&quot;MCU 초기화 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coPRlx/btsDZJTZLJx/kBlbUBk6X67QRjJi3XWUL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoPRlx%2FbtsDZJTZLJx%2FkBlbUBk6X67QRjJi3XWUL1%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; alt=&quot;MCU 세팅&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;149&quot; data-filename=&quot;Screenshot 2024-01-26 at 3.57.14 PM.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MCU 초기화 코드&lt;/figcaption&gt;
&lt;/figure&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;WiFi 연결&lt;/li&gt;
&lt;li&gt;수집한 데이터를 전송할 브로커 서버의 IP 또는 도메인, 포트로 연결합니다. (저는 3 달마다 구글 계정 만들어서 무료로 클라우드를 이용하기에 DNS를 이용했습니다 .. ㅜ)&lt;/li&gt;
&lt;li&gt;온, 습도 수집을 시작하고&lt;/li&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;Screenshot 2024-01-26 at 3.57.25 PM.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJXwiK/btsD0HuGXjs/v53K982ydcOuz2ymOs0gz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJXwiK/btsD0HuGXjs/v53K982ydcOuz2ymOs0gz1/img.png&quot; data-alt=&quot;습도 체크 후 데이터 전송 및 디스플레이에 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJXwiK/btsD0HuGXjs/v53K982ydcOuz2ymOs0gz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJXwiK%2FbtsD0HuGXjs%2Fv53K982ydcOuz2ymOs0gz1%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;355&quot; height=&quot;124&quot; data-filename=&quot;Screenshot 2024-01-26 at 3.57.25 PM.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;습도 체크 후 데이터 전송 및 디스플레이에 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;깊게 들어가기에는 MCU부터, 세팅까지 설명할게 많은데 해당 카테고리가 WEB인 관계로 해당 글에서는 디테일은 생략하고,&lt;br /&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;이제 확인해 볼까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-01-26-15-55-56.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mwjZl/btsD1mqhbPZ/gozIWIqlgCNmvPKAilWQO0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mwjZl/btsD1mqhbPZ/gozIWIqlgCNmvPKAilWQO0/img.jpg&quot; data-alt=&quot;정상 작동되는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mwjZl/btsD1mqhbPZ/gozIWIqlgCNmvPKAilWQO0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmwjZl%2FbtsD1mqhbPZ%2FgozIWIqlgCNmvPKAilWQO0%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; alt=&quot;습도&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;493&quot; data-filename=&quot;KakaoTalk_Photo_2024-01-26-15-55-56.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;습도 85%?&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;사실 전에 MQTT 브로커를 subscribe하는 서버를 만들고, 차트로 보여주는 페이지를 작성한 경험이 있는데, 이번엔 더 효율적으로 모니터링하기 위해 기존 k8s 클러스터에서 사용하던 &lt;b&gt;프로메테우스&lt;/b&gt;라는 모니터링 툴과 &lt;b&gt;Grafana&lt;/b&gt;를 이용해 간단히 온/습도를 모아 시각화해 보도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;간단하게 프로메테우스와 MQTT 프로토콜에 대해 설명하자면 &lt;b&gt;프로메테우스&lt;/b&gt;는&amp;nbsp;CPU, 메모리 사용률과 같은&lt;b&gt; &lt;b&gt;시간에 따라 변화하는 소수형 데이터(float64)&lt;/b&gt;, 즉 메트릭 데이터&lt;/b&gt;를 &lt;b&gt;수집&lt;/b&gt;하고, 레이블을 통해 분류하며 promQL이라는 쿼리를 통해 효율적으로 데이터를 &lt;b&gt;조회, 집계&lt;/b&gt;할 수 있습니다.&lt;br /&gt;MQTT 프로토콜은 흔히 쓰는 HTTP/HTTPS처럼 메시지의 전송에 관한 규약으로, HTTP보다 훨씬 적은 트래픽을 필요로 하며 저전력/낮은 대역이라는 제약이 있는 IoT 기기에서는 &lt;b&gt;효율적인 전송&lt;/b&gt;을 위해 사용합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실내 온/습도 수집&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Prometheus와 Grafana, Mqtt 브로커가 준비되어 있으니 MQTT 브로커가 받은 메시지를 프로메테우스에서 수집할 수 있게 해주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로메테우스는 scrape job에 등록된 url로 직접 요청을 보내 &lt;b&gt;프로메테우스 형식의 메트릭 데이터&lt;/b&gt;를 직접 읽어오기 때문에, MQTT 브로커로 전달된 메시지를 수집하기 위해서는 MQTT 브로커의&lt;b&gt;&amp;nbsp;데이터&lt;/b&gt;를 &lt;b&gt;프로메테우스 형식&lt;/b&gt;으로 변환해 주는 미들웨어가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로메테우스에서는 이를 Exporter라고 부르는데, 직접 데이터 변환 로직을 작성할 필요 없이 기존의 exporter를 사용해 손쉽게 프로메테우스에서 해당 데이터를 수집할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706255602923&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;      - name: mqtt-exporter
        image: kpetrem/mqtt-exporter
        env:
        - name: MQTT_ADDRESS
          value: &quot;broker.mqtt.svc.cluster.local&quot;	# MQTT 브로커의 주소
        - name: MQTT_PORT
          value: &quot;1883&quot;					# MQTT 브로커의 포트
          
---
apiVersion: v1
kind: Service
metadata:
  name: mqtt-exporter
  namespace: monitoring
  labels:
    app: mqtt-exporter					# 서비스 레이블
spec:
  selector:
    app: mqtt-exporter
  ports:
  - name: exporter					# 포트 이름
    protocol: TCP
    port: 9000
    targetPort: 9000&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;MQTT exporter를 띄워주고, 프로메테우스에서 해당 서비스를 통해 메트릭을 수집하도록 구성해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1706256451616&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: mqtt-exporter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: mqtt-exporter	# exporter의 레이블
  endpoints:
  - port: exporter		# exporter의 포트
    path: /&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;저는 쿠버네티스 네이티브 환경에서 Prometheus-Operator를 사용했는데, 쿠버네티스를 사용하지 않는다면 직접 config 파일을 작성하셔야 합니다.&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;Screenshot 2024-01-26 at 5.02.02 PM.png&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2Ywn/btsDZ3dMbm3/1Ko1TMrTGi1eyDhA5AXkO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2Ywn/btsDZ3dMbm3/1Ko1TMrTGi1eyDhA5AXkO0/img.png&quot; data-alt=&quot;간략한 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2Ywn/btsDZ3dMbm3/1Ko1TMrTGi1eyDhA5AXkO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2Ywn%2FbtsDZ3dMbm3%2F1Ko1TMrTGi1eyDhA5AXkO0%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; alt=&quot;개략 구조&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;385&quot; data-filename=&quot;Screenshot 2024-01-26 at 5.02.02 PM.png&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;1036&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;여기까지 완료했다면&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;수집된 데이터가 MQTT 브로커에게 Publish&lt;/li&gt;
&lt;li&gt;MQTT Exporter에서 해당 데이터를 프로메테우스 형식으로 변환&lt;/li&gt;
&lt;li&gt;프로메테우스 서버가 주기적으로 MQTT Exporter로부터 메트릭 데이터를 수집해 저장&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;프로메테우스에서 한 번 확인해 볼까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 5.17.24 PM.png&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGz6oM/btsDZMDnQk5/IbkbPtgDCJctSWW8ApXkk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGz6oM/btsDZMDnQk5/IbkbPtgDCJctSWW8ApXkk1/img.png&quot; data-alt=&quot;127.0.0.1:9090으로 접속해봅시다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGz6oM/btsDZMDnQk5/IbkbPtgDCJctSWW8ApXkk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGz6oM%2FbtsDZMDnQk5%2FIbkbPtgDCJctSWW8ApXkk1%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; alt=&quot;포트포워딩&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;138&quot; data-filename=&quot;Screenshot 2024-01-26 at 5.17.24 PM.png&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;127.0.0.1:9090으로 접속해봅시다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 5.29.45 PM.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcYMkL/btsD3LQjPiW/pynPdKa29gRgD7EXGDzxo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcYMkL/btsD3LQjPiW/pynPdKa29gRgD7EXGDzxo0/img.png&quot; data-alt=&quot;수집된 메트릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcYMkL/btsD3LQjPiW/pynPdKa29gRgD7EXGDzxo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcYMkL%2FbtsD3LQjPiW%2FpynPdKa29gRgD7EXGDzxo0%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;536&quot; height=&quot;182&quot; data-filename=&quot;Screenshot 2024-01-26 at 5.29.45 PM.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;386&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;&lt;br /&gt;promQL은 메트릭의 이름{조건}의 포맷을 가집니다. 여기서 topic=~'^humid.*'는 표현식을 통해 humid로 시작하는 패턴과 매칭되는 조건식을 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MQTT는 '/'를 구분자로 토픽을 트리 형태로 관리하는데, exporter에서 변환할 때, a/b/c라는 토픽은 a_b_c로 변환되며, 오른쪽의 76이라는 값은, 마지막에 수집한 메트릭 값이 76임을 뜻합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열 메트릭을 다루는 모니터링 툴인만큼, 온도를 포함해 30분 동안의 변화도 한 번 보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 5.40.19 PM.png&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;1106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xvGyd/btsD1cg923O/OrViCROmdIsXwqhMbxtcZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xvGyd/btsD1cg923O/OrViCROmdIsXwqhMbxtcZK/img.png&quot; data-alt=&quot;습도;;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xvGyd/btsD1cg923O/OrViCROmdIsXwqhMbxtcZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxvGyd%2FbtsD1cg923O%2FOrViCROmdIsXwqhMbxtcZK%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; alt=&quot;30분 온습도 변화&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;432&quot; data-filename=&quot;Screenshot 2024-01-26 at 5.40.19 PM.png&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;1106&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;humid 또는 temp로 시작하는 토픽을 그래프에 표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 센서를 통해 데이터를 수집하고, 변화를 확인할 수 있도록 설정해 보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;D26CC5A8-8859-4C31-A224-1BF75644C6BA-14234-0000041472A06FCF_file.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGpV1m/btsDZNoTCfm/dR3yNKRhMCogNZQ6dDVQuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGpV1m/btsDZNoTCfm/dR3yNKRhMCogNZQ6dDVQuK/img.jpg&quot; data-alt=&quot;습도 관측 전문 2팀&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGpV1m/btsDZNoTCfm/dR3yNKRhMCogNZQ6dDVQuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGpV1m%2FbtsDZNoTCfm%2FdR3yNKRhMCogNZQ6dDVQuK%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; alt=&quot;습도 시청팀&quot; loading=&quot;lazy&quot; width=&quot;323&quot; height=&quot;424&quot; data-filename=&quot;D26CC5A8-8859-4C31-A224-1BF75644C6BA-14234-0000041472A06FCF_file.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;습도 관측 전문 2팀&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 뭔가 보기도 불편하고, 무엇보다 다 제쳐두고 계속 그래프만 보고 있을 수도 없는 노릇입니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다음 글에서는 시각화 툴인 Grafana를 통해 더 보기 좋게 하고, 일정 수준 이상 습도가 올라가면 외부로 알림을 전송하는 방법에 대해 다루겠습니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>곰팡이</category>
      <category>그라파나</category>
      <category>모니터링</category>
      <category>습도</category>
      <category>쿠버네티스</category>
      <category>프로메테우스</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/108</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-3%EC%B2%9C%EC%9B%90%EC%9C%BC%EB%A1%9C-%EC%8B%A4%EB%82%B4-%EA%B3%B0%ED%8C%A1%EC%9D%B4-%EB%B0%A9%EC%A7%80%ED%95%9C-%ED%9B%84%EA%B8%B0-1#entry108comment</comments>
      <pubDate>Fri, 26 Jan 2024 18:10:13 +0900</pubDate>
    </item>
    <item>
      <title>K8s) 초보자를 위한 쿠버네티스 설명회 -1</title>
      <link>https://youngmon.tistory.com/entry/K8s-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%84%A4%EB%AA%85%ED%9A%8C-1</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;쿠버로고.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2IUV/btsz423AXQB/rs8kKLA8uncQCku2KBnm30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2IUV/btsz423AXQB/rs8kKLA8uncQCku2KBnm30/img.png&quot; data-alt=&quot;쿠버네티스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2IUV/btsz423AXQB/rs8kKLA8uncQCku2KBnm30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2IUV%2Fbtsz423AXQB%2Frs8kKLA8uncQCku2KBnm30%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; alt=&quot;쿠버네티스&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;346&quot; data-filename=&quot;쿠버로고.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;&lt;b&gt;쿠버네티스란?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;쿠버네티스는 컨테이너화된 어플리케이션의 배포, 스케일링 및 관리를 자동화하는 오케스트레이션 시스템으로, 사용자가 리소스와 어플리케이션의 원하는 상태를 Manifest라는 파일에 선언하면 쿠버네티스 시스템이 해당 상태를 실현하는 방식으로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;쿠버네티스는 클러스터 환경을 구성해 스케줄링, 복구, 스케일링, 로드 밸런싱 등의 작업을 수행해, 여러 서버에서 어플리케이션을 실행하며 발생하는 복잡성을 줄여주는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;클러스터의 구성 요소&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;kube-archi.svg&quot; data-origin-width=&quot;161&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k3yKJ/btsz9Z6wEZP/zfxiV57AToQTay9aokCvS1/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k3yKJ/btsz9Z6wEZP/zfxiV57AToQTay9aokCvS1/tfile.svg&quot; data-alt=&quot;쿠버네티스 아키텍처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k3yKJ/btsz9Z6wEZP/zfxiV57AToQTay9aokCvS1/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk3yKJ%2Fbtsz9Z6wEZP%2FzfxiV57AToQTay9aokCvS1%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;kube-archi&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;467&quot; data-filename=&quot;kube-archi.svg&quot; data-origin-width=&quot;161&quot; data-origin-height=&quot;150&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;배포에 사용되는 서버의 Cpu, 메모리, 네트워크, 스토리지와 같은 인프라 리소스는 &lt;b&gt;Node&lt;/b&gt;라는 논리적 요소가 되며, Pod을 실행하고 관리하는 &lt;b&gt;워커 노드&lt;/b&gt;와 클러스터를 관리하는&amp;nbsp;&lt;b&gt;마스터 노드&lt;/b&gt;로 나뉩니다. 이러한 노드의 집합은 &lt;b&gt;클러스터&lt;/b&gt;라는 요소로 묶여 마스터 노드의 &lt;b&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;b&gt;Pod&lt;/b&gt;은 실행에 필요한 1개 이상의 컨테이너 집합으로, 생성 시점에 컨트롤 플레인의 &lt;b&gt;kube-scheduler&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;b&gt;독립적인 실행 환경&lt;/b&gt;을 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프로세스의 실행에 필요한 메모리, Cpu와 같은 자원을 운영체제로부터 제공받는 것처럼, &lt;b&gt;컨트롤 플레인&lt;/b&gt;은 파드의 스케쥴링, 클러스터 리소스의 관리, 클러스터 상태 모니터링 등을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;리소스와 오브젝트&lt;/b&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;b&gt;정확히는 객체 != 인스턴스&lt;/b&gt;) 쿠버네티스의 오브젝트는 쿠버네티스 리소스라는 틀을 통해 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;⭐️ 학습 과정에서 리소스와 오브젝트를 혼용하는 게시물이 많아서 헷갈렸습니다.. 두 개념의 차이를 알면 도움이 될 것 같아요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-11-09 at 9.19.55 PM.png&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG2AuL/btsz3Oxy9bV/A7t7N3LC2oU3KWoe0KhpoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG2AuL/btsz3Oxy9bV/A7t7N3LC2oU3KWoe0KhpoK/img.png&quot; data-alt=&quot;리소스와 오브젝트의 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG2AuL/btsz3Oxy9bV/A7t7N3LC2oU3KWoe0KhpoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG2AuL%2Fbtsz3Oxy9bV%2FA7t7N3LC2oU3KWoe0KhpoK%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; alt=&quot;예시1&quot; loading=&quot;lazy&quot; width=&quot;1842&quot; height=&quot;330&quot; data-filename=&quot;Screenshot 2023-11-09 at 9.19.55 PM.png&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;330&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;api-resource에 해당하는 bindings, endpoints 등은 오브젝트 생성에 필요한 템플릿 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manifest의 &lt;b&gt;Kind&lt;/b&gt;를 통해 &lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;Pod, Service, Deployment, StatefulSet 등&amp;nbsp;&lt;/span&gt;오브젝트의 &lt;b&gt;뼈대가 될 리소스&lt;/b&gt;를 정하고, &lt;b&gt;오브젝트를 식별&lt;/b&gt;하기 위한 &lt;b&gt;metadata&lt;/b&gt;와 &lt;b&gt;오브젝트의 상태&lt;/b&gt;인 &lt;b&gt;spec&lt;/b&gt;을 작성하면 kubectl apply를 이용해 이를 클러스터에 등록할 수 있습니다.&lt;/p&gt;
&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;kubectl apply&lt;/b&gt;의 프로세스는 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;apiVersion, kind, metadata, spec 등의 정보를 포함한 매니페스트 파일을 &lt;b&gt;kube-apiserver&lt;/b&gt;에 전송합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;kube-apiserver&lt;/b&gt;에서는 매니페스트 파일을 받아 검증하고, etcd에 저장하거나 업데이트합니다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로운 &lt;b&gt;오브젝트 생성&lt;/b&gt; 시
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;kube-apiserver에서 &lt;b&gt;etcd&lt;/b&gt;에 오브젝트 &lt;b&gt;정보 등록&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;kube-scheduler&lt;/b&gt;에서 새로운 파드 실행에 적합한 노드를 &lt;b&gt;할당&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;할당된 노드의 &lt;b&gt;kubelet&lt;/b&gt;에서 파드를 &lt;b&gt;실행&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;기존 &lt;b&gt;오브젝트 업데이트&lt;/b&gt; 시
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;kube-apiserver에서 &lt;b&gt;etcd&lt;/b&gt;에 저장된 오브젝트의 &lt;b&gt;상태 수정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;변경 사항에 따라 kube-controller-manager 또는 다른 컨트롤러들이 추가적인 동작 수행(롤아웃 배포 등)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;상태 보고
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;kubelet에서 실행 중인 파드의 상태를 지속적으로 api-server에 보고&lt;/li&gt;
&lt;li&gt;kube-controller-manager에서 파드의 상태 변화에 따라 필요한 동작을 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;지속적인 관리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 클러스터 내부의 오브젝트는 manifest 파일을 통해 코드 형식으로 관리되는데, 이는 IaC(Infrastructure as Code) 방법론으로 인프라 환경을 git과 같은 VCS를 통해 소프트웨어 개발과 유사하게 관리할 수 있습니다.&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;Minikube&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;개발, 테스트 또는 학습 환경에서 여러 노드를 구성하기는 쉽지 않기 때문에 로컬 환경에서 단일 노드 기반의 클러스터를 실행할 수 있도록 &lt;b&gt;Minikube&lt;/b&gt;가 사용됩니다. 클러스터 제어를 위한 마스터 노드와 워커 노드를 가진 로컬 기반의 가상 클러스터라고 보시면 될 것 같습니다.&lt;br /&gt;&amp;nbsp;쿠버네티스 클러스터와 구축에 드는 비용과 어려움을 줄이고, 쿠버네티스의 다양한 기능을 사용할 수 있도록 minikube 관리 커맨드 등을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Desktop에서도 유사하게 로컬에서 사용할 수 있는 가상 k8s 클러스터를 지원하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 6.59.47 PM.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzbpXU/btsD0G9gzoO/nHbppXf4iQWK6FN2K6X3rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzbpXU/btsD0G9gzoO/nHbppXf4iQWK6FN2K6X3rk/img.png&quot; data-alt=&quot;도커 데스크탑의 쿠버네티스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzbpXU/btsD0G9gzoO/nHbppXf4iQWK6FN2K6X3rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzbpXU%2FbtsD0G9gzoO%2FnHbppXf4iQWK6FN2K6X3rk%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; alt=&quot;도커 데스크탑 쿠버네티스&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;361&quot; data-filename=&quot;Screenshot 2024-01-25 at 6.59.47 PM.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도커 데스크탑의 쿠버네티스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Kubectl&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;kubectl은 클러스터의 apiserver로 요청을 보내 클러스터와 상호작용하기 위한 툴로, 여러 클러스터와 사용자를 &quot;context&quot;를 사용해 편리하게 제어할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;&amp;nbsp;context에 대한 정보는 &lt;b&gt;~/.kube/config&lt;/b&gt;에 담겨있으며, 클러스터의 정보와 클러스터와 상호작용하기 위한 사용자의 정보, 인증 방법 등이 포함됩니다. minikube이나 kubeadm을 통해 쉽게 초기 구성을 할 수 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.08.28 PM.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eKvp0E/btsDZM3ew3i/I7mte3lW5nyQKsDmN41WCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eKvp0E/btsDZM3ew3i/I7mte3lW5nyQKsDmN41WCk/img.png&quot; data-alt=&quot;context 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eKvp0E/btsDZM3ew3i/I7mte3lW5nyQKsDmN41WCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeKvp0E%2FbtsDZM3ew3i%2FI7mte3lW5nyQKsDmN41WCk%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; alt=&quot;context 정보&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;138&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.08.28 PM.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;context 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스의 config을 통해 컨텍스트의 정보들을 가져온 모습입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 위해 minikube 컨텍스트를 이용해 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.10.48 PM.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctjS52/btsD0EcyR4K/vlMpK8ymCXheJLHtsbnQuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctjS52/btsD0EcyR4K/vlMpK8ymCXheJLHtsbnQuk/img.png&quot; data-alt=&quot;kubectl이 사용하는 컨텍스트가 minikube로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctjS52/btsD0EcyR4K/vlMpK8ymCXheJLHtsbnQuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctjS52%2FbtsD0EcyR4K%2FvlMpK8ymCXheJLHtsbnQuk%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; alt=&quot;use-context&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;198&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.10.48 PM.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kubectl이 사용하는 컨텍스트가 minikube로 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.28.50 PM.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPWTCp/btsDXFDu115/MpluUzroWkU8T3xWHDArx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPWTCp/btsDXFDu115/MpluUzroWkU8T3xWHDArx0/img.png&quot; data-alt=&quot;minikube의 노드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPWTCp/btsDXFDu115/MpluUzroWkU8T3xWHDArx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPWTCp%2FbtsDXFDu115%2FMpluUzroWkU8T3xWHDArx0%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; alt=&quot;minikube 노드&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;103&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.28.50 PM.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;minikube의 노드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Namespace&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;테스트를 위한 네임스페이스를 생성하고, 두 개의 Pod와 서비스를 통해 동작 방식을 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.49.55 PM.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uAZ3E/btsDZky7VqY/flT2XCCp9UKs5IZaiKTkPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uAZ3E/btsDZky7VqY/flT2XCCp9UKs5IZaiKTkPK/img.png&quot; data-alt=&quot;네임스페이스 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uAZ3E/btsDZky7VqY/flT2XCCp9UKs5IZaiKTkPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuAZ3E%2FbtsDZky7VqY%2FflT2XCCp9UKs5IZaiKTkPK%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; alt=&quot;k8s namespace 생성&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;143&quot; data-filename=&quot;Screenshot 2024-01-25 at 7.49.55 PM.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;222&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;네임스페이스가 생성되었으니, apache와 nginx 두 개의 파드를 생성해 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.58.33 PM.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qrvzc/btsDZJZNrFo/vo8xREFieSnGkKMEaVPJ30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qrvzc/btsDZJZNrFo/vo8xREFieSnGkKMEaVPJ30/img.png&quot; data-alt=&quot;CLI로 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qrvzc/btsDZJZNrFo/vo8xREFieSnGkKMEaVPJ30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqrvzc%2FbtsDZJZNrFo%2Fvo8xREFieSnGkKMEaVPJ30%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; alt=&quot;k8s cli&quot; loading=&quot;lazy&quot; width=&quot;1708&quot; height=&quot;114&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.58.33 PM.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CLI로 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLI 명령어를 이용해 nginx 파드를 test 네임스페이스에 생성해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 리소스를 선언적으로 관리하기 위한 manifest를 이용해 생성해 봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 10.01.44 PM.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAoZLa/btsDZ10cGv0/qKnc4c4ooNAMYsJXDTsW91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAoZLa/btsDZ10cGv0/qKnc4c4ooNAMYsJXDTsW91/img.png&quot; data-alt=&quot;리소스 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAoZLa/btsDZ10cGv0/qKnc4c4ooNAMYsJXDTsW91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAoZLa%2FbtsDZ10cGv0%2FqKnc4c4ooNAMYsJXDTsW91%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; alt=&quot;api-resources&quot; loading=&quot;lazy&quot; width=&quot;1866&quot; height=&quot;118&quot; data-filename=&quot;Screenshot 2024-01-25 at 10.01.44 PM.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;118&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;pod 매니페스트를 생성하기 위한 api 버전(v1)과 kind(Pod)을 통해 간단한 manifest를 작성해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.59.13 PM.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9mhja/btsDVobzyaj/dVqvMC4Hj2KaPSvroIByA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9mhja/btsDVobzyaj/dVqvMC4Hj2KaPSvroIByA0/img.png&quot; data-alt=&quot;간단한 매니페스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9mhja/btsDVobzyaj/dVqvMC4Hj2KaPSvroIByA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9mhja%2FbtsDVobzyaj%2FdVqvMC4Hj2KaPSvroIByA0%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; alt=&quot;k8s manifest&quot; loading=&quot;lazy&quot; width=&quot;261&quot; height=&quot;252&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.59.13 PM.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;간단한 매니페스트&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;v1 버전의 api를 사용하며,&lt;/li&gt;
&lt;li&gt;test 네임스페이스에 속하는&lt;/li&gt;
&lt;li&gt;apache라는 이름의&lt;/li&gt;
&lt;li&gt;Pod입니다.&lt;/li&gt;
&lt;li&gt;이 파드는 apache:latest 이미지를 사용해&lt;/li&gt;
&lt;li&gt;apache라는 이름의 컨테이너를 생성하며&lt;/li&gt;
&lt;li&gt;80 포트를 노출합니다.&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;Screenshot 2024-01-25 at 9.59.05 PM.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I4eLw/btsDWSQXjhC/AQq1atGbD4mAdam13hwVq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I4eLw/btsDWSQXjhC/AQq1atGbD4mAdam13hwVq1/img.png&quot; data-alt=&quot;작성한 매니페스트를 클러스터에 적용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I4eLw/btsDWSQXjhC/AQq1atGbD4mAdam13hwVq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI4eLw%2FbtsDWSQXjhC%2FAQq1atGbD4mAdam13hwVq1%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;523&quot; height=&quot;55&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.59.05 PM.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;작성한 매니페스트를 클러스터에 적용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.59.26 PM.png&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW9PBV/btsDXbpcG27/CsLSGEGpShUWUAHekt2Rq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW9PBV/btsDXbpcG27/CsLSGEGpShUWUAHekt2Rq0/img.png&quot; data-alt=&quot;apache 파드의 에러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW9PBV/btsDXbpcG27/CsLSGEGpShUWUAHekt2Rq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW9PBV%2FbtsDXbpcG27%2FCsLSGEGpShUWUAHekt2Rq0%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; alt=&quot;에러&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;118&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.59.26 PM.png&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apache 파드의 에러&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 네임스페이스의 파드를 보면 문제가 있음을 알 수 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아파치 웹서버의 이미지가 apache가 아니라 httpd라 생긴 오류였습니다ㅎ;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.59.55 PM.png&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8vBV/btsDY8yNTCH/1kPniFjseje1sqXmYUQu1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8vBV/btsDY8yNTCH/1kPniFjseje1sqXmYUQu1K/img.png&quot; data-alt=&quot;컨테이너 이미지 변경 후 정상적으로 올라간 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8vBV/btsDY8yNTCH/1kPniFjseje1sqXmYUQu1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8vBV%2FbtsDY8yNTCH%2F1kPniFjseje1sqXmYUQu1K%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; alt=&quot;정상&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;95&quot; data-filename=&quot;Screenshot 2024-01-25 at 9.59.55 PM.png&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;148&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;/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;Service&lt;/b&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;직접 파드에 접근할 필요 없이 서비스를 통해 접근이 가능하게 해 주며, 서비스는 파드의 metadata를 통해 동일한 레이블을 가진 파드들에게 요청을 분배합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 10.07.28 PM.png&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIIvTs/btsDXyR3R72/vlLJPYlXmGbf8lcYSpIGfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIIvTs/btsDXyR3R72/vlLJPYlXmGbf8lcYSpIGfk/img.png&quot; data-alt=&quot;간단한 서비스 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIIvTs/btsDXyR3R72/vlLJPYlXmGbf8lcYSpIGfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIIvTs%2FbtsDXyR3R72%2FvlLJPYlXmGbf8lcYSpIGfk%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; alt=&quot;service manifest&quot; loading=&quot;lazy&quot; width=&quot;289&quot; height=&quot;306&quot; data-filename=&quot;Screenshot 2024-01-25 at 10.07.28 PM.png&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;간단한 서비스 생성&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;test 네임스페이스에서&lt;/li&gt;
&lt;li&gt;webserver라는 이름을 가진&lt;/li&gt;
&lt;li&gt;v1 버전의 api를 사용하는&lt;/li&gt;
&lt;li&gt;Service는&lt;/li&gt;
&lt;li&gt;NodePort 타입으로&lt;/li&gt;
&lt;li&gt;클러스터에서 12345 포트를 리스닝하며&lt;/li&gt;
&lt;li&gt;test: webserver라는 레이블을 가진 파드를 찾아&lt;/li&gt;
&lt;li&gt;트래픽을 80번 포트로 포워딩합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NodePort의 경우 port, targetPort 외에도 3만번대의 노드 포트가 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 포트를 명시할 수 있으나, 충돌이 발생할 수 있어 자동 생성하도록 비워두었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;해당 리소스가 클러스터에 적용이 되면 임의의 노드 포트가 생성되며, 해당 포트의 트래픽이 클러스터의 port를 거쳐 컨테이너의 targetPort로 포워딩되게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-25 at 10.09.26 PM.png&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CHv1q/btsDY5WoYZM/vTfubeakT3hf67qSs4GtcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CHv1q/btsDY5WoYZM/vTfubeakT3hf67qSs4GtcK/img.png&quot; data-alt=&quot;서비스 생성 후 중간 점검&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CHv1q/btsDY5WoYZM/vTfubeakT3hf67qSs4GtcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCHv1q%2FbtsDY5WoYZM%2FvTfubeakT3hf67qSs4GtcK%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;1702&quot; height=&quot;506&quot; data-filename=&quot;Screenshot 2024-01-25 at 10.09.26 PM.png&quot; data-origin-width=&quot;1702&quot; data-origin-height=&quot;506&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;먼저 &lt;b&gt;1번&lt;/b&gt;을 보면 각 파드에 클러스터 내부에서 사용되는 IP가 생성되어 있고, &lt;b&gt;2번&lt;/b&gt;을 보면 서비스에 31523이라는 nodePort가 생성된 것을 볼 수 있습니다.&lt;br /&gt;&lt;b&gt;노드 IP:31523&lt;/b&gt;으로 들어온 트래픽은 &lt;b&gt;서비스&lt;/b&gt;인 &lt;b&gt;10.98.23.32:12345&lt;/b&gt;로 포워딩됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다시 &lt;b&gt;3번&lt;/b&gt;을 보면 Selector로 &lt;b&gt;test=webserver&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성되는 파드마다 새로운 IP 주소를 가지게 되는데, 이를 &lt;b&gt;동적으로 관리&lt;/b&gt;하기 위해 &lt;b&gt;Label&lt;/b&gt;과 &lt;b&gt;Selector&lt;/b&gt;를 사용합니다.&lt;br /&gt;&lt;b&gt;Label&lt;/b&gt;은 리소스에 붙는 키:값 식별자로, 쿠버네티스에서는 이를 통해 리소스를 &lt;b&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;즉 서비스의 selector는 레이블에 test : webserver가 존재하는 파드를 자동으로 수집하는 &lt;b&gt;서비스 디스커버리를 수행&lt;/b&gt;합니다.&lt;br /&gt;4번 ENDPOINTS를 보면 apache와 nginx의 클러스터 내부 주소인 10.244.0.71:80과 10.244.0.72:80이 등록되어 있는데, &lt;b&gt;10.98.23.32:12345(서비스)&lt;/b&gt;로 포워딩된 트래픽은 &lt;b&gt;10.244.0.71:80(nginx)&lt;/b&gt; 또는 &lt;b&gt;10.244.0.72:80(apache)&lt;/b&gt;로 다시 전달됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트래픽의 전달은 라운드 로빈 알고리즘을 통해 이루어지기 때문에 요청마다 다른 파드가 연결됩니다.&lt;/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;가상 환경 위에서 실행되는 minikube 노드에 node port를 할당했지만, 호스트 PC에서 접근하기 위해서는 추가적인 연결이 필요합니다.&lt;br /&gt;&amp;nbsp;minikube service [서비스 명] -n [서비스 네임스페이스]라는 명령어를 실행하면, minikube는 해당 서비스의 node port에 접근할 수 있는 URL을 만들어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 12.25.25 AM.png&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TSeon/btsD0Lplbq6/9nK9BZnbcKewejbId4R0Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TSeon/btsD0Lplbq6/9nK9BZnbcKewejbId4R0Lk/img.png&quot; data-alt=&quot;minikube service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TSeon/btsD0Lplbq6/9nK9BZnbcKewejbId4R0Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTSeon%2FbtsD0Lplbq6%2F9nK9BZnbcKewejbId4R0Lk%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; alt=&quot;minikube service&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;72&quot; data-filename=&quot;Screenshot 2024-01-26 at 12.25.25 AM.png&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;minikube service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속해 봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 12.27.28 AM.png&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E9BfO/btsDW6hdghY/PRe45ej0itCOK3xEtEWDp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E9BfO/btsDW6hdghY/PRe45ej0itCOK3xEtEWDp0/img.png&quot; data-alt=&quot;nginx&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E9BfO/btsDW6hdghY/PRe45ej0itCOK3xEtEWDp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE9BfO%2FbtsDW6hdghY%2FPRe45ej0itCOK3xEtEWDp0%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; alt=&quot;nginx&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;300&quot; data-filename=&quot;Screenshot 2024-01-26 at 12.27.28 AM.png&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nginx&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 url로 접속해 보면 nginx로 연결되는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-01-26 at 12.58.52 AM.png&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxczA/btsDY9xNo6J/uMfbjXsw7DFJ7ekzUiqIX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxczA/btsDY9xNo6J/uMfbjXsw7DFJ7ekzUiqIX0/img.png&quot; data-alt=&quot;apache&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxczA/btsDY9xNo6J/uMfbjXsw7DFJ7ekzUiqIX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxczA%2FbtsDY9xNo6J%2FuMfbjXsw7DFJ7ekzUiqIX0%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; alt=&quot;apache&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;299&quot; data-filename=&quot;Screenshot 2024-01-26 at 12.58.52 AM.png&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apache&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 주소로 다시 접속해보면 이번엔 아파치로 연결이 된 것을 볼 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스의 기초적인 컨셉을 알아보고, minikube 환경에서 2개의 파드와 서비스로 서비스 디스커버리를 테스트해 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;label과 selector는 다양한 리소스를 동적으로 다루기 위해 사용되는 컨셉으로, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;서비스 외에도&lt;span&gt; 레플리케이션 컨트롤러 등에서 다양하게 사용되므로 개념 이해가 중요한 부분입니다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>WEB/Infra</category>
      <category>clustering</category>
      <category>K8S</category>
      <category>minikube</category>
      <category>POD</category>
      <category>Service</category>
      <category>쿠버네티스</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/107</guid>
      <comments>https://youngmon.tistory.com/entry/K8s-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%84%A4%EB%AA%85%ED%9A%8C-1#entry107comment</comments>
      <pubDate>Fri, 26 Jan 2024 01:41:59 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] AI 요리 블로거 챗종원 개발기 -完</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-%E5%AE%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발에 8시간이 걸렸는데, 포스팅에 일주일이 걸렸습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 전체 내용을 마치는 글 포함해서 7 부분으로 나누고, 하루에 2개씩 쓰려고 했는데 중간중간 내용을 조금씩 더하고, 빼고, 수정하다 보니 길어졌군요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 시리즈의 &lt;b&gt;기획 의도&lt;/b&gt;와 &lt;b&gt;개발 도중 겪었던 난항&lt;/b&gt; 및 &lt;b&gt;현재의 문제점&lt;/b&gt;과 &lt;b&gt;개선 방안&lt;/b&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;b&gt;기획 의도&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 블로그 도메인을 바꾸고 &lt;b&gt;구글 서치콘솔에 등록&lt;/b&gt;된 이전 글의 색인들이 전부 무효가 되면서, 구글 검색을 통한 유입이 되지 않고 광고 수익이 0이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;장기적으로 유입이 될만한 컨텐츠가 필요하다고 생각하던 찰나에, JIRA Automation과 GPT를 활용한 서버리스 환경의 챗봇을 기획, 개발하게 되었고 GPT API를 직접 써보면서 &lt;b&gt;&quot;이거로 블로그 하나 더 파도 되겠는데?&quot;&lt;/b&gt;싶어서 바로 이거 끝내고 GPT를 활용한 포스팅 자동화 서비스를 만들어야겠다고 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;처음부터 요리 블로거를 해야겠다라고 생각한 건 아니었습니다. 평소 금융 분야에도 관심이 있어 &lt;b&gt;GPT&lt;/b&gt;와&amp;nbsp;&lt;b&gt;한국 투자 증권의 REST API&lt;/b&gt;를 활용해&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;재무재표를 GPT 모델에 학습&lt;/li&gt;
&lt;li&gt;커스텀 GPT 모델로 현재 기업 가치와 재무제표를 통한 기업가치 비교&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;뉴스에서 백종원 님과 인삼축제에 대해 보게 되었고,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;백종원? 백종원 + 챗 GPT = 챗종원? 메뉴 추천 AI 요리블로거? ChefGPT?????&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; 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;이맛은.jpeg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOThr6/btszk5GgYG2/JkGj6Qp6wmB2Lqee8jRK50/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOThr6/btszk5GgYG2/JkGj6Qp6wmB2Lqee8jRK50/img.jpg&quot; data-alt=&quot;팬입니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOThr6/btszk5GgYG2/JkGj6Qp6wmB2Lqee8jRK50/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOThr6%2Fbtszk5GgYG2%2FJkGj6Qp6wmB2Lqee8jRK50%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; alt=&quot;이맛은?&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;277&quot; data-filename=&quot;이맛은.jpeg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;팬입니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이름에 꽂혀서 저질러버렸습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;주제 자체가 남녀노소 다양한 사람들이 유용하게 이용할 수 있어서 좋았고, 스스로도 매일 &lt;b&gt;오늘 뭐 먹지? 하며&lt;/b&gt; 메뉴 선정에 귀찮음을 느꼈기 때문에 개발 동기도 솟구쳤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이왕 만드는 김에 &lt;b&gt;백종원 레시피&lt;/b&gt;처럼 직접 요리에 필요한 재료와 조리 방법을 알려주었으면 좋겠다고 생각해&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;font-family: 'Noto Sans Light';&quot;&gt;매 끼니마다 메뉴를 추천하고, 필요한 재료와 조리 방법을 알려주는 AI 요리 전문 블로거&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;챗종원이 탄생했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&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;p data-ke-size=&quot;size16&quot;&gt;여러 솔루션, Dall-E API를 처음 사용하다 보니 이해가 부족해 공식 문서를 읽었음에도 실제 사용 전까지 인지하지 못한 문제가 몇 가지 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;수동 로그인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Access Token 발급을 위해 현재 직접 로그인을 해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 포스팅에서 언급했던 것처럼 셀레니움 등의 프레임워크를 통해 &lt;b&gt;직접 인증&lt;/b&gt;을 하는 부분도 &lt;b&gt;자동화&lt;/b&gt;가 가능하다고 생각됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Http 요청에 대한 비동기 처리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 언어로 파이썬을 사용한 이유는 크게 세 가지입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모든 &lt;b&gt;주요 로직이 I/O&lt;/b&gt;로 이루어졌기 때문에 인터프리터의 한계인 GIL 등의 성능 이슈로부터 자유로움&lt;/li&gt;
&lt;li&gt;다양한 라이브러리로 &lt;b&gt;빠른 개발&lt;/b&gt;이 가능&lt;/li&gt;
&lt;li&gt;코드가 간결해 다른 사람이 해당 서비스를 따라 구현할 때 처음 개발을 접하는 사람도 &lt;b&gt;쉽게 따라 할 수 있음&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 1번의 &lt;b&gt;I/O 작업시간&lt;/b&gt;과 관련되어 문제가 발생했습니다.&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;Cloud Functions에서는 함수의 실행 시간과 실행 횟수를 통해 비용이 측정되기 때문에 실행 시간을 줄여야 했습니다.&lt;/p&gt;
&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;b&gt;202 Accepted를 응답&lt;/b&gt;해 요청을 보낸 서비스가 기다리지 않게 하려고 했지만?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud Functions의 원리를 완벽히 이해하지 못한 상태로 진행해 다른 문제가 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버리스 컨테이너 배포 솔루션인 &lt;b&gt;Cloud Run 기반&lt;/b&gt;으로 동작하는 Cloud Functions는 &lt;b&gt;요청이 들어올 때 컨테이너가 실행&lt;/b&gt;되고, &lt;b&gt;응답이 이루어짐과 동시에 컨테이너가 종료되어 버리기&lt;/b&gt; 때문에 위와 같이 백그라운드에서 task를 실행시킬 수가 없었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 생각해 보면 당연한 거긴 한데, 왜 그땐 미처 생각을 못했을까요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 이를 개선하기 위한 방안으로 생각 중인 것은&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Google Cloud Pub/sub&lt;/li&gt;
&lt;li&gt;Google Cloud Tasks&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;두 솔루션 모두 &lt;b&gt;Http 요청의 비동기 처리&lt;/b&gt;를 위해 사용되는데, 이는 추후에 따로 포스팅을 하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택을 위해 비용과 여러 고려 사항이 있겠지만, 비용 측면에서는 이보다 급하게 처리해야 할 문제가 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;닭 잡는 데에 소 잡는 칼, Cloud SQL&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-28 at 1.20.28 AM.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iltb9/btszk5TNO4F/cbx3Y1d1NKKIJLZ4lfNc6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iltb9/btszk5TNO4F/cbx3Y1d1NKKIJLZ4lfNc6K/img.png&quot; data-alt=&quot;정확히 30배&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iltb9/btszk5TNO4F/cbx3Y1d1NKKIJLZ4lfNc6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIltb9%2Fbtszk5TNO4F%2Fcbx3Y1d1NKKIJLZ4lfNc6K%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;259&quot; height=&quot;238&quot; data-filename=&quot;Screenshot 2023-10-28 at 1.20.28 AM.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정확히 30배&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 티스토리 Access Token 하나 가지고 있고, 티스토리 포스팅할 때 한 번 Read가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션이 필요한 데이터도 아니기 때문에 Access Token을 시크릿이나 환경변수로 옮기거나, Cloud Storage에 저장하는 것이 바람직하다고 생각됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 처리해야 합니다..&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;한글을 학습하지 못한 Dall-E&lt;/b&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;Dall-E 3.0이 9월 중순 경에 공개되었으나, 현재 API로 접근할 수 없고 Chat GPT::GPT-4에서 사용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dall-E 2.0은 한글을 모르기에 프롬프트를 영어로 번역하는 과정을 추가했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 Dall-E 3.0이 생성한 팬케이크 사진의 퀄리티는 상상을 초월하는데요..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;팬케이크.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d31Nma/btszkPKhCNo/2C8k6tcfWCVS2uFE0JAnMK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d31Nma/btszkPKhCNo/2C8k6tcfWCVS2uFE0JAnMK/img.webp&quot; data-alt=&quot;예시 이미지 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d31Nma/btszkPKhCNo/2C8k6tcfWCVS2uFE0JAnMK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd31Nma%2FbtszkPKhCNo%2F2C8k6tcfWCVS2uFE0JAnMK%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;374&quot; height=&quot;374&quot; data-filename=&quot;팬케이크.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시 이미지 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;팬케이크2.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM9YaQ/btszlu6SsAO/wGcd3dPEjrxXMDkatZUCmK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM9YaQ/btszlu6SsAO/wGcd3dPEjrxXMDkatZUCmK/img.webp&quot; data-alt=&quot;예시 이미지 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM9YaQ/btszlu6SsAO/wGcd3dPEjrxXMDkatZUCmK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM9YaQ%2Fbtszlu6SsAO%2FwGcd3dPEjrxXMDkatZUCmK%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;362&quot; height=&quot;362&quot; data-filename=&quot;팬케이크2.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시 이미지 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감탄밖에 나오지 않습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dall-E 3.0 API가 공개되면 블로그 컨텐츠의 퀄리티가 아주 많이 올라갈 것 같아 기대가 됩니다.&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;p data-ke-size=&quot;size16&quot;&gt;본격적으로 개발을 배우기 전, 파이썬 장고를 통해 인스타그램 클론코딩 영상을 보고 무작정 따라 했던 경험이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 프레임워크 버전도 다르고, UI도 달라서 IDE부터 따라 깔고 설정에서도 애를 많이 먹었던 기억이 있는데, 개발을 처음 배우면서 맨 땅에 헤딩하는 게 힘들었던 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르는 사람도 쉽게 접근할 수 있는 주제이고, 서버리스 솔루션을 사용해 처음 개발을 접하는 사람도 설정이나 IDE 등의 이슈없이 흥미를 느끼고 따라 하기 쉬웠으면 좋겠다는 생각으로 기획했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올 초에 개인적으로 알고리즘 과외를 한 적이 있는데, dfs, bfs 탑재시켜서 어느 정도 궤도에 올려놓으니 스스로 흥미가 생겨서 곧잘 하는 모습을 보고 재미를 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 약간의 설명과 과정을 적어서, 코드만 따라친다는 느낌이 들지 않고 흥미가 생기기를 바랐는데 막상 어땠을지는 모르겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시간이지나면서.jpeg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df1Poq/btszlvdEh76/PoutrboRwwpYuM1mly38b0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df1Poq/btszlvdEh76/PoutrboRwwpYuM1mly38b0/img.jpg&quot; data-alt=&quot;나도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df1Poq/btszlvdEh76/PoutrboRwwpYuM1mly38b0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf1Poq%2FbtszlvdEh76%2FPoutrboRwwpYuM1mly38b0%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;305&quot; data-filename=&quot;시간이지나면서.jpeg&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;305&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;피드백은 언제나 환영이고, 틀린 내용이나 궁금하신 내용이 있으시다면 댓글로 알려주셨으면 감사하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고도 좀 눌러주시면 좋구요 ㅎ..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &lt;b&gt;챗종원 블로그&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1698425769224&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;AI 요리사 챗종원&quot; data-og-host=&quot;chefgpt.tistory.com&quot; data-og-source-url=&quot;https://chefgpt.tistory.com&quot; data-og-url=&quot;https://chefgpt.tistory.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chDhTP/hyUkg1Osrx/SWv7ck643J3CuGBASTMbr1/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698,https://scrap.kakaocdn.net/dn/bSZuVA/hyUlr9Mwot/lRGzKCCezMyTdKNybanV0K/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698&quot;&gt;&lt;a href=&quot;https://chefgpt.tistory.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chefgpt.tistory.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chDhTP/hyUkg1Osrx/SWv7ck643J3CuGBASTMbr1/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698,https://scrap.kakaocdn.net/dn/bSZuVA/hyUlr9Mwot/lRGzKCCezMyTdKNybanV0K/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;챗종원&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 요리사 챗종원&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chefgpt.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>WEB</category>
      <category>개발</category>
      <category>부업</category>
      <category>서버리스</category>
      <category>챗종원</category>
      <category>파이썬</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/106</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-%E5%AE%8C#entry106comment</comments>
      <pubDate>Sat, 28 Oct 2023 01:53:26 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] AI 요리 블로거 챗종원 개발기 -6</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서 이미지를 GCS에서 공개 호스팅하는 것을 마지막으로 블로그 포스팅에 필요한 모든 데이터를 완성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시간에는 티스토리 API를 이용해 글을 작성하고, 이러한 작업을 Google Scheduler를 통해 자동화할 수 있도록 설정해 보겠습니다.&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;티스토리 API&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞부분에서 다루었던 티스토리의 Access Token이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 인증하고 저장해 두었던 토큰이 여기서 활용되는데, 이로써 수미상관의 구조가 완성되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tistory.github.io/document-tistory-apis/apis/v1/post/write.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://tistory.github.io/document-tistory-apis/apis/v1/post/write.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698390598928&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;middot; GitBook&quot; data-og-description=&quot;No results matching &amp;quot;&amp;quot;&quot; data-og-host=&quot;tistory.github.io&quot; data-og-source-url=&quot;https://tistory.github.io/document-tistory-apis/apis/v1/post/write.html&quot; data-og-url=&quot;https://tistory.github.io/document-tistory-apis/apis/v1/post/write.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tistory.github.io/document-tistory-apis/apis/v1/post/write.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tistory.github.io/document-tistory-apis/apis/v1/post/write.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;글 작성 &amp;middot; GitBook&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;No results matching &quot;&quot;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tistory.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 작성을 위한 티스토리 공식 문서입니다.&lt;/p&gt;
&lt;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;요청의 메소드가 POST로 되어있는데 글 작성을 위한 컨텐츠가 body가 아닌 Query 파라미터로 입력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 4.14.24 PM.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eIfRx8/btszjzAKzu0/9AuiHXtA1RG63b4zy2k9b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eIfRx8/btszjzAKzu0/9AuiHXtA1RG63b4zy2k9b0/img.png&quot; data-alt=&quot;body가 아닌 쿼리 파라미터로 글 내용을 받습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eIfRx8/btszjzAKzu0/9AuiHXtA1RG63b4zy2k9b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeIfRx8%2FbtszjzAKzu0%2F9AuiHXtA1RG63b4zy2k9b0%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;655&quot; height=&quot;425&quot; data-filename=&quot;Screenshot 2023-10-27 at 4.14.24 PM.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1038&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;body가 아닌 쿼리 파라미터로 글 내용을 받습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 content에 들어갈 내용은 &lt;b&gt;HTML&lt;/b&gt;이라 원문보다 내용이 훨씬 길어질 수가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버의 설정에 따라 얼마든지 문제가 생길 수 있는 부분이기 때문에, 제가 해당 기능 구현 전에 가장 우려했던 부분이고 여러 번의 길이 테스트와 저장된 이미지의 공개 URL을&amp;nbsp;&lt;b&gt;url 단축기&lt;/b&gt;로 줄이는 과정을 거치게 했습니다만, 아직 컨텐츠의 길이 때문에 문제가 생긴 적은 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 414 Status Code와 관련해 문제가 생긴다면 해당 부분을 확인해 보시기 바랍니다.&lt;/p&gt;
&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/414&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Status/414&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698391481587&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;414 URI Too Long - HTTP | MDN&quot; data-og-description=&quot;HTTP 414 URI Too Long 응답 코드는 클라이언트가 요청한 URI가 서버가 해석가능한 URI보다 더 길다는 것을 나타냅니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status/414&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status/414&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btp2ai/hyUkebKvRN/QStpX0tDhcMAwc5bkMOVw1/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/414&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status/414&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btp2ai/hyUkebKvRN/QStpX0tDhcMAwc5bkMOVw1/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;414 URI Too Long - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 414 URI Too Long 응답 코드는 클라이언트가 요청한 URI가 서버가 해석가능한 URI보다 더 길다는 것을 나타냅니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 본론으로 넘어와 포스팅을 위한 Content를 생성해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선적으로 \n으로 나누어진 원문을 &amp;lt;p&amp;gt; 태그를 이용해 치환해 줍니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;안녕하세요\n반갑습니다\n행복하세요&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 텍스트를&lt;/p&gt;
&lt;pre id=&quot;code_1698391685648&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;안녕하세요&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;반갑습니다&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;행복하세요&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어둔 이미지 링크도 html 태그로 만들어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698391767109&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html_content +=  &quot;&amp;lt;img src='{}' style='width: 100%;' /&amp;gt;&quot;.format(image_url)&lt;/code&gt;&lt;/pre&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;edited_Screenshot 2023-10-27 at 4.32.23 PM.png&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ooXX2/btszi5fJEwS/qM4GXVypYzXpN9yfyDl1H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ooXX2/btszi5fJEwS/qM4GXVypYzXpN9yfyDl1H0/img.png&quot; data-alt=&quot;공통적인 값으로 초기화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ooXX2/btszi5fJEwS/qM4GXVypYzXpN9yfyDl1H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FooXX2%2Fbtszi5fJEwS%2FqM4GXVypYzXpN9yfyDl1H0%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; alt=&quot;공통&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;147&quot; data-filename=&quot;edited_Screenshot 2023-10-27 at 4.32.23 PM.png&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;258&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;BLOG_NAME에 들어갈 값은 포스팅될 블로그의 도메인에 적힌 블로그명이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;category를 확인하기 위해 작성하려 하는 카테고리, 주제로 설정한 테스트 글을 작성하고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 4.47.46 PM.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;1214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KCaW5/btszj746LHJ/HKAHBKKdXxRPmx0vjnfdm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KCaW5/btszj746LHJ/HKAHBKKdXxRPmx0vjnfdm1/img.png&quot; data-alt=&quot;카테고리 API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KCaW5/btszj746LHJ/HKAHBKKdXxRPmx0vjnfdm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKCaW5%2Fbtszj746LHJ%2FHKAHBKKdXxRPmx0vjnfdm1%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;568&quot; height=&quot;410&quot; data-filename=&quot;Screenshot 2023-10-27 at 4.47.46 PM.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;1214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카테고리 API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 API를 통해 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 4.33.25 PM.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf8Yyf/btszj4AABHs/HJzFG46mbKS4QpyDtffgoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf8Yyf/btszj4AABHs/HJzFG46mbKS4QpyDtffgoK/img.png&quot; data-alt=&quot;전송 데이터 완성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf8Yyf/btszj4AABHs/HJzFG46mbKS4QpyDtffgoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf8Yyf%2Fbtszj4AABHs%2FHJzFG46mbKS4QpyDtffgoK%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;536&quot; height=&quot;43&quot; data-filename=&quot;Screenshot 2023-10-27 at 4.33.25 PM.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;74&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;이제 요청을 보내고 200 OK를 받으면 포스팅 완료!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 각 서비스에서 데이터가 흘러가는 모습을 시각화해 보면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 5.04.38 PM.png&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;1092&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vJPUE/btszg065JQc/KYSpT3fBXioY0wrrklMcck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vJPUE/btszg065JQc/KYSpT3fBXioY0wrrklMcck/img.png&quot; data-alt=&quot;파이프-필터 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vJPUE/btszg065JQc/KYSpT3fBXioY0wrrklMcck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvJPUE%2Fbtszg065JQc%2FKYSpT3fBXioY0wrrklMcck%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; alt=&quot;메소드 체이닝&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;376&quot; data-filename=&quot;Screenshot 2023-10-27 at 5.04.38 PM.png&quot; data-origin-width=&quot;2150&quot; data-origin-height=&quot;1092&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;/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;이 부분에 대해서는 다음 완결 포스팅에서 더욱 심도 있게 다루어 보도록 하고, 이제 그림의 Trigger Request를 일정 시간마다 실행시켜 주는 기능을 만들어보도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Cloud Scheduler&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주기적으로 특정 작업을 반복할 때 Cron이라는 기능을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Cloud에서 제공하는 Cron이 바로 Cloud Scheduler입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주기적으로 특정 이벤트를 발생시키는 역할을 하는데, 바로 적용해 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.23.44 PM.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/16P43/btsziQ4feJO/LZQEPt3nUUKqTQQOpIktV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/16P43/btsziQ4feJO/LZQEPt3nUUKqTQQOpIktV1/img.png&quot; data-alt=&quot;cloud Scheduler 탭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/16P43/btsziQ4feJO/LZQEPt3nUUKqTQQOpIktV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F16P43%2FbtsziQ4feJO%2FLZQEPt3nUUKqTQQOpIktV1%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; alt=&quot;cloud scheduler 탭&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;186&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.23.44 PM.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cloud Scheduler 탭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케쥴을 만들기를 눌러 스케쥴을 생성해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.25.11 PM.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UIF7K/btszglRmJ7i/exaOlWy5qTWkXyobrWJsJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UIF7K/btszglRmJ7i/exaOlWy5qTWkXyobrWJsJk/img.png&quot; data-alt=&quot;Unix Cron 문법 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UIF7K/btszglRmJ7i/exaOlWy5qTWkXyobrWJsJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUIF7K%2FbtszglRmJ7i%2FexaOlWy5qTWkXyobrWJsJk%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;413&quot; height=&quot;465&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.25.11 PM.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Unix Cron 문법 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈도에 해당하는 입력 값은 UNIX Cron 문법과 일치합니다.&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.ibm.com/docs/en/db2/11.5?topic=task-unix-cron-format&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ibm.com/docs/en/db2/11.5?topic=task-unix-cron-format&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698399045663&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;UNIX cron format&quot; data-og-description=&quot;The UNIX cron format is used to specify time in the schedule parameter of the ADMIN_TASK_ADD and ADMIN_TASK_UPDATE procedures. The cron format has five time and date fields separated by at least one blank. There can be no blank within a field value. Schedu&quot; data-og-host=&quot;www.ibm.com&quot; data-og-source-url=&quot;https://www.ibm.com/docs/en/db2/11.5?topic=task-unix-cron-format&quot; data-og-url=&quot;https://www.ibm.com/docs/en/db2/11.5?topic=task-unix-cron-format&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/db2/11.5?topic=task-unix-cron-format&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ibm.com/docs/en/db2/11.5?topic=task-unix-cron-format&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;UNIX cron format&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The UNIX cron format is used to specify time in the schedule parameter of the ADMIN_TASK_ADD and ADMIN_TASK_UPDATE procedures. The cron format has five time and date fields separated by at least one blank. There can be no blank within a field value. Schedu&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ibm.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈도를 설정했다면, 실행할 작업을 설정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.27.37 PM.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVsVbn/btszkQvn5eD/gUDUE01hLj1WBBTzoPtzg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVsVbn/btszkQvn5eD/gUDUE01hLj1WBBTzoPtzg0/img.png&quot; data-alt=&quot;트리거 요청을 수행할 함수의 endpoint를 입력합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVsVbn/btszkQvn5eD/gUDUE01hLj1WBBTzoPtzg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVsVbn%2FbtszkQvn5eD%2FgUDUE01hLj1WBBTzoPtzg0%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;476&quot; height=&quot;448&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.27.37 PM.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;934&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;트리거 요청을 수행할 함수의 endpoint를 입력합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 스케쥴러가 등록되었다면 잘 동작하는지 실행을 해봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.33.38 PM.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z6fvx/btszltNozt9/0SpFrs6GQsT8tPdIQKE321/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z6fvx/btszltNozt9/0SpFrs6GQsT8tPdIQKE321/img.png&quot; data-alt=&quot;실행될 동작을 미리 실행해봅시다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z6fvx/btszltNozt9/0SpFrs6GQsT8tPdIQKE321/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz6fvx%2FbtszltNozt9%2F0SpFrs6GQsT8tPdIQKE321%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; alt=&quot;강제 실행&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;159&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.33.38 PM.png&quot; data-origin-width=&quot;662&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;성공적으로 실행된 모습입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.35.11 PM.png&quot; data-origin-width=&quot;176&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbpKWH/btszjumlXmL/VaL9VIgIiU07GOao7j2MKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbpKWH/btszjumlXmL/VaL9VIgIiU07GOao7j2MKK/img.png&quot; data-alt=&quot;성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbpKWH/btszjumlXmL/VaL9VIgIiU07GOao7j2MKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbpKWH%2FbtszjumlXmL%2FVaL9VIgIiU07GOao7j2MKK%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;176&quot; height=&quot;142&quot; data-filename=&quot;Screenshot 2023-10-27 at 6.35.11 PM.png&quot; data-origin-width=&quot;176&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 주기적으로 주제를 정하고,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;컨텐츠를 제작해,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;외부에 포스팅하는 AI 요리 블로거 챗종원의 개발기였습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;어떻게.jpeg&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7S2EN/btszgmiv5Tt/Wd2FKAkhV59sYrzhKybTLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7S2EN/btszgmiv5Tt/Wd2FKAkhV59sYrzhKybTLk/img.jpg&quot; data-alt=&quot;어렵지 않쥬?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7S2EN/btszgmiv5Tt/Wd2FKAkhV59sYrzhKybTLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7S2EN%2Fbtszgmiv5Tt%2FWd2FKAkhV59sYrzhKybTLk%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; alt=&quot;쉽쥬?&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;268&quot; data-filename=&quot;어떻게.jpeg&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어렵지 않쥬?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 현재 동작의 문제점이나, 개선점 등에 대해 복기해 보는 포스팅으로 돌아오겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;또궁또말.jpeg&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpQ4JP/btszhpMEbrL/uuPTGwqqMS8es1jKHKkJW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpQ4JP/btszhpMEbrL/uuPTGwqqMS8es1jKHKkJW1/img.jpg&quot; data-alt=&quot;무물보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpQ4JP/btszhpMEbrL/uuPTGwqqMS8es1jKHKkJW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpQ4JP%2FbtszhpMEbrL%2FuuPTGwqqMS8es1jKHKkJW1%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;605&quot; height=&quot;337&quot; data-filename=&quot;또궁또말.jpeg&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무물보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>WEB</category>
      <category>Cloud Functions</category>
      <category>Cloud Scheduler</category>
      <category>서버리스</category>
      <category>자동화</category>
      <category>챗종원</category>
      <category>티스토리 api</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/105</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-6#entry105comment</comments>
      <pubDate>Fri, 27 Oct 2023 18:40:50 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] AI 요리 블로거 챗종원 개발기 -5</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 게시글에서 이미지 생성 모델인 Dall-E를 통해 메뉴의 이미지를 생성하고 결과를 받아오는데에 성공했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 이미지를 저장 및 공개해 모두가 볼 수 있게 만들어야하는데, 저는 &lt;b&gt;구글 클라우드의 GCS&lt;/b&gt;를 사용해 구현하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;GCS란?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;google-cloud-storage-logo.jpg&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opCsl/btszeH68CxL/LCvjQwJ0uTpsTqVI1zILc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opCsl/btszeH68CxL/LCvjQwJ0uTpsTqVI1zILc1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opCsl/btszeH68CxL/LCvjQwJ0uTpsTqVI1zILc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopCsl%2FbtszeH68CxL%2FLCvjQwJ0uTpsTqVI1zILc1%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; alt=&quot;gcs 로고&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;177&quot; data-filename=&quot;google-cloud-storage-logo.jpg&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Google Cloud Storage(GCS)란 구글 클라우드에서 제공하는 클라우드 객체 저장소로 AWS의 S3와 유사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지, 미디어, 백업 데이터 등 구조화 되어있지 않은 바이너리 또는 객체 데이터의 저장 용도로 적합하며, GCS 역시 여러 리전에 동일한 레플리카를 만들어 높은 가용성과 장애 복구 등이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 서비스 계정을 사용해 외부 접근을 막고 데이터를 안전하게 보관할 수 있지만, 여기서는 외부 액세스를 허용하기 위한 공개 스토리지의 구축이 목적이기 때문에 바로 만들어보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.14.04 AM.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yn6FM/btszcRoS11Y/z7cnBThxYHTokSfTijXqKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yn6FM/btszcRoS11Y/z7cnBThxYHTokSfTijXqKK/img.png&quot; data-alt=&quot;클라우드 스토리지 버킷 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yn6FM/btszcRoS11Y/z7cnBThxYHTokSfTijXqKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyn6FM%2FbtszcRoS11Y%2Fz7cnBThxYHTokSfTijXqKK%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; alt=&quot;버킷&quot; loading=&quot;lazy&quot; width=&quot;268&quot; height=&quot;428&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.14.04 AM.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;549&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;버킷의 이름, 리전 등 설정을 하고 객체 액세스를 제어하는 방식에서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.17.43 AM.png&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRa8VT/btszdqYQI5H/mmMxjFXLsxQkC1NvLlWyfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRa8VT/btszdqYQI5H/mmMxjFXLsxQkC1NvLlWyfk/img.png&quot; data-alt=&quot;공개 액세스가 목적이니 체크를 해제해줍니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRa8VT/btszdqYQI5H/mmMxjFXLsxQkC1NvLlWyfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRa8VT%2FbtszdqYQI5H%2FmmMxjFXLsxQkC1NvLlWyfk%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; alt=&quot;액세스 방지 해제&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;246&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.17.43 AM.png&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;272&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;버킷이 생성되었으면, 저장된 이미지를 모두가 볼 수 있도록 버킷의 권한을 수정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.22.12 AM.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDazQ6/btszb6GJpl9/Q3uet6hr5a9vjGY6k2mAXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDazQ6/btszb6GJpl9/Q3uet6hr5a9vjGY6k2mAXk/img.png&quot; data-alt=&quot;권한 탭 -&amp;amp;gt; 액세스 권한 부여&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDazQ6/btszb6GJpl9/Q3uet6hr5a9vjGY6k2mAXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDazQ6%2Fbtszb6GJpl9%2FQ3uet6hr5a9vjGY6k2mAXk%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; alt=&quot;액세스 권한 부여&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;492&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.22.12 AM.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;권한 탭 -&amp;gt; 액세스 권한 부여&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.24.58 AM.png&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1L8Ey/btszbXiP7dD/ivmsGTgXt7n6VOC1TxKNvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1L8Ey/btszbXiP7dD/ivmsGTgXt7n6VOC1TxKNvk/img.png&quot; data-alt=&quot;모든 유저에게 읽기 권한 부여&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1L8Ey/btszbXiP7dD/ivmsGTgXt7n6VOC1TxKNvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1L8Ey%2FbtszbXiP7dD%2FivmsGTgXt7n6VOC1TxKNvk%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; alt=&quot;권한 부여&quot; loading=&quot;lazy&quot; width=&quot;476&quot; height=&quot;321&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.24.58 AM.png&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;366&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;이제 해당 스토리지의 객체들을 공개할 준비가 끝났습니다.&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;이미지를 GCS에 저장&lt;/b&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;base64 형태로 인코딩 된 데이터를 GCS에 저장하면 되는데, 저는 python의 google-cloud-storage 모듈을 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;requirement.txt에 &lt;b&gt;google-cloud-storage&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;Screenshot 2023-10-27 at 3.33.00 AM.png&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qERyU/btszfM78o8o/z02FBrkVkgIrMbgtqKSLkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qERyU/btszfM78o8o/z02FBrkVkgIrMbgtqKSLkk/img.png&quot; data-alt=&quot;이미지 저장을 위한 모듈들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qERyU/btszfM78o8o/z02FBrkVkgIrMbgtqKSLkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqERyU%2FbtszfM78o8o%2Fz02FBrkVkgIrMbgtqKSLkk%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; alt=&quot;모듈들&quot; loading=&quot;lazy&quot; width=&quot;241&quot; height=&quot;57&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.33.00 AM.png&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;57&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;uuid는 저장할 파일 이름을 유니크하게 생성하는 역할이고, base64는 인코딩 된 이미지를 다시 디코딩하는 역할, storage는 gcs에 접근하기 위해 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.41.33 AM.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c32vaz/btszdfwrBC3/N9mENcE9Va3jNCklEuLoSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c32vaz/btszdfwrBC3/N9mENcE9Va3jNCklEuLoSk/img.png&quot; data-alt=&quot;저장 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c32vaz/btszdfwrBC3/N9mENcE9Va3jNCklEuLoSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc32vaz%2FbtszdfwrBC3%2FN9mENcE9Va3jNCklEuLoSk%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; alt=&quot;예제 코드&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;337&quot; data-filename=&quot;Screenshot 2023-10-27 at 3.41.33 AM.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;337&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;예제 코드의 흐름은 크게&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;GCS 클라이언트 객체 생성&lt;/li&gt;
&lt;li&gt;저장될 파일 명 생성&lt;/li&gt;
&lt;li&gt;Bucket에 Blob 엔티티 생성, 파일 업로드&lt;/li&gt;
&lt;li&gt;공개 url 사용&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;위 과정을 통해 쉽게 GCS에 파일을 저장할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;❗️ 유의점 &lt;b&gt;❗️&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 환경에서 Cloud Storage에 업로드 해보려고 하면, 권한이 없어서 실패하게됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;allUsers가 볼 수 있게 했지만, 파일의 업로드는 &lt;b&gt;권한이 있는 사용자만 가능&lt;/b&gt;하기 때문인데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 로컬에서 사용하기 위해 json 포맷의 &lt;b&gt;인증 키&lt;/b&gt;와 &lt;b&gt;환경 변수&lt;/b&gt;가 필요하지만, 저희가 작성중인 Cloud Functions에서는 이러한 인증 관련 설정이 되어있어 동일 프로젝트 내에서는 쉽게 접근할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 권한 관련 설명은 해당 포스팅에서는 다루지 않겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 저장하고 public url을 획득했다면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;글의 제목&lt;/li&gt;
&lt;li&gt;메뉴에 대한 설명&lt;/li&gt;
&lt;li&gt;메뉴에 대한 재료와 조리법&lt;/li&gt;
&lt;li&gt;메뉴 이미지의 url&lt;/li&gt;
&lt;/ul&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;이제 이 정보를 가지고 티스토리 API를 통해 블로그에 포스팅을 해야하는데, 이 부분은 다음 포스팅에서 &lt;b&gt;Google Cloud Scheduler&lt;/b&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;황홀.gif&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZhxff/btszcnO578L/WjBPS5UdKsb1oQ2GRj2h81/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZhxff/btszcnO578L/WjBPS5UdKsb1oQ2GRj2h81/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZhxff/btszcnO578L/WjBPS5UdKsb1oQ2GRj2h81/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cZhxff/btszcnO578L/WjBPS5UdKsb1oQ2GRj2h81/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; alt=&quot;짱종원&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;293&quot; data-filename=&quot;황홀.gif&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글이 드디어 마지막 글이군요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글이 도움이 되셨다면 광고를 보셔도 좋고, 댓글을 달아주셔도 좋습니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>aws S3</category>
      <category>Blob</category>
      <category>GCS</category>
      <category>Google Cloud Storage</category>
      <category>챗종원</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/104</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-5#entry104comment</comments>
      <pubDate>Fri, 27 Oct 2023 04:01:57 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] AI 요리 블로거 챗종원 개발기 -4</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. GPT로 만드는 삼시세끼 요리 블로거, &lt;b&gt;챗종원 설명회&lt;/b&gt;가 이제 막 중간 정도를 지났습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념 설명할 때에는 틀린 부분이 없도록 교차검증하느라 포스팅에 시간을 많이 갈아 넣어야 했는데, 그냥 했던 거 설명만 하니까 시리즈 물임에도 부담이 적고 금방금방 쓰는 것 같네요.. 굿&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;지난 포스팅을 통해 인증 후에 티스토리 Access Token을 처리하고, 메뉴를 추천받고 다루기 편하게 JSON 포맷으로 변환하는 과정까지 설명했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;중간 점검&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 일련의 과정을 통해&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;오늘 추천드릴 메뉴는 팬케이크입니다. 부드럽고 달콤한 팬케이크는 만들기가 어렵지 않으며, 맛있는 아침식사나 간식대용으로 유용합니다.&lt;br /&gt;우선 팬케이크를 만들기 위해 달걀과 우유를...&lt;/blockquote&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;이러한 자연어는 Json 변환 과정을 거쳐&lt;/p&gt;
&lt;pre id=&quot;code_1698330191891&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;title&quot;: &quot;팬케이크&quot;,
  &quot;description&quot;: &quot;팬케이크는 간단하면서도 맛있는 아침식사나 간식으로 좋습니다. 부드럽고 달콤한 맛이 인기입니다.&quot;,
  &quot;content&quot;: &quot;재료:\n1. 달걀\n2. 우유 ...&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;이번 포스팅에서는 이렇게 가공된 데이터를 통해, 글의 내용과 어울리는 사진을 생성해 보는 시간을 가지겠습니다.&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;DALL-E&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dalle.webp&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dowhRK/btszgkXJKfS/iNG2QfyrG4hWlVXwGuigA1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dowhRK/btszgkXJKfS/iNG2QfyrG4hWlVXwGuigA1/img.webp&quot; data-alt=&quot;OpenAI Dall-E&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dowhRK/btszgkXJKfS/iNG2QfyrG4hWlVXwGuigA1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdowhRK%2FbtszgkXJKfS%2FiNG2QfyrG4hWlVXwGuigA1%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; alt=&quot;dall-E logo&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;189&quot; data-filename=&quot;dalle.webp&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OpenAI Dall-E&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뉴스나 각종 매체를 통해 대화형 인공지능 서비스인 Chat GPT는 이제 모르는 사람이 없는 것 같지만, &lt;b&gt;텍스트 기반의 이미지 생성 모델&lt;/b&gt;인 DALL-E에 대해서는 아직 모르는 사람이 많다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chat GPT와 마찬가지로 OpenAI에서 개발한 인공지능 모델인 DALL-E는 달리라고 발음되며,&amp;nbsp;입력되는 텍스트를 이해하고 이미지로 구현해 줍니다.&lt;/p&gt;
&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;Dall-E 2.0 API&lt;/b&gt;를 통해 &lt;b&gt;음식의 이미지를 생성&lt;/b&gt;하는 용도로 사용하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로 위에 만들어진 JSON의 title 속성에 접근하면 &quot;팬케이크&quot;라는 값을 얻을 수 있는데, 프롬프트에&lt;/p&gt;
&lt;pre id=&quot;code_1698331909363&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;f&quot;{}의 이미지를 만들어줘&quot;.format(json_data[&quot;title&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;그러면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;팬케이크.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfUVZx/btszf4OfvoM/SgV3eWkoFXqSyNbneYDrXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfUVZx/btszf4OfvoM/SgV3eWkoFXqSyNbneYDrXK/img.png&quot; data-alt=&quot;실제 Dall-E 2.0을 통해 생성된 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfUVZx/btszf4OfvoM/SgV3eWkoFXqSyNbneYDrXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfUVZx%2Fbtszf4OfvoM%2FSgV3eWkoFXqSyNbneYDrXK%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; alt=&quot;달리 이미지&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;418&quot; data-filename=&quot;팬케이크.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제 Dall-E 2.0을 통해 생성된 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 이미지가 생성이 됩니다!&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;❗️ 문제점 ❗️&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 여기서 약간의 문제가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글을 쓰는 시점은 23년 10월 26일인데, &lt;b&gt;Dall-E 3.0&lt;/b&gt;의 API가 아직 공개가 되지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dall-E 2.0을 사용해 이미지 생성을 해야 하는데, 한국말을 학습하지 못해서 한국어 그대로 입력하면 사용할 수 없는 이미지를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진 역시 영어로 한 번 번역한 후에 입력한 결과이구요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 여기서 프롬프트를 그대로 입력하지 않고 국문을 &lt;b&gt;영문으로 번역&lt;/b&gt;하는 과정을 한 번 더 거쳐야 하는데, 저는 네이버의 파파고 API를 사용해 프롬프트를 영어로 변환했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Naver API 등록 과정은 앞선 Tistory나 OpenAI와 유사하니 생략하도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 12.18.26 AM.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0riy6/btszcpTEt1u/2ytulraoFTGgvOsVEEKX01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0riy6/btszcpTEt1u/2ytulraoFTGgvOsVEEKX01/img.png&quot; data-alt=&quot;한국어로 된 프롬프트를 영문으로 변환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0riy6/btszcpTEt1u/2ytulraoFTGgvOsVEEKX01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0riy6%2FbtszcpTEt1u%2F2ytulraoFTGgvOsVEEKX01%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; alt=&quot;ko to en&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;178&quot; data-filename=&quot;Screenshot 2023-10-27 at 12.18.26 AM.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;201&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;이제 영문 프롬프트까지 완성했으니 Dall E에게 요청해 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-27 at 12.22.53 AM.png&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rHTFT/btszbVFi043/qQuJkXC4oMnE6yKDZJdhoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rHTFT/btszbVFi043/qQuJkXC4oMnE6yKDZJdhoK/img.png&quot; data-alt=&quot;영문 프롬프트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rHTFT/btszbVFi043/qQuJkXC4oMnE6yKDZJdhoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrHTFT%2FbtszbVFi043%2FqQuJkXC4oMnE6yKDZJdhoK%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;258&quot; height=&quot;128&quot; data-filename=&quot;Screenshot 2023-10-27 at 12.22.53 AM.png&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;128&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;위 요청에서 매개변수인 n은 생성할 이미지의 수이고 size는 256x256, 512x512, 1024x1024 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주목할 점은 response_format의 값이 &lt;b&gt;b64_json&lt;/b&gt;으로 되어있다는 점인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;response_format으로 들어갈 수 있는 값은 url과 b64_json 두 가지가 있지만, 해당 로직에서는 b64_json을 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b64_json을 응답 포맷으로 선택하면 &lt;b&gt;base64 방식으로 인코딩&lt;/b&gt; 된 이미지를 반환하게 됩니다. 이 데이터는 url을 통해 이미지에 접근하는 게 아니라 디코딩해서 바로 이미지 변환이 가능한 &lt;b&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;url을 그냥 받아서 블로그에 올리면 되는 게 아닌가? 하시겠지만 Dall E가 &lt;b&gt;이미지를 생성한 이후에, 약 3시간이 지나면 링크가 만료되어 버리는&lt;/b&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;크헉.gif&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P80mz/btszhrPHY4P/v0J0UlCaBNsvEUFNmnumWk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P80mz/btszhrPHY4P/v0J0UlCaBNsvEUFNmnumWk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P80mz/btszhrPHY4P/v0J0UlCaBNsvEUFNmnumWk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/P80mz/btszhrPHY4P/v0J0UlCaBNsvEUFNmnumWk/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;520&quot; height=&quot;293&quot; data-filename=&quot;크헉.gif&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 직접 생성된 이미지를 저장하고 호스팅 해야 하는데, 해당 프로젝트의 전체적인 기조에 따라 정적 파일의 호스팅 역시 서버리스로 진행했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 Json 포맷으로 가공된 데이터를 통해 &lt;b&gt;영문으로 이루어진 프롬프트를 생성&lt;/b&gt;, Dall-E에게 이미지를 생성하는 방법까지 다루었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 포함해서 컨텐츠는 이제 다 만들었고, 이제는 저장 후에 포스팅만 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 시간에는 생성된 이미지를 구글의 클라우드 저장소인 &lt;b&gt;GCS(Google Cloud Storage)&lt;/b&gt;를 통해 호스팅하고 티스토리에 포스팅하는 과정을 설명해 보도록 하겠습니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>Dall E</category>
      <category>GCS</category>
      <category>GPT</category>
      <category>Open AI</category>
      <category>papago</category>
      <category>챗종원</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/103</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-4#entry103comment</comments>
      <pubDate>Fri, 27 Oct 2023 00:51:05 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] AI 요리 블로거 챗종원 개발기 -3</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;앞선 1부와 2부에서 서비스의 전체 청사진 및 티스토리 Token의 &lt;b&gt;영속성&lt;/b&gt;을 위한 인증 후 Access Token의 처리 과정에 대해 소개했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 포스팅에서는 Open AI의 GPT API를 통해 메뉴를 추천받고, 자연어로 이루어진 데이터를 Json으로 정제하는 과정에 대해 설명하겠습니다.&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;Workflow&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파트는 크게 &lt;b&gt;메뉴를 추천하는 모듈&lt;/b&gt;과, 자연어를 &lt;b&gt;Json 형식으로 변형&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;두 파트를 구분 지어 개발한 이유는 자연어를 Json 형식으로 변형하는 부분의 &lt;b&gt;범용성이 크다고 생각&lt;/b&gt;해서, 추후 요리 도메인이 아닌 다른 서비스를 개발할 때 유용하게 &lt;b&gt;재사용이 가능&lt;/b&gt;하기 때문&amp;nbsp;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파트의 흐름은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-26 at 7.58.58 PM.png&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;1216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V9i2K/btszgBdQDOi/zKVnMct0hBIri7q0erUYHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V9i2K/btszgBdQDOi/zKVnMct0hBIri7q0erUYHK/img.png&quot; data-alt=&quot;Request 시, 메뉴 추천 -&amp;amp;gt; Json 형태로 변환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V9i2K/btszgBdQDOi/zKVnMct0hBIri7q0erUYHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV9i2K%2FbtszgBdQDOi%2FzKVnMct0hBIri7q0erUYHK%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; alt=&quot;메뉴 추천&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;408&quot; data-filename=&quot;Screenshot 2023-10-26 at 7.58.58 PM.png&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;1216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Request 시, 메뉴 추천 -&amp;gt; Json 형태로 변환&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OPENAI API&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 외부 API를 사용하기 위해 API Key와 조직을 등록해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OPENAI의 API 키를 발급받고, 이를 사용하는 방법은 이전 글에 포스팅했으니 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.ymon.io/entry/WEB-Jira-Automation%EA%B3%BC-GPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%97%EB%B4%87-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9C%EB%B0%9C%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.10.24 - [WEB] - [WEB] Jira Automation과 GPT를 활용한 챗봇 프로토타입 개발기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698318383581&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] Jira Automation과 GPT를 활용한 챗봇 프로토타입 개발기&quot; data-og-description=&quot;최근 다양한 산업에서 효율성 제고를 위해 인공지능을 활용한 단순 반복 업무의 자동화에 많은 관심을 기울이고 있습니다. 본 포스팅에서는 문의에 대해 자동으로 답변을 생성하고 응답하는, &quot; data-og-host=&quot;blog.ymon.io&quot; data-og-source-url=&quot;https://blog.ymon.io/entry/WEB-Jira-Automation%EA%B3%BC-GPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%97%EB%B4%87-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9C%EB%B0%9C%EA%B8%B0&quot; data-og-url=&quot;https://blog.ymon.io/entry/WEB-Jira-Automation%EA%B3%BC-GPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%97%EB%B4%87-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9C%EB%B0%9C%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgUjDG/hyUkblxqK5/diTYIvJfIWthCvyHfD9Si1/img.png?width=459&amp;amp;height=180&amp;amp;face=0_0_459_180,https://scrap.kakaocdn.net/dn/vjcFf/hyUj92i1tR/eRkmkNXDdkRr7jZmQ1kKZk/img.png?width=459&amp;amp;height=180&amp;amp;face=0_0_459_180,https://scrap.kakaocdn.net/dn/F9lx3/hyUkcEJojM/xIvyU9wp8gv550DbZkyAz1/img.png?width=1722&amp;amp;height=598&amp;amp;face=0_0_1722_598&quot;&gt;&lt;a href=&quot;https://blog.ymon.io/entry/WEB-Jira-Automation%EA%B3%BC-GPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%97%EB%B4%87-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9C%EB%B0%9C%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.ymon.io/entry/WEB-Jira-Automation%EA%B3%BC-GPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%97%EB%B4%87-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9C%EB%B0%9C%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgUjDG/hyUkblxqK5/diTYIvJfIWthCvyHfD9Si1/img.png?width=459&amp;amp;height=180&amp;amp;face=0_0_459_180,https://scrap.kakaocdn.net/dn/vjcFf/hyUj92i1tR/eRkmkNXDdkRr7jZmQ1kKZk/img.png?width=459&amp;amp;height=180&amp;amp;face=0_0_459_180,https://scrap.kakaocdn.net/dn/F9lx3/hyUkcEJojM/xIvyU9wp8gv550DbZkyAz1/img.png?width=1722&amp;amp;height=598&amp;amp;face=0_0_1722_598');&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] Jira Automation과 GPT를 활용한 챗봇 프로토타입 개발기&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;blog.ymon.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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;메뉴 추천&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-26 at 9.31.50 PM.png&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vRkQO/btszb8doOnv/K3jhUiXrKZ49DBXxiYPy01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vRkQO/btszb8doOnv/K3jhUiXrKZ49DBXxiYPy01/img.png&quot; data-alt=&quot;메뉴 추천을 위한 명령 프롬프트 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vRkQO/btszb8doOnv/K3jhUiXrKZ49DBXxiYPy01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvRkQO%2Fbtszb8doOnv%2FK3jhUiXrKZ49DBXxiYPy01%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; alt=&quot;프롬프트&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;128&quot; data-filename=&quot;Screenshot 2023-10-26 at 9.31.50 PM.png&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;162&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;위와 같은 요청에서 GPT는 메뉴 명, 메뉴에 대한 설명, 필요한 재료와 요리 순서를 포함한 자연어를 응답하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 해당 서비스는 다음 서비스에게 해당 자연어를 담은 요청을 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Json 변환&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-26 at 9.36.35 PM.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpJ7Dx/btszbPE2WDh/UNVCksDSenaf9neNCV3vOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpJ7Dx/btszbPE2WDh/UNVCksDSenaf9neNCV3vOk/img.png&quot; data-alt=&quot;자연어를 Json 포맷으로 변환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpJ7Dx/btszbPE2WDh/UNVCksDSenaf9neNCV3vOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpJ7Dx%2FbtszbPE2WDh%2FUNVCksDSenaf9neNCV3vOk%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; alt=&quot;json 프롬프트&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;205&quot; data-filename=&quot;Screenshot 2023-10-26 at 9.36.35 PM.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자연어를 Json 포맷으로 변환&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 언어로 구현하거나, 다른 프로토콜로 구현할 수 있기 때문에 코드에 대한 설명은 최대한 덜어냈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외의 처리나, 아키텍처 설계는 편의에 맞게 구현하시면 될 것 같습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✅ 참고&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메뉴 추천은 GPT-4 모델을 사용&lt;/li&gt;
&lt;li&gt;자연어를 Json 포맷으로 변환하는 용도로는 GPT-3.5-turbo 모델을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 간단한 과정을 통해 메뉴를 추천받고 다루기 쉽게 Json 포맷으로 변환했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;말이나.jpeg&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bisbSy/btszcqydBYc/FFQSuZB2jQKokfiSABQ0kK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bisbSy/btszcqydBYc/FFQSuZB2jQKokfiSABQ0kK/img.jpg&quot; data-alt=&quot;이걸 먹겠어유?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bisbSy/btszcqydBYc/FFQSuZB2jQKokfiSABQ0kK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbisbSy%2FbtszcqydBYc%2FFFQSuZB2jQKokfiSABQ0kK%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;610&quot; height=&quot;343&quot; data-filename=&quot;말이나.jpeg&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;370&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;&lt;b&gt;음식 사진&lt;/b&gt;이 있어야겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 음식 사진을 인터넷에서 찾아서 올리기에는 저작물을 마음대로 가져오는 행위가 될 수 있어 주의가 필요한 부분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하는 방법을 다음 글에서 설명하겠습니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>ai 블로그</category>
      <category>google cloud function</category>
      <category>openAI</category>
      <category>서버리스</category>
      <category>챗종원</category>
      <category>티스토리 api</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/102</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-3#entry102comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:55:40 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] AI 요리 블로거 챗종원 개발기 -2</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1부에서 전체 프로젝트의 구조와 필요 기능에 대해 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 티스토리 인증 API를 활용해 Access Code를 얻고, 이를 관리하는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Tistory API를 사용하기 위해서는 APP을 등록하고, API 키를 발급받아야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크에서 API 키를 발급받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;API 등록 및 키 발급&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1698164528003&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;Tistory&quot; data-og-description=&quot;좀 아는 블로거들의 유용한 이야기&quot; data-og-host=&quot;www.tistory.com&quot; data-og-source-url=&quot;https://www.tistory.com/guide/api/manage/register&quot; data-og-url=&quot;https://www.tistory.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cBvmGr/hyUkbL3Q2N/0Xw04F0N4DBvLldkxhRafk/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/f4vcz/hyUltr6NG4/A1wFIoKt2DpMCnNJSshkO0/img.jpg?width=1200&amp;amp;height=900&amp;amp;face=0_0_1200_900,https://scrap.kakaocdn.net/dn/cgjvZ2/hyUgKbxNqr/ky9Nv7HhSF2dT5h0YcRMT1/img.jpg?width=1200&amp;amp;height=900&amp;amp;face=0_0_1200_900&quot;&gt;&lt;a href=&quot;https://www.tistory.com/guide/api/manage/register&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tistory.com/guide/api/manage/register&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cBvmGr/hyUkbL3Q2N/0Xw04F0N4DBvLldkxhRafk/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/f4vcz/hyUltr6NG4/A1wFIoKt2DpMCnNJSshkO0/img.jpg?width=1200&amp;amp;height=900&amp;amp;face=0_0_1200_900,https://scrap.kakaocdn.net/dn/cgjvZ2/hyUgKbxNqr/ky9Nv7HhSF2dT5h0YcRMT1/img.jpg?width=1200&amp;amp;height=900&amp;amp;face=0_0_1200_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Tistory&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;좀 아는 블로거들의 유용한 이야기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 등록을 시도합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.23.03 AM.png&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HQcp4/btsy9PXqeJI/oV3yuTCbujszCG3bA0Xy31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HQcp4/btsy9PXqeJI/oV3yuTCbujszCG3bA0Xy31/img.png&quot; data-alt=&quot;빈칸을 채우고 API 키 발급 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HQcp4/btsy9PXqeJI/oV3yuTCbujszCG3bA0Xy31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHQcp4%2Fbtsy9PXqeJI%2FoV3yuTCbujszCG3bA0Xy31%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;513&quot; height=&quot;333&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.23.03 AM.png&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;934&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빈칸을 채우고 API 키 발급 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Callback은 나중에 수정될테니 서비스 명, 설명을 간략히 작성합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 URL은 도메인을 기입하거나, 없다면 블로그 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;edited_Screenshot 2023-10-25 at 1.26.46 AM.png&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnLdji/btsy8bfTscK/kajTKQLJvDWCzIJsnqXxWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnLdji/btsy8bfTscK/kajTKQLJvDWCzIJsnqXxWk/img.png&quot; data-alt=&quot;App ID와 Secret Key 저장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnLdji/btsy8bfTscK/kajTKQLJvDWCzIJsnqXxWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnLdji%2Fbtsy8bfTscK%2FkajTKQLJvDWCzIJsnqXxWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;473&quot; data-filename=&quot;edited_Screenshot 2023-10-25 at 1.26.46 AM.png&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1348&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;App ID와 Secret Key 저장&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;b&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;우선 Tistory의 인증 방식을 이해 해야할텐데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tistory API 문서를 같이 보시죠&lt;/p&gt;
&lt;figure id=&quot;og_1698163904121&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;Authorization Code 방식 &amp;middot; GitBook&quot; data-og-description=&quot;No results matching &amp;quot;&amp;quot;&quot; data-og-host=&quot;tistory.github.io&quot; data-og-source-url=&quot;https://tistory.github.io/document-tistory-apis/auth/authorization_code.html&quot; data-og-url=&quot;https://tistory.github.io/document-tistory-apis/auth/authorization_code.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tistory.github.io/document-tistory-apis/auth/authorization_code.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tistory.github.io/document-tistory-apis/auth/authorization_code.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;Authorization Code 방식 &amp;middot; GitBook&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;No results matching &quot;&quot;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tistory.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 문서를 보면 OAuth 2.0 방식을 사용한다고 적혀있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 작성했던 인증 관련 글들을 첨부하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.ymon.io/entry/%EC%9D%B8%EC%A6%9D-vs-%EC%9D%B8%EA%B0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.01.23 - [WEB] - 인증 vs 인가&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.ymon.io/entry/OAuth-20-OAuth-20%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EA%B8%80-%EC%9C%A0%EC%A0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.01.27 - [WEB] - OAuth 2.0) OAuth 2.0으로 구글 유저 정보 가져오기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698168156225&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;OAuth 2.0) OAuth 2.0으로 구글 유저 정보 가져오기&quot; data-og-description=&quot;OAuth란? Open Authorization, 외부 어플리케이션에서 다른 서비스를 이용할 때 필요한 인증과 권한 부여를 위한 개방형 표준 프로토콜로 아래 인증과 인가의 차이를 이해하는 편이 좋습니다. 2023.01.23 -&quot; data-og-host=&quot;blog.ymon.io&quot; data-og-source-url=&quot;https://blog.ymon.io/entry/OAuth-20-OAuth-20%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EA%B8%80-%EC%9C%A0%EC%A0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0&quot; data-og-url=&quot;https://blog.ymon.io/entry/OAuth-20-OAuth-20%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EA%B8%80-%EC%9C%A0%EC%A0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cw66B6/hyUj8oh7Bc/XKdOXk4aTYwo5WNSwwTSIK/img.png?width=800&amp;amp;height=340&amp;amp;face=0_0_800_340,https://scrap.kakaocdn.net/dn/bYpRGq/hyUlrHO198/DCoRjjSS2ShjokelkvX49K/img.png?width=800&amp;amp;height=340&amp;amp;face=0_0_800_340,https://scrap.kakaocdn.net/dn/HWnVd/hyUltMp2jT/QUmAVTtmd2irrEMTtoWGdk/img.png?width=906&amp;amp;height=1006&amp;amp;face=0_0_906_1006&quot;&gt;&lt;a href=&quot;https://blog.ymon.io/entry/OAuth-20-OAuth-20%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EA%B8%80-%EC%9C%A0%EC%A0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.ymon.io/entry/OAuth-20-OAuth-20%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EA%B8%80-%EC%9C%A0%EC%A0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cw66B6/hyUj8oh7Bc/XKdOXk4aTYwo5WNSwwTSIK/img.png?width=800&amp;amp;height=340&amp;amp;face=0_0_800_340,https://scrap.kakaocdn.net/dn/bYpRGq/hyUlrHO198/DCoRjjSS2ShjokelkvX49K/img.png?width=800&amp;amp;height=340&amp;amp;face=0_0_800_340,https://scrap.kakaocdn.net/dn/HWnVd/hyUltMp2jT/QUmAVTtmd2irrEMTtoWGdk/img.png?width=906&amp;amp;height=1006&amp;amp;face=0_0_906_1006');&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;OAuth 2.0) OAuth 2.0으로 구글 유저 정보 가져오기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OAuth란? Open Authorization, 외부 어플리케이션에서 다른 서비스를 이용할 때 필요한 인증과 권한 부여를 위한 개방형 표준 프로토콜로 아래 인증과 인가의 차이를 이해하는 편이 좋습니다. 2023.01.23 -&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.ymon.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인증 처리 로직 구현&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.33.47 AM.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9A1vp/btsy04idbYK/oIDO7mMkKufSneac0Gok51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9A1vp/btsy04idbYK/oIDO7mMkKufSneac0Gok51/img.png&quot; data-alt=&quot;인증 1단계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9A1vp/btsy04idbYK/oIDO7mMkKufSneac0Gok51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9A1vp%2Fbtsy04idbYK%2FoIDO7mMkKufSneac0Gok51%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; alt=&quot;요청 및 코드 발급&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;369&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.33.47 AM.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;940&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;&lt;b&gt;~/oauth/authorize&lt;/b&gt;에 client_id와 redirect_uri, response_type을 쿼리로 전송하면 인증 페이지로 이동하게 되고 사용자가 인증하면 redirect_uri의 주소로&amp;nbsp;&lt;b&gt;Authentication Code&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;Screenshot 2023-10-25 at 1.41.01 AM.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mxvJf/btsy9hs3ZSY/h6A50R1wiKvvcsMHNDLWY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mxvJf/btsy9hs3ZSY/h6A50R1wiKvvcsMHNDLWY1/img.png&quot; data-alt=&quot;API 사용자가 구현해야함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mxvJf/btsy9hs3ZSY/h6A50R1wiKvvcsMHNDLWY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmxvJf%2Fbtsy9hs3ZSY%2Fh6A50R1wiKvvcsMHNDLWY1%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; alt=&quot;리디렉션&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;257&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.41.01 AM.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;API 사용자가 구현해야함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 authorization-code를 받아 처리를 할 수 있는 엔드 포인트를 구현해 App 설정의 redirect_uri에 입력해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 Cloud Function을 이용했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698165986666&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def cb(request):
    args = request.args
    code = args.get('code', None)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;code로 들어온 code를 확인해주고, 적절한 예외 처리를 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수의 End-Point가 redirect_uri의 인자로 들어간다고 생각하시고, 아까 앱 등록할 때 비워두었던 Callback란에 넣어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2023-10-25 at 1.53.59 AM.png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4g7AB/btsy7eRsDTa/1bLOYA4IkFNySW7iiUJ7AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4g7AB/btsy7eRsDTa/1bLOYA4IkFNySW7iiUJ7AK/img.png&quot; data-alt=&quot;Cloud Functions에서 받은 url 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4g7AB/btsy7eRsDTa/1bLOYA4IkFNySW7iiUJ7AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4g7AB%2Fbtsy7eRsDTa%2F1bLOYA4IkFNySW7iiUJ7AK%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; alt=&quot;Callback Url&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;61&quot; data-filename=&quot;edited_Screenshot 2023-10-25 at 1.53.59 AM.png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud Functions에서 받은 url 입력&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;이제 OAuth 2.0 플로우에서 Authentication Code의 발급까지 마쳤는데, 이제 이 코드를 통해 실제 API 사용을 위한 Access Token의 발급 과정이 필요합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.48.23 AM.png&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;1360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WZLr2/btsy5eKXnRZ/OJpq5raP6TcX44SAAPMrg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WZLr2/btsy5eKXnRZ/OJpq5raP6TcX44SAAPMrg0/img.png&quot; data-alt=&quot;실제 API 사용에 필요한 Access Token 발급 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WZLr2/btsy5eKXnRZ/OJpq5raP6TcX44SAAPMrg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWZLr2%2Fbtsy5eKXnRZ%2FOJpq5raP6TcX44SAAPMrg0%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; alt=&quot;Access Token 발급&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;487&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.48.23 AM.png&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;1360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제 API 사용에 필요한 Access Token 발급 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방금 요청을 통해 얻은 &lt;b&gt;code&lt;/b&gt;는 code=부분에 들어가게됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 인자인 &lt;b&gt;client_id&lt;/b&gt;는 APP 등록 시 얻은 App ID, &lt;b&gt;client_Secret&lt;/b&gt; 역시 등록하며 얻은 Secret, &lt;b&gt;redirect_uri&lt;/b&gt;는 code를 처리할 함수의 End-Point로 넣어주고 &lt;b&gt;grant_type&lt;/b&gt;=authorization_code 적어주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.45.16 AM.png&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Licvx/btsy9fIOFSX/EZQr55kFJqCsbUgjcjsHs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Licvx/btsy9fIOFSX/EZQr55kFJqCsbUgjcjsHs0/img.png&quot; data-alt=&quot;/oauth/access_token에 요청 후 access_token 발급&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Licvx/btsy9fIOFSX/EZQr55kFJqCsbUgjcjsHs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLicvx%2Fbtsy9fIOFSX%2FEZQr55kFJqCsbUgjcjsHs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;219&quot; data-filename=&quot;Screenshot 2023-10-25 at 1.45.16 AM.png&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;/oauth/access_token에 요청 후 access_token 발급&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;code를 받아서 params를 채우고 /oauth/access_token에 요청을 하면 &lt;b&gt;access_token&lt;/b&gt;을 발급받게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이후 요청에서 사용하기 위해 데이터베이스에 저장했습니다..만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;access_token을 발급받는데에는 사용자가 인증 페이지에서 로그인을 해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;찾아보니 access_token의 만료 기간이 한 달이라고 하지만, refresh_token 등 로그인 이후에 자동으로 토큰을 재발급하는 방법이 구현되어있지 않아 한 달에 한 번은 사용자가 직접 인증 과정을 거쳐야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이것도 귀찮다면 Selenium을 통해 로그인까지 자동화를 할 수 있으니, 관심 있으신 분은 찾아보시면 좋을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OAuth 2.0 플로우에 대한 이해를 돕기 위해 전체 흐름을 시각화해보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Slide7.jpeg&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T65n6/btsy44BH8zG/8XNGWugJPi5i7F2pkIMa9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T65n6/btsy44BH8zG/8XNGWugJPi5i7F2pkIMa9k/img.jpg&quot; data-alt=&quot;인증 모듈의 전체적인 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T65n6/btsy44BH8zG/8XNGWugJPi5i7F2pkIMa9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT65n6%2Fbtsy44BH8zG%2F8XNGWugJPi5i7F2pkIMa9k%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;569&quot; height=&quot;320&quot; data-filename=&quot;Slide7.jpeg&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;405&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;+ 추가로 저는  토큰을 서버리스 DB인 Cloud SQL을 통해 저장했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-25 at 2.13.34 AM.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C9DBQ/btsy5fQB8h4/4U0scyari991VxUowRR2pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C9DBQ/btsy5fQB8h4/4U0scyari991VxUowRR2pK/img.png&quot; data-alt=&quot;소잡는 칼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C9DBQ/btsy5fQB8h4/4U0scyari991VxUowRR2pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC9DBQ%2Fbtsy5fQB8h4%2F4U0scyari991VxUowRR2pK%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; alt=&quot;비용&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;109&quot; data-filename=&quot;Screenshot 2023-10-25 at 2.13.34 AM.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;230&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;아무리 메모리, CPU 적게 잡고 최대한 비용 낮추어도 cloud functions보다 30배 비용이 더 발생하는데요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Cloud Storage에 파일로 저장하고 IAM으로 비공개 접근하던가, 아니면 로그인 할 때마다 환경변수를 바꿔주는 편이 훨씬 경제적이라고 생각됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현명한 판단을 하십시오.. 저처럼 판단미스를 하지 말기 바랍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 API를 통해 access token을 발급받고 저장하는 방법을 다루어 보았습니다.&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;faab12b6ba40e20815a4fa63adfe537c.jpg&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AgbyF/btsy9S0SYoD/Sd3FLUDdtXPAaXpSSmf2M0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AgbyF/btsy9S0SYoD/Sd3FLUDdtXPAaXpSSmf2M0/img.jpg&quot; data-alt=&quot;도움이 되었나유?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AgbyF/btsy9S0SYoD/Sd3FLUDdtXPAaXpSSmf2M0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAgbyF%2Fbtsy9S0SYoD%2FSd3FLUDdtXPAaXpSSmf2M0%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;227&quot; height=&quot;222&quot; data-filename=&quot;faab12b6ba40e20815a4fa63adfe537c.jpg&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;222&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;포스팅이 도움이 되었다면, 구독해주시고 광고도 좀 구경하셨으면 좋겠습니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>Cloud Functions</category>
      <category>Tistory API</category>
      <category>개발</category>
      <category>서버리스</category>
      <category>인증</category>
      <category>챗종원</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/101</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-2#entry101comment</comments>
      <pubDate>Wed, 25 Oct 2023 02:26:41 +0900</pubDate>
    </item>
    <item>
      <title>[서비스] AI 요리 블로거 챗종원 개발기 -1</title>
      <link>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 지난 번엔 Jira Automation과 GPT API를 통해 문의에 답변을 남기는 챗봇을 만들어보았는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI의 ChatGPT API를 쓰면서, 문득 재밌는 아이디어가 떠올라서 바로 만들어보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;현재 개발을 마치고 운영중인 블로그입니다.&lt;/p&gt;
&lt;figure id=&quot;og_1698159566599&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;AI 요리사 챗종원&quot; data-og-host=&quot;chefgpt.tistory.com&quot; data-og-source-url=&quot;https://chefgpt.tistory.com/&quot; data-og-url=&quot;https://chefgpt.tistory.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bODTvj/hyUlqPFZWV/rCSnXlyO5qso6Y8G0NE9L0/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698,https://scrap.kakaocdn.net/dn/brbzpR/hyUj9OgddL/Sw8qzkzxKr8aUvPxC46S1k/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698&quot;&gt;&lt;a href=&quot;https://chefgpt.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chefgpt.tistory.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bODTvj/hyUlqPFZWV/rCSnXlyO5qso6Y8G0NE9L0/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698,https://scrap.kakaocdn.net/dn/brbzpR/hyUj9OgddL/Sw8qzkzxKr8aUvPxC46S1k/img.jpg?width=800&amp;amp;height=825&amp;amp;face=24_99_573_698');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;챗종원&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 요리사 챗종원&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chefgpt.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아침, 점심, 저녁&lt;/b&gt; 하루 3번 음식 메뉴를 추천하고, 필요한 재료와 레시피를 블로그에 자동으로 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100% 서버리스로 실행되며, &lt;b&gt;광고 수익&lt;/b&gt;이&lt;b&gt;&amp;nbsp;운영 비용&lt;/b&gt;보다 잘 나올 때를 손익 분기점으로 잡고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본이 되는 아이디어는 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GPT로 &lt;b&gt;메뉴를 추천&lt;/b&gt;받고, 메뉴에 대한 &lt;b&gt;설명&lt;/b&gt;, 요리에 필요한 &lt;b&gt;재료&lt;/b&gt;, 요리 &lt;b&gt;방법&lt;/b&gt;을 담은 자연어를 생성합니다.&lt;/li&gt;
&lt;li&gt;해당 자연어를 다시 GPT를 통해 &quot;title&quot;, &quot;description&quot;, &quot;contents&quot;라는 필드를 가지는 &lt;b&gt;json 형태의 구조로 변환&lt;/b&gt;합니다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;title 필드에는 메뉴명이 들어갑니다.&lt;/li&gt;
&lt;li&gt;description에는 메뉴에 대한 설명이 들어갑니다.&lt;/li&gt;
&lt;li&gt;contents 필드에는 요리에 필요한 재료, 요리 방법이 포함됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;이렇게 추천 받은 메뉴 명에 대한 사진을 생성하기 위해 Open AI의 DALL-E API로 &lt;b&gt;메뉴에 대한 사진을 생성&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;title, image, description, contents를 이용해 티스토리 API로 &lt;b&gt;업로드&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-25 at 12.29.25 AM.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFvwqa/btsy39DvQ4o/8enkxKi0of4g0rfkfA3xsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFvwqa/btsy39DvQ4o/8enkxKi0of4g0rfkfA3xsK/img.png&quot; data-alt=&quot;게시글에 적용될 레이아웃&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFvwqa/btsy39DvQ4o/8enkxKi0of4g0rfkfA3xsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFvwqa%2Fbtsy39DvQ4o%2F8enkxKi0of4g0rfkfA3xsK%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; alt=&quot;Grid&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;532&quot; data-filename=&quot;Screenshot 2023-10-25 at 12.29.25 AM.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;1010&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;간단하쥬?&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;API&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3군데의 외부 API를 사용하였습니다.&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;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;네이버&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OPEN AI&lt;/b&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;b&gt;실행 환경&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Google Cloud Function&lt;/li&gt;
&lt;li&gt;Google Cloud Storage&lt;/li&gt;
&lt;li&gt;Google Cloud Scheduler&lt;/li&gt;
&lt;li&gt;Google Cloud SQL&lt;/li&gt;
&lt;li&gt;Python&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;글이 유용하셨다면 광고 좀 눌러주십시오&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;1042&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C8b0O/btsy8aaaC43/K7lD8hVL67PnxiZ0TBz1Mk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C8b0O/btsy8aaaC43/K7lD8hVL67PnxiZ0TBz1Mk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C8b0O/btsy8aaaC43/K7lD8hVL67PnxiZ0TBz1Mk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC8b0O%2Fbtsy8aaaC43%2FK7lD8hVL67PnxiZ0TBz1Mk%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; alt=&quot;갓종원&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;347&quot; data-filename=&quot;지켜주세용.jpg&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2부에서는 티스토리 포스팅을 위한 Access Code 발급과 관리에 대해 다루겠습니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>AI 요리사</category>
      <category>백종원</category>
      <category>부캐</category>
      <category>챗종원</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/100</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%84%9C%EB%B9%84%EC%8A%A4-AI-%EC%9A%94%EB%A6%AC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B1%97%EC%A2%85%EC%9B%90-%EA%B0%9C%EB%B0%9C%EA%B8%B0-1#entry100comment</comments>
      <pubDate>Wed, 25 Oct 2023 01:09:28 +0900</pubDate>
    </item>
    <item>
      <title>[WEB] Jira Automation과 GPT를 활용한 챗봇 프로토타입 개발기</title>
      <link>https://youngmon.tistory.com/entry/WEB-Jira-Automation%EA%B3%BC-GPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%97%EB%B4%87-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9C%EB%B0%9C%EA%B8%B0</link>
      <description>&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개발 환경:&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Atlassian&amp;nbsp;Jira&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Google Cloud Function&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GPT 3.5-turbo&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Python 3.8&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Jira란?&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jiralogo.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjpNBJ/btsy9hzDV7Y/C3G3K18xJ2lS8bHbwL57lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjpNBJ/btsy9hzDV7Y/C3G3K18xJ2lS8bHbwL57lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjpNBJ/btsy9hzDV7Y/C3G3K18xJ2lS8bHbwL57lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjpNBJ%2Fbtsy9hzDV7Y%2FC3G3K18xJ2lS8bHbwL57lK%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; alt=&quot;Jira&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;180&quot; data-filename=&quot;jiralogo.png&quot; data-origin-width=&quot;459&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;Jira란 Atlassian이 개발한 이슈 추적 소프트웨어로 이슈의 추적과 프로젝트 관리를 위해 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다양한 업무(개발 단위, 버그 등)에 대한 이슈를 생성하고 개발자를 할당, 버전 관리를 통한 통합, 배포 등의 기능을 제공하며, Github이나 IntelliJ 등의 써드파티와의 결합으로 Agile/DevOps 프로젝트를 쉽게 관리할 수 있습니다.&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;Jira Automation&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이러한 Jira의 다양한 기능 중, &lt;b&gt;Automation&lt;/b&gt;은 프로젝트에서 발생하는 다양한 이벤트를 트리거하고, 상태에 따라 이후 동작의 실행을 제어합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Workflow의 자동화를 위한 다양한 툴 중, Jira Automation의 특징은 &lt;b&gt;코드가 없기 때문에,&lt;/b&gt;&amp;nbsp;다양한 이해 관계자가 &lt;b&gt;쉽게&lt;/b&gt; 업무를 자동화시켜 관리 포인트를 줄일 수 있다는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Automation을 구성하는 요소로는 하위 동작의 Bootstrap 역할을 하는 &lt;b&gt;트리거&lt;/b&gt;와 상태를 판단해 실행 여부를 결정하는 &lt;b&gt;조건&lt;/b&gt;(if-else), 실행될 작업을 정의하는 &lt;b&gt;동작&lt;/b&gt;이 있으며, 이러한 요소를 모두 아울러&amp;nbsp;&lt;b&gt;Rule&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;b&gt;Jira Automation&lt;/b&gt;과 &lt;b&gt;GPT API&lt;/b&gt;를 활용해, Service Desk 운영 과정에서 발생하는 다양한 문의에 대한 답변을 자동으로 생성하고, 댓글로 응답하는 &lt;b&gt;챗봇 워크플로&lt;/b&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;b&gt;OpenAI API 등록&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 자연어 처리 모델인 GPT를 사용하기 위해서는 API 키를 발급받아야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://platform.openai.com/account/api-keys&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://platform.openai.com/account/api-keys&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698140957730&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;OpenAI Platform&quot; data-og-description=&quot;Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.&quot; data-og-host=&quot;platform.openai.com&quot; data-og-source-url=&quot;https://platform.openai.com/account/api-keys&quot; data-og-url=&quot;https://platform.openai.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bmciIr/hyUkal14aT/xFEDAq2EUSma6AjoWk3wck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mlehx/hyUkkPJbBU/ZTM0tBpbidCVGIW9XRGSBK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://platform.openai.com/account/api-keys&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://platform.openai.com/account/api-keys&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bmciIr/hyUkal14aT/xFEDAq2EUSma6AjoWk3wck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mlehx/hyUkkPJbBU/ZTM0tBpbidCVGIW9XRGSBK/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;OpenAI Platform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;platform.openai.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Organization을 등록하고, API Key를 발급받아줍니다. GPT를 사용하기 위해 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 키를 발급받아도 사용하려면 결제 수단을 입력하지 않으면 인증이 되지 않더군요. 결제 정보도 등록해주세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Google Cloud Function&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gcflogo.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9qTth/btsyYoVmxv7/XwwC2mWyKH5OpCreskkBIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9qTth/btsyYoVmxv7/XwwC2mWyKH5OpCreskkBIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9qTth/btsyYoVmxv7/XwwC2mWyKH5OpCreskkBIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9qTth%2FbtsyYoVmxv7%2FXwwC2mWyKH5OpCreskkBIK%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; alt=&quot;Google Cloud Functions Logo&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;310&quot; data-filename=&quot;gcflogo.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 GCP의 서버리스 컨테이너 배포 플랫폼인 Cloud Run의 글에서 잠깐 등장했던 클라우드 펑션입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1698138773377&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;[GCP] 초보자를 위한 Cloud Run 설명회&quot; data-og-description=&quot;Cloud Run이란 구글 클라우드 플랫폼에서 제공하는 서버리스 컴퓨팅 서비스로 AWS의 Fargate에 대응 됩니다. GCE를 통해 가상 머신을 생성하고 서버를 구성 후 코드를 빌드하여 배포하는 기존 방식(IaaS&quot; data-og-host=&quot;blog.ymon.io&quot; data-og-source-url=&quot;https://blog.ymon.io/entry/GCP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-Cloud-Run-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; data-og-url=&quot;https://blog.ymon.io/entry/GCP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-Cloud-Run-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdyN8F/hyUgKoZK3Z/sTlNI53p1v7kuEemkCCJg0/img.png?width=707&amp;amp;height=250&amp;amp;face=0_0_707_250,https://scrap.kakaocdn.net/dn/V2Vxh/hyUgRVWc7L/lVpsMDGZlFHl7McUhg4fSk/img.png?width=707&amp;amp;height=250&amp;amp;face=0_0_707_250,https://scrap.kakaocdn.net/dn/cEOMWO/hyUlrVhAir/kjl2c6WUWMvNfHCFNWagRk/img.png?width=738&amp;amp;height=370&amp;amp;face=0_0_738_370&quot;&gt;&lt;a href=&quot;https://blog.ymon.io/entry/GCP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-Cloud-Run-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.ymon.io/entry/GCP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-Cloud-Run-%EC%84%A4%EB%AA%85%ED%9A%8C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdyN8F/hyUgKoZK3Z/sTlNI53p1v7kuEemkCCJg0/img.png?width=707&amp;amp;height=250&amp;amp;face=0_0_707_250,https://scrap.kakaocdn.net/dn/V2Vxh/hyUgRVWc7L/lVpsMDGZlFHl7McUhg4fSk/img.png?width=707&amp;amp;height=250&amp;amp;face=0_0_707_250,https://scrap.kakaocdn.net/dn/cEOMWO/hyUlrVhAir/kjl2c6WUWMvNfHCFNWagRk/img.png?width=738&amp;amp;height=370&amp;amp;face=0_0_738_370');&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;[GCP] 초보자를 위한 Cloud Run 설명회&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Cloud Run이란 구글 클라우드 플랫폼에서 제공하는 서버리스 컴퓨팅 서비스로 AWS의 Fargate에 대응 됩니다. GCE를 통해 가상 머신을 생성하고 서버를 구성 후 코드를 빌드하여 배포하는 기존 방식(IaaS&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.ymon.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Cloud Run이 요청 발생 시에 컨테이너를 실행했던 것과 유사하게, Cloud Functions 역시 요청이 발생했을 때 작성해둔 함수를 실행하고 결과 값을 응답합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Cloud Run보다 더 간편하게 백엔드 엔드포인트를 구성가능하지만, Cloud Run에 비해 개발자가 제어할 수 있는 범위가 훨씬 한정적이며 플랫폼 의존성이 높습니다. 예를 들어 Cloud Run에서 동작하는 컨테이너를 AWS Fargate로 이전 할 때, 컨테이너만 새로 배포하면 &lt;b&gt;동일한 동작이 보장&lt;/b&gt;되는 것과 달리, Cloud Function의 경우 다른 플랫폼으로 이동할 경우 코드를 새로 작성해야 하며 아예 실행이 되지 않을 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;부가적으로 실행 시간과 실행 횟수에 따른 비용이 청구되기 때문에 운영 과정에서 발생하는 비용 산정이 용이할 것이라고 생각됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;초기화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성하고 Cloud Function으로 이동합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2023-10-20 at 11.13.32 PM.png&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUVbZU/btsy04PTJT6/BWJc5CdkVgWRZNcgHkaAaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUVbZU/btsy04PTJT6/BWJc5CdkVgWRZNcgHkaAaK/img.png&quot; data-alt=&quot;Cloud Functions 서비스 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUVbZU/btsy04PTJT6/BWJc5CdkVgWRZNcgHkaAaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUVbZU%2Fbtsy04PTJT6%2FBWJc5CdkVgWRZNcgHkaAaK%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; alt=&quot;Cloud Function init&quot; loading=&quot;lazy&quot; width=&quot;394&quot; height=&quot;493&quot; data-filename=&quot;edited_Screenshot 2023-10-20 at 11.13.32 PM.png&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud Functions 서비스 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 만들기 탭에서 리전과 함수명, 트리거, 환경 변수 등을 추가해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-24 at 6.59.41 PM.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEjMZV/btsy8ttC3f0/6YQ3ShxtpF64goalu4f7yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEjMZV/btsy8ttC3f0/6YQ3ShxtpF64goalu4f7yK/img.png&quot; data-alt=&quot;함수 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEjMZV/btsy8ttC3f0/6YQ3ShxtpF64goalu4f7yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEjMZV%2Fbtsy8ttC3f0%2F6YQ3ShxtpF64goalu4f7yK%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; alt=&quot;function create&quot; loading=&quot;lazy&quot; width=&quot;471&quot; height=&quot;189&quot; data-filename=&quot;Screenshot 2023-10-24 at 6.59.41 PM.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;함수 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2023-10-24 at 7.00.53 PM.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9KUrt/btsy4bnGZ8M/FcylZXokIfLsNk6DKq21l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9KUrt/btsy4bnGZ8M/FcylZXokIfLsNk6DKq21l0/img.png&quot; data-alt=&quot;사용에 필요한 환경 변수 세팅&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9KUrt/btsy4bnGZ8M/FcylZXokIfLsNk6DKq21l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9KUrt%2Fbtsy4bnGZ8M%2FFcylZXokIfLsNk6DKq21l0%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; alt=&quot;env&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;271&quot; data-filename=&quot;edited_Screenshot 2023-10-24 at 7.00.53 PM.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;558&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;환경 변수에 OpenAI에서 발급 받은 $조직 키와 $API 키를 입력해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.02.58 PM.png&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOMIgU/btsy4kSdsQW/hGyB0SujK9Gqti0WMJHkH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOMIgU/btsy4kSdsQW/hGyB0SujK9Gqti0WMJHkH1/img.png&quot; data-alt=&quot;필요 모듈 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOMIgU/btsy4kSdsQW/hGyB0SujK9Gqti0WMJHkH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOMIgU%2Fbtsy4kSdsQW%2FhGyB0SujK9Gqti0WMJHkH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;141&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.02.58 PM.png&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;392&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;필요한 모듈로 openai를 등록해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python, node.js에서는 openai 모듈, 패키지를 설치해 손쉽게 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java나 다른 프레임워크에서는 직접 API Endpoint에 요청을 보내야하고, 구현하려는 기능의 특성 상 CPU보다 I/O Burst가 월등히 높기 때문에 빠르게 개발하기 위해 Python을 개발 언어로 택했는데 다른 언어가 편하다면 해당 언어를 쓰시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;함수 초기화&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.17.17 PM.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W1nsb/btsy9P34qkt/Y9qG9Hk7NXuatulatpCSd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W1nsb/btsy9P34qkt/Y9qG9Hk7NXuatulatpCSd1/img.png&quot; data-alt=&quot;진입점*이 요청이 들어왔을 때 실행될 함수 엔드포인트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W1nsb/btsy9P34qkt/Y9qG9Hk7NXuatulatpCSd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW1nsb%2Fbtsy9P34qkt%2FY9qG9Hk7NXuatulatpCSd1%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; alt=&quot;function init&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;154&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.17.17 PM.png&quot; data-origin-width=&quot;1042&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;진입점과 시작 점의 함수를 일치시켜주고, openai 모듈에 인증 정보를 담아 초기화시켜 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698142929879&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    # 요청의 Body를 파이썬에서 쉽게 사용하기 위한 dict 자료구조로 변환
    question_json = json.loads(request.data.decode('utf-8'))
    # 문의에 대해 접근
    question = question_json[&quot;fields&quot;][&quot;description&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;예시로 사용된 field.description은 이슈의 설명 란의 데이터입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.27.01 PM.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0RdUL/btsy4tuIdzX/wy7N9BHefAKiaxkTMJW8v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0RdUL/btsy4tuIdzX/wy7N9BHefAKiaxkTMJW8v0/img.png&quot; data-alt=&quot;예시 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0RdUL/btsy4tuIdzX/wy7N9BHefAKiaxkTMJW8v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0RdUL%2Fbtsy4tuIdzX%2Fwy7N9BHefAKiaxkTMJW8v0%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; alt=&quot;Jira Issue&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;163&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.27.01 PM.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;386&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;파이썬에서 Issue의 Description으로 문의를 받았으니, 해당 질문을 가지고 GPT를 통해 답변을 생성해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;System role에 간단한 프롬프트를 입력해 답변을 원하는 방향으로 조정할 수 있으며, 대량의 데이터 셋을 입력해 Fine-Tuning도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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://platform.openai.com/finetune&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://platform.openai.com/finetune&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698143525353&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;OpenAI Platform&quot; data-og-description=&quot;Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.&quot; data-og-host=&quot;platform.openai.com&quot; data-og-source-url=&quot;https://platform.openai.com/finetune&quot; data-og-url=&quot;https://platform.openai.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NsWEn/hyUkkvpDox/4a3VrWnOYHIKoZvGaATTaK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bKnAap/hyUj7XaDTo/QgTXMASRqNhkOr3R4eCTJk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://platform.openai.com/finetune&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://platform.openai.com/finetune&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NsWEn/hyUkkvpDox/4a3VrWnOYHIKoZvGaATTaK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bKnAap/hyUj7XaDTo/QgTXMASRqNhkOr3R4eCTJk/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;OpenAI Platform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;platform.openai.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 링크에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.33.40 PM.png&quot; data-origin-width=&quot;1722&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDYYR/btsy3gJm3yt/fD4KePdp0LiGwigxY5JKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDYYR/btsy3gJm3yt/fD4KePdp0LiGwigxY5JKK0/img.png&quot; data-alt=&quot;프롬프트를 통해 최적화 된 답변 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDYYR/btsy3gJm3yt/fD4KePdp0LiGwigxY5JKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDYYR%2Fbtsy3gJm3yt%2FfD4KePdp0LiGwigxY5JKK0%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; alt=&quot;최적화 프롬프트&quot; loading=&quot;lazy&quot; width=&quot;1722&quot; height=&quot;598&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.33.40 PM.png&quot; data-origin-width=&quot;1722&quot; data-origin-height=&quot;598&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;답변 생성을 위한 가이드라인을 제시하고, user의 content에 질문을 입력해 답변을 생성한 후, 응답 중 GPT가 생성한 실제 답변을 반환합니다.&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;edited_edited_Screenshot 2023-10-24 at 7.46.35 PM.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4dklV/btsy7PcUKUI/n6ms5ymfkISFxtUrJx9Bkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4dklV/btsy7PcUKUI/n6ms5ymfkISFxtUrJx9Bkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4dklV/btsy7PcUKUI/n6ms5ymfkISFxtUrJx9Bkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4dklV%2Fbtsy7PcUKUI%2Fn6ms5ymfkISFxtUrJx9Bkk%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;1800&quot; height=&quot;252&quot; data-filename=&quot;edited_edited_Screenshot 2023-10-24 at 7.46.35 PM.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL에 작성한 진입점 함수 이름을 붙이면 해당 함수의 End-Point가 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Automation 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이슈가 생성되면 문의를 전달하고, 응답을 받아 코멘트를 작성하기 위해 Automation을 설정 할 차례입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.40.29 PM.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tuUMa/btsy04vIS5S/RIMSTYbjnDx9XBjVbiA8q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tuUMa/btsy04vIS5S/RIMSTYbjnDx9XBjVbiA8q1/img.png&quot; data-alt=&quot;1. 프로젝트 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tuUMa/btsy04vIS5S/RIMSTYbjnDx9XBjVbiA8q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtuUMa%2Fbtsy04vIS5S%2FRIMSTYbjnDx9XBjVbiA8q1%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; alt=&quot;Project Setting&quot; loading=&quot;lazy&quot; width=&quot;244&quot; height=&quot;408&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.40.29 PM.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1. 프로젝트 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.40.56 PM.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxxuM6/btsy4kELi36/GhiX7oG1OQRVs5BcODD2M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxxuM6/btsy4kELi36/GhiX7oG1OQRVs5BcODD2M0/img.png&quot; data-alt=&quot;2. 자동화(Automation)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxxuM6/btsy4kELi36/GhiX7oG1OQRVs5BcODD2M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxxuM6%2Fbtsy4kELi36%2FGhiX7oG1OQRVs5BcODD2M0%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;236&quot; height=&quot;277&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.40.56 PM.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2. 자동화(Automation)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_Screenshot 2023-10-24 at 7.43.25 PM.png&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cChcbE/btsy4k5O0T0/ze8YWTHu9uwkCr9W8XQ3K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cChcbE/btsy4k5O0T0/ze8YWTHu9uwkCr9W8XQ3K0/img.png&quot; data-alt=&quot;아까 만든 ${URL}/${FUNC_NAME} 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cChcbE/btsy4k5O0T0/ze8YWTHu9uwkCr9W8XQ3K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcChcbE%2Fbtsy4k5O0T0%2Fze8YWTHu9uwkCr9W8XQ3K0%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; alt=&quot;오토메이션 설정&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;336&quot; data-filename=&quot;edited_edited_Screenshot 2023-10-24 at 7.43.25 PM.png&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아까 만든 ${URL}/${FUNC_NAME} 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When에는 이슈 생성을 트리거 예시로 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cloud functions에서 생성된 함수의 진입점을 요청 url에 입력해주고, POST 요청으로 이슈 데이터를 전달하면 답변을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 답변이 오면 Response로 전달된 답변을 해당 이슈의 댓글에 달아줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동작 확인&lt;/b&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;Screenshot 2023-10-24 at 7.57.21 PM.png&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;1166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxwuXH/btsy8mByw3e/pufPHXrtLbi1Qq9dVJ97AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxwuXH/btsy8mByw3e/pufPHXrtLbi1Qq9dVJ97AK/img.png&quot; data-alt=&quot;응답 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxwuXH/btsy8mByw3e/pufPHXrtLbi1Qq9dVJ97AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxwuXH%2Fbtsy8mByw3e%2FpufPHXrtLbi1Qq9dVJ97AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;471&quot; data-filename=&quot;Screenshot 2023-10-24 at 7.57.21 PM.png&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;1166&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;Automation for Jira가 이슈에 대해 자동으로 답변을 생성한 결과입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 Jira Automation과 GPT를 활용한 챗봇 시스템 구축 방법에 대해 알아보았습니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>atlassian</category>
      <category>automation</category>
      <category>Chat GPT</category>
      <category>cloud function</category>
      <category>GPT</category>
      <category>JIRA</category>
      <category>Open AI</category>
      <category>serverless</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/99</guid>
      <comments>https://youngmon.tistory.com/entry/WEB-Jira-Automation%EA%B3%BC-GPT%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%97%EB%B4%87-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9C%EB%B0%9C%EA%B8%B0#entry99comment</comments>
      <pubDate>Tue, 24 Oct 2023 20:00:43 +0900</pubDate>
    </item>
    <item>
      <title>[GCP] 초보자를 위한 Cloud Run 설명회</title>
      <link>https://youngmon.tistory.com/entry/GCP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-Cloud-Run-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cloud-run.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WSVB2/btsyEUF6UT2/TBuRkGbTFDwlZ6BKV0ksFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WSVB2/btsyEUF6UT2/TBuRkGbTFDwlZ6BKV0ksFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WSVB2/btsyEUF6UT2/TBuRkGbTFDwlZ6BKV0ksFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWSVB2%2FbtsyEUF6UT2%2FTBuRkGbTFDwlZ6BKV0ksFK%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; alt=&quot;google cloud run&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;211&quot; data-filename=&quot;cloud-run.png&quot; data-origin-width=&quot;707&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;&lt;b&gt;&amp;nbsp;Cloud Run&lt;/b&gt;이란 구글 클라우드 플랫폼에서 제공하는 서버리스 컴퓨팅 서비스로 &lt;b&gt;AWS&lt;/b&gt;의 &lt;b&gt;Fargate&lt;/b&gt;에 대응 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GCE를 통해 가상 머신을 생성하고 서버를 구성 후 코드를 빌드하여 배포하는 기존 방식(IaaS)과 달리, 어플리케이션을 컨테이너 형태로 빌드해 Cloud Run에 등록하는 간단한 과정으로 빠르고 안전하게 배포할 수 있게 돕습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Container.png&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R3r2A/btsyDN8n4hh/SpkwpJcgI5N7IKzlCXw8fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R3r2A/btsyDN8n4hh/SpkwpJcgI5N7IKzlCXw8fk/img.png&quot; data-alt=&quot;Cloud Run 내부에서 자동화 된 컨테이너 관리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R3r2A/btsyDN8n4hh/SpkwpJcgI5N7IKzlCXw8fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR3r2A%2FbtsyDN8n4hh%2FSpkwpJcgI5N7IKzlCXw8fk%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; alt=&quot;Internal&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;370&quot; data-filename=&quot;edited_Container.png&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud Run 내부에서 자동화 된 컨테이너 관리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Cloud Run 은 https나 웹소켓, gRPC 등의 &lt;b&gt;요청이나 이벤트가 발생&lt;/b&gt;할 때 등록되어있는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;b&gt;컨테이너를&lt;/b&gt;&lt;span&gt;&lt;b&gt; 실행&lt;/b&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;figure id=&quot;og_1697549829837&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;Docker) 초보자를 위한 도커 설명회&quot; data-og-description=&quot;Docker는 어플리케이션을 구성하는 여러 서비스가 독립적인 환경에서 실행되도록 관리하는 오픈 소스 프로젝트입니다. Docker를 사용함으로써 어플리케이션의 개발, 운영, 확장, 유지보수, 배포를 &quot; data-og-host=&quot;blog.ymon.io&quot; data-og-source-url=&quot;https://blog.ymon.io/entry/Docker-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; data-og-url=&quot;https://blog.ymon.io/entry/Docker-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KDIdu/hyUdMfN9zi/1UnyIhEaFhRBBYnxNSO2KK/img.png?width=800&amp;amp;height=684&amp;amp;face=0_0_800_684,https://scrap.kakaocdn.net/dn/k7NLV/hyUdVKzWxx/XSdFy2XtoUrOidiRf1ohwK/img.png?width=800&amp;amp;height=684&amp;amp;face=0_0_800_684,https://scrap.kakaocdn.net/dn/BiGBg/hyUdXBCytY/oqLMypELIWUdj37VC6J2xk/img.png?width=1280&amp;amp;height=512&amp;amp;face=0_0_1280_512&quot;&gt;&lt;a href=&quot;https://blog.ymon.io/entry/Docker-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.ymon.io/entry/Docker-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%EC%84%A4%EB%AA%85%ED%9A%8C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KDIdu/hyUdMfN9zi/1UnyIhEaFhRBBYnxNSO2KK/img.png?width=800&amp;amp;height=684&amp;amp;face=0_0_800_684,https://scrap.kakaocdn.net/dn/k7NLV/hyUdVKzWxx/XSdFy2XtoUrOidiRf1ohwK/img.png?width=800&amp;amp;height=684&amp;amp;face=0_0_800_684,https://scrap.kakaocdn.net/dn/BiGBg/hyUdXBCytY/oqLMypELIWUdj37VC6J2xk/img.png?width=1280&amp;amp;height=512&amp;amp;face=0_0_1280_512');&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;Docker) 초보자를 위한 도커 설명회&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker는 어플리케이션을 구성하는 여러 서비스가 독립적인 환경에서 실행되도록 관리하는 오픈 소스 프로젝트입니다. Docker를 사용함으로써 어플리케이션의 개발, 운영, 확장, 유지보수, 배포를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.ymon.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;완전 관리형 서비스 (Serverless)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;기존의 온프레미스나 IaaS의 한계인 인프라의 운영과 관리에 필요한 수고를 자동화해 관리함으로써 서비스와 인프라를 분리, 개발자가 서비스의 개발에 집중할 수 있게 만든 것이 서버리스 솔루션으로, 프로비저닝이나 스케일링 등의 인프라 운영을 신경쓸 필요가 없기에 서버리스라고 불립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Cloud Run 이외에도 Aws Lambda, Azure Container Apps 등 벤더에 따라 유사한 서비스가 있고, 같은 벤더 내에서도 아키텍처의 추상화 정도에 따라 Google Cloud Function 등으로 분리됩니다.&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;Cloud Run VS Cloud Function&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;구글의 또 다른 서버리스 솔루션인 Cloud Function 역시 특정 이벤트가 트리거 되어 실행되지만, 추상화 정도에 차이가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Aws Lambda나 Cloud Function 등의 &lt;b&gt;FaaS(Function As A Service)&lt;/b&gt; 는 컨테이너 기반의 Cloud Run보다 &lt;b&gt;높은 추상화 수준&lt;/b&gt;으로 함수를 작성하고, 특정 이벤트에 응답하도록 설정하면 되지만, 사용 언어나 버전 등에 크게 의존성을 가지며 컨테이너 기반의 Cloud Run에 비해 낮은 이식성을 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;반면 &lt;b&gt;Cloud Run&lt;/b&gt;은 더 &lt;b&gt;낮은 추상화 수준&lt;/b&gt;으로 런타임 환경, 라이브러리, 프레임워크 등의 제어권을 가질 수 있기 때문에 보다 복잡한 어플리케이션에 적합합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Cloud Run 설정 및 배포&lt;/b&gt;&lt;/h3&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;컨테이너 레지스트리는 Google Container Registry를 사용하였습니다.&lt;/li&gt;
&lt;li&gt;이미지 빌드와 GCR 업로드까지의 과정은 gcloud sdk와 CLI 환경&lt;/li&gt;
&lt;li&gt;클라우드 런 설정과 배포까지의 과정은 클라우드 콘솔을 통해 진행하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로젝트 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 구글 클라우드 프로젝트 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-17 at 11.36.36 PM.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ArUdx/btsyLliHpIF/K90moGzJnNePjGIQeaOkN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ArUdx/btsyLliHpIF/K90moGzJnNePjGIQeaOkN1/img.png&quot; data-alt=&quot;1번의 프로젝트 ID를 기억&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ArUdx/btsyLliHpIF/K90moGzJnNePjGIQeaOkN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FArUdx%2FbtsyLliHpIF%2FK90moGzJnNePjGIQeaOkN1%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; alt=&quot;프로젝트 생성&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;271&quot; data-filename=&quot;Screenshot 2023-10-17 at 11.36.36 PM.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1번의 프로젝트 ID를 기억&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Google Cloud Registry 사용 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-17 at 11.38.39 PM.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIQBPs/btsyJQ4gvJU/pkrKkzQitmrbsuXKcwXgLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIQBPs/btsyJQ4gvJU/pkrKkzQitmrbsuXKcwXgLk/img.png&quot; data-alt=&quot;API 사용 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIQBPs/btsyJQ4gvJU/pkrKkzQitmrbsuXKcwXgLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIQBPs%2FbtsyJQ4gvJU%2FpkrKkzQitmrbsuXKcwXgLk%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; alt=&quot;클라우드 레지스트리 사용 설정 1&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;263&quot; data-filename=&quot;Screenshot 2023-10-17 at 11.38.39 PM.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;API 사용 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-17 at 11.39.12 PM.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nX0B5/btsyIPdthQF/A8zsyenuJ2jBfRYgGKWrt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nX0B5/btsyIPdthQF/A8zsyenuJ2jBfRYgGKWrt1/img.png&quot; data-alt=&quot;해당 API 사용 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nX0B5/btsyIPdthQF/A8zsyenuJ2jBfRYgGKWrt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnX0B5%2FbtsyIPdthQF%2FA8zsyenuJ2jBfRYgGKWrt1%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; alt=&quot;GCR&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;181&quot; data-filename=&quot;Screenshot 2023-10-17 at 11.39.12 PM.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해당 API 사용 설정&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;이미지 빌드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 실행될 서비스를 이미지로 빌드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.07.27 PM.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SC3sh/btsyHqMh8wB/Hkkx1NKXSKG8Kfk9BPsy20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SC3sh/btsyHqMh8wB/Hkkx1NKXSKG8Kfk9BPsy20/img.png&quot; data-alt=&quot;gcr.io/프로젝트 명/이미지 이름으로 태그를 붙여 빌드해줍니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SC3sh/btsyHqMh8wB/Hkkx1NKXSKG8Kfk9BPsy20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSC3sh%2FbtsyHqMh8wB%2FHkkx1NKXSKG8Kfk9BPsy20%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; alt=&quot;컨테이너 빌드&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;43&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.07.27 PM.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gcr.io/프로젝트 명/이미지 이름으로 태그를 붙여 빌드해줍니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. gcloud 서비스를 사용하기 위해 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.16.59 PM.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AMWam/btsyJzuGQ8R/89DMvfeoKh7RcEVyekzhPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AMWam/btsyJzuGQ8R/89DMvfeoKh7RcEVyekzhPK/img.png&quot; data-alt=&quot;프로젝트의 권한을 가진 계정으로 로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AMWam/btsyJzuGQ8R/89DMvfeoKh7RcEVyekzhPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAMWam%2FbtsyJzuGQ8R%2F89DMvfeoKh7RcEVyekzhPK%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;503&quot; height=&quot;52&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.16.59 PM.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;74&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;3. 도커 클라이언트 구성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.35.13 PM.png&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nP4ar/btsyJzuJIxY/mKwfvQagggeurNMkgGom90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nP4ar/btsyJzuJIxY/mKwfvQagggeurNMkgGom90/img.png&quot; data-alt=&quot;도커 클라이언트가 Container Registry와 연결될 수 있도록 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nP4ar/btsyJzuJIxY/mKwfvQagggeurNMkgGom90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnP4ar%2FbtsyJzuJIxY%2FmKwfvQagggeurNMkgGom90%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; alt=&quot;도커 등록&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;26&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.35.13 PM.png&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도커 클라이언트가 Container Registry와 연결될 수 있도록 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이미지를 컨테이너 레지스트리에 Push&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.39.01 PM.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5gwkJ/btsyHzhTFtR/Ty5qZ1jniHBH5aPTIuiUO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5gwkJ/btsyHzhTFtR/Ty5qZ1jniHBH5aPTIuiUO1/img.png&quot; data-alt=&quot;이미지를 레지스트리에 push&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5gwkJ/btsyHzhTFtR/Ty5qZ1jniHBH5aPTIuiUO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5gwkJ%2FbtsyHzhTFtR%2FTy5qZ1jniHBH5aPTIuiUO1%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;533&quot; height=&quot;62&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.39.01 PM.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지를 레지스트리에 push&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 과정을 끝내고 push까지 마무리했다면 이미지가 제대로 업로드 되었는지 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.46.44 PM.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;1304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4DlDR/btsyMyn6hQ9/j4yk5DHiV2BRCKYY72ZtIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4DlDR/btsyMyn6hQ9/j4yk5DHiV2BRCKYY72ZtIK/img.png&quot; data-alt=&quot;순서대로 버킷에 접근해보면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4DlDR/btsyMyn6hQ9/j4yk5DHiV2BRCKYY72ZtIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4DlDR%2FbtsyMyn6hQ9%2Fj4yk5DHiV2BRCKYY72ZtIK%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; alt=&quot;컨테이너 레지스트리&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;562&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.46.44 PM.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;1304&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;방금 올린 이미지가 정상적으로 Push 되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.45.44 PM.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wgkgp/btsyMxW2bRo/vmP6SONDncUVJBF7tM6bg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wgkgp/btsyMxW2bRo/vmP6SONDncUVJBF7tM6bg0/img.png&quot; data-alt=&quot;리소스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wgkgp/btsyMxW2bRo/vmP6SONDncUVJBF7tM6bg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwgkgp%2FbtsyMxW2bRo%2FvmP6SONDncUVJBF7tM6bg0%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;702&quot; height=&quot;89&quot; data-filename=&quot;Screenshot 2023-10-18 at 4.45.44 PM.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;248&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;이미지를 생성하고 레지스트리에 올리기까지 성공했다면 클라우드 런을 통해 배포할 수 있습니다.&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;Screenshot 2023-10-18 at 5.28.02 PM.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;1298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EOEh5/btsyHZngvXG/Y0CK6ZeCRAk3rkX89RBM7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EOEh5/btsyHZngvXG/Y0CK6ZeCRAk3rkX89RBM7k/img.png&quot; data-alt=&quot;클라우드 런 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EOEh5/btsyHZngvXG/Y0CK6ZeCRAk3rkX89RBM7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEOEh5%2FbtsyHZngvXG%2FY0CK6ZeCRAk3rkX89RBM7k%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; alt=&quot;클라우드 런 콘솔&quot; loading=&quot;lazy&quot; width=&quot;164&quot; height=&quot;362&quot; data-filename=&quot;Screenshot 2023-10-18 at 5.28.02 PM.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;1298&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;클라우드 런에 접속해 서비스를 생성해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 5.31.32 PM.png&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7yo7n/btsyLPcQz1Z/dFkkuiCbJ1hoZaOVgJ9M80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7yo7n/btsyLPcQz1Z/dFkkuiCbJ1hoZaOVgJ9M80/img.png&quot; data-alt=&quot;실행에 필요한 환경 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7yo7n/btsyLPcQz1Z/dFkkuiCbJ1hoZaOVgJ9M80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7yo7n%2FbtsyLPcQz1Z%2FdFkkuiCbJ1hoZaOVgJ9M80%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; alt=&quot;초기 설정&quot; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;364&quot; data-filename=&quot;Screenshot 2023-10-18 at 5.31.32 PM.png&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행에 필요한 환경 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실행될 이미지를 선택합니다. 컨테이너 레지스트리를 확인해보면 아까 push한 이미지가 있는데, 선택해줍니다.&lt;/li&gt;
&lt;li&gt;서비스의 이름을 설정합니다&lt;/li&gt;
&lt;li&gt;인스턴스가 위치할 리전을 지정합니다.&lt;/li&gt;
&lt;li&gt;자동 확장에 필요한 인스턴스를 설정해줍니다. 인스턴스 최소 개수 pool로 상시 동작중인 인스턴스의 최소 갯수를 지정해 요청이 없으면 아무것도 실행하지 않게 할 수도 있고, 1개 이상의 인스턴스를 상시로 구동해 요청에 따른 컨테이너 실행의 오버헤드를 줄일 수 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 6.45.14 PM.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B9SgG/btsyHp7YYfm/WlTn7xTFsQfX84CNQy1bRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B9SgG/btsyHp7YYfm/WlTn7xTFsQfX84CNQy1bRK/img.png&quot; data-alt=&quot;배포 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B9SgG/btsyHp7YYfm/WlTn7xTFsQfX84CNQy1bRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB9SgG%2FbtsyHp7YYfm%2FWlTn7xTFsQfX84CNQy1bRK%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; alt=&quot;배포 성공&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;183&quot; data-filename=&quot;Screenshot 2023-10-18 at 6.45.14 PM.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;538&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;배포에 성공한 모습입니다. 외부에서 접근할 수 있는 URL을 제공받습니다.&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;테스트에 사용한 이미지는 테스트용으로 만들어 둔 url 단축기입니다. 블로그 주소로 테스트 해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트 툴은 Apache Jmeter를 사용했습니다.&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;Screenshot 2023-10-18 at 6.57.52 PM.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBpeeO/btsyLOZsBzf/lwQ40ANBMmxKfZV3CanXJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBpeeO/btsyLOZsBzf/lwQ40ANBMmxKfZV3CanXJ1/img.png&quot; data-alt=&quot;새로운 블로그 url 만관부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBpeeO/btsyLOZsBzf/lwQ40ANBMmxKfZV3CanXJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBpeeO%2FbtsyLOZsBzf%2FlwQ40ANBMmxKfZV3CanXJ1%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; alt=&quot;테스트 1&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;186&quot; data-filename=&quot;Screenshot 2023-10-18 at 6.57.52 PM.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새로운 블로그 url 만관부&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;Screenshot 2023-10-18 at 6.59.20 PM.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ41zJ/btsyHzbrzNF/oy7FxFdMGJa2CWKyUkjD8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ41zJ/btsyHzbrzNF/oy7FxFdMGJa2CWKyUkjD8K/img.png&quot; data-alt=&quot;200 OK&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ41zJ/btsyHzbrzNF/oy7FxFdMGJa2CWKyUkjD8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ41zJ%2FbtsyHzbrzNF%2Foy7FxFdMGJa2CWKyUkjD8K%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; alt=&quot;테스트 2&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;168&quot; data-filename=&quot;Screenshot 2023-10-18 at 6.59.20 PM.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;200 OK&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 유휴 컨테이너가 0이라 요청이 들어오면 컨테이너 실행 후 응답합니다. 0.8초가 걸린 모습입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud Run을 사용하는 이유 중 하나는 스케일링의 자동화인데, 부하를 걸어 동시에 요청을 보냈을 때 컨테이너가 추가로 늘어나는 모습입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-18 at 7.10.14 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/79LNH/btsyHzibPWH/NqvvYkJZKlcbdFCyXlTbBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/79LNH/btsyHzibPWH/NqvvYkJZKlcbdFCyXlTbBk/img.png&quot; data-alt=&quot;초당 요청수에 따라 컨테이너가 4개까지 늘어난 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/79LNH/btsyHzibPWH/NqvvYkJZKlcbdFCyXlTbBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F79LNH%2FbtsyHzibPWH%2FNqvvYkJZKlcbdFCyXlTbBk%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; alt=&quot;스케일링&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;347&quot; data-filename=&quot;Screenshot 2023-10-18 at 7.10.14 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초당 요청수에 따라 컨테이너가 4개까지 늘어난 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여기까지 구글의 서버리스 솔루션인 Cloud Run을 통해 어플리케이션을 컨테이너화하고 배포 이후 부하 테스트를 통해 자동으로 스케일링되는 모습까지 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;요청 트래픽에 대한 스케일링은 처리했지만, 이러한 여러 컨테이너가 동시에 커넥션을 맺고있는 DB 등에서 다양한 문제가 발생하는데, Stateless한 서버와 달리 데이터베이스는 이렇게 분산될 시 여러 데이터베이스가 동기화 되지 않는 문제가 발생합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2023-10-18 at 7.12.16 PM.png&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9QEA4/btsyHy4G4gm/IFfJc5F5DnWyNdLSvqhVsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9QEA4/btsyHy4G4gm/IFfJc5F5DnWyNdLSvqhVsK/img.png&quot; data-alt=&quot;산넘어 산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9QEA4/btsyHy4G4gm/IFfJc5F5DnWyNdLSvqhVsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9QEA4%2FbtsyHy4G4gm%2FIFfJc5F5DnWyNdLSvqhVsK%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; alt=&quot;커넥션 에러&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;103&quot; data-filename=&quot;edited_Screenshot 2023-10-18 at 7.12.16 PM.png&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;103&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;Aurora DB나 Cloud SQL 등 서버리스 DB도 존재하지만, 비용이 어마어마합니다..&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;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;&lt;b&gt;블로그 URL을 바꾸었더니 접속자가 싹 사라졌습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;크롤러가 360도 달라진 절 찾아줄 줄 알았는데, 아니네요.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고도 이 주소로 이전해야하는데, 어서 새로운 글을 써서 구글에게 절 알려야겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문이 있다면 댓글 적어주시면 친절히 답변드리겠습니다. 감사합니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>Cloud Run</category>
      <category>GCP</category>
      <category>jmeter</category>
      <category>대규모 트래픽</category>
      <category>로드밸런싱</category>
      <category>분산처리</category>
      <category>서버리스</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/98</guid>
      <comments>https://youngmon.tistory.com/entry/GCP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-Cloud-Run-%EC%84%A4%EB%AA%85%ED%9A%8C#entry98comment</comments>
      <pubDate>Wed, 18 Oct 2023 20:07:52 +0900</pubDate>
    </item>
    <item>
      <title>BOJ 16946) c++ 벽 부수고 이동하기 4 (분리 집합)</title>
      <link>https://youngmon.tistory.com/entry/BOJ-16946-c-%EB%B2%BD-%EB%B6%80%EC%88%98%EA%B3%A0-%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0-4-%EB%B6%84%EB%A6%AC-%EC%A7%91%ED%95%A9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시간 제한 - 2s&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;메모리 제한 - 512MB&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-07-10 at 5.35.29 PM.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qqFOe/btsm92t7P0Y/6tU5lCB4x4EJpGJU7iaZc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qqFOe/btsm92t7P0Y/6tU5lCB4x4EJpGJU7iaZc1/img.png&quot; data-alt=&quot;기존 1, 2, 3과는 다른 문제 유형&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qqFOe/btsm92t7P0Y/6tU5lCB4x4EJpGJU7iaZc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqqFOe%2Fbtsm92t7P0Y%2F6tU5lCB4x4EJpGJU7iaZc1%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; alt=&quot;벽 부수고 이동하기 4&quot; loading=&quot;lazy&quot; width=&quot;2334&quot; height=&quot;1496&quot; data-filename=&quot;Screenshot 2023-07-10 at 5.35.29 PM.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1496&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존 1, 2, 3과는 다른 문제 유형&lt;/figcaption&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 벽 부수고 이동하기 1, 2, 3과는 다른 형식의 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정석대로라면 BFS, DFS를 통한 그래프 탐색문제로 풀 수 있지만, 그래프 탐색을 쓰지않은 풀이는 없는 것 같아서 이런 방법도 있다고 알려드리기 위해 포스팅합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. N * M 행렬을 순회하며 입력을 받으며 입력 값을 체크합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 만약 입력 값이 0이라면 이미 지나왔으며 인접한 위, 왼쪽을 체크해 0인지 확인하고, 0이라면 두 좌표를 union 연산으로 묶어주고 두 그룹의 크기를 합쳐줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 입력이 끝난 시점에서 각 노드는 그룹이 완성된 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 다시 입력받은 배열을 순회하며 0이라면 그대로 출력, 1이라면 상하좌우 그룹의 크기를 더한 후 10을 나눈 나머지를 출력해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;입력&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 &amp;lt;= N, M &amp;lt;= 1000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(문제에서 최대 1,000,000개의 입력이 가능하지만, c++ 기준 입출력 최적화를 하지 않아도 통과했습니다.)&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;char[N][M] NM개의 입력을 받기위한 배열입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int[N][M] NM개의 노드의 부모노드를 나타내기 위한 배열입니다.(하기 코드에서는 1차원 배열로 변형해 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 각 그룹의 크기를 기록하기 위해 map, 상하좌우 그룹의 중복을 막기위해 set 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;로직&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. N*M 크기의 배열을 순회하며 기존에 이미 연산이 끝난 왼쪽, 위쪽 값을 참조해 집합을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 즉 현재 위치가 x, y일 때 현재 위치와 상호작용이 가능한 위치는 {x - 1, y}와 {x, y - 1}의 두개의 위치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 만약 해당 두 위치가 현재 위치와 서로 연결되어있다면, 두 위치는 현재 위치를 매개로 같은 집합이 이루어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 순회를 마쳤을 때, 모든 벽이 아닌 공간은 집합이 되어있으므로 벽을 부쉈을 경우 상하좌우의 집합의 갯수를 모두 세어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-ad-creative-wrap=&quot;outer&quot;&gt;
&lt;div data-ad-creative-wrap=&quot;inner&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;pre id=&quot;code_1663933155553&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;map&amp;gt;
#include &amp;lt;set&amp;gt;

using namespace std;

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

vector&amp;lt;int&amp;gt; par;
map&amp;lt;int, int&amp;gt; szmap;
vector&amp;lt;vector&amp;lt;char&amp;gt;&amp;gt; grp;

int find(int x) {
	if (par[x] == x) return x;
	if (par[x] == -1) return -1;
	return par[x] = find(par[x]);
}
void merge(int a, int b) {
	a = find(a);
	b = find(b);
	if (a == b) return ;
	par[b] = a;
	szmap[a] += szmap[b];
}

int main() {
	int n, m; cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
	par.resize(n * m, -1);
	grp.resize(n, vector&amp;lt;char&amp;gt;(m));
	
	for (int i = 0; i &amp;lt; n; ++i)
		for (int j = 0; j &amp;lt; m; ++j) {
			cin &amp;gt;&amp;gt; grp[i][j];
			if (grp[i][j] == '0') {
				szmap[i * m + j] = 1;
				par[i * m + j] = i * m + j;
				if (i - 1 &amp;gt;= 0 &amp;amp;&amp;amp; grp[i - 1][j] == '0')
					merge((i - 1) * m + j, i * m + j);
				if (j - 1 &amp;gt;= 0 &amp;amp;&amp;amp; grp[i][j - 1] == '0')
					merge(i * m + j - 1, i * m + j);
			}
		}
	for (int i = 0; i &amp;lt; n; ++i) {
		for (int j = 0; j &amp;lt; m; ++j) {
			if (grp[i][j] == '0') cout &amp;lt;&amp;lt; 0;
			else {
				set&amp;lt;int&amp;gt; tmp;
				for (int k = 0; k &amp;lt; 4; ++k) {
					int nY = i + dy[k];
					int nX = j + dx[k];
					if (nY &amp;lt; 0 || nX &amp;lt; 0 || nY &amp;gt;= n || nX &amp;gt;= m) continue ;
					tmp.insert(find(nY * m + nX));
				}
				int res = 1;
				for (auto t : tmp)
					if (t == -1) continue;
					else res += szmap[t];
				cout &amp;lt;&amp;lt; res % 10;
			}
		}
		cout &amp;lt;&amp;lt; '\n';
	}
	return 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(NM logNM)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NM 크기의 배열을 순회하며 O(logNM) 만큼의 시간복잡도를 가지는 find 연산을 수행하기에 위와 같은 시간복잡도가 발생합니다.&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;style2&quot; /&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;</description>
      <category>PS</category>
      <category>DP</category>
      <category>다이나믹프로그래밍</category>
      <category>백준</category>
      <category>벽 부수고 이동하기</category>
      <category>분리집합</category>
      <category>유니온파인드</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/97</guid>
      <comments>https://youngmon.tistory.com/entry/BOJ-16946-c-%EB%B2%BD-%EB%B6%80%EC%88%98%EA%B3%A0-%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0-4-%EB%B6%84%EB%A6%AC-%EC%A7%91%ED%95%A9#entry97comment</comments>
      <pubDate>Fri, 21 Jul 2023 21:18:30 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT) Chat GPT-4 분석, Bing과의 차이점</title>
      <link>https://youngmon.tistory.com/entry/ChatGPT-Chat-GPT-4-%EB%B6%84%EC%84%9D-Bing%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.41.07 PM.png&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZiVCY/btr3V6DuGkc/QuUvIPORzrccWDQzMHcXQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZiVCY/btr3V6DuGkc/QuUvIPORzrccWDQzMHcXQk/img.png&quot; data-alt=&quot;플러스 구독자를 위한 최신 버전, GPT-4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZiVCY/btr3V6DuGkc/QuUvIPORzrccWDQzMHcXQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZiVCY%2Fbtr3V6DuGkc%2FQuUvIPORzrccWDQzMHcXQk%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; alt=&quot;Chat GPT 4&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;729&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.41.07 PM.png&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;플러스 구독자를 위한 최신 버전, GPT-4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open AI가 드디어 Chat GPT의 새로운 버전인 GPT-4 모델을 플러스 유저들에게 공개했습니다.&lt;br /&gt;일반 유저에게는 공개되지 않았으며, GPT-4를 사용하기 위해서는 GPT Plus 구독을 통해 Plus 유저 권한으로 사용할 수 있습니다.&lt;/p&gt;
&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://youngmon.app/entry/ChatGPT-Chat-GPT-사용-방법과-GPT-Plus-후기&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.02.12 - [정정생보통] - ChatGPT) Chat GPT 사용 방법과 GPT Plus 후기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1678867281710&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;ChatGPT) Chat GPT 사용 방법과 GPT Plus 후기&quot; data-og-description=&quot;OpenAI의 Chat GPT의 유료버전인 Chat GPT Plus가 11일 한국에 도입되었습니다. GPT 플러스는 이용자가 몰리는 시간에도 평소처럼 접속할 수 있으며, 답변을 받기까기 걸리는 시간을 단축해주며, 새로운 &quot; data-og-host=&quot;youngmon.app&quot; data-og-source-url=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-사용-방법과-GPT-Plus-후기&quot; data-og-url=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95%EA%B3%BC-GPT-Plus-%ED%9B%84%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRe0oq/hyRWy32ZGS/xkJpIbsHkSbw0wQUi5Yj3K/img.png?width=580&amp;amp;height=600&amp;amp;face=0_0_580_600,https://scrap.kakaocdn.net/dn/gDKyA/hyRWnuGuNc/5wcK7P7lgO0uGpVzHZNjl0/img.png?width=580&amp;amp;height=600&amp;amp;face=0_0_580_600,https://scrap.kakaocdn.net/dn/7DxxY/hyRWsirHCc/Iz125Ay0dmiMT7KF3KXQh1/img.png?width=1000&amp;amp;height=992&amp;amp;face=0_0_1000_992&quot;&gt;&lt;a href=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-사용-방법과-GPT-Plus-후기&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-사용-방법과-GPT-Plus-후기&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRe0oq/hyRWy32ZGS/xkJpIbsHkSbw0wQUi5Yj3K/img.png?width=580&amp;amp;height=600&amp;amp;face=0_0_580_600,https://scrap.kakaocdn.net/dn/gDKyA/hyRWnuGuNc/5wcK7P7lgO0uGpVzHZNjl0/img.png?width=580&amp;amp;height=600&amp;amp;face=0_0_580_600,https://scrap.kakaocdn.net/dn/7DxxY/hyRWsirHCc/Iz125Ay0dmiMT7KF3KXQh1/img.png?width=1000&amp;amp;height=992&amp;amp;face=0_0_1000_992');&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;ChatGPT) Chat GPT 사용 방법과 GPT Plus 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OpenAI의 Chat GPT의 유료버전인 Chat GPT Plus가 11일 한국에 도입되었습니다. GPT 플러스는 이용자가 몰리는 시간에도 평소처럼 접속할 수 있으며, 답변을 받기까기 걸리는 시간을 단축해주며, 새로운&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;youngmon.app&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 가능 모델&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용 가능한 모델로는 일반 유저를 위한 GPT 3.5(Legacy)와 Plus 유저를 위한 GPT 3.5(Plus), 그리고 오늘 소개해드릴 GPT 4가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.49.26 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p74wS/btr35F5qaIc/pltx0PmqKRa63RKh4okY11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p74wS/btr35F5qaIc/pltx0PmqKRa63RKh4okY11/img.png&quot; data-alt=&quot;GPT-3.5(Legacy)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p74wS/btr35F5qaIc/pltx0PmqKRa63RKh4okY11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp74wS%2Fbtr35F5qaIc%2Fpltx0PmqKRa63RKh4okY11%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; alt=&quot;GPT-3.5(Legacy)&quot; loading=&quot;lazy&quot; width=&quot;673&quot; height=&quot;296&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.49.26 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPT-3.5(Legacy)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.49.21 PM.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HBB8L/btr3XzZOhnX/c0sLscTpmKEmTL3kQDGNW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HBB8L/btr3XzZOhnX/c0sLscTpmKEmTL3kQDGNW1/img.png&quot; data-alt=&quot;GPT-3.5 (plus)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HBB8L/btr3XzZOhnX/c0sLscTpmKEmTL3kQDGNW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHBB8L%2Fbtr3XzZOhnX%2Fc0sLscTpmKEmTL3kQDGNW1%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; alt=&quot;GPT-3.5 (plus)&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;308&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.49.21 PM.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPT-3.5 (plus)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.49.32 PM.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Npbny/btr36RxKE4Q/ns4n3DH9R1WsTf5llOBVm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Npbny/btr36RxKE4Q/ns4n3DH9R1WsTf5llOBVm1/img.png&quot; data-alt=&quot;GPT-4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Npbny/btr36RxKE4Q/ns4n3DH9R1WsTf5llOBVm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNpbny%2Fbtr36RxKE4Q%2Fns4n3DH9R1WsTf5llOBVm1%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; alt=&quot;GPT-4&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;395&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.49.32 PM.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPT-4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 버전의 특징들을 간단히 시각화하여 보여주고 있습니다. GPT 3.5의 경우 Plus로 사용할 때 조금 더 빠르고 일관된 답변을 제공,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-4 모델의 경우 기존 3.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;h4 data-ke-size=&quot;size20&quot;&gt;답변 정확도 증가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 GPT가 틀린 정보를 줘서 검색 등을 통해 교차 검증하는 과정에 시간이 꽤 많이 필요했는데, 이번 모델은 도메인 지식에 대한 적응력을 높여 전문적인 분야의 답변에도 정확성을 크게 높였다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 다양한 분야의 학습 데이터의 확장, 특정 도메인에 특화되기 위한 Fine-Tuning 기능, 전이 학습을 통한 다른 도메인 간 지식의 활용을 통해 구현되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문맥 이해도 증가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문을 하다 보면 질문에 대해 잘 못 이해해서 같은 질문을 반복하고, 같은 답변을 받는 과정에서 스트레스가 있었는데 사용자의 질문에 대해 파악하는 능력을 향상해 더욱 관련성 있고, 문맥에 어울리는 답변을 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용자 인터페이스 개선&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 장황한 설명이나 반복적인 답변에 대해 더욱 간결하고 정확한 답변을 생성하도록 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이미지 처리 기능&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text로만 입력을 받을 수 있는 기존 모델과 달리 이미지를 입력받을 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 아직 일반 사용자에게는 기능이 공개되지 않았는데 귀만 있던 GPT가 눈이 생기면 어떻게 될 지 궁금하네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 입력받고 Dall-E를 통해 새로운 합성물을 만든다던가, 누끼를 딴다던가 하는 작업도 가능할 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고&amp;nbsp; 쓰면서 가장 만족했던 점 ..&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;창의력&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 창의적으로 변한 것보다도 더 이상 없는 소리를 지어내지 않는다는 사실이 가장 마음에 드는 것 같습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;창의력을 마음대로 발휘하지 않는 부분이 저를 안심시키네요&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;거짓말쟁이 GPT 3.5&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;Screenshot 2023-03-15 at 5.28.01 PM.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ng8Qu/btr34M5apXA/Oog8GdS5jjm6pJovu1cgf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ng8Qu/btr34M5apXA/Oog8GdS5jjm6pJovu1cgf0/img.png&quot; data-alt=&quot;한국 무형 문화재 체인 라이트닝&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ng8Qu/btr34M5apXA/Oog8GdS5jjm6pJovu1cgf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fng8Qu%2Fbtr34M5apXA%2FOog8GdS5jjm6pJovu1cgf0%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; alt=&quot;기존 정확도&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;410&quot; data-filename=&quot;Screenshot 2023-03-15 at 5.28.01 PM.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1020&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;참말쟁이 GPT-4&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;Screenshot 2023-03-15 at 5.32.09 PM.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUAyhs/btr36FEf9PQ/eQFlpBTLRFQb5kAHwjHv21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUAyhs/btr36FEf9PQ/eQFlpBTLRFQb5kAHwjHv21/img.png&quot; data-alt=&quot;정신 차렸네&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUAyhs/btr36FEf9PQ/eQFlpBTLRFQb5kAHwjHv21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUAyhs%2Fbtr36FEf9PQ%2FeQFlpBTLRFQb5kAHwjHv21%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; alt=&quot;GPT-4 정확도&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;541&quot; data-filename=&quot;Screenshot 2023-03-15 at 5.32.09 PM.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1276&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;이거 때문에 의심되는 건 Bing Ai로 한 번 더 물어보고, 구글에서 찾아보고 했었는데 Bing Ai에 또 물어볼 필요는 없어진 것 같습니다.&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;이렇게 GPT 3.5와 GPT 4에 대해 비교해 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT4가 기존 모델에 비해 정확도나 안정성 측면에서 훨씬 낫습니다. 그렇다면 이제 GPT 3.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;하지만 GPT 4에도 아직 부족한 부분이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.42.16 PM.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;1352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJR4wz/btr3V6DH7gL/IyJdZrRBCz6IY2YkxnHbmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJR4wz/btr3V6DH7gL/IyJdZrRBCz6IY2YkxnHbmk/img.png&quot; data-alt=&quot;요청 개수 제한&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJR4wz/btr3V6DH7gL/IyJdZrRBCz6IY2YkxnHbmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJR4wz%2Fbtr3V6DH7gL%2FIyJdZrRBCz6IY2YkxnHbmk%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; alt=&quot;요청 제한 개수&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;632&quot; data-filename=&quot;Screenshot 2023-03-15 at 4.42.16 PM.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;1352&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;단점은 아니지만 GPT 4는 아직 플러스 유저도 4시간 동안 100개의 요청밖에 보낼 수 없습니다. 때문에 GPT의 사용량이 많은 분이라면 GPT4의 요청량을 소진한 이후에는 다시 GPT 3.5를 사용하셔야 합니다. 약 1시간에 25개의 요청이 가능하고, 2분에 한 개 이상 질문을 했을 때 리밋이 걸린다고 생각하면 약간 부족한 감은 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 사용해 본 후기로는 GPT 3.5를 쓸 때보다 질문이 덜 필요했습니다. 기존에는 장황하게 설명해서 다시 물어보거나 꼬리 질문을 통해 더욱 깊이 파고들어 가야 했다면, 지금은 꽤나 정확하고 간결하게 말해주어서 여러 번 질문을 하지 않게 된다는 장점이 있습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-03-15 at 6.10.02 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1028&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHeFK/btr34b5klri/v4P6kK8MOf9kj5waoA1fGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHeFK/btr34b5klri/v4P6kK8MOf9kj5waoA1fGk/img.png&quot; data-alt=&quot;Bing AI chatbot&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHeFK/btr34b5klri/v4P6kK8MOf9kj5waoA1fGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHeFK%2Fbtr34b5klri%2Fv4P6kK8MOf9kj5waoA1fGk%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; alt=&quot;Bing과 마지막 인사&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;323&quot; data-filename=&quot;Screenshot 2023-03-15 at 6.10.02 PM.png&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1028&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bing AI chatbot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 쓸만하냐구요? 일단 만족하는 중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 저 낮은 정확도 때문에 Bing AI를 사용해야 했는데, 이제 그럴 필요는 없어진 것 같아 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bing AI의 단점은 너무 단순한데요. (살면서 제가 엣지를 쓸 줄은 몰랐습니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT 구독에 회의감을 느끼던 시점에서 GPT4가 나와서 쓰게 해 주니까 또 얼어붙은 마음이 눈 녹듯이 녹아내리는군요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빙 안녕 다시 잘 가..&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>Ai</category>
      <category>ChatGPT</category>
      <category>GPT</category>
      <category>대화형 검색엔진</category>
      <category>인공지능</category>
      <category>챗GPT</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/96</guid>
      <comments>https://youngmon.tistory.com/entry/ChatGPT-Chat-GPT-4-%EB%B6%84%EC%84%9D-Bing%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90#entry96comment</comments>
      <pubDate>Wed, 15 Mar 2023 18:15:35 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 91-100) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-91-100-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drQaEL/btr3lDmUTQt/0NL3KjK3xFk3ETPZ2w1hD1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drQaEL/btr3lDmUTQt/0NL3KjK3xFk3ETPZ2w1hD1/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drQaEL/btr3lDmUTQt/0NL3KjK3xFk3ETPZ2w1hD1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrQaEL%2Fbtr3lDmUTQt%2F0NL3KjK3xFk3ETPZ2w1hD1%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;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;91. 다음 중 NIS 클라이언트에서 사용하는 명령어로 거리가 먼 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ypcat&lt;/li&gt;
&lt;li&gt;yptest&lt;/li&gt;
&lt;li&gt;ypwhich&lt;/li&gt;
&lt;li&gt;yppush&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. yppush&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : ypcat, yptest, ypwhich 모두 NIS 클라이언트에서 사용하는 명령어지만 yppush는 NIS 마스터 서버에서 사용하는 명령어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;92. 다음 중 NIS 클라이언트로 운영하기 위해 설치해야 하는 패키지의 조합으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ypbind, yp-tools&lt;/li&gt;
&lt;li&gt;ypserv, ypbind&lt;/li&gt;
&lt;li&gt;ypserv, yp-tools&lt;/li&gt;
&lt;li&gt;ypbind, ypxfrd&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. ypbind, yp-tools&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : NIS 클라이언트 운영을 위해서는 ypbind와 yp-tools 패키지가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;93. CentOS 7에서 NIS 서버를 사용하기 위해 RPC 처리를 위한 데몬 실행이 요구된다. 다음 중 관련 실행 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;systemctl start ypbind&lt;/li&gt;
&lt;li&gt;systemctl start ypserv&lt;/li&gt;
&lt;li&gt;systemctl start portmap&lt;/li&gt;
&lt;li&gt;systemctl start rpcbind&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. systemctl start rpcbind&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : NIS 서버를 사용하기 위해서는 RPC 처리를 위한 rpcbind 데몬을 실행해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;94. 다음은 LDAP의 속성 관련 설정의 일부이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;( ㄱ ): ( ㄴ )=Jone Doe, dc=ihd, dc=com&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;( ㄱ ) dc&amp;nbsp; &amp;nbsp;( ㄴ ) cn&lt;/li&gt;
&lt;li&gt;( ㄱ ) dn&amp;nbsp; &amp;nbsp;( ㄴ ) dc&lt;/li&gt;
&lt;li&gt;( ㄱ ) cn&amp;nbsp; &amp;nbsp;( ㄴ ) dc&lt;/li&gt;
&lt;li&gt;( ㄱ ) dn&amp;nbsp; &amp;nbsp;( ㄴ ) cn&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. (&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ㄱ ) dn&amp;nbsp; &amp;nbsp;( ㄴ ) cn&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : dn(distinguished Name), cn(Common Name)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;95. 다음 중 LDAP과 RDBMS(관계형 데이터베이스 시스템)과의 비교 설명으로 틀린 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;LDAP이 RDBMS에 비해 읽기 작업이 많은 곳에 유리하다.&lt;/li&gt;
&lt;li&gt;LDAP이 RDBMS에 비해 쓰기 작업이 많은 곳에 유리하다.&lt;/li&gt;
&lt;li&gt;LDAP이 RDBMS에 비해 검색 작업이 많은 곳에 유리하다.&lt;/li&gt;
&lt;li&gt;LDAP은 계층형 트리 구조 형태이고, RDBMS는 행과 열 형태의 테이블 구조이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. LDAP이 RDBMS에 비해 쓰기 작업이 많은 곳에 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : LDAP이 RDBMS에 비해 쓰기 작업에서 불리하고 읽기, 검색 등의 작업에서 유리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;96. 다음은 PHP7 버전 파일에서 MySQL 5.7 버전의 데이터베이스 접속하기 위한 설정이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;pre id=&quot;code_1678563221945&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;? php
$db=( 괄호 )(&quot;localhost&quot;, &quot;root&quot;, &quot;1234&quot;, &quot;ihd&quot;);
... 생략
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;mysql_connect&lt;/li&gt;
&lt;li&gt;mysqli_connect&lt;/li&gt;
&lt;li&gt;mysql_select_db&lt;/li&gt;
&lt;li&gt;mysqli_select_db&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. mysqli_connect&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;mysqli_connect(&quot;호스트명&quot;, &quot;사용자명&quot;, &quot;암호&quot;, &quot;데이터베이스명&quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;97. 다음은 개인 사용자의 홈페이지 사용을 허가하기 위해 관련 설정 파일을 확인하는 과정이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;LoadModule userdir_module modules/( 괄호 )&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;mod-userdir.so&lt;/li&gt;
&lt;li&gt;mod_userdir.so&lt;/li&gt;
&lt;li&gt;httpd-userdir.so&lt;/li&gt;
&lt;li&gt;httpd_userdoir.so&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. mod_userdir.so&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : Apache 웹 서버의 userdir_module은 사용자별 디렉토리 기능을 활성화, 사용자가 홈 디렉토리에서 웹 페이지를 작성하면 서버주소/~사용자명의 형식으로 페이지 접속을 지원합니다. 이를 위해서는 mod_userdir.so라는 모듈이 위치해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;98. 다음 중 아파치 웹 서버 환경 설정 파일의 문법적인 오류를 점검하는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;httpd -f&lt;/li&gt;
&lt;li&gt;httpd -t&lt;/li&gt;
&lt;li&gt;httpd -l&lt;/li&gt;
&lt;li&gt;httpd -S&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. httpd -t&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : -t(test), 문법적인 오류 점검&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;99. 다음은 아파치 웹 서버 환경 설정 파일에서 웹 문서가 저장되는 위치를 확인하는 과정이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;( 괄호 ) &quot;/usr/local/apache/htdocs&quot;&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DocumentRoot&lt;/li&gt;
&lt;li&gt;ServerRoot&lt;/li&gt;
&lt;li&gt;DirectoryRoot&lt;/li&gt;
&lt;li&gt;IndexRoot&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. DocumentRoot&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 웹페이지의 기본 디렉터리를 지정하는 지시자로 해당 디렉터리 내의 파일들이 웹 서버에서 제공됩니다. 따라서 괄호에 들어갈 값으로는 DocumentRoot가 적절합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;100. 다음 설명에 해당하는 웹 서버 프로그램으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;가벼움과 높은 성능을 목표로 하는 프로그램으로 리버스 프록시, 로드 밸런서, HTTP Cache 기능을 제공한다. 클라이언트 요청에 응답하기 위해 비동기 이벤트 기반 구조이다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;IIS&lt;/li&gt;
&lt;li&gt;GWS&lt;/li&gt;
&lt;li&gt;NginX&lt;/li&gt;
&lt;li&gt;Apache HTTP Server&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. NginX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 가볍고 고성능을 목표로 하는 비동기 이벤트 기반의 웹 서버는 NginX입니다. Apache에 비해 적은 자원을 사용하며 높은 성능을 보여줍니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/95</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-91-100-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry95comment</comments>
      <pubDate>Sun, 12 Mar 2023 04:51:49 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 81-90) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-81-90-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5hTJO/btr3iJnpope/mgKfqnjEkvmJKsETc97IP1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5hTJO/btr3iJnpope/mgKfqnjEkvmJKsETc97IP1/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5hTJO/btr3iJnpope/mgKfqnjEkvmJKsETc97IP1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5hTJO%2Fbtr3iJnpope%2FmgKfqnjEkvmJKsETc97IP1%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;81. 다음 설명과 가장 관련이 있는 환경 설정 파일로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;회사의 help 계정으로 들어오는 메일은 고객지원실 소속 직원들에게 전부 전송되도록 설정한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/etc/mail/local-host-names&lt;/li&gt;
&lt;li&gt;/etc/mail/access&lt;/li&gt;
&lt;li&gt;/etc/mail/virtusertable&lt;/li&gt;
&lt;li&gt;/etc/aliases&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. /etc/mail/virtusertable&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 가상 사용자 테이블인 virtusertable은 메일의 수신자 주소를 실제 존재하는 사용자 계정으로 매핑하는데 사용합니다. 위 경우에는 help 계정으로 들어오는 메일을 소속 직원들에게 매핑해 전송합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;82. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# cd /etc/mail&lt;br /&gt;# ( ㄱ ) sendmail.mc ( ㄴ ) sendmail.cf&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;( ㄱ ) m4&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;gt;&lt;/li&gt;
&lt;li&gt;( ㄱ ) m4&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;lt;&lt;/li&gt;
&lt;li&gt;( ㄱ ) makemap hash&amp;nbsp; &amp;nbsp; ( ㄴ ) &amp;gt;&lt;/li&gt;
&lt;li&gt;( ㄱ ) makemap hash&amp;nbsp; &amp;nbsp; ( ㄴ ) &amp;lt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 1. ( ㄱ ) m4&amp;nbsp; &amp;nbsp;( ㄴ ) &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : M4 매크로 언어를 사용해 sendmail의 config 파일을 생성할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;83. 다음 형식의 설정을 확인할 수 있는 파일로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Connect:192.168.5.13&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;RELAY&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/etc/mail/local-host-names&lt;/li&gt;
&lt;li&gt;/etc/mail/access&lt;/li&gt;
&lt;li&gt;/etc/mail/virtusertable&lt;/li&gt;
&lt;li&gt;/etc/aliases&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 2. /etc/mail/access&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : access 파일은 송신자나 수신자 등에 대한 액세스 규칙 지정에 사용됩니다. 위 예시에서 /etc/mail/access 파일의 설정은 192.168.5.13으로부터 들어오는 메일을 RELAY로 지정해 릴레이할 수 있도록 하용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;84. 다음 설명에 해당하는 메일 관련 프로그램으로 거리가 먼 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;사용자들이 메일을 읽고 보낼 때 사용하는 프로그램으로 MUA(Mail User Agent)라고 부른다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;mail&lt;/li&gt;
&lt;li&gt;qmail&lt;/li&gt;
&lt;li&gt;evolution&lt;/li&gt;
&lt;li&gt;Outlook&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 1. mail&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : mail은 MUA가 아닌 CLI 기반 클라이언트입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;85. 다음 설명에 가장 적합한 메일 관련 프로그램으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;사용자들에게 안전한 IMAP 및 POP3 서버를 제공하고 손쉽게 관리하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;dovecot&lt;/li&gt;
&lt;li&gt;qmail&lt;/li&gt;
&lt;li&gt;procmail&lt;/li&gt;
&lt;li&gt;postfix&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 1. dovecot&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : dovecot은 안전하고 확장성이 높은 IMAP 및 POP3 서버입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;86. 다음은 vsftpd 서버의 환경 설정 파일 내용 중 일부이다. 해당 설정에 대한 설명으로 가장 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;local_enable=YES&lt;/blockquote&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;root 사용자의 접근을 허가한다.&lt;/li&gt;
&lt;li&gt;일반 사용자의 접근을 허가한다.&lt;/li&gt;
&lt;li&gt;모든 사용자의 접근을 허가한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 3. 일반 사용자의 접근을 허가한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 해당 값은 로컬 사용자의 FTP 접근을 허용한다는 의미입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;87. 다음 설명에 해당하는 NFS 서버 설정 옵션으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;root 사용자와 일반 사용자의 권한을 nobody 또는 nfsnobody 계정으로 매핑시킨다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;root_squash&lt;/li&gt;
&lt;li&gt;no_root_squash&lt;/li&gt;
&lt;li&gt;all_squash&lt;/li&gt;
&lt;li&gt;no_all_squash&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 1. root_squash&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : root_squash는 NFS 서버에서 root 사용자가 파일을 접근할 때 해당 권한을 nobody 또는 nfsnobody 계정으로 매핑시켜 보안 문제를 방지합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;88. 다음은 NFS 서버에서 공유된 내용을 확인할 결과이다. 관련 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[root@www ~]#&lt;br /&gt;/data&amp;nbsp; &amp;nbsp; &amp;nbsp; 192.168.56.0/24(sync, wdelay,hide, no_subtree_check,sec=sys,rw,no_root_squash,no_all_squash)&lt;br /&gt;/data&amp;nbsp; &amp;nbsp; &amp;nbsp; 192.168.13.0/24(sync, wdelay,hide,no_subtree_check,sec=sys,rw,root_squash,all_squash)&lt;br /&gt;[root@www ~]#&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;showmount&lt;/li&gt;
&lt;li&gt;exportfs&lt;/li&gt;
&lt;li&gt;nfsstauts&lt;/li&gt;
&lt;li&gt;rpcinfo&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 2. exportfs&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : exportfs는 NFS 서버에서 공유된 내용을 확인할 때 사용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;89. 다음은 삼바 설정 파일에서 공유 디렉터리의 경로를 설정하는 과정이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;( 괄호 ) = /usr/local/apache/htdocs&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;data&lt;/li&gt;
&lt;li&gt;path&lt;/li&gt;
&lt;li&gt;share&lt;/li&gt;
&lt;li&gt;root&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 2. path&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 삼바서버 설정 파일에서 공유 디렉터리를 설정할 때는 path 옵션을 사용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;90. 다음은 리눅스 시스템에서 IP 주소가 192.168.5.13인 윈도우 시스템에 공유된 디렉터리를 마운트하는 과정이다. 공유 디렉터리명이 data일 때 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# smbclient ( 괄호 )&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;////192.168.5.13//data&lt;/li&gt;
&lt;li&gt;\\\\192.168.5.13\\data&lt;/li&gt;
&lt;li&gt;-L 192.168.5.13 -U data&lt;/li&gt;
&lt;li&gt;-L 192.168.5.13 -M data&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 2. \\\\192.168.5.13\\data&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 리눅스에서 smbclient 명령으로 윈도우 시스템에 접근할 때에는 윈도우에서 사용하는 \의 2배로 지정, /를 사용하는 경우에는 호스트 앞에 2개, 디렉토리 구분은 1개씩 사용하며, 대소문자는 구분하지 않습니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/94</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-81-90-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry94comment</comments>
      <pubDate>Sun, 12 Mar 2023 04:18:49 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 71-80) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-71-80-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q0KtF/btr3psk6iin/AQmQcphORP7HJmqNAMf0Gk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q0KtF/btr3psk6iin/AQmQcphORP7HJmqNAMf0Gk/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q0KtF/btr3psk6iin/AQmQcphORP7HJmqNAMf0Gk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq0KtF%2Fbtr3psk6iin%2FAQmQcphORP7HJmqNAMf0Gk%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;71. 다음 중 KVM을 이용해서 가상 머신을 생성했을 때 기본적으로 적용되는 디스크 이미지 파일 형식으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;VDI&lt;/li&gt;
&lt;li&gt;VMDK&lt;/li&gt;
&lt;li&gt;VHD&lt;/li&gt;
&lt;li&gt;QCOW2&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. QCOW2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : KVM을 이용해 가상머신을 생성할 때 기본적으로 적용되는 디스크 이미지 파일 형식은 QCOW2 (QEU Copy On Write 2)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;72. 다음 중 가상 머신만을 대상으로 CPU 자원 상태를 모니터링할 때 사용하는 명령어로 가장 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;virsh&lt;/li&gt;
&lt;li&gt;libvirtd&lt;/li&gt;
&lt;li&gt;virt-manager&lt;/li&gt;
&lt;li&gt;virt-top&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. virt-top&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 가상머신만을 대상으로 CPU 자원 상태를 모니터링하는 명령어는 virt-top입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;73. 다음 설명에 해당하는 프로그램으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;구글이 개발을 시작한 컨테이너 관리 프로그램으로 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화해준다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;CoreOS&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Openstack&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. Kubernetes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 쿠버네티스는 구글의 대규모 컨테이너 배포, 자동화를 위한 오픈소스 플랫폼입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;74. 다음 설명에 해당하는 프로그램으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;VMM(Virtual Machine Monitor)과 원활한 통신을 위해 게스트 운영체제의 커널 일부분을 수정해서 적용한다. 이를 통해 게스트 운영체제에서 물리적 자원에 대해 직접 접근이 가능해진다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;XEN&lt;/li&gt;
&lt;li&gt;KVM&lt;/li&gt;
&lt;li&gt;Hyper-V&lt;/li&gt;
&lt;li&gt;VirtualBox&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. XEN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 게스트 운영체제에서 물리적 자원에 대해 &quot;직접 접근&quot;이 가능하게 하는 기술을 반 가상화라고 하며, 이를 사용하는 프로그램은 XEN입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;75. 다음 설명에 해당하는 가상화의 기능으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;가상 자원을 여러 개의 물리적 자원들에 걸쳐서 만드는 것으로 이를 통해 외견상 전체 용량을 증가시키고, 전체적인 관점에서 활용과 관리를 단순화시킬 수 있다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;공유(sharing)&lt;/li&gt;
&lt;li&gt;단일화(Aggregation)&lt;/li&gt;
&lt;li&gt;절연(Insulation)&lt;/li&gt;
&lt;li&gt;에뮬레이션(Emulation)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. 단일화(Aggregation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 여러 개의 물리적 자원을 가상자원으로 만들어 관리를 단순화하고 용량을 증가시키는 기능은 단일화입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;76. 다음 설명에 해당하는 DNS 서버의 Zone 파일 설정으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;도메인은 ihd.or.kr이고, 호스트 이름을 mail로 해서 메일 서버를 운영하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;mail&amp;nbsp; &amp;nbsp; MX&amp;nbsp; &amp;nbsp; ihd.or.kr&lt;/li&gt;
&lt;li&gt;mail&amp;nbsp; &amp;nbsp; MX&amp;nbsp; &amp;nbsp; ihd.or.kr.&lt;/li&gt;
&lt;li&gt;mail&amp;nbsp; &amp;nbsp; MX&amp;nbsp; 0&amp;nbsp; ihd.or.kr&lt;/li&gt;
&lt;li&gt;mail&amp;nbsp; &amp;nbsp; MX&amp;nbsp; 0&amp;nbsp; ihd.or.kr.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. mail&amp;nbsp; &amp;nbsp;MX&amp;nbsp; 0 ihd.or.kr&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : mail은 호스트 이름, MX는 메일서버 레코드 타입, 0은 우선순위, ihd.or.kr은 메일 서버의 IP 주소 또는 FQDN이며, FQDN을 사용할 경우 맨 끝에 &quot;.&quot;를 붙여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;77. 다음 중 리버스 존 파일에서만 사용되는 레코드 타입으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;PTR&lt;/li&gt;
&lt;li&gt;CNAME&lt;/li&gt;
&lt;li&gt;MX&lt;/li&gt;
&lt;li&gt;NS&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. PTR&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : PTR(PoinTeR) 레코드는 IP 주소를 호스트 이름으로 변환하는 데에 사용되며, 이러한 PTR 레코드는 리버스 DNS에서 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;78. 다음은 DNS 관련 질의를 다른 서버로 넘기는 설정의 일부이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;forward only;&lt;br /&gt;( 괄호 ) { 168.126.63.1; };&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;allow-query&lt;/li&gt;
&lt;li&gt;allow-transfer&lt;/li&gt;
&lt;li&gt;allow-forwarder&lt;/li&gt;
&lt;li&gt;forwarders&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. forwarders&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : DNS 쿼리를 다른 서버로 넘기는 설정에서 다른 DNS 서버에 대한 포워딩 설정은 &quot;forwarders&quot;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;79. 다음 중 /etc/named.conf 파일에 대한 설명으로 틀린 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;C 언어에서 사용되는 /* ~ */ 형식의 주석을 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;C++ 언어에서 사용되는 // 형식의 주석을 사용할 수 있다.&lt;/li&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;정답 : 3.윈도우 운영체제에서 사용되는 ; 형식의 주석을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 윈도우 운영체제의 ; 빼고 전부 사용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;80. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;( ㄱ ) 프로그램은 가장 널리 쓰이는 DNS 서버 프로그램으로 ( ㄴ )라는 비영리 기업에서 배포하고 있다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;( ㄱ ) named&amp;nbsp; &amp;nbsp;( ㄴ ) ISC&lt;/li&gt;
&lt;li&gt;( ㄱ ) named&amp;nbsp; &amp;nbsp;( ㄴ ) BIND&lt;/li&gt;
&lt;li&gt;( ㄱ ) ISC&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( ㄴ ) BIND&lt;/li&gt;
&lt;li&gt;( ㄱ ) BIND&amp;nbsp; &amp;nbsp; &amp;nbsp; ( ㄴ ) ISC&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. ( ㄱ ) BIND&amp;nbsp; &amp;nbsp; ( ㄴ ) ISC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : BIND는 가장 널리 사용되는 DNS 서버 프로그램이며, ISC에서 개발 및 유지보수를 담당합니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/93</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-71-80-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry93comment</comments>
      <pubDate>Sun, 12 Mar 2023 03:40:52 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 61-70) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-61-70-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wP1hV/btr3cdp29vB/nBxzV5ekATxoLi3k9GBKh0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wP1hV/btr3cdp29vB/nBxzV5ekATxoLi3k9GBKh0/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wP1hV/btr3cdp29vB/nBxzV5ekATxoLi3k9GBKh0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwP1hV%2Fbtr3cdp29vB%2FnBxzV5ekATxoLi3k9GBKh0%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;&lt;span style=&quot;color: #555555; text-align: center;&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bSLtD6/btr3cKunp2u/1rMbJlOS0aYhHfjWD4Zlx1/img.webp&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;/span&gt;61. 다음 설명에 해당하는 프로그램으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;iptables를 만든 넷필터(netfilter) 프로젝트에서 iptables, ip6tables, arptables, ebtables를 대체하기 위해 새롭게 만든 방화벽 소프트웨어이다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nftables&lt;/li&gt;
&lt;li&gt;lokkit&lt;/li&gt;
&lt;li&gt;ipchains&lt;/li&gt;
&lt;li&gt;firewall-cmd&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. nftables&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : nftables는 넷필터 프로젝트의 대체 프로그램으로 기존 iptable,arptables 등의 옛날 프로그램들의 단점을 보완하는 것이 목적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;62. 다음 중 iptables의 사용법으로 틀린 것은?&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;iptables -nL INPUT&lt;/li&gt;
&lt;li&gt;iptables -A INPUT -s 192.168.5.4 -j DROP&lt;/li&gt;
&lt;li&gt;iptables -P INPUT -j DROP&lt;/li&gt;
&lt;li&gt;iptables -t nat -L PREROUTING&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : X..? 정답이 없어 보임&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 :&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. iptables -nL INPUT&lt;br /&gt;&amp;nbsp; -&amp;gt; 현재 시스템 내 INPUT 체인의 방화벽 규칙을 모두 출력&lt;br /&gt;2. iptables -A INPUT -s 192.168.5.4 -j DROP&lt;br /&gt;&amp;nbsp; -&amp;gt; 192.168.5.4에서 들어오는 모든 패킷을 차단&lt;br /&gt;3. iptables -P INPUT -j DROP&lt;br /&gt;&amp;nbsp; -&amp;gt; INPUT 체인의 정책을 DROP으로 설정해 모든 입력 패킷을 차단&lt;br /&gt;4. iptables -t nat -L PREROUTING&lt;br /&gt;&amp;nbsp; -&amp;gt; 현재 시스템 내 PREROUTING 체인의 nat 방화벽 규칙을 출력&lt;/blockquote&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;63. 다음 설명에 보안 프로그램으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2009년 미국 국토안보부가 자금을 제공하여 설립한 OISF가 2010년에 개발한 공개형 IDS 및 IPS이다 멀티 코어 및 멀티스레딩 지원, GPU 하드웨어 가속 지원, LUA 언어를 사용한 시그니처 작성이 가능하다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SELinux&lt;/li&gt;
&lt;li&gt;Snort&lt;/li&gt;
&lt;li&gt;Suricata&lt;/li&gt;
&lt;li&gt;Portsentry&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 3. Suricata&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : Snort 역시 IDS, IPS에 속하나 멀티코어, 멀티 스레딩, GPU 하드웨어 가속 등의 기능은 Suricata에만 해당됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;64. 다음과 같은 소스 코드가 시스템에서 발견된 경우에 발생할 수 있는 공격으로 가장 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;main() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; chat *m;&lt;br /&gt;&amp;nbsp; &amp;nbsp; while (1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m=malloc(1000);&lt;br /&gt;}&lt;/blockquote&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;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 3. 가용 메모리 자원 고갈&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 무한으로 반복되는 반복문 안에서 동적으로 메모리를 할당하여 메모리 자원을 고갈시키는 코드입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;65. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;SYN Flooding 공격의 확인은 대상이 되는 서버에서 netstat 명령을 실행했을 때, 결과의 State 항목에 ( 괄호 ) 표시가 과도하게 발생했다면 이 공격을 의심할 수 있다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SYS_SENT&lt;/li&gt;
&lt;li&gt;SYN_RECV&lt;/li&gt;
&lt;li&gt;TIME_WAIT&lt;/li&gt;
&lt;li&gt;LAST_ACK&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 2. SYN_RECV&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : SYN Flooding 공격은 목적지 서버에 다수의 SYN 요청을 보내고 ACK 응답을 보내지 않아 SYN_RECV 상태로 대기하게 하는 방식으로 목적지 서버의 포트를 점유합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;66. 다음은 원격지의 NTP 서버를 이용해서 시간을 동기화하는 과정이다. ( 괄호 ) 안에 들어갈 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# ( 괄호 ) 203.248.240.140&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ntpq&lt;/li&gt;
&lt;li&gt;ntptime&lt;/li&gt;
&lt;li&gt;ntpdate&lt;/li&gt;
&lt;li&gt;ntpd&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 3. ntpdate&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : NTP 서버로부터 시간 정보를 가져오는 명령어입니다. 현재 시스템의 시간을 NTP 서버의 시간에 맞춰 동기화 할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;67. 다음 설명의 경우에 구축해야 하는 서버로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;원격지의 다른 컴퓨터에서 가상 머신으로 동작하는 시스템에 접속해서 데스크톱처럼 사용하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DHCP 서버&lt;/li&gt;
&lt;li&gt;NTP 서버&lt;/li&gt;
&lt;li&gt;VNC 서버&lt;/li&gt;
&lt;li&gt;PROXY 서버&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 3. VNC&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : VNC 서버는 원격으로 컴퓨터를 제어할 수 있게 해줍니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;68. 특정 MAC 주소를 갖는 네트워크 어댑터에 고정적으로 IP 주소를 할당하기 위해 관련 설정을 진행하는 과정의 일부이다. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;host ihd_pc {&lt;br /&gt;&amp;nbsp; &amp;nbsp; ( 괄호 ) 08:00:07:26:c0:a5;&lt;br /&gt;&amp;nbsp; &amp;nbsp; fixed-address 192.168.12.22;&lt;br /&gt;}&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;hardware address&lt;/li&gt;
&lt;li&gt;ethernet address&lt;/li&gt;
&lt;li&gt;mac address&lt;/li&gt;
&lt;li&gt;hardware ethernet&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 4. hardware ethernet&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : mac address, ethernet address 등의 명령으로도 MAC 주소를 설정할 수 있으나, 고정 IP 주소를 할당하기 위해서는 hardware ethernet을 기재해야합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;69. 다음 설명에 해당하는 프로토콜로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;초기 적재 통신 규약이라고 부르는데, 공용의 X 터미널과 같이 하드디스크가 없는 장치에 IP 주소 등을 할당하고 관리하기 위해 개발된 프로토콜이다. RFC 951에 정의되어 있다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DHCP&lt;/li&gt;
&lt;li&gt;BOOTP&lt;/li&gt;
&lt;li&gt;RIP&lt;/li&gt;
&lt;li&gt;RTP&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 2. BOOTP&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : BOOTP는 DHCP의 전신으로 IP 주소 등의 네트워크 구성 정보를 부팅 중인 컴퓨터에게 할당합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;70. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;TCP wrapper는 호스트 기반의 접근 제어를 담당하는데, 초기에는 inetd와 같은 슈퍼 서버에 의해 관리되는 서비스들만 이용할 수 있다. 그러나 최근에는 standalone 데몬도 사용 가능한데, ldd 명령으로 실행 데몬의 라이브러리를 확인해서 ( 괄호 ) 파일을 참조한다면 이용할 수 있다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;libtcp.so&lt;/li&gt;
&lt;li&gt;libwrap.so&lt;/li&gt;
&lt;li&gt;tcpwrap.so&lt;/li&gt;
&lt;li&gt;inetdwrap.so&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 : 2. libwrap.so&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : libwrap.so는 TCP wrapper의 핵심 라이브러리 파일로 호스트 기반의 접근 제어 기능을 수행하는 데 필요한 함수들을 제공, ldd 명령으로 확인한 데몬의 라이브러리가 libwrap.so 파일을 참조한다면, 해당 데몬은 TCP wrapper의 호스트 기반 접근 제어를 적용 가능&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/92</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-61-70-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry92comment</comments>
      <pubDate>Sun, 12 Mar 2023 03:06:31 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 51-60) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-51-60-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSLtD6/btr3cKunp2u/1rMbJlOS0aYhHfjWD4Zlx1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSLtD6/btr3cKunp2u/1rMbJlOS0aYhHfjWD4Zlx1/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSLtD6/btr3cKunp2u/1rMbJlOS0aYhHfjWD4Zlx1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSLtD6%2Fbtr3cKunp2u%2F1rMbJlOS0aYhHfjWD4Zlx1%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;51. 다음 중 locate 명령어에 대한 설명으로 알맞은 것은?&lt;/h4&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;정보를 데이터베이스화하여 find 명령어보다 검색 속도가 빠르다.&lt;/li&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;정답 : 2. 정보를 데이터베이스화하여 find 명령어보다 검색 속도가 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 1. grep에 대한 설명입니다. 3. updatedb 명령어로 데이터베이스를 업데이트 해야합니다. 4. 사용자, 허가권 등 다양한 조건을 통한 검색은 find에서 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;52. 다음 중 touch 명령어에 대한 설명으로 틀린 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일의 크기가 0인 빈 파일을 만들 때 사용한다.&lt;/li&gt;
&lt;li&gt;파일의 Access Time을 변경할 때 사용한다.&lt;/li&gt;
&lt;li&gt;파일의 Change Time을 변경할 때 사용한다.&lt;/li&gt;
&lt;li&gt;파일의 Modify Time을 변경할 때 사용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. 파일의 Change Time을 변경할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : Change Time은 파일의 메타데이터가 변경될 때 자동으로 업데이트됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;53. 다음 중 XFS 파일 시스템으로 운영 중인 CentOS7에서 사용자 쿼터를 설정할 때 사용하는 명령으로 거리가 먼 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;quota&lt;/li&gt;
&lt;li&gt;edquota&lt;/li&gt;
&lt;li&gt;setquota&lt;/li&gt;
&lt;li&gt;xfs_quota&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. quota&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : quota 명령어는 사용자나 그룹의 쿼터 사용량을 보여주는데 사용되며, 쿼터의 설정에 사용되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;54. 다음 설명에 해당하는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;아파치 웹 문서가 위치한 디렉터리가 /usr/local/apache/htdocs인데, /var/www/html이라는 디렉터리명으로 접근할 수 있도록 설정하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ln /var/www/html /usr/local/apache/htdocs&lt;/li&gt;
&lt;li&gt;ln -s /var/www/html /usr/local/apache/htdocs&lt;/li&gt;
&lt;li&gt;ln /usr/local/apache/htdocs &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;/var/www/html&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;ln -s /usr/local/apache/htdocs &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;/var/www/html&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. ln -s /usr/local/apache/htdocs&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/www/html&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : ln -s를 통해 심볼릭 링크를 생성, /var/www/html에서 /usr/local/apache/htdocs에 접근할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;55. 다음과 같이 허가권이 설정된 경우에 관련 설명으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[root@www ~]# ls -l /usr/bin/passwd&lt;br /&gt;-rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이 파일은 root 사용자만 실행할 수 있다.&lt;/li&gt;
&lt;li&gt;ihduser 사용자가 실행하면 ihduser 사용자 권한으로 실행된다.&lt;/li&gt;
&lt;li&gt;ihduser 사용자가 실행하면 실행하는 동안 root 사용자 권한으로 인정된다.&lt;/li&gt;
&lt;li&gt;ihduser 사용자가 실행하면 실행하는 동안 root 그룹 권한으로 인정된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. ihduser 사용자가 실행하면 실행하는 동안 root 사용자 권한으로 인정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : rws의 s는 setuid 비트로, 실행하는 동안 사용자는 root 사용자 권한으로 인정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;56. 다음 결과에 해당하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[root@www ~]#&lt;br /&gt;&amp;nbsp;22:42:18 up&amp;nbsp; 9:01, 3 users,&amp;nbsp; load average: 0.08, 0.03, 0.05&lt;br /&gt;USER&amp;nbsp; &amp;nbsp; TTY&amp;nbsp; &amp;nbsp; FROM&amp;nbsp; &amp;nbsp; LOGIN@&amp;nbsp; &amp;nbsp; IDLE&amp;nbsp; &amp;nbsp; &amp;nbsp; JCPU&amp;nbsp; &amp;nbsp; PCPU&amp;nbsp; &amp;nbsp; WHAT&lt;br /&gt;root&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Mon21&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;?xdm?&amp;nbsp; &amp;nbsp;1:19&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0.20s&amp;nbsp; &amp;nbsp; &amp;nbsp;/usr/libexec/gn&lt;br /&gt;&amp;bull;&amp;bull;&amp;bull;&lt;br /&gt;[root@www ~]#&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;w&lt;/li&gt;
&lt;li&gt;who&lt;/li&gt;
&lt;li&gt;users&lt;/li&gt;
&lt;li&gt;lslogins&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. w&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : w 명령어는 현재 로그인한 사용자의 정보와 시스템의 부하량을 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;57.&amp;nbsp; 다음 중 그룹관리자를 확인하는 과정으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/etc/group 파일의 3번째 필드에서 확인한다.&lt;/li&gt;
&lt;li&gt;/etc/group 파일의 4번째 필드에서 확인한다.&lt;/li&gt;
&lt;li&gt;/etc/gshadow 파일의 3번째 필드에서 확인한다.&lt;/li&gt;
&lt;li&gt;/etc/gshadow 파일의 4번째 필드에서 확인한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. /etc/gshadow 파일의 3번째 필드에서 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : gshadow는 각각 다음과 같은 정보를 담고 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1번 필드 : 그룹 이름&lt;br /&gt;2번 필드 : 그룹 패스워드&lt;br /&gt;3번 필드 : 그룹 관리자&lt;br /&gt;4번 필드 : 멤버 리스트&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;58.&amp;nbsp; 다음 결과에 해당하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[root@www ~]#&lt;br /&gt;Last password change&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; : never&lt;br /&gt;Password expires&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;: never&lt;br /&gt;Password inactive&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; : never&lt;br /&gt;Account expires&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;: never&lt;br /&gt;Minimum number of days between password change&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0&lt;br /&gt;Maximum number of days between password change&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 99999&lt;br /&gt;Number of days of warning before password expires&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 7&lt;br /&gt;[root@www ~]#&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;passwd -l 사용자명&lt;/li&gt;
&lt;li&gt;chage -l 사용자명&lt;/li&gt;
&lt;li&gt;usermod -l 사용자명&lt;/li&gt;
&lt;li&gt;chpasswd -l 사용자명&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. chage -l&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : chage -l 명령어는 위 결과처럼 사용자의 패스워드에 대한 정보를 리스트로 출력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;59. 다음은 ihduser 사용자가 휴직한 상태여서 계정 사용을 일시 정지시키는 과정이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# ( 괄호 ) ihduser&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;passwd -L&lt;/li&gt;
&lt;li&gt;passwd -d&lt;/li&gt;
&lt;li&gt;usermod -l&lt;/li&gt;
&lt;li&gt;usermod -L&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. usermod -L&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : usermod -L(Lock) 옵션은 사용자의 패스워드의 잠금을 걸어 로그인을 막습니다. 사용자의 계정은 남아있지만 로그인할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;60. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;/etc/passwd 파일은 시스템에 로그인하여 자원을 이용할 수 있는 사용자의 목록 정보를 저장하고 있다. 콜론(:) 기호를 구분자로 총 7개의 필드로 구분되어 있는데, 사용자의 홈 디렉터리는 ( 괄호 ) 번째 필드에서 확인할 수 있다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;4&lt;/li&gt;
&lt;li&gt;5&lt;/li&gt;
&lt;li&gt;6&lt;/li&gt;
&lt;li&gt;7&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. 6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : /etc/passwd 파일에서 사용자의 홈 디렉터리는 6번째 필드에 있습니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/91</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-51-60-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry91comment</comments>
      <pubDate>Sun, 12 Mar 2023 01:06:55 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 41-50) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-41-50-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGdwZu/btr3gLMknK5/Yh7RC6URhQFKksZK6tKVJK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGdwZu/btr3gLMknK5/Yh7RC6URhQFKksZK6tKVJK/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGdwZu/btr3gLMknK5/Yh7RC6URhQFKksZK6tKVJK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGdwZu%2Fbtr3gLMknK5%2FYh7RC6URhQFKksZK6tKVJK%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;41. 다음 그림의 결과에 해당하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[posein@www ~]$&lt;br /&gt;&amp;nbsp; &amp;nbsp; linux-vdso.so.1 =&amp;gt; (0x00007ffd730da000)&lt;br /&gt;&amp;nbsp; &amp;nbsp; libselinux.so.1 =&amp;gt; /lib64/libselinux.so.1 (0x00007f0b420bf000)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;bull;&amp;bull;&amp;bull;&lt;br /&gt;[posein@www ~]$&amp;nbsp;&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;yum&lt;/li&gt;
&lt;li&gt;ldd&lt;/li&gt;
&lt;li&gt;ldconfig&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. ldd&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 실행 파일이 참조하는 공유 라이브러리의 경로를 나타내는데 이는 ldd를 통해 얻을 수 있습니다.&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;42. 다음은 현재 디렉터리 안에 존재하는 C 언어 파일을 기존에 생성되어 있던 text.tar 파일에 묶는 과정이다. ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# tar ( 괄호 ) text.tar *.c&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;cvf&lt;/li&gt;
&lt;li&gt;xvf&lt;/li&gt;
&lt;li&gt;tvf&lt;/li&gt;
&lt;li&gt;rvf&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. rvf&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 기존의 tar 파일에 추가하기 위해서는 --append 또는 -r 옵션을 주어야하므로 rvf가 정답입니다.&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;43. 다음 그림의 결과에 해당하는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[root@www ~]#&lt;br /&gt;Loaded plugins: fastestmirror, langpacks&lt;br /&gt;Loading mirror speeds from cached hostfile&lt;br /&gt;&amp;nbsp; * base: mirror.kakao.com&lt;br /&gt;&amp;nbsp; * extras: mirror.kakao.com&lt;br /&gt;&amp;bull;&amp;bull;&amp;bull;&lt;br /&gt;[root@www ~]#&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;yum list telnet-server&lt;/li&gt;
&lt;li&gt;yum info telnet-server&lt;/li&gt;
&lt;li&gt;yum check telnet-server&lt;/li&gt;
&lt;li&gt;yum search telnet-server&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. yum info telnet-server&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : yum info를 통해 패키지의 정보를 확인할 수 있습니다.&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;44.httpd 패키지의 환경 설정 파일을 빠르고 간편하게 찾으려고 한다. 다음 ( 괄호 ) 안에 들어갈 내용으로 가장 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# rpm ( 괄호 ) httpd&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;-qa&lt;/li&gt;
&lt;li&gt;-qf&lt;/li&gt;
&lt;li&gt;-qc&lt;/li&gt;
&lt;li&gt;-ql&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. -qc&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 쿼리를 위해 q 옵션이 필요하며 환경 설정 파일을 찾기 위해서는 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-configfiles 또는 -c 옵션이 필요합니다.&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;45. 다음 중 레드햇 계열 패키지 관리 기법으로 가장 거리가 먼 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;dnf&lt;/li&gt;
&lt;li&gt;yum&lt;/li&gt;
&lt;li&gt;rpm&lt;/li&gt;
&lt;li&gt;apt-get&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. apt-get&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : apt-get은 데비안의 패키지 관리 기법입니다.&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;46. 프로세스 아이디(PID)가 513인 bash 프로세스의 우선순위(NI) 값이 0이다. 다음 중 NI 값을 변경하여 우선순위를 낮추는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nice -5 513&lt;/li&gt;
&lt;li&gt;nice -5 bash&lt;/li&gt;
&lt;li&gt;renice -5 513&lt;/li&gt;
&lt;li&gt;renice - 5 bash&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. renice -5 513&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : PID가 있다는 것은 프로그램이 실행 중임을 뜻하며, 이미 실행중인 프로세스의 우선순위를 조정하는 명령어는 renice입니다. renice는 pid를 지정해 특정 프로세스의 우선순위를 변경할 수 있습니다.&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;47.&amp;nbsp; 다음 설명에 해당하는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;프로세스 아이디가 513번이고 작업번호는 3인 백그라운드 프로세스를 포어그라운드 프로세스로 전환하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;bg 513&lt;/li&gt;
&lt;li&gt;bg 3&lt;/li&gt;
&lt;li&gt;fg 513&lt;/li&gt;
&lt;li&gt;fg 3&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. fg 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 백그라운드에서 포그라운드로 전환하는 명령어는 fg로, 작업 번호가 3인 백그라운드 프로세스를 포그라운드 프로세스로 전환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;48. 다음 ( 괄호 ) 안에 들어갈 수 있는 명령어로 틀린 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# ( 괄호 ) httpd&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;kill&lt;/li&gt;
&lt;li&gt;killall&lt;/li&gt;
&lt;li&gt;pgrep&lt;/li&gt;
&lt;li&gt;pkill&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. kill&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : kill 명령어는 PID를 지정해 특정 프로세스에 시그널을 보내는데 사용됩니다. 이 명령어에는 프로세스의 이름을 지정할 수 없습니다.&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;49. cron을 이용해서 점검 스크립트를 매주 수요일과 금요일 오전 1시 2분에 주기적으로 실행하려고 한다. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;( 괄호 ) /etc/check.sh&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1 2 * * 3,5&lt;/li&gt;
&lt;li&gt;2 1 * * 3,5&lt;/li&gt;
&lt;li&gt;1 2 * * 3-5&lt;/li&gt;
&lt;li&gt;2 1 * * 3-5&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. 2 1 * * 3, 5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : cron의 포맷은 `분 시 일 월 요일`이며, 수요일과 금요일이므로 3, 5입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;50. 다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;프로세스 우선순위와 관련된 항목에는 NI와 PRI가 있다. ( ㄱ )는 사용자가 명령어를 이용해 값을 변경할 수 있고, 지정할 수 있는 값의 범위는 ( ㄴ )이다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;( ㄱ ) NI&amp;nbsp; &amp;nbsp;( ㄴ ) -19 ~ 20&lt;/li&gt;
&lt;li&gt;( ㄱ ) NI&amp;nbsp; &amp;nbsp;( ㄴ ) -20 ~ 19&lt;/li&gt;
&lt;li&gt;( ㄱ ) PRI ( ㄴ ) -19 ~ 20&lt;/li&gt;
&lt;li&gt;( ㄱ ) PRI ( ㄴ ) -20 ~ 19&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. ( ㄱ ) NI&amp;nbsp; &amp;nbsp;( ㄴ ) -20 ~ 19&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : PRI 값은 사용자가 직접 변경할 수 없으며, NI의 범위는 -20부터 19까지입니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/90</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-41-50-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry90comment</comments>
      <pubDate>Sat, 11 Mar 2023 22:39:41 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 31-40) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-31-40-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85-1</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzCw1e/btr3cdjax6O/a0Ozh99DUdLlG22lPgryb1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzCw1e/btr3cdjax6O/a0Ozh99DUdLlG22lPgryb1/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzCw1e/btr3cdjax6O/a0Ozh99DUdLlG22lPgryb1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzCw1e%2Fbtr3cdjax6O%2Fa0Ozh99DUdLlG22lPgryb1%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;31. 다음 중 프린트 작업을 요청하는 명령어 조합으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;lp, lpstat&lt;/li&gt;
&lt;li&gt;lp, lpc&lt;/li&gt;
&lt;li&gt;lp, lpr&lt;/li&gt;
&lt;li&gt;lpr, lpc&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. lp, lpr&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : BSD의 lpr은 프린트 요청을 위한 명령이며, sysV에서는 lp가 BSD의 lpr과 유사한 동작을 합니다.&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;32. 다음 중 생성된 RAID 장치에 대한 레벨 정보를 확인할 때 사용하는 파일로 가장 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/proc/mdadm&lt;/li&gt;
&lt;li&gt;/proc/raidtools&lt;/li&gt;
&lt;li&gt;/proc/mdstat&lt;/li&gt;
&lt;li&gt;/proc/partitions&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. /proc/mdstat&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : /proc/mdstat은 리눅스에서 RAID 구성 정보를 확인할 수 있는 파일 중 하나입니다. 이 정보에는 RAID 레벨 및 디스크 상태, 스트라이핑 정보, 장치 크기 등이 포함됩니다.&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;33. 다음은 RAID-1을 구성하는 과정이다. ( 괄호 )안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# mdadm -C /dev/md2 ( ㄱ ) ( ㄴ ) /dev/sdb1 /dev/sdc1&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ㄱ) -l 1&amp;nbsp; &amp;nbsp;ㄴ) -n 1&lt;/li&gt;
&lt;li&gt;ㄱ) -l 1&amp;nbsp; &amp;nbsp;ㄴ) -n 2&lt;/li&gt;
&lt;li&gt;ㄱ) -l 2&amp;nbsp; &amp;nbsp;ㄴ) -n 1&lt;/li&gt;
&lt;li&gt;ㄱ) -l 2&amp;nbsp; &amp;nbsp;ㄴ) -n 2&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. ㄱ) -l 1&amp;nbsp; ㄴ) -n 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : -l 옵션은 RAID 레벨을 지정하며, -n 옵션은 디스크를 2개 사용하겠다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;34. 다음 결과에 해당하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[root@www ~]#&lt;br /&gt;&amp;nbsp; Reading all physical volumes. This may take a while&amp;bull;&amp;bull;&amp;bull;&lt;br /&gt;&amp;nbsp; Found volume group &quot;lvm0&quot; using metadata type lvm2&lt;br /&gt;[root@www ~]#&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;pvscan&lt;/li&gt;
&lt;li&gt;vgscan&lt;/li&gt;
&lt;li&gt;lvscan&lt;/li&gt;
&lt;li&gt;pvdisplay&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. vgscan&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 위 결과는 시스템 내의 물리 볼륨을 스캔 후, LVM2 메타데이터를 사용하는 lvm0 볼륨 그룹을 찾았음을 보여줍니다. 이는 vgscan 명령어로 확인할 수 있습니다.&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;35. RAID 구성을 위해 fdisk 명령을 이용해서 생성된 파티션의 속성을 변경하려고 한다. 다음 중 파티션 변경에 사용되는 코드값으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;82&lt;/li&gt;
&lt;li&gt;83&lt;/li&gt;
&lt;li&gt;8e&lt;/li&gt;
&lt;li&gt;fd&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. fd&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;82: 리눅스 스왑 파티션 유형&lt;br /&gt;83: 리눅스 네이티브 파티션 유형&lt;br /&gt;8e: 리눅스 LVM 파티션 유형&lt;br /&gt;fd: 리눅스 RAID 파티션 유형&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;36. 다음 중 X 윈도가 미설치된 환경에서 커널 컴파일을 진행할 수 있는 도구의 조합으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;make config, make xconfig&lt;/li&gt;
&lt;li&gt;make xconfig, make menuconfig&lt;/li&gt;
&lt;li&gt;make config, make menuconfig&lt;/li&gt;
&lt;li&gt;make config, make gconfig&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. make config, make menuconfig&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : X 윈도우를 사용하지 않는 경우, GUI 기반의 X 윈도 응용 프로그램을 실행할 수 없기 때문에 X 윈도 관련 도구(make xconfig, make gconfig 등)를 사용할 수 없습니다.&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;37. 다음은 커널 컴파일 과정의 일부이다. 커널 컴파일 과정 순서로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;가. make menuconfig&lt;br /&gt;나. make bzimage&lt;br /&gt;다. make mrproper&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가 -&amp;gt; 나 -&amp;gt; 다&lt;/li&gt;
&lt;li&gt;가 -&amp;gt; 다 -&amp;gt; 나&lt;/li&gt;
&lt;li&gt;다 -&amp;gt; 가 -&amp;gt; 나&lt;/li&gt;
&lt;li&gt;다 -&amp;gt; 나 -&amp;gt; 가&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. 다 -&amp;gt; 가 -&amp;gt; 나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : (다) 이전 빌드 관련 파일 정리 -&amp;gt; (가) 사용자가 필요한 설정 변경 -&amp;gt; (나) 변경된 커널 설정을 바탕으로 컴파일해 이미지 파일 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;38. 다음 중 커널 모듈 간의 의존성을 갱신할 때 사용하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;depmod&lt;/li&gt;
&lt;li&gt;modules.dep&lt;/li&gt;
&lt;li&gt;ldconfig&lt;/li&gt;
&lt;li&gt;modprobe&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. depmod&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 모듈 간의 의존성을 갱신할 때 쓰이는 명령어는 depmod입니다.&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;39. 다음은 커널에 모듈을 적재하는 과정이다. ( 괄호 ) 안에 들어갈 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# ( 괄호 ) iptable_filter&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;insmod&lt;/li&gt;
&lt;li&gt;depmod&lt;/li&gt;
&lt;li&gt;rmmod&lt;/li&gt;
&lt;li&gt;modprobe&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. modprobe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : modprobe의 경우 의존성이 있어도 적재가 가능합니다.&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;40.&amp;nbsp; 다음은 커널에 적재된 모듈을 제거하는 과정이다. ( 괄호 ) 안에 들어갈 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# ( 괄호 ) -r iptable_filter&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;insmod&lt;/li&gt;
&lt;li&gt;depmod&lt;/li&gt;
&lt;li&gt;rmmod&lt;/li&gt;
&lt;li&gt;modprobe&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. modprobe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : modprobe -r의 경우도 의존성도 함께 삭제합니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/89</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-31-40-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85-1#entry89comment</comments>
      <pubDate>Sat, 11 Mar 2023 21:03:44 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 21-30) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-21-30-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9ynjL/btr3gOCc3Oh/3aQMYuvfK0B1Lic10Nhxy1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9ynjL/btr3gOCc3Oh/3aQMYuvfK0B1Lic10Nhxy1/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9ynjL/btr3gOCc3Oh/3aQMYuvfK0B1Lic10Nhxy1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9ynjL%2Fbtr3gOCc3Oh%2F3aQMYuvfK0B1Lic10Nhxy1%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;21. 다음 XFS 파일 시스템에서 사용할 수 없는 백업 도구로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;dd&lt;/li&gt;
&lt;li&gt;dump&lt;/li&gt;
&lt;li&gt;cpio&lt;/li&gt;
&lt;li&gt;rsync&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. dump&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;XFS 파일 시스템에서는 dump 명령어를 사용할 수 없으며, xfsdump를 사용하거나 파일 시스템을 변경해야합니다.&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;22. 다음은 백업된 데이터를 이용해서 복원하는 과정이다. ( 괄호 ) 안에 들어갈 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# ( 괄호 ) -iF backup.data&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;dump&lt;/li&gt;
&lt;li&gt;restore&lt;/li&gt;
&lt;li&gt;cpio&lt;/li&gt;
&lt;li&gt;rsync&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. cpio&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000;&quot;&gt;cpio&lt;span style=&quot;text-align: start;&quot;&gt; 명령어의&amp;nbsp;&lt;/span&gt;-i&lt;span style=&quot;text-align: start;&quot;&gt; 옵션은 아카이브 파일에서 데이터를 읽는다는 것을 나타내며, &lt;/span&gt;-F&lt;span style=&quot;text-align: start;&quot;&gt; 옵션은 파일을 명시하는 것입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;23. 다음은 tar 명령을 이용해서 증분 백업하는 과정이다. ( 괄호 ) 안에 들어갈 옵션으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# tar ( 괄호 ) list -cvfp home1.tar /home&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;-g&lt;/li&gt;
&lt;li&gt;-C&lt;/li&gt;
&lt;li&gt;-L&lt;/li&gt;
&lt;li&gt;-N&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. -g&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : tar 명령에서 증분 백업을 위해 필요한 옵션은 -g 입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;24. 다음 설명에 해당하는 보안 도구로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;서버의 보안 취약점을 검사해주는 도구로서 문제가 되는 서비스에 대한 정보를 알려주고 대처 방안을 제시해준다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nessus&lt;/li&gt;
&lt;li&gt;tripwire&lt;/li&gt;
&lt;li&gt;GnuPG&lt;/li&gt;
&lt;li&gt;wireshark&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. nessus&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Nessus는 취약점 스캐너로, 시스템의 소프트웨어 및 서비스의 취약점을 검사하고, 이를 이용하여 시스템 해킹 및 정보 유출 등의 보안 문제를 방지하기 위한 대처 방안을 제시해줍니다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;25. 다음 중 /etc/services 파일의 수정은 불가하고 내용 추가만 가능하도록 설정하는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;setfacl -m +a /etc/services&lt;/li&gt;
&lt;li&gt;setfacl +i /etc/services&lt;/li&gt;
&lt;li&gt;chattr +a /etc/services&lt;/li&gt;
&lt;li&gt;chattr +i /etc/services&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. chattr +a /etc/services&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 해당 명령은 /etc/services에 append 권한을 주며, 추가를 제외한 동작을 할 수 없게 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;26. 다음 설명에 해당하는 커널 매개변수 설정으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;iptables를 이용해서 인터넷 공유나 IP 매스커레이드 정책을 사용하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;sysctl -n net.ipv4.ip_forward=0&lt;/li&gt;
&lt;li&gt;sysctl -n net.ipv4.ip_forward=1&lt;/li&gt;
&lt;li&gt;sysctl -w net.ipv4.ip_forward=0&lt;/li&gt;
&lt;li&gt;sysctl -w net.ipv4.ip_forward=1&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;sysctl -w net.ipv4.ip_forward=1&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 인터넷 공유나 매스커레이딩을 위해서는 IP 포워딩을 활성화해야하며, w옵션으로 값을 작성, ip 포워딩을 활성화 하기 위해 1을 적용해주어야합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;27. 다음 설명에 해당하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;명령행에서 로그 시스템에 메시지를 전송할 때 사용하는 명령으로 특정 파일명을 지정하지 않으면 /var/log/messages 파일에 기록된다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;last&lt;/li&gt;
&lt;li&gt;lastlog&lt;/li&gt;
&lt;li&gt;dmesg&lt;/li&gt;
&lt;li&gt;logger&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. logger&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : logger를 통해 /var/log/messages에 로그를 기록할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;28. 다음 중 문서 편집기나 cat 명령으로 내용을 확인할 수 있는 로그 파일로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/var/log/btmp&lt;/li&gt;
&lt;li&gt;/var/log/secure&lt;/li&gt;
&lt;li&gt;/var/log/wtmp&lt;/li&gt;
&lt;li&gt;/var/log/lastlog&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. /var/log/secure&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : secure를 제외한 나머지 로그파일들은 바이너리 파일로 lastlog, last, lastb 등의 명령으로 확인 가능합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;29. 다음 조건에 해당하는 로그 파일 설정으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;가. 모든 facility에서 경고(warning) 수준 이상의 로그를 기록한다.&lt;br /&gt;나. 커널 관련 로그는 제외한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;*.=warn;kern.none&lt;/li&gt;
&lt;li&gt;*.=warn;kern.!=none&lt;/li&gt;
&lt;li&gt;*.warn;kern.none&lt;/li&gt;
&lt;li&gt;*.warn;kern.!=none&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. *.warn;kern.none&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : 가. 경고 수준 이상 -&amp;gt; *.warn, 나. 커널 관련 로그는 제외 -&amp;gt; kern.none&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;30. 다음 중 로그 설정 파일에서 가장 많은 기록이 남는 낮은 수준의 priority로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;alert&lt;/li&gt;
&lt;li&gt;crit&lt;/li&gt;
&lt;li&gt;panic&lt;/li&gt;
&lt;li&gt;emerg&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. crit&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해설 : priority는 crit &amp;lt; alert &amp;lt; panic, emerg로 crit은 해당 로그를 모두 기록하므로 가장 많은 기록이 남습니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/87</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-21-30-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry87comment</comments>
      <pubDate>Sat, 11 Mar 2023 19:35:12 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 11-20) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-11-20-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhnjCy/btr3ccLg6Eb/hdMJPm7YrIOKynJHRkzkV1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhnjCy/btr3ccLg6Eb/hdMJPm7YrIOKynJHRkzkV1/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhnjCy/btr3ccLg6Eb/hdMJPm7YrIOKynJHRkzkV1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhnjCy%2Fbtr3ccLg6Eb%2FhdMJPm7YrIOKynJHRkzkV1%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;11. 다음 그림에 해당하는 프로그램명으로 가장 알맞은 것은?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHdhoO/btr3bYGhRYo/pK13HXVjk11oxHVerGyErK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHdhoO/btr3bYGhRYo/pK13HXVjk11oxHVerGyErK/img.png&quot; data-alt=&quot;GDM&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHdhoO/btr3bYGhRYo/pK13HXVjk11oxHVerGyErK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHdhoO%2Fbtr3bYGhRYo%2FpK13HXVjk11oxHVerGyErK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;460&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GDM&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GDM&lt;/li&gt;
&lt;li&gt;KDE&lt;/li&gt;
&lt;li&gt;GNOME&lt;/li&gt;
&lt;li&gt;Mutter&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. GDM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : GNOME Display Manager&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;12. 다음 중 원격지 X 서버에 응용 프로그램을 전송하기 위해 X 클라이언트에서 진행해야 하는 과정으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;xauth 명령으로 서버 주소를 등록한다.&lt;/li&gt;
&lt;li&gt;xhost 명령으로 서버 주소를 등록한다.&lt;/li&gt;
&lt;li&gt;환경변수인 DISPLAY의 값을 서버 주소로 변경한다.&lt;/li&gt;
&lt;li&gt;환경변수인 TERM의 값을 서버 주소로 변경한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. 환경변수인 DISPLAY의 값을 서버 주소로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : X 클라이언트에서 원격지의 X 서버에 프로그램을 전달하기 위해서는 터미널에 정의된 DISPLAY를 수정해야 합니다.&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;13. 다음 중 ssh 데몬이 리눅스 부팅 시에 실행되도록 설정하는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;systemctl enable sshd&lt;/li&gt;
&lt;li&gt;systemctl status sshd&lt;/li&gt;
&lt;li&gt;systemctl active sshd&lt;/li&gt;
&lt;li&gt;systemctl start sshd&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. systemctl enable sshd&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : systemctl ena&lt;span style=&quot;color: #000000;&quot;&gt;ble&lt;span style=&quot;text-align: start;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;14. 리눅스 프로그램의 root 패스워드를 잊어버린 상태로 GRUB 환경 설정파일에서 커널 인자값을 변경하려고 한다. 다음 중 밑줄 친 부분을 대체해야할 커널 인자값으로 알맞은 것은?&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;linux16 /boot/vmlinux-3.10.0-862-el7.x86_64&lt;br /&gt;root =UUID=800f7aa2-83b9-4b18-a4ce-7de8ede7c0&lt;br /&gt;14 &lt;u&gt;&lt;b&gt;ro rhgb quiet LANG=ko_KR.UTF-8&lt;/b&gt;&lt;/u&gt;&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;rw single&lt;/li&gt;
&lt;li&gt;rw rescue&lt;/li&gt;
&lt;li&gt;rw systemd=/bin/sh&lt;/li&gt;
&lt;li&gt;rw init=/bin/sh&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. rw init=/bin/sh&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; root 파일 시스템을 읽기-쓰기 모드로 마운트하고 /sbin/init 대신 /bin/sh을 init 프로세스로 사용하도록 지정&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: #000000; text-align: start;&quot;&gt;15. 다음 설명의 경우에 사용 가능한 실제 디스크 용량으로 알맞은 것은?&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;10GB 용량의 하드디스크 6개가 장착된 시스템이다. 스페어(Spare) 디스크로 하나 사용하고, RAID-5로 구성하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;30GB&lt;/li&gt;
&lt;li&gt;40GB&lt;/li&gt;
&lt;li&gt;50GB&lt;/li&gt;
&lt;li&gt;60GB&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. 40GB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 전체 6개 중 하나를 스페어 디스크로 두고, 나머지 5개 중 1개를 패리티 디스크로 사용해 총 4개만큼의 디스크를 사용. 10G * 4&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;16. 다음 설명의 경우에 구성해야 할 인프라 기술로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;다수의 웹 서버를 운영중으로 웹 서버 앞단에 로드 밸런서를 이용하여 부하분산 역할을 수행하도록 구성하였다. 로드 밸런서 역할을 수행하는 시스템의 오류에 대비하려고 한다.&lt;/blockquote&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;HPC 클러스터&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. 고가용성 클러스터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;고가용성 클러스터는 하나 이상의 서버 시스템을 클러스터로 묶어서 서비스의 가용성을 보장하는 기술입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;17. 다음 설명에 해당하는 리눅스 배포판으로 가장 알맞은 것은?&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;패키지 설치 및 업데이트할 때 dpkg 또는 apt-get명령을 사용하고, 칼리 리눅스도 이 리눅스 배포판을 기반으로 만들었다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Rocky Linux&lt;/li&gt;
&lt;li&gt;CentOs&lt;/li&gt;
&lt;li&gt;Debian&lt;/li&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. Debian&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Debian은 dpkg 패키지 관리 시스템을 사용하고, apt-get 명령을 이용하여 패키지 설치, 업데이트, 삭제 등을 수행합니다. 또한 칼리 리눅스는 Debian을 기반으로 만들어진 보안 전문용 리눅스 배포판입니다.&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: #000000; text-align: start;&quot;&gt;18. 다음 설명에 해당하는 라이선스로 알맞은 것은?&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 라이선스가 부여된 소프트웨어는 누구든 자유롭게 부분 혹은 전체를 개인적 또는 상업적 목적으로 이용할 수 있다. 또한 재배포 시에도 소스 코드 또는 수정한 소스 코드를 포함하여 반드시 공개할 필요가 없다. 대표적인 프로그램에는 Hadoop, Tomcat 등이 있다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Apache License&lt;/li&gt;
&lt;li&gt;LGPL&lt;/li&gt;
&lt;li&gt;BSD&lt;/li&gt;
&lt;li&gt;MPL&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. Apache License&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : Apache License에 대한 설명입니다.&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;19. 다음 설명에 해당하는 리눅스의 기술적인 특징으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;특정 프로세스의 표준 출력을 다른 프로세스의 표준입력으로 쓰이게 하는것으로 대표적인 프로세스 간 통신 기술이다.&lt;/blockquote&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;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. 파이프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;파이프는 한 프로세스의 표준 출력이 다른 프로세스의 표준 입력으로 전달되도록 하는 기술입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;20. 다음 (괄호) 안에 들어갈 내용으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;리눅스 커널은 (ㄱ) (이)가 만들었는데, 이것은 (ㄴ) (이)가 개발한 교육용 유닉스인 미닉스를 참고해서 만들었다.&lt;/blockquote&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;(ㄱ) 리누스 토발즈 (ㄴ) 앤드루 S. 타넨바움&lt;/li&gt;
&lt;li&gt;(ㄱ) 켄 톰슨&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(ㄴ) 데니스 리치&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. (ㄱ) 리누스 토발즈 (ㄴ) 앤드루 S. 타넨바움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : 각각 리눅스, 미닉스의 개발자입니다.&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/86</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-11-20-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry86comment</comments>
      <pubDate>Sat, 11 Mar 2023 18:18:07 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 마스터 1급 1-10) 23년 1차 필기 가답 + 설명</title>
      <link>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-1-10-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DN6UM/btr3gPA3aBj/8G4rSF2pS9vFiIlZWEUtD1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DN6UM/btr3gPA3aBj/8G4rSF2pS9vFiIlZWEUtD1/img.webp&quot; data-alt=&quot;리눅스 마스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DN6UM/btr3gPA3aBj/8G4rSF2pS9vFiIlZWEUtD1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDN6UM%2Fbtr3gPA3aBj%2F8G4rSF2pS9vFiIlZWEUtD1%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; alt=&quot;리눅스&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;350&quot; data-filename=&quot;리눅스.webp&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;675&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;1. 다음 중 ssh로 접속한 호스트의 IP 주소를 확인 할 때 사용하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ss&lt;/li&gt;
&lt;li&gt;arp&lt;/li&gt;
&lt;li&gt;mii-tool&lt;/li&gt;
&lt;li&gt;ethtool&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. ss&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;ssh로 접속한 호스트의 IP 주소를 확인하기 위해서는 &lt;/span&gt;ss&lt;span style=&quot;text-align: start;&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;h4 data-ke-size=&quot;size20&quot;&gt;2. 다음 설명에 해당하는 명령어로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;로컬 네트워크에 연결된 다른 호스트의 MAC 주소를 확인하려고 한다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ip&lt;/li&gt;
&lt;li&gt;arp&lt;/li&gt;
&lt;li&gt;ifconfig&lt;/li&gt;
&lt;li&gt;ethtool&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. arp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : arp 명령어는 Address Resolution Protocol의 약자로, IP 주소를 물리적인 MAC 주소로 매핑하는 프로토콜입니다. arp 명령어를 사용하면 IP 주소와 관련된 MAC 주소를 확인할 수 있습니다.&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;3. 다음과 같은 조건일 때 할당되는 게이트웨이 주소값으로 가장 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;IP 주소 및 서브넷마스크: 192.168.3.150/26&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;192.168.3.126&lt;/li&gt;
&lt;li&gt;192.168.3.127&lt;/li&gt;
&lt;li&gt;192.168.3.128&lt;/li&gt;
&lt;li&gt;192.168.3.129&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 4. 192.168.3.129&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : IP 주소 및 서브넷마스크가 192.168.3.150/26인 경우, 해당 네트워크의 서브넷 주소는 192.168.3.128이며, 브로드캐스트 주소는 192.168.3.191, 게이트웨이 주소는 192.168.3.129입니다.&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;4. 다음 설명에 해당하는 기관으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전기 및 전자공학 전문가들로 구성된 국제 조직으로 전기, 전자, 컴퓨터 과학 등 다양한 과학 전공자들이 참여하여 주요 표준 및 연구 정책을 발전시키는 역할을 수행한다. 컴퓨터 네트워크 분야에서는 LAN 및 MAN 표준을 제정하였다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ICANN&lt;/li&gt;
&lt;li&gt;IANA&lt;/li&gt;
&lt;li&gt;IEEE&lt;/li&gt;
&lt;li&gt;ISO&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. IEEE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;컴퓨터 네트워크 분야에서 LAN 및 MAN 표준을 제정한 국제 조직은 IEEE입니다.&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;5. 다음 중 '전송 계층 - 네트워크 계층 - 데이터링크 계층' 순서로 나열된 PDU(Protocol Data Unit) 단위로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;frame-packet-segment&lt;/li&gt;
&lt;li&gt;segment-packet-frame&lt;/li&gt;
&lt;li&gt;packet-frame-segment&lt;/li&gt;
&lt;li&gt;packet-segment-frame&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. segment-packet-frame&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;segment-packet-frame입니다.&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;6. 다음 중 백그라운드로 수행 중인 프로세스를 확인하는 명령으로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;bg&lt;/li&gt;
&lt;li&gt;fg&lt;/li&gt;
&lt;li&gt;jobs&lt;/li&gt;
&lt;li&gt;nohup&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. jobs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;백그라운드로 수행 중인 프로세스를 확인하는 명령은 jobs입니다.&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;7. 다음 중 시그널 번호 숫자 값이 가장 큰 시그널로 알맞은 것은?&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SIGINT&lt;/li&gt;
&lt;li&gt;SIGKILL&lt;/li&gt;
&lt;li&gt;SIGSTOP&lt;/li&gt;
&lt;li&gt;SIGQUIT&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 3. SIGSTOP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : SIGINT - 2, SIGKILL - 9, SIGSTOP - 19, SIGQUIT - 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 다음 설명에 해당하는 명칭으로 가장 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;하나의 프로세스가 다른 프로세스를 실행할 때 사용하는 시스템 호출 방법의 하나로서, 새롭게 생성된 프로세스는 호출한 프로세스의 자식 프로세스가 된다.&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;fork&lt;/li&gt;
&lt;li&gt;exec&lt;/li&gt;
&lt;li&gt;init&lt;/li&gt;
&lt;li&gt;systemd&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 1. fork&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : &lt;span style=&quot;color: #000000;&quot;&gt;f&lt;span style=&quot;text-align: start;&quot;&gt;ork 호출 이후에는 호출한 프로세스와 자식 프로세스가 각각 독립적인 프로세스로서 실행되며, 서로 영향을 미치지 않습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 다음 ( 괄호 ) 안에 들어갈 내용으로 가장 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# test 20 -gt 30&lt;br /&gt;# echo $?&lt;br /&gt;( 괄호 )&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;0&lt;/li&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;10&lt;/li&gt;
&lt;li&gt;-10&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : 2. 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설 : gt는 greater than으로 왼쪽 값이 오른쪽 값보다 크면 true를 반환합니다. 쉘에서는 true가 0, false가 1입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. 다음 명령의 결과에 대한 설명으로 알맞은 것은?&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[ihd@www ~]# echo &quot;My Home is `pwd`&quot;&lt;br /&gt;&lt;br /&gt;* Back quotes 사용한 예제임&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;My Home is `pwd`&lt;/li&gt;
&lt;li&gt;My Home is `/home/ihd`&lt;/li&gt;
&lt;li&gt;My Home is /home/ihd&lt;/li&gt;
&lt;li&gt;My Home is pwd&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 : &lt;span style=&quot;color: #000000;&quot;&gt;3. &lt;span style=&quot;text-align: start;&quot;&gt;My Home is /home/ihd&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;text-align: start;&quot;&gt;해설 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;백틱으로 감싼 변수는 /home/ihd로 출력됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>IHD</category>
      <category>KAIT</category>
      <category>리눅스</category>
      <category>리눅스 마스터</category>
      <category>자격증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/85</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-1%EA%B8%89-1-10-23%EB%85%84-1%EC%B0%A8-%ED%95%84%EA%B8%B0-%EA%B0%80%EB%8B%B5-%EC%84%A4%EB%AA%85#entry85comment</comments>
      <pubDate>Sat, 11 Mar 2023 17:42:47 +0900</pubDate>
    </item>
    <item>
      <title>공연 후기) 오로라 내한 공연 후기 + 영상</title>
      <link>https://youngmon.tistory.com/entry/%EA%B3%B5%EC%97%B0-%ED%9B%84%EA%B8%B0-%EC%98%A4%EB%A1%9C%EB%9D%BC-%EB%82%B4%ED%95%9C-%EA%B3%B5%EC%97%B0-%ED%9B%84%EA%B8%B0-%EC%98%81%EC%83%81</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6NtuV/btrZISQtZ0F/bNuXabU0KegJXBOiA4kwTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6NtuV/btrZISQtZ0F/bNuXabU0KegJXBOiA4kwTK/img.jpg&quot; data-alt=&quot;두둥~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6NtuV/btrZISQtZ0F/bNuXabU0KegJXBOiA4kwTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6NtuV%2FbtrZISQtZ0F%2FbNuXabU0KegJXBOiA4kwTK%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; alt=&quot;포스터&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;602&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두둥~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;몽환적인 목소리가 매력적인 오로라가 2023년 2월 19일 드디어 내한합니다.&lt;br /&gt;공연은 6시부터 입장해 7시부터 90분 간 진행되는데,&lt;br /&gt;좌석은 1층의 스탠딩 석과 2층의 지정석으로 구분됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오로라&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 후기를 쓰려면 누군지부터 알려드려야겠쥬?&lt;br /&gt; 오로라(Aurora)는 노르웨이의 96년생 싱어송라이터로 몽환적이고 음산한 음색이 특징입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0TTQv/btrZKZ144He/BvQZJSJs2X3jFQULhHSXl1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0TTQv/btrZKZ144He/BvQZJSJs2X3jFQULhHSXl1/img.webp&quot; data-alt=&quot;겨울왕국 into the unknown에서 아아~하는 사람&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0TTQv/btrZKZ144He/BvQZJSJs2X3jFQULhHSXl1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0TTQv%2FbtrZKZ144He%2FBvQZJSJs2X3jFQULhHSXl1%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; alt=&quot;오로라&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;516&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;겨울왕국 into the unknown에서 아아~하는 사람&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이름이 Aurora인데 신기한 건 이게 본명입니다.&lt;br /&gt;한국이름으로 김빛나라고 생각하면 있을법한 이름 같기도 하네요&lt;br /&gt;96년생에 앳되어 보이지만 2012년에 데뷔했습니다.&lt;br /&gt;11년 차고 아이폰 4S 나올 때쯤 데뷔했네요...&lt;br /&gt;&lt;br /&gt;빌리 아일리시가 영향을 많이 받았다고 언급한 적이 있고, 음악적인 부분도 상당 부분 비슷합니다.&lt;br /&gt;뭔가 마르고 작아 보이지만 뚜렷한 이목구비와 전체적으로 큰 동작이 무대를 아방가르드하게 만듭니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;음악&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo7CtW/btrZJdmxg3u/liTcUtq4yzXIirDZzStli0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo7CtW/btrZJdmxg3u/liTcUtq4yzXIirDZzStli0/img.jpg&quot; data-alt=&quot;cure for me 뮤비&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo7CtW/btrZJdmxg3u/liTcUtq4yzXIirDZzStli0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo7CtW%2FbtrZJdmxg3u%2FliTcUtq4yzXIirDZzStli0%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; alt=&quot;cure for me&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;506&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cure for me 뮤비&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음색 때문에 호불호가 갈릴 수밖에 없고,&lt;br /&gt;국내에서는 Into the Unknown으로 조금씩 알려지다가 작년 Cure for me가 많이 들리게 됩니다.&lt;br /&gt;&lt;br /&gt;안타깝게도 음악의 무덤, 틱톡 챌린지가 돌아버립니다...&lt;br /&gt;그럼에도 예매 과정에서 다른 내한 공연에 비해서는 예매하기가 쉬웠네요&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;공연&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;접근성&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;span style=&quot;color: #555555;&quot;&gt;☆&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;다 좋은데 5호선 감점&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주차할 곳이 없다고 하며, 광나루역에서 내려서 약 5-7분 정도 걸으면 yes24 라이브홀&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;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKBZT7/btrZKoamJjB/9Uee2NoSQ2rIjTJLko0LU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKBZT7/btrZKoamJjB/9Uee2NoSQ2rIjTJLko0LU1/img.jpg&quot; data-alt=&quot;공연장 전경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKBZT7/btrZKoamJjB/9Uee2NoSQ2rIjTJLko0LU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKBZT7%2FbtrZKoamJjB%2F9Uee2NoSQ2rIjTJLko0LU1%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; alt=&quot;전경1&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공연장 전경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uVAG8/btrZNJZg2fg/7l7UK47HkkySc2BxpEloF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uVAG8/btrZNJZg2fg/7l7UK47HkkySc2BxpEloF1/img.jpg&quot; data-alt=&quot;6시 20분, 한가한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uVAG8/btrZNJZg2fg/7l7UK47HkkySc2BxpEloF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuVAG8%2FbtrZNJZg2fg%2F7l7UK47HkkySc2BxpEloF1%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; alt=&quot;전경2&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;6시 20분, 한가한 모습&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;공연장 환경&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음향은 생각했던 것보다 좋았습니다. 울린다고 들었는데 크게 그런 느낌은 못 받았고 베이스가 두껍게 깔려도 출력이 부족하지 않습니다.&lt;br /&gt;다만 조명 때문에 표정이 잘 안 보이고 카메라의 초점이 조금 튀는 느낌을 받았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조명&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;☆&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;음향&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시야&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;★&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;운영&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2500명 수용 가능한 시설이라는데 인원만큼 다 받지 않았는지 주변 사람이랑 부딪히지도 않았고 좁다는 생각은 하지 않았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgaANI/btrZR1L1AYi/Iz7fkXKtk8KK1ResjKun3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgaANI/btrZR1L1AYi/Iz7fkXKtk8KK1ResjKun3K/img.jpg&quot; data-alt=&quot;한국-노르웨이 수교 기념식인줄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgaANI/btrZR1L1AYi/Iz7fkXKtk8KK1ResjKun3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgaANI%2FbtrZR1L1AYi%2FIz7fkXKtk8KK1ResjKun3K%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; alt=&quot;한노수교&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한국-노르웨이 수교 기념식인줄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;종합&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;노래가 좋아서 간 건데 라이브 호달달합니다..&lt;br /&gt;땀도 안 나나 봐 한 시간 넘게 뛰어 댕기고도 춤추면서 라이브 덜덜~&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개인적으로 라이브 영상 보면 청각적인 부분 이외에도 여러 감상 요소가 많아서 한 번 가보고 싶었습니다.&lt;br /&gt;2월에 가고 싶은 게 5개 정도 있었는데 하나 고른 게 맘에 듭니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마무리는 마지막 곡인 cure for me로 가겠습니다.&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>별점맨</category>
      <category>aurora</category>
      <category>라이브홀</category>
      <category>예사홀</category>
      <category>예스24</category>
      <category>오로라</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/84</guid>
      <comments>https://youngmon.tistory.com/entry/%EA%B3%B5%EC%97%B0-%ED%9B%84%EA%B8%B0-%EC%98%A4%EB%A1%9C%EB%9D%BC-%EB%82%B4%ED%95%9C-%EA%B3%B5%EC%97%B0-%ED%9B%84%EA%B8%B0-%EC%98%81%EC%83%81#entry84comment</comments>
      <pubDate>Mon, 20 Feb 2023 01:04:07 +0900</pubDate>
    </item>
    <item>
      <title>터키 지진) 튀르키예(터키) 지진 설명회 + 후원 방법</title>
      <link>https://youngmon.tistory.com/entry/%ED%84%B0%ED%82%A4-%EC%A7%80%EC%A7%84-%ED%8A%80%EB%A5%B4%ED%82%A4%EC%98%88%ED%84%B0%ED%82%A4-%EC%A7%80%EC%A7%84-%EC%84%A4%EB%AA%85%ED%9A%8C-%ED%9B%84%EC%9B%90-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23년 2월 6일 오전 1시 17분경, 튀르키예(터키) 가지안테프 남쪽에서 모멘트 규모 7.8의 지진을 시작으로 다수의 여진이 발생했으며, 약 9시간이 지난 10시 24분경 규모 7.5의 지진이 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터키를 비롯한 주변 국가에서 최소 115,000명 이상의 사상자가 나타났다고 보고 있으며 가장 큰 피해를 받은 튀르키예의 경우 1,350만 명의 이재민이 발생, 현재 4만 명 이상의 사망자가 발생했다고 합니다.&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;해당 지진의 규모를 나타내는 모멘트 규모는 지진이 방출하는 에너지의 양을 수치화해 측정하기 위한 값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일본, 아이티 등 9.0 이상의 대지진만 보다가 7.x 규모를 보면 체감이 되지 않을 수 있습니다. 이해를 돕기 위해 비교를 하자면, 모멘트 규모를 구하기 위한 공식은 로그함수를 사용하기 때문에 값이 1만큼 커질 때마다 발생되는 에너지의 양은 31.6배씩 급격하게 커집니다. 2017년 포항에서 발생한 지진이 5.5 규모의 지진이었으니 당시보다 31.6^2.3, &lt;b&gt;약 2813배 큰 규모의 지진&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;포항.jpeg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I3O7B/btrZKZURT9l/LVZWuSheNYGYxyybVr1MQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I3O7B/btrZKZURT9l/LVZWuSheNYGYxyybVr1MQ0/img.jpg&quot; data-alt=&quot;포항 지진 당시 피해상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I3O7B/btrZKZURT9l/LVZWuSheNYGYxyybVr1MQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI3O7B%2FbtrZKZURT9l%2FLVZWuSheNYGYxyybVr1MQ0%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; alt=&quot;포항 지진&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;386&quot; data-filename=&quot;포항.jpeg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&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;후원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지진 발생 11일이 된 현재도 생존자가 나오고 있으나, 열악한 의료시설과 추운 날씨 등으로 피해가 막대한 것으로 보고 있습니다. 다양한 구호처에서 긴급 구호 캠페인에 참여할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근성이 좋은 후원처로는 유니세프, 대한적십자사, 카카오 같이가치 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1676672642645&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;[유니세프] 대지진이 강타한 튀르키예&amp;middot;시리아 어린이 돕기&quot; data-og-description=&quot;튀르키예&amp;middot;시리아 대지진 피해 어린이를 도와주세요.&quot; data-og-host=&quot;campaign.unicef.or.kr&quot; data-og-source-url=&quot;https://campaign.unicef.or.kr/2023syria_earthquake/?trackcode=g_kad_23syria&amp;amp;utm_source=google&amp;amp;utm_medium=cpc&amp;amp;utm_term=%EC%82%AC%EC%9D%B4%ED%8A%B8%EB%A7%81%ED%81%AC%2B%EC%A7%80%EC%A7%84%EA%B8%B4%EA%B8%89%EA%B5%AC%ED%98%B8%2BPC&amp;amp;utm_campaign=23syria&amp;amp;gclid=Cj0KCQiA6LyfBhC3ARIsAG4gkF_4aZpdDxl7vPA8FnaSmX1dHV9KDZPTUiFaKe78ACmGvqzS-H8As1waAh8ZEALw_wcB&quot; data-og-url=&quot;https://campaign.unicef.or.kr/2023syria_earthquake&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sxQx1/hyRF76amof/FqLC8z8GJqwJHm0LfSMGLk/img.jpg?width=1412&amp;amp;height=941&amp;amp;face=500_165_702_387,https://scrap.kakaocdn.net/dn/ePrxT/hyREIz8QI1/Pb1bZLDSOXbDLWG2vSONzK/img.png?width=400&amp;amp;height=214&amp;amp;face=0_0_400_214&quot;&gt;&lt;a href=&quot;https://campaign.unicef.or.kr/2023syria_earthquake/?trackcode=g_kad_23syria&amp;amp;utm_source=google&amp;amp;utm_medium=cpc&amp;amp;utm_term=%EC%82%AC%EC%9D%B4%ED%8A%B8%EB%A7%81%ED%81%AC%2B%EC%A7%80%EC%A7%84%EA%B8%B4%EA%B8%89%EA%B5%AC%ED%98%B8%2BPC&amp;amp;utm_campaign=23syria&amp;amp;gclid=Cj0KCQiA6LyfBhC3ARIsAG4gkF_4aZpdDxl7vPA8FnaSmX1dHV9KDZPTUiFaKe78ACmGvqzS-H8As1waAh8ZEALw_wcB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://campaign.unicef.or.kr/2023syria_earthquake/?trackcode=g_kad_23syria&amp;amp;utm_source=google&amp;amp;utm_medium=cpc&amp;amp;utm_term=%EC%82%AC%EC%9D%B4%ED%8A%B8%EB%A7%81%ED%81%AC%2B%EC%A7%80%EC%A7%84%EA%B8%B4%EA%B8%89%EA%B5%AC%ED%98%B8%2BPC&amp;amp;utm_campaign=23syria&amp;amp;gclid=Cj0KCQiA6LyfBhC3ARIsAG4gkF_4aZpdDxl7vPA8FnaSmX1dHV9KDZPTUiFaKe78ACmGvqzS-H8As1waAh8ZEALw_wcB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sxQx1/hyRF76amof/FqLC8z8GJqwJHm0LfSMGLk/img.jpg?width=1412&amp;amp;height=941&amp;amp;face=500_165_702_387,https://scrap.kakaocdn.net/dn/ePrxT/hyREIz8QI1/Pb1bZLDSOXbDLWG2vSONzK/img.png?width=400&amp;amp;height=214&amp;amp;face=0_0_400_214');&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;middot;시리아 어린이 돕기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;튀르키예&amp;middot;시리아 대지진 피해 어린이를 도와주세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;campaign.unicef.or.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1676672672056&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;redcross.campaignus.me&quot; data-og-source-url=&quot;https://redcross.campaignus.me/earthquake?_ga=2.174398114.1634284812.1676672660-1955655734.1676223855&quot; data-og-url=&quot;https://redcross.campaignus.me/earthquake?_ga=2.174398114.1634284812.1676672660-1955655734.1676223855&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mtfXf/hyREQrnqOF/Eza25o27fuIWL2EN4201J1/img.jpg?width=4096&amp;amp;height=2731&amp;amp;face=0_0_4096_2731,https://scrap.kakaocdn.net/dn/48ir9/hyRETV3hnT/znhNbcy3NJkvukldCkku00/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280,https://scrap.kakaocdn.net/dn/qOfHx/hyREGbmfNX/hm6k7vKItH4bfAB4WYC261/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080&quot;&gt;&lt;a href=&quot;https://redcross.campaignus.me/earthquake?_ga=2.174398114.1634284812.1676672660-1955655734.1676223855&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://redcross.campaignus.me/earthquake?_ga=2.174398114.1634284812.1676672660-1955655734.1676223855&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mtfXf/hyREQrnqOF/Eza25o27fuIWL2EN4201J1/img.jpg?width=4096&amp;amp;height=2731&amp;amp;face=0_0_4096_2731,https://scrap.kakaocdn.net/dn/48ir9/hyRETV3hnT/znhNbcy3NJkvukldCkku00/img.jpg?width=1920&amp;amp;height=1280&amp;amp;face=0_0_1920_1280,https://scrap.kakaocdn.net/dn/qOfHx/hyREGbmfNX/hm6k7vKItH4bfAB4WYC261/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_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;튀르키예.시리아 지진피해 긴급구호&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;redcross.campaignus.me&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1676672701898&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;together.kakao.com&quot; data-og-source-url=&quot;https://together.kakao.com/tags/%ED%8A%80%EB%A5%B4%ED%82%A4%EC%98%88-%EC%8B%9C%EB%A6%AC%EC%95%84%EA%B8%B4%EA%B8%89%EB%AA%A8%EA%B8%88&quot; data-og-url=&quot;https://together.kakao.com/tags/%ED%8A%80%EB%A5%B4%ED%82%A4%EC%98%88-%EC%8B%9C%EB%A6%AC%EC%95%84%EA%B8%B4%EA%B8%89%EB%AA%A8%EA%B8%88&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biNXzG/hyRF8RvwLv/2EforBAu0wkbKSeO04VQc0/img.png?width=2400&amp;amp;height=1200&amp;amp;face=1188_393_1319_535,https://scrap.kakaocdn.net/dn/cLDSU9/hyRETV1RQx/zICnl8JT98bhC7j6iHzrsK/img.png?width=2400&amp;amp;height=1200&amp;amp;face=1188_393_1319_535&quot;&gt;&lt;a href=&quot;https://together.kakao.com/tags/%ED%8A%80%EB%A5%B4%ED%82%A4%EC%98%88-%EC%8B%9C%EB%A6%AC%EC%95%84%EA%B8%B4%EA%B8%89%EB%AA%A8%EA%B8%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://together.kakao.com/tags/%ED%8A%80%EB%A5%B4%ED%82%A4%EC%98%88-%EC%8B%9C%EB%A6%AC%EC%95%84%EA%B8%B4%EA%B8%89%EB%AA%A8%EA%B8%88&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biNXzG/hyRF8RvwLv/2EforBAu0wkbKSeO04VQc0/img.png?width=2400&amp;amp;height=1200&amp;amp;face=1188_393_1319_535,https://scrap.kakaocdn.net/dn/cLDSU9/hyRETV1RQx/zICnl8JT98bhC7j6iHzrsK/img.png?width=2400&amp;amp;height=1200&amp;amp;face=1188_393_1319_535');&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;together.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;후기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGE0rn/btrZz0UPl29/QTXMkPdYtUDrgPfglYRGDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGE0rn/btrZz0UPl29/QTXMkPdYtUDrgPfglYRGDk/img.jpg&quot; data-alt=&quot;후원함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGE0rn/btrZz0UPl29/QTXMkPdYtUDrgPfglYRGDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGE0rn%2FbtrZz0UPl29%2FQTXMkPdYtUDrgPfglYRGDk%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; alt=&quot;후원증서&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;756&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;후원함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tS7mf/btrZBGBbf37/QdhH7enojjIOYkf1BkHHUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tS7mf/btrZBGBbf37/QdhH7enojjIOYkf1BkHHUK/img.jpg&quot; data-alt=&quot;나누어내기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tS7mf/btrZBGBbf37/QdhH7enojjIOYkf1BkHHUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtS7mf%2FbtrZBGBbf37%2FQdhH7enojjIOYkf1BkHHUK%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;644&quot; height=&quot;785&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1372&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;나누어내기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clIutL/btrZz59wgPh/X2keNVjPAgtd5SlZJ5UmC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clIutL/btrZz59wgPh/X2keNVjPAgtd5SlZJ5UmC0/img.png&quot; data-alt=&quot;현재 입금 완료..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clIutL/btrZz59wgPh/X2keNVjPAgtd5SlZJ5UmC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclIutL%2FbtrZz59wgPh%2FX2keNVjPAgtd5SlZJ5UmC0%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; alt=&quot;후원내역&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;397&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;1008&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 class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;마무리&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;며칠 전에 해놓고 시간이 이제 나서 늦게 올리는군요&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예~전에 정기 후원하다가 출금이 밀린적이 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;빚진 것도 아닌데 전화해서 독촉하길래 정기후원 끊었다가 오랜만에 착한 일 했습니다 ㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모두 왼손이 하는 일을 오른손으로 찍어서 SNS에 인성자랑하세요&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>기부</category>
      <category>시리아</category>
      <category>지진</category>
      <category>터키</category>
      <category>튀르키예</category>
      <category>후원</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/83</guid>
      <comments>https://youngmon.tistory.com/entry/%ED%84%B0%ED%82%A4-%EC%A7%80%EC%A7%84-%ED%8A%80%EB%A5%B4%ED%82%A4%EC%98%88%ED%84%B0%ED%82%A4-%EC%A7%80%EC%A7%84-%EC%84%A4%EB%AA%85%ED%9A%8C-%ED%9B%84%EC%9B%90-%EB%B0%A9%EB%B2%95#entry83comment</comments>
      <pubDate>Sat, 18 Feb 2023 07:40:17 +0900</pubDate>
    </item>
    <item>
      <title>돌비 시네마 vs 아이맥스 vs 4DX 장단점 및 명당 비교</title>
      <link>https://youngmon.tistory.com/entry/%EB%8F%8C%EB%B9%84-%EC%8B%9C%EB%84%A4%EB%A7%88-vs-%EC%95%84%EC%9D%B4%EB%A7%A5%EC%8A%A4-vs-4DX-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B9%84%EA%B5%90</link>
      <description>&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;예전 인터스텔라를 시작으로 IMAX가 떠오르더니, 작년 탑건의 흥행으로 4DX와 돌비 시네마의 수요층도 점점 두터워지고 있습니다. 영화 잘 안 보는 영알못 기준으로 세 특수관의 차이를 비교해 보겠습니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CGV 4DX&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;CGV에서 상용화한 4D 상영 시스템의 브랜드명입니다. 이름에 4D가 들어가기 때문에 3D + 모션 체어라고 생각하시는 분이 많지만, 2D로 상영하는 4DX 영화도 있고, 3D로 상영하는 경우 4DX 3D라는 포맷으로 제공되기 때문에 예매 전 확인하는 편이 좋습니다.&lt;br /&gt;4DX관에서 상영하는 4D 영화의 종류는 4DX 2D, 4DX 3D에 더불어 SOUNDX, SCREENX 등 다양하게 존재합니다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;모션 체어를 통해 영화의 장면에 맞게 다양한 움직임이 표현되고, 바람, 에어샷, 레인 등의 특수 효과로 영화의 날씨, 분위기, 향기 등을 구현했기 때문에 기존 영화관에서 느낄 수 없던 경험을 할 수 있습니다. IMAX, 돌비보다 좌석 위치에 따른 격차가 적은 편입니다.&lt;br /&gt;마치 놀이공원에 간 것 같다는 장점이 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;단점&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;마치 놀이공원에 간 것 같습니다;;;; 모션체어에 3D 안경까지 더해지면 멀미가 유발될 수 있고 러닝타임이 길어지면 굉장히 피로해질 수 있으며, 다양한 특수효과가 전부 돈이기 때문에 비쌉니다. 또한 IMAX나 돌비가 일정 수준 이상의 설비를 갖추어야 전용관으로 인정해 주는 것에 비해, 상영관마다 차이가 굉장히 심합니다.&lt;br /&gt;스크린의 크기가 작은 편이며, 경우에 따라 오히려 영화의 몰입도를 낮출 수 있습니다.&lt;br /&gt;&lt;br /&gt;용산 아이파크, 여의도, 청담 씨네시티 정도가 괜찮다고 알려져 있으며 그중에서도 용산 아이파크몰 4dx관 중 가운데 프리미엄 좌석은 용포프라 불리며 어떤 영화가 걸리던 예매가 상당히 어렵습니다.&lt;br /&gt;개인적으로는 용산 프리미엄 &amp;gt; 여의도 &amp;gt; 청담 &amp;gt;= 용산 4dx라고 생각합니다.&lt;br /&gt;좌석 선택 팁으로 좌석을 선정하실 때, 통로 쪽 자리에 앉으시면 더욱 가동범위가 커지기 때문에 더욱 재밌게 보실 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CGV IMAX&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;IMAX는 Eye-Maximum 또는 Image-Maximum이라는 뜻으로 인간의 눈으로 볼 수 있는 한계치를 필름에 담는다는 뜻입니다. 독자적인 화면 비율과 고화질/고해상도, 고출력 스피커를 통해 영화의 몰입도를 높입니다. &lt;br /&gt;IMAX는 사실 용산 아이파크몰을 제외하면 격차가 꽤 큰데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;955&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5OsiW/btrZewkWi7M/sSmu8Wrh8ekuH6k9EurQ90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5OsiW/btrZewkWi7M/sSmu8Wrh8ekuH6k9EurQ90/img.jpg&quot; data-alt=&quot;IMAX 스크린 크기 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5OsiW/btrZewkWi7M/sSmu8Wrh8ekuH6k9EurQ90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5OsiW%2FbtrZewkWi7M%2FsSmu8Wrh8ekuH6k9EurQ90%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; alt=&quot;IMAX 스크린 크기 비교&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;821&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;955&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IMAX 스크린 크기 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;스크린 크기를 비교해 보시면 같은 IMAX임에도 4배가량 크기 차이가 나는 것을 보실 수 있습니다.&lt;br /&gt;또한 아이맥스 레이저(IMAX Laser) 관을 지원하는 경우 아이맥스 필름인 1.43 : 1 비율의 영상을 잘리지 않은 채로 온전히 볼 수 있으며 기존의 IMAX보다 밝고 선명한 영상을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthFull&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt0Mi0/btrZcmXqBMC/0s4VTN4itYOKskH8q8xrB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt0Mi0/btrZcmXqBMC/0s4VTN4itYOKskH8q8xrB1/img.jpg&quot; data-alt=&quot;용산 IMAX Laser관&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt0Mi0/btrZcmXqBMC/0s4VTN4itYOKskH8q8xrB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt0Mi0%2FbtrZcmXqBMC%2F0s4VTN4itYOKskH8q8xrB1%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; alt=&quot;용산 IMAX Laser&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;682&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;용산 IMAX Laser관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;인터스텔라를 기준으로 한 IMAX 비율과 일반 상영관의 비율 차이입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthFull&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJqVy/btrY7MJWM3M/Pwo3fKLd0Lp6zVkQXS1khK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJqVy/btrY7MJWM3M/Pwo3fKLd0Lp6zVkQXS1khK/img.jpg&quot; data-alt=&quot;사진 전체가 1.43 아이맥스용 70mm 필름 비율&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJqVy/btrY7MJWM3M/Pwo3fKLd0Lp6zVkQXS1khK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJqVy%2FbtrY7MJWM3M%2FPwo3fKLd0Lp6zVkQXS1khK%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;824&quot; height=&quot;601&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진 전체가 1.43 아이맥스용 70mm 필름 비율&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;초록색 선이 Blu-ray 화면에 담기는 비율&lt;br /&gt;노란색 선이 디지털 IMAX(LASER X)&lt;br /&gt;파란색이 일반 극장에서의 상영 비율입니다.&lt;br /&gt;&lt;br /&gt;파란색 선 아래의 부분은 잘려서 버려지는 부분으로 필름에는 위 사진의 전체가 담겨있지만, 실제로는&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthFull&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TxtbV/btrZau3ilOj/43zjc33UwfTuR6g7zFp8Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TxtbV/btrZau3ilOj/43zjc33UwfTuR6g7zFp8Q1/img.png&quot; data-alt=&quot;확실히 갑갑해져버린 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TxtbV/btrZau3ilOj/43zjc33UwfTuR6g7zFp8Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTxtbV%2FbtrZau3ilOj%2F43zjc33UwfTuR6g7zFp8Q1%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; alt=&quot;실제 상영 크기&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;340&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;확실히 갑갑해져버린 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이만큼만 극장에서 볼 수 있게 됩니다. 모르고 봤다면 일반 상영관에서도 봤겠지만 비교해 보면 차이가 매우 큰데 이러한 부분이 관객들을 전용관으로 이끄는 것이라고 생각합니다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;IMAX로 촬영된 영화일 경우, 버려지는 부분 없이 온전히 즐길 수 있으며 4DX와 반대로 거대한 화면과 다중 채널 스피커 등이 영화의 몰입감을 높여줍니다.&lt;br /&gt;이 한 줄로 충분할 만큼 영화 보는 내내 깊이 몰입할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;단점&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;큰 화면을 통한 몰입감이 장점이지만, A열에 앉았을 때 목이 너무 아픕니다..&lt;br /&gt;&lt;br /&gt;좌석 선택 시 스크린에서 멀리 떨어질수록 좋은 것 같습니다.. 가장 큰 스크린 때문에 용산 가놓고 너무 커서 뒤로 가는 바보..&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dolby Cinema, 메가박스 돌비 시네마&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;아이맥스, 4DX에 묻힌 시대가 낳은 비극, 돌비 시네마입니다.&lt;br /&gt;일반적으로 돌비하면 Dolby Atmos, Dolby Audio 등 뛰어난 음향 기술을 자랑하기 때문에 영상 기술이 저평가되어있습니다. 마치 가수나 배우의 외모가 너무 뛰어나면 가창력이나 연기력에 대해 의문을 가지게 되는 것처럼요. 위의 IMAX 소개 글에서 썼던 것처럼 IMAX의 최대 장점은 큰 화면을 통한 영화의 몰입도 증가입니다.&lt;br /&gt;그렇다면 돌비관은 화면이 작을까요?&lt;br /&gt;&lt;br /&gt;국내에서 현재 최고라고 평가받는 남양주의 돌비관의 경우 스크린의 가로 20.5m, 세로 길이 11.7m입니다.&lt;br /&gt;위 IMAX 상영관 중 5번째로 큰 광교, 일산 IMAX 관과 비슷한 수준입니다.&lt;br /&gt;서울 코엑스에 있는 돌비 시네마의 경우에도 16m, 6.7m로 작은 IMAX관 정도의 스크린 크기입니다.&lt;br /&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;해상도&lt;/li&gt;
&lt;li&gt;HDR &amp;amp; WCG&lt;/li&gt;
&lt;li&gt;높은 프레임(HFR)&lt;/li&gt;
&lt;li&gt;멀티 채널 오디오&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;등이 있습니다.&lt;br /&gt;&lt;br /&gt;우선 돌비 시네마를 접하기 전에는 보다 나은 화면을 위해서는 IMAX, 보다 나은 음질을 위해서는 돌비라고 생각했지만? 화면도 미쳤습니다.&lt;br /&gt;앞서 설명드린 HDR(밝기, 고대비)와 WCG(풍부한 색 표현력)에 있어서는 돌비 비전이 더 낫다고 봅니다. 물론 음향은 말할 것도 없구요.&lt;br /&gt;&lt;br /&gt;돌비 시네마는 돌비 비전 HDR과 돌비 애트모스를 결합한 고급 영화관의 형태로 정사각형의 건축 구조와 매립형 스피커, 전용 화면과 프로젝터 등의 가이드라인을 지켜야 라이센스가 발급됩니다.&lt;br /&gt;현재 국내에는 코엑스, 남양주 스페이스원, 안성 스타필드, 대전 신세계, 대구 신세계 5개 상영관이 있으며 2023년 2월 현재 기준, 남양주의 돌비관이 가장 시설이 좋다고 알려져 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Dolby Vision HDR의 풍부한 색 표현과 고대비를 통한 깊은 채도 표현, 입체적이고 타이타닉이 반토막 나도 찢어지지 않는 안정적인 고출력 사운드 시스템이 장점입니다. 또한 아직까지는 IMAX에 비해 사람들 관심이 적어 조금은 더 쉽게 즐길 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;단점&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;남양주? 교통편이 너무 안 좋습니다. 코엑스는 그나마 교통편이 좋은 편이나 기존 MX 상영관을 리뉴얼해 돌비 가이드라인에 맞춘 것이기 때문에 설계 단계부터 돌비에 최적화된 남양주관에 못 미친다고 합니다. 또한 사운드의 입체감을 위해 신경을 쓴 만큼 가운데 자리와 사이드 자리가 차이가 난다고 하는데, 아이맥스나 4DX에 비해 중앙 좌석의 중요도가 커 좋은 자리 구하기가 어렵습니다.&lt;br /&gt;&lt;br /&gt;좌석 선정 팁으로 어제 코돌비 가봤는데 E-G열 괜찮은 것 같습니다. 화면 한눈에 딱 들어오고 앞사람 거슬린다고 했는데 그 정도는 아닌 것 같고 사운드는 비교할 수가 없다는 것..&lt;br /&gt;&lt;br /&gt;개인적인 영화 상영관 고를 때 추천드리는 기준은&lt;br /&gt;차량, 바람이 많이 불거나 &lt;b&gt;속도감이 빠른 영화&lt;/b&gt;는 &lt;b&gt;4DX&lt;/b&gt;(4DX with 3D는 비추)&lt;br /&gt;&lt;b&gt;IMAX 전용&lt;/b&gt; &lt;b&gt;필름&lt;/b&gt;으로 촬영된 1.43:1 비율의 영화라면 &lt;b&gt;IMAX&lt;/b&gt;&lt;br /&gt;1.43 비율이 아닌 일반 비율이라면 돌비 상영관을 추천드리지만, 4DX는 취향 차이기 때문에 원하시는 것 보시면 될 것 같습니다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;영화 후기&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;1136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clsHNy/btrZa26uDF0/G1mZTxK1EH85uzRAl1K4p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clsHNy/btrZa26uDF0/G1mZTxK1EH85uzRAl1K4p1/img.png&quot; data-alt=&quot;코돌비 타이타닉&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clsHNy/btrZa26uDF0/G1mZTxK1EH85uzRAl1K4p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclsHNy%2FbtrZa26uDF0%2FG1mZTxK1EH85uzRAl1K4p1%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; alt=&quot;관람권&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;381&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;1136&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코돌비 타이타닉&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2100&quot; data-origin-height=&quot;1896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P5XY9/btrZewtoBxV/vP6R8J6ixeII8O9Kl4nnGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P5XY9/btrZewtoBxV/vP6R8J6ixeII8O9Kl4nnGK/img.jpg&quot; data-alt=&quot;진짜 3D안경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P5XY9/btrZewtoBxV/vP6R8J6ixeII8O9Kl4nnGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP5XY9%2FbtrZewtoBxV%2FvP6R8J6ixeII8O9Kl4nnGK%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;2100&quot; height=&quot;1896&quot; data-origin-width=&quot;2100&quot; data-origin-height=&quot;1896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진짜 3D안경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;3d도 cgv 검은 안경보다 돌비가 더 밝고 덜 어지러웠습니다. 다만 무거워서 자꾸 흘러내린다는 것..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmzvF/btrZi7T1Yhy/2yLlENDKhKCH1nzNRSh0zk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmzvF/btrZi7T1Yhy/2yLlENDKhKCH1nzNRSh0zk/img.jpg&quot; data-alt=&quot;광고임.. 영화 아님&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmzvF/btrZi7T1Yhy/2yLlENDKhKCH1nzNRSh0zk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpmzvF%2FbtrZi7T1Yhy%2F2yLlENDKhKCH1nzNRSh0zk%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;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;광고임.. 영화 아님&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;E열 기준 작지 않은 스크린 크기와 색감..&lt;br /&gt;돌비 광고는 진짜 영화 한 편 보는 느낌..&lt;br /&gt;끝나고 엔딩 크레딧 올라가면서 My heart will go on이 나와서 찍었는데 영상으로 녹화된 게 정식 음원보다 듣기 좋습니다 띠용~&lt;br /&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;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;어쨌든 짧은 추가 후기와 함께 비교글을 마치겠습니다.&lt;/p&gt;</description>
      <category>별점맨</category>
      <category>4DX</category>
      <category>Dolby</category>
      <category>imax</category>
      <category>남돌비</category>
      <category>돌비</category>
      <category>아이맥스</category>
      <category>용아맥</category>
      <category>용포디</category>
      <category>용포프</category>
      <category>코돌비</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/82</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%8F%8C%EB%B9%84-%EC%8B%9C%EB%84%A4%EB%A7%88-vs-%EC%95%84%EC%9D%B4%EB%A7%A5%EC%8A%A4-vs-4DX-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B9%84%EA%B5%90#entry82comment</comments>
      <pubDate>Tue, 14 Feb 2023 20:47:58 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT) Chat GPT 사용 방법과 GPT Plus 후기</title>
      <link>https://youngmon.tistory.com/entry/ChatGPT-Chat-GPT-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95%EA%B3%BC-GPT-Plus-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-02-12 at 6.40.11 PM.png&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctJNbJ/btrYV9RMhlF/SoZjymjfBL0yWCqO8D8MoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctJNbJ/btrYV9RMhlF/SoZjymjfBL0yWCqO8D8MoK/img.png&quot; data-alt=&quot;ChatGPT plus 요금제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctJNbJ/btrYV9RMhlF/SoZjymjfBL0yWCqO8D8MoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctJNbJ%2FbtrYV9RMhlF%2FSoZjymjfBL0yWCqO8D8MoK%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; alt=&quot;ChatGPT Plus&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;600&quot; data-filename=&quot;Screenshot 2023-02-12 at 6.40.11 PM.png&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ChatGPT plus 요금제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI의 Chat GPT의 유료버전인 Chat GPT Plus가 11일 한국에 도입되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT 플러스는 이용자가 몰리는 시간에도 평소처럼 접속할 수 있으며, 답변을 받기까기 걸리는 시간을 단축해주며, 새로운 기능(알파, 베타 서비스)에 대해 일반 사용자보다 우선적인 접근이 가능합니다.&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;Chat GPT란?&lt;/b&gt;&lt;/h3&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;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdtgf9/btrYY61uRdv/bPJprqgVXE5ZWRfQylZ8d0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdtgf9/btrYY61uRdv/bPJprqgVXE5ZWRfQylZ8d0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdtgf9/btrYY61uRdv/bPJprqgVXE5ZWRfQylZ8d0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdtgf9%2FbtrYY61uRdv%2FbPJprqgVXE5ZWRfQylZ8d0%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; alt=&quot;GPT3&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;374&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;우선 Chat GPT에 대해 간략히 소개를 드리자면 22년 11월 미국의 인공지능 스타트업인 OpenAI에서 개발한 인공지능 챗봇으로, 세계 최대 수준의 빅데이터 기반 모델인 GPT-3.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;약 두 달 동안, ChatGPT를 사용하며 크게 불편함은 없었으나 시간이 지나 사용자가 급증하면서 사용자가 몰리는 오후 11시(미국에선 아침 9시)부터 수요가 많다는 알림과 함께 서비스 이용에 불편을 겪었고, 시간 당 보낼 수 있는 요청의 갯수 제한과 한국어로 대답하는 경우 속도가 너무 느려 사용하지 못할 정도라고 생각했기 때문에 GPT 플러스 소식을 듣자마자 waitlist에 등록하고 기다렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 오늘 대기 없이 한국에서 바로 GPT Plus 모델을 구독할 수 있게 되었습니다.&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;ChatGPT Plus&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2023-02-11 at 4.12.07 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etWc59/btrYTMwiIwv/Zq0IY9P3WSkEXg5TsM3Huk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etWc59/btrYTMwiIwv/Zq0IY9P3WSkEXg5TsM3Huk/img.png&quot; data-alt=&quot;GPT Plus 구독&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etWc59/btrYTMwiIwv/Zq0IY9P3WSkEXg5TsM3Huk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FetWc59%2FbtrYTMwiIwv%2FZq0IY9P3WSkEXg5TsM3Huk%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; alt=&quot;GPT Plus 가입&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;643&quot; data-filename=&quot;edited_Screenshot 2023-02-11 at 4.12.07 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPT Plus 구독&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-02-11 at 4.14.18 PM.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CLoC3/btrYSOOPXG7/MvIYQKKGYJFdC8kD9D1xp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CLoC3/btrYSOOPXG7/MvIYQKKGYJFdC8kD9D1xp0/img.png&quot; data-alt=&quot;결제 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CLoC3/btrYSOOPXG7/MvIYQKKGYJFdC8kD9D1xp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCLoC3%2FbtrYSOOPXG7%2FMvIYQKKGYJFdC8kD9D1xp0%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; alt=&quot;결제 완료&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;135&quot; data-filename=&quot;Screenshot 2023-02-11 at 4.14.18 PM.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;135&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;챗 GPT 플러스를 구독하는데 드는 비용은 한달에 20달러(11일 기준 약 25,400원)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT Plus를 구독하면 기존 GPT 모델이 GPT 플러스로 업그레이드되며, 현재 알파 버전인 GPT Turbo를 사용할 수 있습니다. GPT 터보 모델은 기존 모델에 비해 더 빠른 처리 속도와 높은 성능을 제공하는 것이 목적으로, 딥러닝 알고리즘과 고속 처리 장치 등을 사용해 개발되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT Plus가 공개되었으나, GPT Plus 유저 뿐 아니라, 요금을 지불하지 않는 기존 사용자도 여전히 ChatGPT를 사용할 수 있습니다.&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;GPT Turbo&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT 터보 모델을 실제로 사용해 본 경험으로는 속도가 확실히 빠릅니다..!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 모델에 영어로 질문했을 때 답변이 생성되는 속도와 비교해도 큰 차이가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT 터보 모델의 정확성이 기존 모델에 비해 떨어진다고 하지만 큰 체감을 느끼지는 못했습니다.&lt;/p&gt;
&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 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;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;확실히 4초대면 참을만은 한 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT를 사용할 수 있는 링크는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;Open AI - ChatGPT&quot; href=&quot;https://chat.openai.com/chat&quot; rel=&quot;noopener&quot;&gt;https://chat.openai.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;후기와 느낀 점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT는 기존의 이루다처럼 자연어 처리에 중점을 둔 대화형 챗봇을 넘어, 방대한 데이터 베이스를 가진 대화형 검색엔진에 가깝습니다. 두 달간 GPT를 사용하며 검색, 학습에 필요한 시간과 생산성 측면에서 많은 부분이 개선되었기에 20달러라는 금액이 작은 금액은 아니지만 작업 도구라고 생각하고 그냥 결제했습니다 ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료로도 사용할 수 있기 때문에 사용량이 적은 분들은 사실 굳이 결제하지 않아도 이용에 큰 문제가 없으니 현명한 사용 하시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;+ GPT4 설명과 후기입니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-4-분석-Bing과의-차이점&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.03.15 - [정정생보통] - ChatGPT) Chat GPT-4 분석, Bing과의 차이점&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1678994161814&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;ChatGPT) Chat GPT-4 분석, Bing과의 차이점&quot; data-og-description=&quot;Open AI가 드디어 Chat GPT의 새로운 버전인 GPT-4 모델을 플러스 유저들에게 공개했습니다. 일반 유저에게는 공개되지 않았으며, GPT-4를 사용하기 위해서는 GPT Plus 구독을 통해 Plus 유저 권한으로 사&quot; data-og-host=&quot;youngmon.app&quot; data-og-source-url=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-4-분석-Bing과의-차이점&quot; data-og-url=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-4-%EB%B6%84%EC%84%9D-Bing%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/p3Kez/hyRXFaJpx1/mciNUJEULhKEw26ITfbzzk/img.png?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/vIQuJ/hyRWBnwwIP/8WSfLVNjU8npkOCk802GP1/img.png?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/bgJM1v/hyRWxFlSIZ/3VaUdxf8SXXN1JaejFv9kk/img.png?width=972&amp;amp;height=1248&amp;amp;face=0_0_972_1248&quot;&gt;&lt;a href=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-4-분석-Bing과의-차이점&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngmon.app/entry/ChatGPT-Chat-GPT-4-분석-Bing과의-차이점&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/p3Kez/hyRXFaJpx1/mciNUJEULhKEw26ITfbzzk/img.png?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/vIQuJ/hyRWBnwwIP/8WSfLVNjU8npkOCk802GP1/img.png?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/bgJM1v/hyRWxFlSIZ/3VaUdxf8SXXN1JaejFv9kk/img.png?width=972&amp;amp;height=1248&amp;amp;face=0_0_972_1248');&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;ChatGPT) Chat GPT-4 분석, Bing과의 차이점&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Open AI가 드디어 Chat GPT의 새로운 버전인 GPT-4 모델을 플러스 유저들에게 공개했습니다. 일반 유저에게는 공개되지 않았으며, GPT-4를 사용하기 위해서는 GPT Plus 구독을 통해 Plus 유저 권한으로 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;youngmon.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>Ai</category>
      <category>ChatGPT</category>
      <category>대화형 검색엔진</category>
      <category>이루다</category>
      <category>인공지능</category>
      <category>챗GPT</category>
      <category>챗봇</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/81</guid>
      <comments>https://youngmon.tistory.com/entry/ChatGPT-Chat-GPT-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95%EA%B3%BC-GPT-Plus-%ED%9B%84%EA%B8%B0#entry81comment</comments>
      <pubDate>Sun, 12 Feb 2023 19:56:19 +0900</pubDate>
    </item>
    <item>
      <title>HTTP) 초보자를 위한 REST 설명회</title>
      <link>https://youngmon.tistory.com/entry/HTTP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-REST-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;REST란 확장과 유지보수가 쉽고 유연한 &lt;b&gt;웹 서비스/API&lt;/b&gt;를 만들기 위한 &lt;b&gt;가이드라인&lt;/b&gt;(아키텍처 스타일)이며, 이러한 가이드라인을 준수해 만든 API를 RESTful API라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST는 인터넷을 통해 서버의 자원이나 기능을 사용하기 위해 외부에 노출시킬 &lt;b&gt;인터페이스&lt;/b&gt;를 HTTP의 특징을 살려서 알기 쉽게 표현하기 적합합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;REST에는 다음과 같은 특징이 있습니다.&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;무상태(Stateless)&lt;/li&gt;
&lt;li&gt;URI로 표현되는 자원&lt;/li&gt;
&lt;li&gt;HTTP 메소드(CRUD 작업)&lt;/li&gt;
&lt;li&gt;Json 또는 Xml로 표현되는 표현 형식&lt;/li&gt;
&lt;li&gt;캐시 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 더욱 쉽게 핵심만 추리자면 다음과 같이 요약할 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자원을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;URI&lt;/b&gt;로 표시하고&lt;/li&gt;
&lt;li&gt;자원에 대한 동작을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HTTP 메소드&lt;/b&gt;로 접근할 수 있게 하며&lt;/li&gt;
&lt;li&gt;동작을 실행한 결과와 알맞은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HTTP Code&lt;/b&gt;를 응답&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST하게 설계된 API의 장점으로는 HTTP로만 구현 가능하며, stateless하고 메소드별로 캐싱이 가능하다는 특징으로 고성능의 분산처리 시스템에서 유용하게 사용될 수 있어 실제로 MSA의 통신은 REST API를 통해 이루어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 메소드의 다양성 측면이나 애매한 표준으로 인해 API의 객관적인 품질 검증이 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RESTful API&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ciqw6/btrYARDJDhi/H7vhKg6lP6htkG1oDACDHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ciqw6/btrYARDJDhi/H7vhKg6lP6htkG1oDACDHK/img.png&quot; data-alt=&quot;RESTful API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ciqw6/btrYARDJDhi/H7vhKg6lP6htkG1oDACDHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCiqw6%2FbtrYARDJDhi%2FH7vhKg6lP6htkG1oDACDHK%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; alt=&quot;RESTful API&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;353&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RESTful API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 설명한 REST의 가이드라인을 잘 준수할 때, RESTful API라고 부릅니다. 문제는 상기 서술한 것처럼 큰 흐름으로서의 가이드라인은 있으나, 객관적인 품질 표준은 없기 때문에 자원의 이름, 적합한 메소드(Put, Post, Patch 등)의 선정, 적절한 응답 코드(4xx, 5xx 등)처럼 개발자의 주관이 많이 관여하는 특성상, API가 잘 설계되었는지 아닌지를 판단하기가 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 용어는 상황에 따라 종종 모호할 수 있으며, 다양한 맥락에서 혼재되어 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 REST 아키텍처가 추구하는 방향성(확장성, 유지보수성, 유연성)과 제약 조건을 이해하고 각 서비스의 특정 요구사항을 충족할 수 있는 API의 설계임을 기억하시기 바랍니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>http</category>
      <category>MSA</category>
      <category>Rest</category>
      <category>rest api</category>
      <category>restful api</category>
      <category>web</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/80</guid>
      <comments>https://youngmon.tistory.com/entry/HTTP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-REST-%EC%84%A4%EB%AA%85%ED%9A%8C#entry80comment</comments>
      <pubDate>Wed, 8 Feb 2023 22:15:43 +0900</pubDate>
    </item>
    <item>
      <title>Nest.Js) 중급자를 위한 Gateway/Socket.io 설명회</title>
      <link>https://youngmon.tistory.com/entry/NestJs-%EC%A4%91%EA%B8%89%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-GatewaySocketio-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅은 추상적인 개념을 설명하는 게 아닌 실제 코드나 Nest.js의 데코레이터, Typescript로 작성되는 코드 등 보다 구체화되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Socket.io를 알아보기에 앞서 WebSocket에 대한 이해를 선행하는 편을 추천드립니다.&lt;/p&gt;
&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://youngmon.app/entry/WEB-초보자를-위한-웹소켓WebSocket-설명회&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.02.05 - [WEB] - WEB) 초보자를 위한 웹소켓(WebSocket) 설명회&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675674500106&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) 초보자를 위한 웹소켓(WebSocket) 설명회&quot; data-og-description=&quot;우리가 사용하는 다양한 어플리케이션 중에는 카카오톡이나 공유 문서, 게임처럼 실시간으로 화면이 변경되며 데이터가 수정되는 모델들이 존재합니다. 이러한 웹 어플리케이션들은 어떻게 데&quot; data-og-host=&quot;youngmon.app&quot; data-og-source-url=&quot;https://youngmon.app/entry/WEB-초보자를-위한-웹소켓WebSocket-설명회&quot; data-og-url=&quot;https://youngmon.app/entry/WEB-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%9B%B9%EC%86%8C%EC%BC%93WebSocket-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhTtQ1/hyRwxLNP7f/8RHs5nAigV8a4xUHjaeonk/img.png?width=220&amp;amp;height=106&amp;amp;face=0_0_220_106,https://scrap.kakaocdn.net/dn/b2rb81/hyRwHt5HHr/MnyHKEmJfkQktaLkGA02kK/img.png?width=220&amp;amp;height=106&amp;amp;face=0_0_220_106,https://scrap.kakaocdn.net/dn/b6Paf4/hyRwFwhr9i/HKh9GVLrcnCaqD5byK0o21/img.jpg?width=650&amp;amp;height=400&amp;amp;face=0_0_650_400&quot;&gt;&lt;a href=&quot;https://youngmon.app/entry/WEB-초보자를-위한-웹소켓WebSocket-설명회&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngmon.app/entry/WEB-초보자를-위한-웹소켓WebSocket-설명회&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhTtQ1/hyRwxLNP7f/8RHs5nAigV8a4xUHjaeonk/img.png?width=220&amp;amp;height=106&amp;amp;face=0_0_220_106,https://scrap.kakaocdn.net/dn/b2rb81/hyRwHt5HHr/MnyHKEmJfkQktaLkGA02kK/img.png?width=220&amp;amp;height=106&amp;amp;face=0_0_220_106,https://scrap.kakaocdn.net/dn/b6Paf4/hyRwFwhr9i/HKh9GVLrcnCaqD5byK0o21/img.jpg?width=650&amp;amp;height=400&amp;amp;face=0_0_650_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;WEB) 초보자를 위한 웹소켓(WebSocket) 설명회&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;youngmon.app&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;실시간 통신을 구현하기 위해 사용할 수 있는 라이브러리는 SockJs, Socket.io 또는 ws(Nest.js 내장)을 고려할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅에서는 Socket.io 모듈을 사용하는데 이유는 Socket.io를 사용할 경우 WebSocket을 지원하지 않는 브라우저, 프록시가 있더라도 API를 동일하게 유지하면서 HTTP Streaming, Long Poling 등의 방식으로 &lt;b&gt;에뮬레이팅&lt;/b&gt;(WebSocket 흉내) 해 주기 때문이며 보다 구현이 쉽다는 점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요 모듈&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce8y1c/btrYsP6WnrT/kzswgMBZHjsKrEJtox4Xkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce8y1c/btrYsP6WnrT/kzswgMBZHjsKrEJtox4Xkk/img.png&quot; data-alt=&quot;socket.io&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce8y1c/btrYsP6WnrT/kzswgMBZHjsKrEJtox4Xkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce8y1c%2FbtrYsP6WnrT%2FkzswgMBZHjsKrEJtox4Xkk%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; alt=&quot;socket.io&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;263&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;socket.io&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nest.js에서 사용하기 위해 설치해야 하는 라이브러리는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1675677988047&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i @nestjs/websockets \
      @nestjs/platform-socket.io \
      @type/socket.io&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Gateway란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nest.js에서는 웹소켓 커넥션을 생성, 관리하기 위해 Gateway라는 개념을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게이트웨이는 일반적으로 다른 두 시스템 또는 네트워크를 연결, 제어해 통신을 가능하게 하며, 호환, 보안, 성능 등을 보장하기 위해 사용되는 매개체를 뜻합니다. 예를 들어 인터넷과 내부 망을 연결하는 공유기, MSA 구조에서 복잡한 API를 묶어 외부에서 접근하기 쉽게 해 주고 권한과 로드밸런싱을 담당하는 API Gateway 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nest.js에서 사용할 수 있는 웹소켓 구현체로는 ws, socket.io 등이 있습니다. 문제는 socket.io가 단순히 ws를 상속받는 것이 아니라 서로의 인터페이스가 다르다는 문제가 있기 때문에 이러한 저수준의 API를 Gateway라는 클래스로 래핑 해서 고수준의 Gateway API로 변경이 용이한 코드를 작성할 수 있게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 설계를 어댑터 패턴이라고 하며, 인터페이스 호환을 통한 의존성 감소를 위해 사용합니다. Gateway로 웹소켓 관련 코드를 작성한 후, Gateway에 적용될 구현체를 변경하는 것으로 코드의 변경을 최소화하면서 어플리케이션을 수정할 수 있습니다.&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;@WebSocketGateway 데코레이터로 웹소켓 게이트웨이 클래스를 정의하고 경로, 네임스페이스, CORS 등의 옵션을 지정할 수 있습니다. 웹소켓 게이트웨이로 사용할 클래스를 지정했다면, 클래스 내부에서는 크게&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WebSocketServer : 게이트웨이에서 사용하는 기본 웹소켓 서버 인스턴스를 정의, 연결된 클라이언트 소켓들을 가져올 수 있으며 여러 유용한 기능을 제공&lt;/li&gt;
&lt;li&gt;SubscribeMessage : 서버에서 메시지를 받을 때 실행할 메소드 정의(.on()의 역할)&lt;/li&gt;
&lt;li&gt;OnGatewayConnection/Disconnect : 클라이언트가 연결/해제 이벤트 감지를 위한 인터페이스&lt;/li&gt;
&lt;/ul&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;&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;socket.io의 동작을 극도로 단순화시켜 설명하자면 emit()으로 전송하고, on()으로 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;emit의 인자로 보내지는 값은 이벤트의 이름(네임스페이스)과 자바스크립트 구조체인 데이터 페이로드(옵션), 이벤트 전송 이후 실행될 콜백 함수(옵션)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;pre id=&quot;code_1675775565522&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@WebSocketServer()
private server;	//	웹소켓에 사용될 서버 인스턴스 주입

this.server.emit(&quot;abc&quot;, {
	data: &quot;asd&quot;,
});	// 해당 네임스페이스 서버의 &quot;abc&quot; 이벤트에 data를 전달&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 서버 함수에서는 &quot;abc&quot; 이벤트에 &quot;asd&quot;라는 문자열을 data라는 이름으로 전달합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1675775274595&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SubscribeMessage(&quot;abc&quot;)	//	socket.on(&quot;abc&quot;, (payload) =&amp;gt; {});
handlerF(@MessageBody() payload) {};	//	Nest.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &quot;abc&quot; 이벤트를 기다리고 있던 handlerF 메소드가 실행되며 필요에 따라 함께 넘어온 payload 객체를 이용해 비즈니스 로직을 수행할 수 있습니다.&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;클라이언트 코드(.html)&lt;/p&gt;
&lt;pre id=&quot;code_1675793866135&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;Socket.io Example&amp;lt;/title&amp;gt;
  &amp;lt;script src=&quot;https://cdn.socket.io/4.5.4/socket.io.min.js&quot; integrity=&quot;sha384-/KNQL8Nu5gCHLqwqfQjA689Hhoqgi2S84SNUxC3roTe4EhJ9AfLkp8QiQcU8AMzI&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1 id = &quot;title&quot;&amp;gt;&amp;lt;/h1&amp;gt;
  &amp;lt;ul id = &quot;msg-list&quot;&amp;gt;
  &amp;lt;/ul&amp;gt;
  &amp;lt;div&amp;gt;
	  &amp;lt;input id=&quot;msg&quot; type=&quot;text&quot; /&amp;gt;
	  &amp;lt;button onclick=&quot;handleSend()&quot;&amp;gt;Send&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;script src=&quot;./index.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 코드(.js)&lt;/p&gt;
&lt;pre id=&quot;code_1675793910351&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const name = prompt('name?');
document.getElementById(&quot;title&quot;).textContent = 'USER : ' + name;
const socket = io('http://localhost:3001/chat?name=' + name, { transports: ['websocket'] });
const message = document.getElementById('msg');
const messages = document.getElementById('msg-list');

const handleSend = () =&amp;gt; {
  socket.emit('message', { data: msg.value });
};

socket.on('pub-message', ( data ) =&amp;gt; {
	console.log(data);
  handlePrintMessage(data);
});

handlePrintMessage = (message) =&amp;gt; {
  messages.appendChild(buildMessage(message));
};

const buildMessage = (message) =&amp;gt; {
  const li = document.createElement('li');
  li.appendChild(document.createTextNode(message));
  return li;
};&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;pre id=&quot;code_1675776466880&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  async handleConnection(sock) {
	sock.name = sock.handshake.query.name;
	this.logger.verbose(`${sock.name} is Connected.`);
	this.server.emit('pub-message', `${sock.name} is entered!`);
  }

  async handleDisconnect(sock) {
	this.logger.verbose(`${sock.name} is Disconnected.`);
	this.server.emit('pub-message', `${sock.name} is leaves!`);
  }
  @SubscribeMessage('message')
  handleMessage(@ConnectedSocket() sock,
				@MessageBody() payload: any) {
	this.logger.log(this.handleMessage.name + &quot; &quot; + sock.name + &quot; : &quot; + payload.data);
    this.server.emit('pub-message', `${sock.name} : ${payload.data}`);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스 로직에 대해 간단히 설명하자면&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트와 소켓 커넥션이 생기면 서버 전체에 특정 클라이언트가 들어왔다고 공지&lt;/li&gt;
&lt;li&gt;클라이언트가 특정 데이터를 서버에 보내면 서버에서 전체 사용자들에게 pub&lt;/li&gt;
&lt;li&gt;클라이언트가 연결이 종료되면 전체 서버에 공지&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;p data-ke-size=&quot;size16&quot;&gt;예제 코드를 작성하면서 프론트엔드 프레임워크를 하나 정도 배우고 싶은 생각이 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 서버사이드부터 잘해야 할 텐데 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마도 요건 시리즈물로 두 편 정도 더 나올 것 같습니다. 웹소켓 재밌네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론보다 구체적인 프레임 워크와 코드로 설명하는 비중이 있기에 중급자라고 적었습니다만, 제가 초급자이기 때문에 찐 중급자 분들이 보시기에 미흡한 부분이 넘쳐날 수 있습니다. 틀린 부분이 있다면 지적 부탁드립니다 &amp;zwj;♂️&lt;/p&gt;</description>
      <category>JS</category>
      <category>socket.io</category>
      <category>websocket</category>
      <category>웹소켓</category>
      <category>채팅 서버</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/79</guid>
      <comments>https://youngmon.tistory.com/entry/NestJs-%EC%A4%91%EA%B8%89%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-GatewaySocketio-%EC%84%A4%EB%AA%85%ED%9A%8C#entry79comment</comments>
      <pubDate>Wed, 8 Feb 2023 03:31:24 +0900</pubDate>
    </item>
    <item>
      <title>터꾸) 터미널에 출력되는 사용자 정보 수정하기(터미널 색상 변경)</title>
      <link>https://youngmon.tistory.com/entry/%ED%84%B0%EA%BE%B8-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90-%EC%B6%9C%EB%A0%A5%EB%90%98%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0%ED%84%B0%EB%AF%B8%EB%84%90-%EC%83%89%EC%83%81-%EB%B3%80%EA%B2%BD</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;포스팅을 위해 터미널 입력을 캡처하려는데 제 사용자 이름과 컴퓨터 이름이 아주 거슬리는데요..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-02-05 at 9.38.24 PM.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FtqBj/btrX2Zw9d5J/BembDhDGNyAkdrgaVEsyZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FtqBj/btrX2Zw9d5J/BembDhDGNyAkdrgaVEsyZ0/img.png&quot; data-alt=&quot;터미널 4분할 중 절반 이상을 필요없는 정보가 차지..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FtqBj/btrX2Zw9d5J/BembDhDGNyAkdrgaVEsyZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFtqBj%2FbtrX2Zw9d5J%2FBembDhDGNyAkdrgaVEsyZ0%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; alt=&quot;origin&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;186&quot; data-filename=&quot;Screenshot 2023-02-05 at 9.38.24 PM.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;터미널 4분할 중 절반 이상을 필요없는 정보가 차지..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이도 길이지만 민감하신 분들은 터미널의 사용자 정보를 모자이크 하느라 귀찮음까지 더해질 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 불편함을 해결하기 위해 이 포스팅을 작성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷, 2023-02-06 오전 12.51.28.png&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dar19/btrX3ZciJuv/sTGq5tETeuFIMrkjkAItO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dar19/btrX3ZciJuv/sTGq5tETeuFIMrkjkAItO1/img.png&quot; data-alt=&quot;나도 하기 싫어~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dar19/btrX3ZciJuv/sTGq5tETeuFIMrkjkAItO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDar19%2FbtrX3ZciJuv%2FsTGq5tETeuFIMrkjkAItO1%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; alt=&quot;나도 하기 싫어&quot; loading=&quot;lazy&quot; width=&quot;333&quot; height=&quot;431&quot; data-filename=&quot;스크린샷, 2023-02-06 오전 12.51.28.png&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;1014&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;Screenshot 2023-02-05 at 8.51.02 PM.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSaZ3i/btrX8jndu5z/1r7QIdhGhOJQ2HdLzKhzd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSaZ3i/btrX8jndu5z/1r7QIdhGhOJQ2HdLzKhzd1/img.png&quot; data-alt=&quot;프롬프트 상태 표시 변수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSaZ3i/btrX8jndu5z/1r7QIdhGhOJQ2HdLzKhzd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSaZ3i%2FbtrX8jndu5z%2F1r7QIdhGhOJQ2HdLzKhzd1%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; alt=&quot;PS 변수&quot; loading=&quot;lazy&quot; width=&quot;709&quot; height=&quot;126&quot; data-filename=&quot;Screenshot 2023-02-05 at 8.51.02 PM.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;174&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;사진에 나온 PS는&lt;b&gt; Prompt Statement&lt;/b&gt;의 약자로 프롬프트의 상태를 저장하는 변수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PS1에서는 쉘의 현재 상태를 보여주는 값이 담겨있고, PS2에는 한 줄로 끝나지 않는 멀티라인 커맨드 상태를 나타내는 값이 담겨있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-02-05 at 11.22.19 PM.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LCA8U/btrX32fRIu2/9IQXttOpzphrk11bH8yOzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LCA8U/btrX32fRIu2/9IQXttOpzphrk11bH8yOzk/img.png&quot; data-alt=&quot;PS2의 값과 멀티라인 커맨드 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LCA8U/btrX32fRIu2/9IQXttOpzphrk11bH8yOzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLCA8U%2FbtrX32fRIu2%2F9IQXttOpzphrk11bH8yOzk%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; alt=&quot;PS2 변수&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;104&quot; data-filename=&quot;Screenshot 2023-02-05 at 11.22.19 PM.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PS2의 값과 멀티라인 커맨드 예시&lt;/figcaption&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;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;$PS1 수정&lt;/h3&gt;
&lt;pre id=&quot;code_1675607511251&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export PS1='표시될 문자'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PS1 변수를 수정해 프롬프트에 출력될 PS1 변수를 바꾸어줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-02-05 at 11.34.08 PM.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/msYSm/btrX6iPPaJe/xgWyMXQdMgHGQkMAqKJLlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/msYSm/btrX6iPPaJe/xgWyMXQdMgHGQkMAqKJLlK/img.png&quot; data-alt=&quot;변경 후 프롬프트 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/msYSm/btrX6iPPaJe/xgWyMXQdMgHGQkMAqKJLlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmsYSm%2FbtrX6iPPaJe%2FxgWyMXQdMgHGQkMAqKJLlK%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; alt=&quot;after&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;134&quot; data-filename=&quot;Screenshot 2023-02-05 at 11.34.08 PM.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;138&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;다시 기존 PS1 변수의 값을 보면&lt;/p&gt;
&lt;pre id=&quot;code_1675607789708&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;%n@%m %1~ %#&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%n : 사용자 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%m : 컴퓨터 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%1 : 현재 작업 디렉토리의 마지막 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%# : % 출력을 나타냄을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 환경 변수를 이용해 동적으로 프롬프트를 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;폰트 색 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력되는 폰트의 색을 변경하기 위해서는 Ansi Escape와 컬러 코드를 통해 원하는 색상을 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + v와 [ 로 ^[ 모양이 생겼다면 &lt;span&gt;Ansi-Escape 시퀀스가 시작되는 것이며 이 뒤에 [를 붙여 ^[[ 모양이 생겼다면 뒤의 컬러 코드로 변경됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-02-06 at 12.02.16 AM.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRlHU0/btrYeZIpDOE/N8dbp7Slyja3kpMc7st3mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRlHU0/btrYeZIpDOE/N8dbp7Slyja3kpMc7st3mK/img.png&quot; data-alt=&quot;예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRlHU0/btrYeZIpDOE/N8dbp7Slyja3kpMc7st3mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRlHU0%2FbtrYeZIpDOE%2FN8dbp7Slyja3kpMc7st3mK%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; alt=&quot;예시&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;54&quot; data-filename=&quot;Screenshot 2023-02-06 at 12.02.16 AM.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;54&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;위 예시를 적용한 상태입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-02-05 at 11.58.29 PM.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nAHCA/btrX4ZwdXP7/YGndNRg6fOQPSt0egOmpH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nAHCA/btrX4ZwdXP7/YGndNRg6fOQPSt0egOmpH1/img.png&quot; data-alt=&quot;알록달록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nAHCA/btrX4ZwdXP7/YGndNRg6fOQPSt0egOmpH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnAHCA%2FbtrX4ZwdXP7%2FYGndNRg6fOQPSt0egOmpH1%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; alt=&quot;프롬프트 after&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;50&quot; data-filename=&quot;Screenshot 2023-02-05 at 11.58.29 PM.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;50&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;&lt;span style=&quot;color: #0593d3;&quot;&gt;^[&lt;/span&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;[ &lt;span style=&quot;color: #000000;&quot;&gt;이후로 32, 3, 1과 같은 숫자들이 오고 ;가 구분자가 되며 m으로 시퀀스를 마치는 규칙을 찾으셨나요?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 숫자는 적용될 속성을 나타내며 주요한 속성으로는&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;리셋&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;30 - 37&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;글자 색(어두움)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;볼드, 밝게&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;40 - 47&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;배경 색(어두움)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;희미하게, 어둡게&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;90 - 97&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;글자 색(밝음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;기울임&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;100 - 107&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;배경 색(밝음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;밑줄&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용되었을 때의 모습은 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPuyJl/btrX4jO4SXk/txsheAAc4dqbMkqkh0Izf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPuyJl/btrX4jO4SXk/txsheAAc4dqbMkqkh0Izf1/img.png&quot; data-alt=&quot;적용되는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPuyJl/btrX4jO4SXk/txsheAAc4dqbMkqkh0Izf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPuyJl%2FbtrX4jO4SXk%2FtxsheAAc4dqbMkqkh0Izf1%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; alt=&quot;Color&quot; loading=&quot;lazy&quot; width=&quot;330&quot; height=&quot;174&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적용되는 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; 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;figure id=&quot;og_1675609582747&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;ANSI escape code - Wikipedia&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Method used for display options on video text terminals ANSI escape sequences are a standard for in-band signaling to control cursor location, color, font styling, and other options on video text terminals and terminal&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/ANSI_escape_code&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/ANSI_escape_code&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YGp6S/hyRva409Yd/xY9um8ud2Ex7srkLSOe3y1/img.png?width=720&amp;amp;height=400&amp;amp;face=0_0_720_400,https://scrap.kakaocdn.net/dn/w9xbh/hyRvdHpWyq/JDEPzyKhNVjLgqPLkmwfk0/img.png?width=720&amp;amp;height=400&amp;amp;face=0_0_720_400,https://scrap.kakaocdn.net/dn/b6oUxG/hyRwFI5oGG/qaoPEy596KFyjK2kpoOjmk/img.png?width=640&amp;amp;height=356&amp;amp;face=0_0_640_356&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/ANSI_escape_code&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/ANSI_escape_code&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YGp6S/hyRva409Yd/xY9um8ud2Ex7srkLSOe3y1/img.png?width=720&amp;amp;height=400&amp;amp;face=0_0_720_400,https://scrap.kakaocdn.net/dn/w9xbh/hyRvdHpWyq/JDEPzyKhNVjLgqPLkmwfk0/img.png?width=720&amp;amp;height=400&amp;amp;face=0_0_720_400,https://scrap.kakaocdn.net/dn/b6oUxG/hyRwFI5oGG/qaoPEy596KFyjK2kpoOjmk/img.png?width=640&amp;amp;height=356&amp;amp;face=0_0_640_356');&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;ANSI escape code - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;From Wikipedia, the free encyclopedia Method used for display options on video text terminals ANSI escape sequences are a standard for in-band signaling to control cursor location, color, font styling, and other options on video text terminals and terminal&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;en.wikipedia.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;/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;변수 영구 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 오셨다면 원하는 모양으로 프롬프트를 꾸미셨을 것이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 문제는 아직까지는 임시변수라 껐다키면 다시 원래의 못생긴 모습으로 돌아오게 된다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위에서 만들었던 변수 등록 명령을 쉘이 실행될 때마다 등록해서 영구적으로 적용되도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 zsh을 사용하기 때문에 사용자 HOME 경로의 .zshrc 파일을 사용했지만 bash 등의 다른 쉘을 쓰신다면 .bashrc 또는 /etc/bashrc 로 전역적으로 등록하셔도 무방합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675610676023&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;~/.zshrc &amp;lt;&amp;lt; export PS1=위에서 적었던 포맷&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 명령어를 실행하면 zsh이 실행될 때마다 PS1 변수를 등록하게 됩니다.&lt;/p&gt;
&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_1675610785535&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 실행해 ~/.zshrc의 내용이 적용되도록 해주면 됩니다.&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';&quot;&gt;다들 멋쟁이 터미널을 만들어보아요~&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>정정생보통</category>
      <category>터미널 개인정보</category>
      <category>터미널 색상</category>
      <category>프롬프트 색상</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/78</guid>
      <comments>https://youngmon.tistory.com/entry/%ED%84%B0%EA%BE%B8-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90-%EC%B6%9C%EB%A0%A5%EB%90%98%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EB%B3%B4-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0%ED%84%B0%EB%AF%B8%EB%84%90-%EC%83%89%EC%83%81-%EB%B3%80%EA%B2%BD#entry78comment</comments>
      <pubDate>Mon, 6 Feb 2023 00:54:30 +0900</pubDate>
    </item>
    <item>
      <title>WEB) 초보자를 위한 웹소켓(WebSocket) 설명회</title>
      <link>https://youngmon.tistory.com/entry/WEB-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%9B%B9%EC%86%8C%EC%BC%93WebSocket-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 사용하는 다양한 어플리케이션 중에는 카카오톡이나 공유 문서, 게임처럼 실시간으로 화면이 변경되며 데이터가 수정되는 모델들이 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 웹 어플리케이션들은 어떻게 데이터와 화면을 변경하는 걸까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP의 이해&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버-클라이언트 구조에서 가장 보편적으로 사용되는 프로토콜은 HTTP 프로토콜입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 특징에 대해 알아보기 위해 이전에 작성한 HTTP 관련 글을 읽어보시기 바랍니다.&lt;/p&gt;
&lt;figure id=&quot;og_1675513269440&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;HTTP) 초보자를 위한 HTTP 설명회&quot; data-og-description=&quot;HTTP란 웹 어플리케이션에서 웹 브라우저와 서버 사이의 통신을 위해 만들어진 표준 프로토콜로, 크게 클라이언트의 요청과 서버의 응답으로 이루어진 단방향 통신 방식입니다. HTTP 프로토콜 HTTP&quot; data-og-host=&quot;youngmon.app&quot; data-og-source-url=&quot;https://youngmon.app/entry/HTTP-초보자를-위한-HTTP-설명회&quot; data-og-url=&quot;https://youngmon.app/entry/HTTP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%84%A4%EB%AA%85%ED%9A%8C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dXadzw/hyRvldJ7mM/qTObxdiBxVa7YeoCPytNnk/img.gif?width=216&amp;amp;height=298&amp;amp;face=0_0_216_298,https://scrap.kakaocdn.net/dn/bgBz0E/hyRvjfVwGu/j6WeUaHnERBLUqmWq2I5PK/img.gif?width=216&amp;amp;height=298&amp;amp;face=0_0_216_298,https://scrap.kakaocdn.net/dn/81YSE/hyRvjGYVCl/AzKMaHLTAd7FdpkvEaZKIk/img.jpg?width=1340&amp;amp;height=756&amp;amp;face=0_0_1340_756&quot;&gt;&lt;a href=&quot;https://youngmon.app/entry/HTTP-초보자를-위한-HTTP-설명회&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngmon.app/entry/HTTP-초보자를-위한-HTTP-설명회&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dXadzw/hyRvldJ7mM/qTObxdiBxVa7YeoCPytNnk/img.gif?width=216&amp;amp;height=298&amp;amp;face=0_0_216_298,https://scrap.kakaocdn.net/dn/bgBz0E/hyRvjfVwGu/j6WeUaHnERBLUqmWq2I5PK/img.gif?width=216&amp;amp;height=298&amp;amp;face=0_0_216_298,https://scrap.kakaocdn.net/dn/81YSE/hyRvjGYVCl/AzKMaHLTAd7FdpkvEaZKIk/img.jpg?width=1340&amp;amp;height=756&amp;amp;face=0_0_1340_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;HTTP) 초보자를 위한 HTTP 설명회&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP란 웹 어플리케이션에서 웹 브라우저와 서버 사이의 통신을 위해 만들어진 표준 프로토콜로, 크게 클라이언트의 요청과 서버의 응답으로 이루어진 단방향 통신 방식입니다. HTTP 프로토콜 HTTP&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;youngmon.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글에서 볼 수 있는 것처럼 HTTP에서 클라이언트가 서버의 특정 URI에 대한 요청을 보내면, 서버가 해당 URI의 처리 결과를 클라이언트에게 전달하고 연결을 끊어버리며, 이를 통해 단방향성(오직 클라이언트-&amp;gt;서버로만 요청이 가능)과 비연결성, 무상태성이라는 특징을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트(브라우저)가 화면을 업데이트하기 위해서는 서버에게 새로운 요청을 보내, 새로운 정보를 얻어 다시 화면을 렌더링 하는 과정을 거쳐야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 수강 신청이나 공연 등의 티켓팅을 위해서는 &lt;b&gt;페이지를 새로고침&lt;/b&gt;하다가 남들보다 빠르게 신청해야 합니다. 이는 HTTP 프로토콜의 단방향성 때문이며, 오직 클라이언트가 요청을 해야지 새로운 정보를 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 새로 요청을 하고, 페이지를 응답받아 다시 사용자에게 보여주는 과정을 개선시킨 것이 Ajax라는 클라이언트 기술입니다.&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;간단하게 Ajax 이해하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DKMBB/btrX2YR7V73/25Hkcn7MEulBxmfFeJCiuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DKMBB/btrX2YR7V73/25Hkcn7MEulBxmfFeJCiuK/img.png&quot; data-alt=&quot;아약스X 에이잭스O&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DKMBB/btrX2YR7V73/25Hkcn7MEulBxmfFeJCiuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDKMBB%2FbtrX2YR7V73%2F25Hkcn7MEulBxmfFeJCiuK%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; alt=&quot;Ajax&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;106&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아약스X 에이잭스O&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심부터 말하자면 Ajax는 웹 페이지를 부분적으로 업데이트하기 위한 &lt;b&gt;비동기 HTTP 통신 기술&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;Javascript는 원래 브라우저의 HTML 코드를 조작하기 위해 사용되던 스크립트 언어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript를 사용해 페이지의 일부만 수정(DOM)할 수 있으며,&amp;nbsp;자바스크립트의 XHR(XmlHttpRequest)라는 객체를 통해 비동기적으로 데이터를 보내고 검색할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 자바스크립트와 XHR을 통해 페이지 이동 없이 페이지의 일부를 &lt;b&gt;동적으로 업데이트&lt;/b&gt;하는 클라이언트 기술을 Ajax(Asynchronous Javascript And Xml)이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ajax를 통해 일부만 수정하는 식으로 요청을 보다 쉽고 가볍게 만들 수 있으나, Ajax로 ❗️&lt;b&gt;실시간성❗️&lt;/b&gt;을 구현할 때 클라이언트는 일정 주기로 서버에 요청을 보내고 데이터를 받아오는 폴링 방식을 사용하기 때문에 서버에 가해지는 부하가 엄청나게 커집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오톡으로 예를 들자면 1000명이 참여한 오픈 채팅방에서 모든 클라이언트가 1초에 3번씩 요청을 보낸다고 가정하면 서버에서는 1초에 3000개의 [ 연결 생성 -&amp;gt; 요청 처리 -&amp;gt; 연결 제거]의 과정을 거칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 한계 때문에 HTML5에서 WebSocket이라는 새로운 프로토콜이 도입됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;WebSocket 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebSocket은 보안 여부에 따라 ws 또는 wss로 표현됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOioA1/btrX2Y5EcCB/PRw4h5KIj0rlkd0hv9mjY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOioA1/btrX2Y5EcCB/PRw4h5KIj0rlkd0hv9mjY1/img.jpg&quot; data-alt=&quot;각이 많고 강해보이는 공대 공학적 디자인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOioA1/btrX2Y5EcCB/PRw4h5KIj0rlkd0hv9mjY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOioA1%2FbtrX2Y5EcCB%2FPRw4h5KIj0rlkd0hv9mjY1%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; alt=&quot;WebSocket&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;213&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;400&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;Ajax의 한계는 클라이언트가 요청을 하기 전까지는 서버가 클라이언트에게 데이터를 전송할 수 없다는 &lt;b&gt;단방향성➡️&lt;/b&gt;에 기인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 서버의 요청-응답 계층으로 제한된 기존 HTTP 방식과 달리 웹소켓은 커넥션을 유지하며 양방향 통신을 통해 요청이 없어도 서버에서 클라이언트에게 데이터를 전송할 수 있게 해 서버의 부하를 늘리지 않으면서 실시간성을 구현할 수 있게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹소켓 프로토콜은 HTTP 프로토콜과 마찬가지로 TCP 프로토콜을 사용해 호환성을 높였는데, 웹소켓 프로토콜을 통해 연결되는 과정은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트는 웹소켓으로 서버와 연결하기 위해 &lt;b&gt;Upgrade 헤더&lt;/b&gt;를 포함한 HTTP 요청&lt;/li&gt;
&lt;li&gt;이후 서버가 Upgrade 헤더를 확인하고, 웹소켓 프로토콜을 사용해 연결을 유지&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP에서 요청-응답 이후 연결이 닫힌 것과 달리 웹소켓 프로토콜에서는 Upgrade를 통한 핸드셰이크 과정 이후 클라이언트 또는 서버가 연결을 닫을 때까지 연결을 유지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹소켓 프로토콜은 실시간성이 필요한 상황에서 커넥션 수립에 드는 오버헤드의 감소나 양방향으로 통신이 가능하다는 측면에서 장점을 갖지만, 구현이 복잡하고 HTTP와 반대로 Stateful 한 연결이 이루어지기 때문에 접속 트래픽이 많은 경우 커넥션 유지에 메모리가 많이 필요하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 HTML5에 도입된 기술인 만큼 이전 버전의 브라우저에서 지원하지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(⚠️사실 웹소켓이 표준화된 지는 10년이 넘습니다..)&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;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;figure id=&quot;og_1675531829068&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Web Sockets | Can I use... Support tables for HTML5, CSS3, etc&quot; data-og-description=&quot;Reported to be supported in some Android 4.x browsers, including Sony Xperia S, Sony TX and HTC.&quot; data-og-host=&quot;caniuse.com&quot; data-og-source-url=&quot;https://caniuse.com/websockets&quot; data-og-url=&quot;https://caniuse.com/websockets&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://caniuse.com/websockets&quot; data-source-url=&quot;https://caniuse.com/websockets&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&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 Sockets | Can I use... Support tables for HTML5, CSS3, etc&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Reported to be supported in some Android 4.x browsers, including Sony Xperia S, Sony TX and HTC.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;caniuse.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;2022년 10월 기준 약 2.3퍼센트의 사용자가 웹소켓을 지원하지 않는 브라우저를 사용하고 있습니다.(이마 탁)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 호환 문제를 해결하기 위해 Socket.io라는 라이브러리를 사용하는 것을 생각할 수 있는데, WebSocket을 기반으로 구현된 Socket.io는 기본적으로 웹소켓 프로토콜로 통신, 웹소켓을 사용할 수 없을 때 자동 재연결, 대기 시간 최적화, 다른 통신 방법을 사용해 다양한 브라우저와 네트워크 조건에 대해 호환될 수 있도록 합니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>ajax</category>
      <category>http</category>
      <category>websocket</category>
      <category>비동기 통신</category>
      <category>웹소켓</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/77</guid>
      <comments>https://youngmon.tistory.com/entry/WEB-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%9B%B9%EC%86%8C%EC%BC%93WebSocket-%EC%84%A4%EB%AA%85%ED%9A%8C#entry77comment</comments>
      <pubDate>Sun, 5 Feb 2023 02:50:13 +0900</pubDate>
    </item>
    <item>
      <title>HTTP) 초보자를 위한 HTTP 설명회</title>
      <link>https://youngmon.tistory.com/entry/HTTP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP란 웹 어플리케이션에서 웹 브라우저와 서버 사이의 통신을 위해 만들어진 표준 프로토콜로, 크게 클라이언트의 요청과 서버의 응답으로 이루어진 &lt;b&gt;단방향 통신&lt;/b&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;HTTP 프로토콜&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 프로토콜은 클라이언트(주로 웹 브라우저)가 리소스의 위치(URI)를 통해 서버의 리소스에 접근해 Get, Post 등의 메소드로 약속된 동작을 요청합니다. 요청을 받은 서버는 요청된 리소스 또는 동작의 결과를 반환합니다.&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;HTTP의 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 프로토콜이 웹에서 왜 사용되는지를 알기 위해서는 HTTP 프로토콜의 특징을 이해할 필요가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말씀드린 것처럼 HTTP는 요청-응답 모델을 통해 클라이언트와 서버의 &lt;b&gt;책임을 분리&lt;/b&gt;함으로써, 계층화된 구조를 통해 클라이언트와 서버의 권한과 역할을 명확하게 구분할 수 있습니다. 또한 URI, 헤더, 메서드(RESTful), Json 등 여러 기능을 통해 웹 어플리케이션이 보다 &lt;b&gt;쉽게 확장&lt;/b&gt;되고, 변화할 수 있게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특징을 객체지향 패러다임에서 다루는 단일 책임, 개방 폐쇄 원칙 등과 연결지어 생각한다면 웹 어플리케이션을 객체지향적으로 설계하고 개발할 수 있게 돕는다고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 또 다른 특징인 무상태성(Stateless)은 HTTP 통신이 이루어지는 방식을 통해 이해할 수 있습니다.&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;HTTP vs 소켓 통신 (?)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP는 기본적으로 TCP/IP 4계층 모델에서 Application 계층에 속합니다. 따라서 HTTP 프로토콜로 통신하기 위해 클라이언트와 서버는 하위 계층인 전송계층에서 TCP 프로토콜, 즉 소켓으로 연결됩니다. (HTTP/3.0 X)&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-origin-width=&quot;216&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zvfxU/btrX31GWZSJ/O7dzlHZkucpkugNV7d8530/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zvfxU/btrX31GWZSJ/O7dzlHZkucpkugNV7d8530/img.gif&quot; data-alt=&quot;TCP/IP 4 Layers&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zvfxU/btrX31GWZSJ/O7dzlHZkucpkugNV7d8530/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/zvfxU/btrX31GWZSJ/O7dzlHZkucpkugNV7d8530/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; alt=&quot;TCP/IP 4 Layers&quot; loading=&quot;lazy&quot; width=&quot;216&quot; height=&quot;298&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TCP/IP 4 Layers&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;TCP 소켓을 통한 통신에서 두 컴퓨터는 IP와 포트를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;커넥션을 유지&lt;/b&gt;&lt;span&gt;하며&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;양방향&lt;/b&gt;으로 데이터를 주고받기 때문에 HTTP 통신과 소켓 통신을 다른 방식이라고 생각하기도 하지만, &lt;b&gt;HTTP&lt;/b&gt;는 &lt;b&gt;TCP 소켓&lt;/b&gt;으로&lt;b&gt; 연결&lt;/b&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;IMG_0679.jpg&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m6PME/btrX1y0FdiQ/ozIV55f5RTY3VkxVEbdZRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m6PME/btrX1y0FdiQ/ozIV55f5RTY3VkxVEbdZRK/img.jpg&quot; data-alt=&quot;클라이언트가 서버에게 연결 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m6PME/btrX1y0FdiQ/ozIV55f5RTY3VkxVEbdZRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm6PME%2FbtrX1y0FdiQ%2FozIV55f5RTY3VkxVEbdZRK%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; alt=&quot;Connect&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;244&quot; data-filename=&quot;IMG_0679.jpg&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;756&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;위와 같이 서버가 80번 포트를 통해 연결 수립 요청을 기다리고 있으면, 클라이언트에서 해당 포트에 연결 요청을 합니다.&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_0680.jpg&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjt7lR/btrX19lM3fk/H0BvAeGDKnSw7Keia7IclK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjt7lR/btrX19lM3fk/H0BvAeGDKnSw7Keia7IclK/img.jpg&quot; data-alt=&quot;서버에서 새로운 소켓 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjt7lR/btrX19lM3fk/H0BvAeGDKnSw7Keia7IclK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjt7lR%2FbtrX19lM3fk%2FH0BvAeGDKnSw7Keia7IclK%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; alt=&quot;accept&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;212&quot; data-filename=&quot;IMG_0680.jpg&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;674&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;서버는 요청을 받아 클라이언트와 데이터를 주고받기 위한 새로운 소켓을 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0681.jpg&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFbOuC/btrX6hCljM4/i5HmJdkKeA7vT7KVbz5wn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFbOuC/btrX6hCljM4/i5HmJdkKeA7vT7KVbz5wn0/img.jpg&quot; data-alt=&quot;서버는 여전히 80번 포트로 요청을 받으며 클라이언트와 연결됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFbOuC/btrX6hCljM4/i5HmJdkKeA7vT7KVbz5wn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFbOuC%2FbtrX6hCljM4%2Fi5HmJdkKeA7vT7KVbz5wn0%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; alt=&quot;상호 연결&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;234&quot; data-filename=&quot;IMG_0681.jpg&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버는 여전히 80번 포트로 요청을 받으며 클라이언트와 연결됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;0.0.0.1:12345와 0.0.0.3:9001&lt;/span&gt;&lt;/b&gt;이 연결되었고, &lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;0.0.0.2:54321과 0.0.0.3:9002&lt;/span&gt;&lt;/b&gt;가 연결되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지는 소켓을 통해 연결되는 방식과 같으며, 소켓통신에서는 이러한 연결을 유지하며 서로 지속적으로 데이터를 주고받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 HTTP 통신에서는 해당 커넥션을 통해 클라이언트가 하나의 요청을 보내고, 서버에서 이에 응답을 완료하면 연결을 끊어버립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 맺어진 인연이라 쉽게 끊어낸 걸까요? 같은 클라이언트에게 또다시 요청이 와도 서버는 알아차리지 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번의 요청에 하나의 연결이 생성되고 끊어지는 이러한 특징을 Connectionless, 비연결성이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비연결성으로 인해 이전에 보냈던 요청에 대한 어떤 정보도 저장되지 않으며, 무상태성이라는 특징이 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번거롭게 매 요청마다 커넥션을 만들었다가 없애는 이유는 뭘까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connection 자체가 메모리를 점유하는 자원이기 때문입니다. 웹 서버의 특성상, 불특정 다수의 요청에 응답을 할 필요가 있는데 이 과정에서 모든 클라이언트와 커넥션을 유지하고 있는다면 다수의 사용자에게 응답을 해줄 수가 없습니다. 또한 비연결성으로 인해 생기는 무상태성을 통해 어플리케이션을 확장성 높게 설계할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 갑자기 사용자의 요청이 늘어나서 서버를 한대 더 추가해야 하는 상황이 생겼을 때, 완벽히 Stateless 한 서버라면 기존 서버와 새로 추가된 서버 중 어떤 곳에 요청을 보내더라도 동일한 동작을 보장받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹서버의 특성을 통해 HTTP 프로토콜이 사용되는 이유를 이해해 보는 시간이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;근황올림픽&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 프로토콜은 문서화도 잘 되어있고 커뮤니티가 활성화되어 있어 빠르게 발전하고, 다양한 용도로 사용됩니다. 최근 HTTP/3.0에 따르면 심지어 TCP가 아닌 UDP 기반(QUIC)에서 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커넥션을 새로 만들고 제거하는 과정에서의 오버헤드와, 완전 무상태로 설계된 어플리케이션의 사용자 정보의 필요성(로그인) 등의 이유로 인해, 현재는 Keep-Alive라는 필드를 통해 바로 연결을 끊어버리지 않고 일정 시간 동안 커넥션을 유지시키거나, Set-Cookie 등의 헤더를 사용하는 등 시대가 변하며 HTTP도 조금씩 보완하며 변화해 왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 HTTP/3.0 시대에서 새로운 버전인 HTTP/3.0의 점유율이 얼마나 빠르게 늘어날지, 어떤 변화가 생길지 궁금해집니다.&lt;/p&gt;</description>
      <category>WEB</category>
      <category>http</category>
      <category>iP</category>
      <category>osi</category>
      <category>tcp</category>
      <category>네트워크</category>
      <category>프로토콜</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/76</guid>
      <comments>https://youngmon.tistory.com/entry/HTTP-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%84%A4%EB%AA%85%ED%9A%8C#entry76comment</comments>
      <pubDate>Sat, 4 Feb 2023 05:02:53 +0900</pubDate>
    </item>
    <item>
      <title>DB) 초보자를 위한 ORM 설명회, Object-Relational Mapper</title>
      <link>https://youngmon.tistory.com/entry/DB-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-ORM-%EC%84%A4%EB%AA%85%ED%9A%8C-Object-Relational-Mapper</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ORM은 관계형 데이터베이스 시스템(RDBMS)과 객체 지향 프로그래밍 언어 사이에서 데이터를 변환하는 기술로, &lt;b&gt;DB 접근&lt;/b&gt;과 저장, 검색, 수정, 삭제 등의 &lt;b&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;대표적인 ORM 프레임워크로는 SqlAlchemy, JPA, Hibernate, Sequelize, TypeORM 등이 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ORM의 역할&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brr1no/btrXUWzXigC/YzRrFdMevDGtDJxce0I9q0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brr1no/btrXUWzXigC/YzRrFdMevDGtDJxce0I9q0/img.jpg&quot; data-alt=&quot;ORM Layer&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brr1no/btrXUWzXigC/YzRrFdMevDGtDJxce0I9q0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrr1no%2FbtrXUWzXigC%2FYzRrFdMevDGtDJxce0I9q0%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; alt=&quot;ORM&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;305&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ORM Layer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM은 관계형 데이터베이스 시스템의 접근, 조작을 &lt;b&gt;API로 제공&lt;/b&gt;, 어플리케이션에서 특정 프로그래밍 언어로 접근 가능하게 한다는 측면에서 DAO 설계 패턴을 구현한다고 볼 수 있습니다.&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;ORM 프로세스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM이 데이터 베이스에서 객체를 사용하기 위해 이루어지는 과정은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;CRUD 작업 실행 : 매핑이 정의되면 ORM은 객체를 통해 DB의 테이블에서 CRUD 작업을 수행할 수 있는 SQL 쿼리를 생성하고 데이터베이스에서 실행합니다.&lt;/li&gt;
&lt;li&gt;객체 캐싱 : 불러온 객체는 캐시되어 다음 필요시 바로 사용할 수 있도록 합니다. 이는 매번 데이터 베이스에 접근하지 않고도 객체를 사용할 수 있게 합니다.&lt;/li&gt;
&lt;/ol&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;Screenshot 2023-02-03 at 1.06.02 AM.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxvJj/btrXWxzf1TR/rQgF4CRCnYq9u7nGl7nogk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxvJj/btrXWxzf1TR/rQgF4CRCnYq9u7nGl7nogk/img.png&quot; data-alt=&quot;테이블보다는 트리에 가까운 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxvJj/btrXWxzf1TR/rQgF4CRCnYq9u7nGl7nogk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxvJj%2FbtrXWxzf1TR%2FrQgF4CRCnYq9u7nGl7nogk%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; alt=&quot;객체 트리&quot; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;213&quot; data-filename=&quot;Screenshot 2023-02-03 at 1.06.02 AM.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테이블보다는 트리에 가까운 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1675358403663&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;user&quot;: {
  &quot;id&quot;: 1,
  &quot;name&quot;: &quot;hi&quot;,
  &quot;age&quot; : 12,
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;직렬화를 거쳐 json으로 표현된 모습&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 71.6279%; height: 61px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignCenter&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;id&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;name&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;age&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;hi&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;테이블로 표현한 모습&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 객체지향 프로그래밍 언어와 관계형 데이터 베이스 간의 구조/기능적 차이로 생기는&lt;b&gt;&lt;/b&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;b&gt;Granularity(세분화)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Inheritance(상속)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Identity(일치)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Associations(연관성)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Data navigation(데이터 탐색, 조회)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같은 Impedance Mismatch, 객체-관계 패러다임 불일치 문제를 매핑을 통해 해결&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;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ORM의 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기한 것처럼 ORM은 데이터 베이스의 조작을 고수준의 API로 추상화시켜 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 ORM은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 베이스와의 의존성을 낮추고 코드의 재사용을 통해 높은 품질의 코드를 짤 수 있게 하며,&lt;/li&gt;
&lt;li&gt;테이블 구조(스키마) 변경에 따른 불일치 문제를 해결,&lt;/li&gt;
&lt;li&gt;자동으로 데이터의 유형, 크기 등의 제약 조건을 검증하여 개발자가 개발에 집중할 수 있게 합니다.&lt;/li&gt;
&lt;li&gt;또한 저수준의 DB 코드 양을 줄여 유지 보수를 쉽게 해 주고,&amp;nbsp;&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;다만 ORM의 사용으로 생길 수 있는 단점 역시 성능의 하락입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;효율적으로 원시 SQL 쿼리를 작성했을 경우 ORM보다 빠르며,&lt;/li&gt;
&lt;li&gt;DTO(Data Transfer Object) 객체와 Entity 사이의 변환 과정 사이의 오버헤드,&lt;/li&gt;
&lt;li&gt;추상화된 API를 통해 DB를 조작하므로 데이터베이스에 대한 제어력이 떨어질 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ORM을 대체할 방안&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 설명한 장, 단점 간의 트레이드오프로 보다 적절한 기술이 존재할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;원시 SQL : 추상화 없이 데이터 베이스에 직접 쿼리를 날려 상호작용합니다.&lt;/li&gt;
&lt;li&gt;데이터 매퍼 : ORM의 변형으로 개체와 테이블 간의 매핑을 보다 유연하게 제어 가능&lt;/li&gt;
&lt;li&gt;마이크로 ORM : 최소한의 저수준 API를 제공하는 경량 ORM으로 기존 ORM의 오버헤드를 줄입니다.&lt;/li&gt;
&lt;li&gt;NoSQL : 관계형 데이터 베이스가 아닌 다른 모델을 사용하며, 보다 유연하거나 확장성이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB</category>
      <category>Django</category>
      <category>Hibernate</category>
      <category>JPA</category>
      <category>ORM</category>
      <category>typeorm</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/75</guid>
      <comments>https://youngmon.tistory.com/entry/DB-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-ORM-%EC%84%A4%EB%AA%85%ED%9A%8C-Object-Relational-Mapper#entry75comment</comments>
      <pubDate>Fri, 3 Feb 2023 02:54:30 +0900</pubDate>
    </item>
    <item>
      <title>Node.Js란?</title>
      <link>https://youngmon.tistory.com/entry/NodeJs%EC%9D%B4%EB%9E%80</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Node.js.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjv05D/btrWQYFFOlG/jB7s065jFZrSvKubbKbZz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjv05D/btrWQYFFOlG/jB7s065jFZrSvKubbKbZz1/img.png&quot; data-alt=&quot;노트북 스티커를 노린 로고 디자인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjv05D/btrWQYFFOlG/jB7s065jFZrSvKubbKbZz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjv05D%2FbtrWQYFFOlG%2FjB7s065jFZrSvKubbKbZz1%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; alt=&quot;노드 js&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;263&quot; data-filename=&quot;Node.js.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노트북 스티커를 노린 로고 디자인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size23&quot;&gt;Node.Js란&lt;/h2&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 HTML 코드를 조작하기 위해 사용되던 기존의 Javascript를 독립적으로 사용하기 위한 &lt;b&gt;자바스크립트 런타임 환경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm이라는 패키지 매니저를 통해 다양한 모듈을 사용할 수 있어 어플리케이션의 확장성이 높으며, 구글의 자바스크립트 엔진인&lt;b&gt; V8&lt;/b&gt;과 &lt;b&gt;libuv&lt;/b&gt;를 통해 빠른 처리 속도를 지닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Non-Blocking I/O와 싱글 스레드 기반의 이벤트 루프로 동작한다는 점이 특징입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 코어 라이브러리는 Node를 통해 C, C++ 구현체인 V8, Libuv와 연결됩니다.&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;V8 엔진&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dePYo9/btrWUcvJoPp/5aGvJ84ZMTqBxDmVHGSPzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dePYo9/btrWUcvJoPp/5aGvJ84ZMTqBxDmVHGSPzK/img.png&quot; data-alt=&quot;오픈소스 자바 스크립트 엔진, V8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dePYo9/btrWUcvJoPp/5aGvJ84ZMTqBxDmVHGSPzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdePYo9%2FbtrWUcvJoPp%2F5aGvJ84ZMTqBxDmVHGSPzK%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; alt=&quot;V8&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오픈소스 자바 스크립트 엔진, V8&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름부터 8기통인 만큼 빠른 속도를 위해 만들어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;구글에서 개발한 자바스크립트 엔진으로, 크롬에 탑재되어 있는 자바 스크립트 엔진으로 이그니션과 터보팬이라는 두 가지 핵심 컴포넌트를 통해 성능을 끌어올립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;가볍게 설명하자면 Ignition은 매 라인을 런타임에 바이트 코드로 컴파일해 파싱과 최적화에 드는 시간을 줄입니다. 이렇게 매 줄 바이트 코드를 실행하며 터보팬에서는 히든 클래스와 캐싱을 통해 객체를 효율적으로 관리하고 반복되는 코드를 최적화해 실행 속도를 향상시킵니다.&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;Libuv&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;libuv는 이벤트 루프와 Non-Blocking I/O, 스레드 풀, 파일 시스템, 시스템 작업 등 OS의 자원을 이용하기 위해 사용되는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;운영체제의 Low-Level을 추상화시켜 Async, NonBlock I/O, 이벤트 루프 등 노드의 특징을 유지하면서 크로스 플랫폼을 구현할 수 있습니다.&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;Node.JS 성능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;싱글 스레드로 동작하는 Node.js가 고성능이라는 주장은 이해하기 어려울 수 있는데, 멀티 프로세스, 멀티 스레드를 통해 병렬적으로 여러 컨텍스트를 실행하는 이유가 고성능의 연산 작업을 위함이기 때문에 모순이라고 생각할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;실제로 단일 작업이 복잡한 연산을 처리하는 상황이 많다면 다른 방법들에 비해 성능이 떨어질 수 있습니다. 다만 실제 대부분의 서버는 네트워킹, I/O 작업에서 대부분의 시간을 사용하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Node.js가 성능을 향상시키는 방법은&amp;nbsp;&lt;b&gt;단일 스레드 이벤트 루프&lt;/b&gt; 방식, 즉 &lt;b&gt;시분할 스케줄링&lt;/b&gt;으로 컨텍스트 스위칭에 드는 비용을 줄이고 I/O와 네트워킹은 OS에게, 비동기 작업이나, DB 같은 특정 I/O 작업은 libuv의 스레드 풀의 워커 노드들에게 넘기고 하나의 스택에서 가벼운 연산들을 빠르게 처리하여 성능을 향상시킵니다. 이러한 방식은 하나의 커넥션마다 하나의 프로세스, 스레드를 생성하는 멀티 프로세싱, 멀티 스레딩 방식보다 효율적일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이를 이벤트 멀티플렉싱이라고 하는데, libuv의 이벤트 루프는 폴링을 통해 이벤트를 감지하고, 메인 스레드의 콜 스택이 비어있을 경우 이벤트를 실행합니다. 실제 백엔드 서버에서 사용되는 연산은 보통 복잡하고 오래 걸리지 않으므로, 이러한 특정 상황에 한정해 Node.js가 더 빠를 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;특히 비 선점형 스케쥴링 (Non Preemptive Scheduling) 방식을 사용하는 Node.js의 이벤트 루프는 단일 Request가 스레드를 독점하고 많은 연산을 사용한다면 전체적인 성능이 떨어질 수 있으며, 에러가 생길 경우 프로세스가 쉽게 종료될 수 있다는 단점도 존재합니다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;서로 다른 여러 클라이언트의 요청에 응답하는 작업처럼 비동기적으로 처리할 수 있는 여러 작업을 처리하기 위한 용도의 서버라면 Node.js가 적합하나, 한계도 분명히 있기 때문에 목적과 대안 등을 비교해 보면 좋을 것 같습니다.&lt;/p&gt;</description>
      <category>JS</category>
      <category>Express</category>
      <category>JavaScript</category>
      <category>libuv</category>
      <category>nest.js</category>
      <category>Node.js</category>
      <category>React</category>
      <category>V8</category>
      <category>싱글 스레드</category>
      <category>이벤트 루프</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/67</guid>
      <comments>https://youngmon.tistory.com/entry/NodeJs%EC%9D%B4%EB%9E%80#entry67comment</comments>
      <pubDate>Wed, 1 Feb 2023 01:34:43 +0900</pubDate>
    </item>
    <item>
      <title>구글 애드센스) 애드센스 승인 후기 (12시간 차 수익)</title>
      <link>https://youngmon.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%8A%B9%EC%9D%B8-%ED%9B%84%EA%B8%B0-12%EC%8B%9C%EA%B0%84-%EC%B0%A8-%EC%88%98%EC%9D%B5</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;컨텐츠 수익을 높이기 위해서는 타사 대비 광고 단가가 높은 &lt;b&gt;애드센스&lt;/b&gt; 배너를 노출시키는 편이 좋습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또한 승인이 까다로운 만큼, 금전적인 부분을 제외하더라도 양질의 컨텐츠임이 인증되는 것인데요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;글을 보시는 분들도 도움이 될 수 있도록, 애드센스 승인 과정을 간략하게나마 공유해 봅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-31 at 3.56.01 PM.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;1236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS6VAf/btrXH9y873T/763xbnewOGPnAOFjo9IoT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS6VAf/btrXH9y873T/763xbnewOGPnAOFjo9IoT0/img.png&quot; data-alt=&quot;짝짝쓰~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS6VAf/btrXH9y873T/763xbnewOGPnAOFjo9IoT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS6VAf%2FbtrXH9y873T%2F763xbnewOGPnAOFjo9IoT0%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; alt=&quot;애드센스 계정이 활성화되었습니다.&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;504&quot; data-filename=&quot;Screenshot 2023-01-31 at 3.56.01 PM.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;1236&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;짝짝쓰~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 블로그 자체를 개설한 지는 오래되었지만, 아무도 안 본다고 생각해 공부한 내용을 적어놓는 메모장처럼 썼습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;약 1년 반 사이에 &lt;b&gt;42개&lt;/b&gt;&lt;span&gt;의 공개 게시물과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;전체 방문자 7,500명&lt;/b&gt;이 되었고 최근에는 하루 약 100명 정도가 방문했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;작년에 샀던 도메인이 아까워서 블로그에&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt;2차 도메인 설정&lt;/b&gt;,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;다음 날부터 유입이 반토막 나서 복구하느라 애드센스 신청은 약 1주일 전쯤에 했습니다..ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단, 2차 도메인 설정하는 순간 &lt;b&gt;과거의 글&lt;/b&gt;과 &lt;b&gt;미래의 글&lt;/b&gt;은 평행 우주로 갈라집니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;검색엔진이 기존 블로그의 글을 인덱싱 했는데, 같은 내용의 글이 다른 도메인에서 발행되었다면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;두 포스트는 중복 게시물이 되며 낮은 최적화 점수를 받게 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;저의 경우는 여러 사이트의 웹 마스터 도구를 돌아다니며 기존 주소의 게시물을 보이지 않게 하고,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;새로운 도메인에서 &lt;b&gt;다시 수집&lt;/b&gt;이 이루어지도록 했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 과정이 한 2주 걸린 거 같네요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;찾아보니까 승인받는 노하우에 글자수라던가 포스팅 주기 쓰여있던데,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자주는 못 썼는데 대충 보면 1,000자는 넘긴 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내용 검토하느라 임시저장에 여러 개 쌓아놓고 시간 날 때마다 조금씩 고치고 하다 보니까 양이 늘어난 것 같아요&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;SEO 최적화 과정에서 HTML 공부도 좀 하고 좋았습니다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-31 at 11.37.35 PM.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWqg98/btrXGTX74mi/5kfHrMBjHHDwOVw41CzPR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWqg98/btrXGTX74mi/5kfHrMBjHHDwOVw41CzPR0/img.png&quot; data-alt=&quot;반나절 수입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWqg98/btrXGTX74mi/5kfHrMBjHHDwOVw41CzPR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWqg98%2FbtrXGTX74mi%2F5kfHrMBjHHDwOVw41CzPR0%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; alt=&quot;예상 수입&quot; loading=&quot;lazy&quot; width=&quot;1194&quot; height=&quot;215&quot; data-filename=&quot;Screenshot 2023-01-31 at 11.37.35 PM.png&quot; data-origin-width=&quot;1194&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;애드핏 1년 넘게 모인 수익을 하루 만에 제칩니다. 확실히 광고 단가가 굉장히 높긴 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용돈으로 쓰기에는 충분한 것 같네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애드센스도 그렇고 요즘 쓴 글이 유입이 잘 되어서 글 맛이 좋은데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-31 at 11.36.39 PM.png&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QaLlN/btrXJ26QUmT/pMmUUTmBOE7RfmUhz6wGVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QaLlN/btrXJ26QUmT/pMmUUTmBOE7RfmUhz6wGVk/img.png&quot; data-alt=&quot;SNS 유입은 없었는데?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QaLlN/btrXJ26QUmT/pMmUUTmBOE7RfmUhz6wGVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQaLlN%2FbtrXJ26QUmT%2FpMmUUTmBOE7RfmUhz6wGVk%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; alt=&quot;카카오톡 유입&quot; loading=&quot;lazy&quot; width=&quot;175&quot; height=&quot;195&quot; data-filename=&quot;Screenshot 2023-01-31 at 11.36.39 PM.png&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SNS 유입은 없었는데?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;IMG_5623.jpg&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;1437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4owi/btrXH8NMbQC/dXPToEIhlz9PgUgPKKHSa1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4owi/btrXH8NMbQC/dXPToEIhlz9PgUgPKKHSa1/img.jpg&quot; data-alt=&quot;와 1등〰️&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4owi/btrXH8NMbQC/dXPToEIhlz9PgUgPKKHSa1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4owi%2FbtrXH8NMbQC%2FdXPToEIhlz9PgUgPKKHSa1%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; alt=&quot;도커&quot; loading=&quot;lazy&quot; width=&quot;248&quot; height=&quot;1437&quot; data-filename=&quot;IMG_5623.jpg&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;1437&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;와 1등〰️&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5624.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tcnHc/btrXIQsjouW/pKASMHs5H62cguRLthV8Dk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tcnHc/btrXIQsjouW/pKASMHs5H62cguRLthV8Dk/img.jpg&quot; data-alt=&quot;애플뮤직, 스포티파이, 유튜브뮤직&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tcnHc/btrXIQsjouW/pKASMHs5H62cguRLthV8Dk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtcnHc%2FbtrXIQsjouW%2FpKASMHs5H62cguRLthV8Dk%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; alt=&quot;뮤직뮤직&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;1476&quot; data-filename=&quot;IMG_5624.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애플뮤직, 스포티파이, 유튜브뮤직&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;style2&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5120193281050678&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;꿀단지 뭐임~ 개꿀이잖슴~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오신 김에 광고 좀 구경해 주신다면 더 좋은 컨텐츠를 제공할 수 있을 것 같습니다.. 후후&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>Adsense</category>
      <category>광고 게재</category>
      <category>배너 광고</category>
      <category>애드센스</category>
      <category>애드센스 승인</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/74</guid>
      <comments>https://youngmon.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%8A%B9%EC%9D%B8-%ED%9B%84%EA%B8%B0-12%EC%8B%9C%EA%B0%84-%EC%B0%A8-%EC%88%98%EC%9D%B5#entry74comment</comments>
      <pubDate>Wed, 1 Feb 2023 00:56:06 +0900</pubDate>
    </item>
    <item>
      <title>구글 애드센스) ads.txt 파일 문제 해결하기</title>
      <link>https://youngmon.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-adstxt-%ED%8C%8C%EC%9D%BC-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;애드센스 광고 검토 완료 후, 애드센스 대시보드에 들어가니 아래와 같은 창이 떠 있었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;애드센스가 시키는 대로 해결한 후기 올려드립니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-31 at 4.09.15 PM.png&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8NyzU/btrXHHWE3zI/1oKhYdNIc6e4bIkVM4HrOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8NyzU/btrXHHWE3zI/1oKhYdNIc6e4bIkVM4HrOK/img.png&quot; data-alt=&quot;무손실&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8NyzU/btrXHHWE3zI/1oKhYdNIc6e4bIkVM4HrOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8NyzU%2FbtrXHHWE3zI%2F1oKhYdNIc6e4bIkVM4HrOK%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; alt=&quot;수익 손실 위험&quot; loading=&quot;lazy&quot; width=&quot;1970&quot; height=&quot;102&quot; data-filename=&quot;Screenshot 2023-01-31 at 4.09.15 PM.png&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;102&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;1. 지금 해결하기를 누르면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-31 at 3.48.55 PM.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B5H1e/btrXHBCdNCj/vfkMkKfG4uStbpXBVJDimK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B5H1e/btrXHBCdNCj/vfkMkKfG4uStbpXBVJDimK/img.png&quot; data-alt=&quot;ads.txt를 루트 수준 도메인에 업로드하시오&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B5H1e/btrXHBCdNCj/vfkMkKfG4uStbpXBVJDimK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB5H1e%2FbtrXHBCdNCj%2FvfkMkKfG4uStbpXBVJDimK%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; alt=&quot;ads.txt 만들기&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;208&quot; data-filename=&quot;Screenshot 2023-01-31 at 3.48.55 PM.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ads.txt를 루트 수준 도메인에 업로드하시오&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 다운로드 버튼을 눌러 ads.txt를 내려받습니다.&lt;/p&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. 블로그 관리의 스킨 편집 -&amp;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;edited_Screenshot 2023-01-31 at 3.51.12 PM.png&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PR1c8/btrXIoa3QlI/veVKhtayrherwEvsJAKNsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PR1c8/btrXIoa3QlI/veVKhtayrherwEvsJAKNsK/img.png&quot; data-alt=&quot;images/ads.txt? 그럼 그렇지 ㅠ~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PR1c8/btrXIoa3QlI/veVKhtayrherwEvsJAKNsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPR1c8%2FbtrXIoa3QlI%2FveVKhtayrherwEvsJAKNsK%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; alt=&quot;파일 업로드&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;363&quot; data-filename=&quot;edited_Screenshot 2023-01-31 at 3.51.12 PM.png&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;images/ads.txt? 그럼 그렇지 ㅠ~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 그런데 짜잔&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_Screenshot 2023-01-31 at 4.31.17 PM.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bni0qH/btrXGnEiaBN/HvXdH7ictkwgesQkuTw7Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bni0qH/btrXGnEiaBN/HvXdH7ictkwgesQkuTw7Qk/img.png&quot; data-alt=&quot;어차피 public이긴 한데 그냥 모자이크 함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bni0qH/btrXGnEiaBN/HvXdH7ictkwgesQkuTw7Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbni0qH%2FbtrXGnEiaBN%2FHvXdH7ictkwgesQkuTw7Qk%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;709&quot; height=&quot;155&quot; data-filename=&quot;edited_edited_Screenshot 2023-01-31 at 4.31.17 PM.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어차피 public이긴 한데 그냥 모자이크 함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 경로에서 접근이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 것들도 그런가? 하고 images/preview.jpg 처럼 같이 저장된 다른 파일도 접근해 봤는데 접근할 수가 없군요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 그렇진 않고, ads.txt에만 예외를 적용하는 것 같으니 보안 걱정도 할 필요가 없을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 루트 경로에 업로드 못한다고 알고 있었는데 걱정하지 말고 저렇게 올리시고 기다리세용&lt;/p&gt;</description>
      <category>정정생보통</category>
      <category>ads.txt</category>
      <category>구글 애드센스</category>
      <category>애드센스</category>
      <category>티스토리</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/73</guid>
      <comments>https://youngmon.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-adstxt-%ED%8C%8C%EC%9D%BC-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0#entry73comment</comments>
      <pubDate>Tue, 31 Jan 2023 16:47:00 +0900</pubDate>
    </item>
    <item>
      <title>Docker) 초보자를 위한 도커 설명회</title>
      <link>https://youngmon.tistory.com/entry/Docker-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%EC%84%A4%EB%AA%85%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Docker는 어플리케이션을 구성하는 여러 서비스가 독립적인 환경에서 실행되도록 관리하는 오픈 소스 프로젝트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 사용함으로써 어플리케이션의 개발, 운영, 확장, 유지보수, 배포를 빠르고 쉽게 할 수 있습니다.&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;style2&quot; /&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;1316&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Ebgv/btrXyiYciQX/2FL55qaiB1TrUi0N0panT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Ebgv/btrXyiYciQX/2FL55qaiB1TrUi0N0panT1/img.png&quot; data-alt=&quot;도커 공식 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Ebgv/btrXyiYciQX/2FL55qaiB1TrUi0N0panT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Ebgv%2FbtrXyiYciQX%2F2FL55qaiB1TrUi0N0panT1%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; alt=&quot;도커 공식 이미지&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;293&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1126&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;도커란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커는 libcontainer라는 자체 기술을 통해 필요한 &lt;b&gt;최소한&lt;/b&gt;의 의존성(lib, bin) 등을 가진 경량 컨테이너를 도커 엔진을 통해 실행합니다.&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-origin-width=&quot;1280&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7XaN/btrXBZwlow7/dpILuIgH3IRMApkS8wQ0Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7XaN/btrXBZwlow7/dpILuIgH3IRMApkS8wQ0Kk/img.png&quot; data-alt=&quot;LXC vs Docker&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7XaN/btrXBZwlow7/dpILuIgH3IRMApkS8wQ0Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7XaN%2FbtrXBZwlow7%2FdpILuIgH3IRMApkS8wQ0Kk%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; alt=&quot;LXC vs Docker&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;299&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LXC vs Docker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커와 기존 컨테이너와의 가장 큰 차이는 LXC는 init 프로세스를 통해, 여러 프로세스를 하나의 컨테이너에서 관리할 수 있으나, 도커에서는 세분화된 프로세스를 standard-alone으로 실행하도록 권장하고 지원하며,&amp;nbsp;Host OS 위에 도커 엔진이라는 컨테이너 런타임을 두어 다양한 플랫폼에서 동일한 환경으로 컨테이너를 실행할 수 있도록합니다(윈도우, OS X에서도 실행 가능).&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;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;도커 아키텍처&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커는 크게 도커 클라이언트와 도커 데몬으로 나뉘어 클라이언트와-서버 구조로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 둘은 Rest 또는 소켓으로 통신하며 이미지를 생성, 확장, 실행, 배포 등의 작업을 수행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blIKGC/btrXDgRM3Sg/IimT6s1tJtn00NxTsKwvf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blIKGC/btrXDgRM3Sg/IimT6s1tJtn00NxTsKwvf1/img.jpg&quot; data-alt=&quot;Docker Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blIKGC/btrXDgRM3Sg/IimT6s1tJtn00NxTsKwvf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblIKGC%2FbtrXDgRM3Sg%2FIimT6s1tJtn00NxTsKwvf1%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; alt=&quot;도커 아키텍처&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;308&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Docker Architecture&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;도커 레지스트리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지가 저장되는 곳으로 Docker-Hub와 같은 Public 레지스트리나 개인 레지스트리를 통해 사용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지가 없다면 도커는 기본적으로 도커 허브에서 이미지를 찾아 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 허브에서도 공식 이미지가 존재하므로 유사품 주의~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dockerfile&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 빌드하기 위한 스크립트로 기존 이미지 위에 추가적인 명령을 덧붙여 확장하는 방식으로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FROM, RUN, ENTRYPOINT, ADD 등의 문법을 통해 이미지를 쉽게 빌드할 수 있습니다.&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;Dockerfile에서 여러&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;도커 이미지가 실제로 실행되어 인스턴스화가 되었을 때, 컨테이너라고 일컫으며 실행된 컨테이너 내부의 수정 사항은 별도의 설정이 없는 한 반영되지 않습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;요약&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;도커는 어플리케이션 내부 모듈들의 상호 의존성을 느슨하게 만들어 확장과 유지보수를 쉽게 만들어준다는 장점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 프로세스를 추상화시켜 프로그램의 Life-Cycle과 비교하자면&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;Dockerfile : Makefile과 같은 빌더로써 명령 간의 의존성에 따라 빌드, 명령어는 컴파일되어 오브젝트 파일이 되며 이들이 링킹 과정을 거쳐 프로그램(도커 이미지)이 생성됨&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Docker Image : 프로그램과 같은 존재로써 ENTRYPOINT(main 함수)를 제공합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Docker Container : 프로그램이 메모리에 적재되어 실행되는 것처럼 ENTRYPOINT의 명령을 수행한 이후 종료되며, 프로그램을 여러 번 실행해도 동일한 동작을 하는 것처럼 컨테이너의 동작은 다른 컨테이너와 독립적으로 동작합니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>컴퓨터 과학</category>
      <category>docker</category>
      <category>도커</category>
      <category>도커엔진</category>
      <category>컨테이너</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/72</guid>
      <comments>https://youngmon.tistory.com/entry/Docker-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%EC%84%A4%EB%AA%85%ED%9A%8C#entry72comment</comments>
      <pubDate>Mon, 30 Jan 2023 23:27:21 +0900</pubDate>
    </item>
    <item>
      <title>애플 뮤직 vs 스포티파이 vs 유튜브 뮤직</title>
      <link>https://youngmon.tistory.com/entry/%EC%95%A0%ED%94%8C-%EB%AE%A4%EC%A7%81-vs-%EC%8A%A4%ED%8F%AC%ED%8B%B0%ED%8C%8C%EC%9D%B4-vs-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%AE%A4%EC%A7%81</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;바야흐로 대 스트리밍 시대, 어떤 스트리밍 플랫폼을 사용하는 게 좋을까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XiRW6/btrXoDHsEsS/jHIaHMWJ9lJwm7uiF3p181/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XiRW6/btrXoDHsEsS/jHIaHMWJ9lJwm7uiF3p181/img.jpg&quot; data-alt=&quot;유튜브 프리미엄 - 예전부터 구독해서 월 8,690원만 내고 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XiRW6/btrXoDHsEsS/jHIaHMWJ9lJwm7uiF3p181/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXiRW6%2FbtrXoDHsEsS%2FjHIaHMWJ9lJwm7uiF3p181%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; alt=&quot;유튜브 프리미엄 구독&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;98&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유튜브 프리미엄 - 예전부터 구독해서 월 8,690원만 내고 있다.&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-origin-width=&quot;1125&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjHemf/btrXnKUA5Fx/Lrbd9bCW409gt5ms7Kg8Mk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjHemf/btrXnKUA5Fx/Lrbd9bCW409gt5ms7Kg8Mk/img.jpg&quot; data-alt=&quot;애플 뮤직 월 8,900원&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjHemf/btrXnKUA5Fx/Lrbd9bCW409gt5ms7Kg8Mk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjHemf%2FbtrXnKUA5Fx%2FLrbd9bCW409gt5ms7Kg8Mk%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; alt=&quot;애플 뮤직 구독&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;302&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애플 뮤직 월 8,900원&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKDjEM/btrXypnnc2A/GZd9shO0q4wQiyNT36kcm1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKDjEM/btrXypnnc2A/GZd9shO0q4wQiyNT36kcm1/img.jpg&quot; data-alt=&quot;스포티파이 프리미엄 개인 월 11,990&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKDjEM/btrXypnnc2A/GZd9shO0q4wQiyNT36kcm1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKDjEM%2FbtrXypnnc2A%2FGZd9shO0q4wQiyNT36kcm1%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; alt=&quot;스포티파이 구독&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;219&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스포티파이 프리미엄 개인 월 11,990&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도합 월 29,800&lt;/b&gt;&lt;br /&gt;나 영몬 월 구독료 3만원. 나같이 살지 마시오.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w7PwU/btrXv3SsQCM/xRnfbjSeOARQbzauRyYYkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w7PwU/btrXv3SsQCM/xRnfbjSeOARQbzauRyYYkK/img.png&quot; data-alt=&quot;ㄹㅇ로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w7PwU/btrXv3SsQCM/xRnfbjSeOARQbzauRyYYkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw7PwU%2FbtrXv3SsQCM%2FxRnfbjSeOARQbzauRyYYkK%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; alt=&quot;나같이 살지 마시오&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;179&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㄹㅇ로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물론 이를 인지하면서도 쓰는 이유는 각각 다 장단점이 있기 때문이긴 하다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;유튜브 뮤직&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유튜브 뮤직을 돈 내고 듣는 사람이 있을까?&lt;br /&gt;그냥 유튜브 광고를 없애니까 음악을 들을 수 있게 해주는 것..&lt;br /&gt;그게 유일한 장점이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;음질&lt;/b&gt;&lt;br /&gt;최대 AAC 256 kbps, 타사 AAC 256 kbps랑 비교해도 음질이 떨어진다.&lt;br /&gt;비트레이트 샘플레이트 빼놓고도 플레이어가 구짐..&lt;br /&gt;★☆&lt;br /&gt;&lt;br /&gt;&lt;b&gt;가격&lt;/b&gt;&lt;br /&gt;유튜브 프리미엄의 번들이기 때문에 사실 무료로 봐도 무방하다.&lt;br /&gt;다만 20년 9월 이후, 구독료가 올라서 새로 구독하는 사람들은 10,450원의 구독료를 냄&lt;br /&gt;★★★★☆&lt;br /&gt;&lt;br /&gt;&lt;b&gt;다양성&lt;/b&gt;&lt;br /&gt;정식 음원 말고도 다양한 커버곡, 라이브 음원이 있다.&lt;br /&gt;다만 저는 굳이 찾아 듣지는 않습니다. 필요하면 유튜브로 봄&lt;br /&gt;★★★★★&lt;br /&gt;&lt;br /&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;br /&gt;거의 없다시피 함&lt;br /&gt;장르 자체가 왔다갔다&lt;br /&gt;★★☆&lt;br /&gt;&lt;br /&gt;&lt;b&gt;종합&lt;/b&gt;&lt;br /&gt;★★☆&lt;br /&gt;&lt;br /&gt;사실 무료(프리미엄 + @)기 때문에 쓰는 거지, 유튜브 노광고만 팔면 바로 해지 가능&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;애플 뮤직&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Dolby Atmos와 무손실 음원 지원이 장점이다.&lt;br /&gt;애플 뮤직 무손실은 24bit / 192khz 지원&lt;br /&gt;본인은 5.1 채널 + 구글 크롬캐스트 오디오 세팅해 놓고 씀&lt;br /&gt;&lt;br /&gt;'애플' 뮤직이니까 아이폰, 아이패드, 맥북이랑 잘 맞을 거라고 생각하시겠지만&lt;br /&gt;아이폰, 아이패드, 맥북 모두 블투 코덱으로 AAC만 지원하기 때문에 무손실 들으려면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHwu7b/btrXo6bARRz/yM7KnUg3GDbtKGPM0A2t7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHwu7b/btrXo6bARRz/yM7KnUg3GDbtKGPM0A2t7K/img.png&quot; data-alt=&quot;DAC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHwu7b/btrXo6bARRz/yM7KnUg3GDbtKGPM0A2t7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHwu7b%2FbtrXo6bARRz%2FyM7KnUg3GDbtKGPM0A2t7K%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; alt=&quot;8핀 DAC&quot; loading=&quot;lazy&quot; width=&quot;111&quot; height=&quot;170&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DAC&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;불편한 꼬다리 끼워서 들어야 함&lt;br /&gt;&lt;br /&gt;블루투스 타는 순간 무손실이 의미 없다고 보면 됩니다.&lt;br /&gt;&lt;br /&gt;안드로이드는 그래도 LDAC이라는 선택지가 있는데&lt;br /&gt;당근에서 &lt;b&gt;크롬캐스트 오디오 (블투 X&lt;/b&gt; 와이파이 O, 현재 단종) 구해서 뽕 뽑아도 됨&lt;br /&gt;&lt;br /&gt;에어팟 공간음향도 가상 서라운드기 때문에 돌비 제대로 쓰려면 또 홈시어터 만들어야 하고...&lt;br /&gt;구독료가 문제가 아니라 &lt;b&gt;초기 비용 발생&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;음질&lt;/b&gt;&lt;br /&gt;최대 ALAC(Apple lossless) 24bit 192kHz&lt;br /&gt;Dolby Atmos 메타 데이터로 찐 돌비 가능&lt;br /&gt;★★★★★&lt;br /&gt;&lt;br /&gt;&lt;b&gt;가격&lt;/b&gt;&lt;br /&gt;월 8,900원&lt;br /&gt;에어팟으로만 듣는다면 애플 뮤직을 쓸 필요가 없음&lt;br /&gt;굳이 애플 뮤직을 쓰려면 장비에도 돈을 써야 한다고 봅니다.&lt;br /&gt;★★☆&lt;br /&gt;&lt;br /&gt;&lt;b&gt;다양성&lt;/b&gt;&lt;br /&gt;스포티파이에 있는데 애플 뮤직에 없는 노래 지금까지 딱 한 곡 봤다. 비교 불가함&lt;br /&gt;★★★★&lt;br /&gt;&lt;br /&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;br /&gt;나쁘지 않은데, 스포티파이가 너무 쎔&lt;br /&gt;★★★☆&lt;br /&gt;&lt;br /&gt;&lt;b&gt;종합&lt;/b&gt;&lt;br /&gt;★★★☆&lt;br /&gt;&lt;br /&gt;다른 어플들에 없는 기능들을 하나둘씩 가지고 있는 느낌..?&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;스포티파이&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;적당한 음질에 적당한 가격, 높은 호환성, 특이점이 온 알고리즘&lt;br /&gt;&lt;br /&gt;&lt;b&gt;음질&lt;/b&gt;&lt;br /&gt;최대 AAC 320 kbps&lt;br /&gt;MP3 320 kbps이랑은 다르다. 사실 이 정도만 돼도 들을 때 무손실이랑 크게 차이 못 느낌&lt;br /&gt;근데 유튜브 AAC 256이랑 비교하면 차이가 느껴지긴 한다,,&lt;br /&gt;★★★★&lt;br /&gt;&lt;br /&gt;&lt;b&gt;가격&lt;/b&gt;&lt;br /&gt;지금 쓰고 있는 스포티파이 프리미엄 개인 요금제는 월 11,990원으로 비싼 느낌이 있었지만&lt;br /&gt;이번에 스포티파이 베이직 요금제가 출시되어서 8,670원에 사용 가능하다.&lt;br /&gt;개인 프리미엄 요금제와의 차이도 음원 다운로드 가능 여부밖에 없음&lt;br /&gt;★★★★&lt;br /&gt;&lt;br /&gt;&lt;b&gt;다양성&lt;/b&gt;&lt;br /&gt;애플뮤직과 마찬가지로 찾는 음악이 없었던 적은 없음&lt;br /&gt;★★★★&lt;br /&gt;&lt;br /&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;br /&gt;스포티파이를 쓰는 이유&lt;br /&gt;노래 3-4곡 중 한 곡은 무조건 좋아요 누른다.&lt;br /&gt;플레이리스트 만들 때도 2-3곡 넣어두고 추천 음악 껴놓고 들으면 어느새 1시간짜리 플리 완성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3BGz2/btrXoDHvA7R/iCTVpG5s14N0f2USYDMRH0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3BGz2/btrXoDHvA7R/iCTVpG5s14N0f2USYDMRH0/img.jpg&quot; data-alt=&quot;플리 생성 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3BGz2/btrXoDHvA7R/iCTVpG5s14N0f2USYDMRH0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3BGz2%2FbtrXoDHvA7R%2FiCTVpG5s14N0f2USYDMRH0%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; alt=&quot;플레이 리스트 노래 추천&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;188&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;플리 생성 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음악 추천을 켜 놓으면 내가 넣어둔 노래 사이사이에 유사한 음악을 추가해 준다.&lt;br /&gt;초록색 별 반짝이들이 추천 음악&lt;br /&gt;★★★★★&lt;br /&gt;&lt;br /&gt;&lt;b&gt;종합&lt;/b&gt;&lt;br /&gt;★★★★☆&lt;br /&gt;&lt;br /&gt;딱 하나만 쓸 수 있다고 하면 스포티파이 씁니다.&lt;br /&gt;애플 뮤직이 아이폰 아이패드 등 애플 기기들과 호환성이 좋을 거 같은데, 스포티파이? 모자람 없다.&lt;br /&gt;오히려 데스크탑 + 웹 환경에서는 스포티파이가 훨씬 좋음.&lt;br /&gt;&lt;br /&gt;근데 나는 스포티파이로 노래 찾아서 애플 뮤직으로 듣습니다.&lt;br /&gt;&lt;b&gt;나처럼 살지 마시오..&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음악 듣는 시간이 적다면 유튜브 광고 없애면서 겸사겸사 유튜브 프리미엄&lt;br /&gt;이미 돈을 좀 발라놨다면? 또는 가격 신경 안 쓴다면 애플 뮤직&lt;br /&gt;매일 똑같은 노래만 듣고 가끔 길 가다가 맘에 드는 노래 한 두곡 찾으면 그거 주구장창? 스포티파이&lt;/p&gt;</description>
      <category>별점맨</category>
      <category>비교</category>
      <category>스트리밍</category>
      <category>스포티파이</category>
      <category>애플뮤직</category>
      <category>유튜브</category>
      <category>유튜브 프리미엄</category>
      <category>플랫폼</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/71</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%95%A0%ED%94%8C-%EB%AE%A4%EC%A7%81-vs-%EC%8A%A4%ED%8F%AC%ED%8B%B0%ED%8C%8C%EC%9D%B4-vs-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%AE%A4%EC%A7%81#entry71comment</comments>
      <pubDate>Sun, 29 Jan 2023 23:11:37 +0900</pubDate>
    </item>
    <item>
      <title>에어팟 프로 2) 약 3달 사용 후기</title>
      <link>https://youngmon.tistory.com/entry/%EC%97%90%EC%96%B4%ED%8C%9F-%ED%94%84%EB%A1%9C-2-%EC%95%BD-3%EB%8B%AC-%EC%82%AC%EC%9A%A9-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_4466.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVlShf/btrXm73ePtY/MzyzdCdglbNz9T2bqdxlq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVlShf/btrXm73ePtY/MzyzdCdglbNz9T2bqdxlq0/img.jpg&quot; data-alt=&quot;별점은요 ★★★&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVlShf/btrXm73ePtY/MzyzdCdglbNz9T2bqdxlq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVlShf%2FbtrXm73ePtY%2FMzyzdCdglbNz9T2bqdxlq0%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; alt=&quot;결제 영수증&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;159&quot; data-filename=&quot;IMG_4466.jpeg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;별점은요 ★★★&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;에어팟 프로 1을 안 써봐서 비교는 불가능&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대신 기존 쓰던 건&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;b&amp;amp;o E8 3.0(단종)&lt;/p&gt;
&lt;figure id=&quot;og_1674905768942&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;Webpage&quot; data-og-title=&quot;True wireless earbuds - Beoplay E8 3rd Generation | B&amp;amp;O&quot; data-og-description=&quot;Enjoy the powerful sound and 35 hours of playtime with Beoplay E8 3rd Gen in-ear earphones. Featuring touch controls to listen to music and pick up calls.&quot; data-og-host=&quot;www.bang-olufsen.com&quot; data-og-source-url=&quot;https://www.bang-olufsen.com/en/us/earphones/beoplay-e8-3rd-gen?variant=beoplay-e8-3-greymist&quot; data-og-url=&quot;https://www.bang-olufsen.com/en/us/earphones/beoplay-e8-3rd-gen?variant=beoplay-e8-3-greymist&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cicOSd/hyRqWD6oL7/FT5TFB3at79SWtST5MznH1/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000,https://scrap.kakaocdn.net/dn/tyktL/hyRpPNl3XJ/330TpZTLvBLLjtzhd9DDBK/img.png?width=375&amp;amp;height=375&amp;amp;face=0_0_375_375&quot;&gt;&lt;a href=&quot;https://www.bang-olufsen.com/en/us/earphones/beoplay-e8-3rd-gen?variant=beoplay-e8-3-greymist&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.bang-olufsen.com/en/us/earphones/beoplay-e8-3rd-gen?variant=beoplay-e8-3-greymist&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cicOSd/hyRqWD6oL7/FT5TFB3at79SWtST5MznH1/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000,https://scrap.kakaocdn.net/dn/tyktL/hyRpPNl3XJ/330TpZTLvBLLjtzhd9DDBK/img.png?width=375&amp;amp;height=375&amp;amp;face=0_0_375_375');&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;True wireless earbuds - Beoplay E8 3rd Generation | B&amp;amp;O&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Enjoy the powerful sound and 35 hours of playtime with Beoplay E8 3rd Gen in-ear earphones. Featuring touch controls to listen to music and pick up calls.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.bang-olufsen.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1674906023544&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;WF-1000XM4 | 무선 노이즈캔슬링 이어폰  | Sony KR&quot; data-og-description=&quot;소니 WF-1000XM4 이어버드의 업계 최고 수준 노이즈 캔슬링, 스마트 기능, 깨끗한 통화 음질, 생활방수, 긴 배터리 수명, Bluetooth 연결을 알아보세요.&quot; data-og-host=&quot;www.sony.co.kr&quot; data-og-source-url=&quot;https://www.sony.co.kr/headphones/products/wf-1000xm4&quot; data-og-url=&quot;https://www.sony.co.kr/headphones/products/wf-1000xm4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0nXkW/hyRpRLe1ox/3fF6D07W4kKA8kgom3r1I1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/E0TJs/hyRq9pUGFG/RnVfpHlv39uIGVkea4sTs1/img.jpg?width=2880&amp;amp;height=1748&amp;amp;face=0_0_2880_1748,https://scrap.kakaocdn.net/dn/ewK94/hyRqW5ax8v/RnoCKncu48WWhc1pXHwJck/img.jpg?width=2880&amp;amp;height=1748&amp;amp;face=0_0_2880_1748&quot;&gt;&lt;a href=&quot;https://www.sony.co.kr/headphones/products/wf-1000xm4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.sony.co.kr/headphones/products/wf-1000xm4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0nXkW/hyRpRLe1ox/3fF6D07W4kKA8kgom3r1I1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/E0TJs/hyRq9pUGFG/RnVfpHlv39uIGVkea4sTs1/img.jpg?width=2880&amp;amp;height=1748&amp;amp;face=0_0_2880_1748,https://scrap.kakaocdn.net/dn/ewK94/hyRqW5ax8v/RnoCKncu48WWhc1pXHwJck/img.jpg?width=2880&amp;amp;height=1748&amp;amp;face=0_0_2880_1748');&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;WF-1000XM4 | 무선 노이즈캔슬링 이어폰 | Sony KR&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소니 WF-1000XM4 이어버드의 업계 최고 수준 노이즈 캔슬링, 스마트 기능, 깨끗한 통화 음질, 생활방수, 긴 배터리 수명, Bluetooth 연결을 알아보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.sony.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; 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;3FFAD860-CCA9-4B38-ADAF-B3B52C77733E_1_102_o.jpeg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;2048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DRNgj/btrXo4RMKeC/WH4YXi3vx16wko5nVJ9hP1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DRNgj/btrXo4RMKeC/WH4YXi3vx16wko5nVJ9hP1/img.jpg&quot; data-alt=&quot;포장 뜯기전에 찍어놓음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DRNgj/btrXo4RMKeC/WH4YXi3vx16wko5nVJ9hP1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDRNgj%2FbtrXo4RMKeC%2FWH4YXi3vx16wko5nVJ9hP1%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; alt=&quot;노캔 겹치기&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;657&quot; data-filename=&quot;3FFAD860-CCA9-4B38-ADAF-B3B52C77733E_1_102_o.jpeg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;2048&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실 처음 에어팟 맥스까지만 해도 기준치가 매우 낮았다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FLAC 못 듣는 거야 당연히 옥희(어차피 아이폰에서 지원 안 함)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;좀 무거운 것도 옥희&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대신 맥북, 패드, 아이폰 등 기기 간 이동 때문에 샀었다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;B06207FB-9D7F-4C7A-98C5-5CA72A801819_1_201_a.jpeg&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;845&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXbjss/btrXn54K4Nq/Bzk7dxsxyz7jophCzbBL41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXbjss/btrXn54K4Nq/Bzk7dxsxyz7jophCzbBL41/img.jpg&quot; data-alt=&quot;딱 이렇게 됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXbjss/btrXn54K4Nq/Bzk7dxsxyz7jophCzbBL41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXbjss%2FbtrXn54K4Nq%2FBzk7dxsxyz7jophCzbBL41%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; alt=&quot;헤드셋 전후&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;345&quot; data-filename=&quot;B06207FB-9D7F-4C7A-98C5-5CA72A801819_1_201_a.jpeg&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;845&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;딱 이렇게 됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqtLTN/btrXpchYSV7/ZN5wNXg9cCskFUZDkUZIDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqtLTN/btrXpchYSV7/ZN5wNXg9cCskFUZDkUZIDk/img.jpg&quot; data-alt=&quot;벗으면 머리에 오솔길 생김&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqtLTN/btrXpchYSV7/ZN5wNXg9cCskFUZDkUZIDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqtLTN%2FbtrXpchYSV7%2FZN5wNXg9cCskFUZDkUZIDk%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; alt=&quot;오솔길&quot; loading=&quot;lazy&quot; width=&quot;273&quot; height=&quot;273&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;벗으면 머리에 오솔길 생김&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다 좋은데 진짜 무게가 너무 무거워서 관자놀이도 아프고, 아무리 작게 해도 앞으로 흘러서 프로 2 사전예약 나오자마자 삼&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;음질&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;역시 헤드폰이라 좋은 거였음..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;★★&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연결성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기기 간 이동 때문에 오히려 짜증 나서 꺼둠 + 잘 끊김&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다만 추가로 관련 서드파티 앱을 깔 필요가 없이 네이티브에서 관리가 가능&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;★★★★&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무게&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;WF-1000xm4, E8 3.0 전부 유닛 크기가 대단했다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;확실히 가벼운 게 장점&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;★★★★★&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;노캔&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제일 이해 안 가는 부분, 22FW인데 그냥 그럼&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;★★★&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배터리&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;가벼운 만큼 금방 죽음&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;★★&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;총평&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;★★★&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;어떤 측면을 보던 무난하지만, 어떤 측면도 딱히 특출나진 않음.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;근데 그게 장점이라 다른 거 써도 에어팟 하나 있으면 편할 것 같다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>별점맨</category>
      <category>AirPods</category>
      <category>AirPods Pro 2</category>
      <category>Apple</category>
      <category>★★★</category>
      <category>노이즈 캔슬링</category>
      <category>블루투스 이어폰</category>
      <category>애플</category>
      <category>에어팟</category>
      <category>에어팟 프로 2</category>
      <category>이어폰</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/70</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%97%90%EC%96%B4%ED%8C%9F-%ED%94%84%EB%A1%9C-2-%EC%95%BD-3%EB%8B%AC-%EC%82%AC%EC%9A%A9-%ED%9B%84%EA%B8%B0#entry70comment</comments>
      <pubDate>Sat, 28 Jan 2023 21:46:35 +0900</pubDate>
    </item>
    <item>
      <title>OAuth 2.0) OAuth 2.0으로 구글 유저 정보 가져오기</title>
      <link>https://youngmon.tistory.com/entry/OAuth-20-OAuth-20%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EA%B8%80-%EC%9C%A0%EC%A0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;OAuth란?&lt;/h3&gt;
&lt;p id=&quot;-oauthopen-authorization란&quot; data-ke-size=&quot;size16&quot;&gt;Open Authorization, 외부 어플리케이션에서 다른 서비스를 이용할 때 필요한 &lt;b&gt;인증&lt;/b&gt;과 &lt;b&gt;권한 부여&lt;/b&gt;를 위한 개방형 표준 프로토콜로 아래 인증과 인가의 차이를 이해하는 편이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youngmon.app/entry/인증-vs-인가&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.01.23 - [WEB] - 인증 vs 인가&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674791908429&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;인증 vs 인가&quot; data-og-description=&quot;인증 (Authentication) 유저나 시스템이 누구인지 신원을 확인하는 프로세스, 일반적으로 유저/시스템의 정보를 담고있는 DB의 ID/PW 대조를 통해 대상이 누구인지, 신원을 결정함 인가 (Authorization) 인&quot; data-og-host=&quot;youngmon.app&quot; data-og-source-url=&quot;https://youngmon.app/entry/인증-vs-인가&quot; data-og-url=&quot;https://youngmon.app/entry/%EC%9D%B8%EC%A6%9D-vs-%EC%9D%B8%EA%B0%80&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brUJbe/hyRpExaR78/chgDKHLOaDQhhklewxrI40/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c1jQlw/hyRpIsPwqE/fzvWV0SZAqkU3MT6ukGCM0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://youngmon.app/entry/인증-vs-인가&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youngmon.app/entry/인증-vs-인가&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brUJbe/hyRpExaR78/chgDKHLOaDQhhklewxrI40/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c1jQlw/hyRpIsPwqE/fzvWV0SZAqkU3MT6ukGCM0/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;인증 vs 인가&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인증 (Authentication) 유저나 시스템이 누구인지 신원을 확인하는 프로세스, 일반적으로 유저/시스템의 정보를 담고있는 DB의 ID/PW 대조를 통해 대상이 누구인지, 신원을 결정함 인가 (Authorization) 인&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;youngmon.app&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;Access 토큰을 문화상품권 같은 개념이라고 비유한다면, 사용자가 구매(인증)한 문상(토큰, 권한)으로 도서를 구매하거나 게임에 현질을 할 수 있지만 주류, 담배 구입(인가되지 않은 스코프)등에는 사용할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RFC 문서&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;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc6749&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://datatracker.ietf.org/doc/html/rfc6749&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674796318605&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;RFC ft-ietf-oauth-v2: The OAuth 2.0 Authorization Framework&quot; data-og-description=&quot;The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowi&quot; data-og-host=&quot;datatracker.ietf.org&quot; data-og-source-url=&quot;https://datatracker.ietf.org/doc/html/rfc6749&quot; data-og-url=&quot;https://datatracker.ietf.org/doc/html/rfc6749&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eYluS/hyRpHHwuQm/BdeXKfaDO9rTk9Ol2VazeK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc6749&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://datatracker.ietf.org/doc/html/rfc6749&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eYluS/hyRpHHwuQm/BdeXKfaDO9rTk9Ol2VazeK/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;RFC ft-ietf-oauth-v2: The OAuth 2.0 Authorization Framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowi&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;datatracker.ietf.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OAuth와 OAuth2.0 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OAuth2.0은 OAuth가 개선된 버전.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;권한 부여 타입 외에도 리프레시 토큰이라는 개념이 도입되어 지속적으로 재인증을 할 필요 없이, 토큰이 만료될 때마다 새로운 Access 토큰을 발급받아 유지할 수 있으며, 요청에 서명을 할 필요가 없어 프로세스를 간소화해 중간에 토큰이 공격받는 상황을 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OAuth에 비해 유연하고 구현하기가 쉬움&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;OAuth2.0 흐름&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서버에서 미리 사용하고자 하는 외부 서비스의 서버에 Application과 callback url을 등록해 Client ID, secret를 부여받음&lt;/li&gt;
&lt;li&gt;서버에서 필요한 리소스,서비스에 접근 시, 토큰이 없다면 패스포트에서 인증 페이지로 리다이렉션&lt;/li&gt;
&lt;li&gt;사용자가 인증에 성공하면 callback url로 Authorization code를 포함해 리다이렉션을 수행&lt;/li&gt;
&lt;li&gt;Authorization code를 통해 인증 서버에 Access Token을 요청&lt;/li&gt;
&lt;li&gt;토큰을 통해 보호된 리소스, 서비스를 사용 가능함&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Nest.js로 구현해보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 사용자의 정보를 보기 위한 예시를 작성해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://console.cloud.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674795006200&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/&quot; data-og-url=&quot;https://accounts.google.com/v3/signin/identifier?dsh=S1543523194%3A1674795004854873&amp;amp;continue=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;followup=https%3A%2F%2Fconsole.cloud.google.com%2F&amp;amp;osid=1&amp;amp;passive=1209600&amp;amp;service=cloudconsole&amp;amp;flowName=WebLiteSignIn&amp;amp;flowEntry=ServiceLogin&amp;amp;ifkv=AWnogHf6tIcwOvSGDub1_FeuAXs9MEZMg4JlKskzkK1I_zDwYr_fmMkmEtF9Wb57Xs0qCx_tIqpn5w&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://console.cloud.google.com/&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;p data-ke-size=&quot;size16&quot;&gt;Google Api를 이용하기 위해 해당 페이지로 이동해줍니다.&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;Google API 등록&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-27 at 1.49.34 PM.png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p7GVz/btrXiOoLpvb/FqtKVmTL1ekB4HSmXLjD81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p7GVz/btrXiOoLpvb/FqtKVmTL1ekB4HSmXLjD81/img.png&quot; data-alt=&quot;OAuth를 사용하기 위해 동의 후 사용자 인증 정보 탭으로 이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p7GVz/btrXiOoLpvb/FqtKVmTL1ekB4HSmXLjD81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp7GVz%2FbtrXiOoLpvb%2FFqtKVmTL1ekB4HSmXLjD81%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; alt=&quot;사용자 인증 정보&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;223&quot; data-filename=&quot;Screenshot 2023-01-27 at 1.49.34 PM.png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OAuth를 사용하기 위해 동의 후 사용자 인증 정보 탭으로 이동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-27 at 1.54.27 PM.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6mtRw/btrXmxzh4Ka/czqRA6sfL1Lzblk3FbZBwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6mtRw/btrXmxzh4Ka/czqRA6sfL1Lzblk3FbZBwK/img.png&quot; data-alt=&quot;OAuth를 사용할 수 있게 서비스를 등록하고 설정해줍니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6mtRw/btrXmxzh4Ka/czqRA6sfL1Lzblk3FbZBwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6mtRw%2FbtrXmxzh4Ka%2FczqRA6sfL1Lzblk3FbZBwK%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; alt=&quot;사용자 인증 정보&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;210&quot; data-filename=&quot;Screenshot 2023-01-27 at 1.54.27 PM.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OAuth를 사용할 수 있게 서비스를 등록하고 설정해줍니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션의 종류 등을 설정하고 승인된 리디렉션 URI가 콜백을 받기 위해 사용될 주소이므로 적어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 간단한 테스트 용도기 때문에 &quot;http://localhost:3000/auth/callback&quot;으로 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장하면 Client ID와 클라이언트 보안 비밀이라는 탭이 나오는데 구현에 필요한 내용이므로 기억해둡시다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2023-01-27 at 2.00.52 PM.png&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bscxO5/btrXg31lXtV/fhpGNaeZPg75aRQZ2DlmQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bscxO5/btrXg31lXtV/fhpGNaeZPg75aRQZ2DlmQk/img.png&quot; data-alt=&quot;코드에 삽입될 컨텐츠들입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bscxO5/btrXg31lXtV/fhpGNaeZPg75aRQZ2DlmQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbscxO5%2FbtrXg31lXtV%2FfhpGNaeZPg75aRQZ2DlmQk%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; alt=&quot;google api&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;172&quot; data-filename=&quot;edited_Screenshot 2023-01-27 at 2.00.52 PM.png&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;348&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;필요 모듈 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.passportjs.org/packages/passport-google-oauth20/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.passportjs.org/packages/passport-google-oauth20/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674795931366&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;passport-google-oauth20&quot; data-og-description=&quot;Google (OAuth 2.0) authentication strategy for Passport.&quot; data-og-host=&quot;www.passportjs.org&quot; data-og-source-url=&quot;https://www.passportjs.org/packages/passport-google-oauth20/&quot; data-og-url=&quot;https://www.passportjs.org/packages/passport-google-oauth20/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biU2sz/hyRpJyyPqq/bgjstpA5Vs8PYLJhLwWrZ1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://www.passportjs.org/packages/passport-google-oauth20/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.passportjs.org/packages/passport-google-oauth20/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biU2sz/hyRpJyyPqq/bgjstpA5Vs8PYLJhLwWrZ1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&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;passport-google-oauth20&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Google (OAuth 2.0) authentication strategy for Passport.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.passportjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js에서 Strategy 패턴을 통해 인증, 권한 부여, 세션 관리 등의 동작을 쉽게 할 수 있는 미들웨어인 패스포트 모듈을 설치해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1674796581340&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install passport-google-oauth20 @nestjs/passport&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_1674796738202&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-google-oauth20';
import { User } from './user.dto';

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
	constructor() {
		super({
			clientID: ${CLIENT_ID},
    		clientSecret: ${SECRET},
    		callbackURL: '/auth/callback',
			scope: ['profile', 'email'],
		});
	}

	async validate(
		accessToken: string,
		refreshToken: string,
		profile: any,
		cb: any
	) {
		const user: User = {
			userId: profile.id,
			userName: profile.displayName,
			email: profile.emails[0].value,
		};
		cb(null, user);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명드린 것처럼 Strategy 패턴을 사용하기 때문에 passport-google-oauth20의 Strategy 클래스를 PassportStrategy에서 확장해 사용합니다. 저는 해당 Strategy의 이름을 google로 지정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clientID와 clientSecret은 아까 API 등록하고 받은 내용들로 채워줍니다. 인증이 완료되면 passport 모듈에서 CallbackURL로 돌려보내줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;validate를 구현해야하는데 passport-google-oauth20의 프로토타입대로 작성했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-27 at 2.24.13 PM.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yuJ4u/btrXmyFdLIW/2Fk1xpErbfgKFpfKv8BE61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yuJ4u/btrXmyFdLIW/2Fk1xpErbfgKFpfKv8BE61/img.png&quot; data-alt=&quot;validate 프로토타입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yuJ4u/btrXmyFdLIW/2Fk1xpErbfgKFpfKv8BE61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyuJ4u%2FbtrXmyFdLIW%2F2Fk1xpErbfgKFpfKv8BE61%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; alt=&quot;validate 프로토타입&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;35&quot; data-filename=&quot;Screenshot 2023-01-27 at 2.24.13 PM.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;validate 프로토타입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저를 확인할 가드를 생성해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1674797281655&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Injectable } from '@nestjs/common'
import { AuthGuard } from '@nestjs/passport'

@Injectable()
export class GAuthGuard extends AuthGuard('google') {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 만들어 둔 'google' 전략을 확장해 가드 클래스를 만듭니다.&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_1674797631394&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Module } from '@nestjs/common';
import { GoogleStrategy } from './google.strategy'
import { AuthController } from './auth.controller'
import { PassportModule } from '@nestjs/passport'

@Module({
	imports: [
		PassportModule.register({
			GoogleStrategy
		}),
	], controllers: [
		AuthController
	], providers: [
		GoogleStrategy
	]
})
export class AuthModule {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈에 Strategy를 등록해 provider로 관리될 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 설명하자면 해당 모듈이 생성될 때 GoogleStrategy가 PassportModule에 등록되어 로드됩니다.&lt;/p&gt;
&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_1674797867904&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller('auth')
export class AuthController {
	
	@Get()
	@UseGuards(GAuthGuard)
	login() {}

	@Get('/callback')
	@UseGuards(GAuthGuard)
	async callback(@GetUser() user: User) {
		return user;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 GetUser 데코레이터는 설명하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간략히 흐름을 보면 login()에서 인증이 되어있지 않다면 GAuthGuard에 막혀서 google 로그인 창으로 이동하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 페이지에서 사용자가 인증을 완료하면 callback URL로 유저의 정보가 이동하며, 'auth/callback'에서는 해당 정보를 리턴해 json 형식으로 응답합니다.&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;Screenshot 2023-01-27 at 2.43.11 PM.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcZ3BY/btrXmov9ALx/uKf7N8K6JK7apPhUvaV9X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcZ3BY/btrXmov9ALx/uKf7N8K6JK7apPhUvaV9X0/img.png&quot; data-alt=&quot;토큰이 없는 상태로 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcZ3BY/btrXmov9ALx/uKf7N8K6JK7apPhUvaV9X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcZ3BY%2FbtrXmov9ALx%2FuKf7N8K6JK7apPhUvaV9X0%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; alt=&quot;요청 URL&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;58&quot; data-filename=&quot;Screenshot 2023-01-27 at 2.43.11 PM.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰이 없는 상태로 요청&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-27 at 2.43.23 PM.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS4O8k/btrXiOipPa4/O1FmLytFnkOS25kK7xD9sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS4O8k/btrXiOipPa4/O1FmLytFnkOS25kK7xD9sk/img.png&quot; data-alt=&quot;익숙한 로그인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS4O8k/btrXiOipPa4/O1FmLytFnkOS25kK7xD9sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS4O8k%2FbtrXiOipPa4%2FO1FmLytFnkOS25kK7xD9sk%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; alt=&quot;구글 로그인 화면&quot; loading=&quot;lazy&quot; width=&quot;366&quot; height=&quot;406&quot; data-filename=&quot;Screenshot 2023-01-27 at 2.43.23 PM.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;익숙한 로그인 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot 2023-01-27 at 2.43.47 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIfsM3/btrXmSXPp1y/ZYXEJxQG2Di7vvlrpSqZe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIfsM3/btrXmSXPp1y/ZYXEJxQG2Di7vvlrpSqZe0/img.png&quot; data-alt=&quot;모자이크 왤케 징그럽죠?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIfsM3/btrXmSXPp1y/ZYXEJxQG2Di7vvlrpSqZe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIfsM3%2FbtrXmSXPp1y%2FZYXEJxQG2Di7vvlrpSqZe0%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; alt=&quot;유저 정보 리턴&quot; loading=&quot;lazy&quot; width=&quot;1352&quot; height=&quot;174&quot; data-filename=&quot;edited_Screenshot 2023-01-27 at 2.43.47 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;174&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;이렇게 OAuth를 이용해 유저 정보를 얻어오는 방법을 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘못된 정보나, 헷갈리는 내용이 있으면 알려주세용&lt;/p&gt;</description>
      <category>WEB</category>
      <category>express.js</category>
      <category>Google API</category>
      <category>nest.js</category>
      <category>nestjs</category>
      <category>oauth</category>
      <category>oauth2.0</category>
      <category>passport</category>
      <category>passport-js</category>
      <category>구글 API</category>
      <category>구글 클라우드 콘솔</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/69</guid>
      <comments>https://youngmon.tistory.com/entry/OAuth-20-OAuth-20%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EA%B8%80-%EC%9C%A0%EC%A0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0#entry69comment</comments>
      <pubDate>Fri, 27 Jan 2023 14:49:39 +0900</pubDate>
    </item>
    <item>
      <title>인증 vs 인가</title>
      <link>https://youngmon.tistory.com/entry/%EC%9D%B8%EC%A6%9D-vs-%EC%9D%B8%EA%B0%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;인증 (Authentication)&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;유저나 시스템이 누구인지 신원을 확인하는 프로세스, 일반적으로 유저/시스템의 정보를 담고있는 DB의 ID/PW 대조를 통해 대상이 누구인지, 신원을 &lt;b&gt;결정&lt;/b&gt;함&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인가 (Authorization)&lt;/h2&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면 두 개념은 밀접하나 다른 개념으로 인증은 Identity의 확인, 인가는 확인된 Identity를 기반으로 리소스/작업에 대한 접근 통제가 목적&lt;/p&gt;</description>
      <category>WEB</category>
      <category>web</category>
      <category>웹</category>
      <category>인가</category>
      <category>인증</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/68</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%9D%B8%EC%A6%9D-vs-%EC%9D%B8%EA%B0%80#entry68comment</comments>
      <pubDate>Mon, 23 Jan 2023 15:17:59 +0900</pubDate>
    </item>
    <item>
      <title>BOJ 19566) c++ 수열의 구간 평균</title>
      <link>https://youngmon.tistory.com/entry/BOJ-19566-%EC%88%98%EC%97%B4%EC%9D%98-%EA%B5%AC%EA%B0%84-%ED%8F%89%EA%B7%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시간 제한 - 1s&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;메모리 제한 - 256MB&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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_0666.jpg&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnGF3g/btrWQKNLX9T/SiYX37eKxz8YflYvQngQK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnGF3g/btrWQKNLX9T/SiYX37eKxz8YflYvQngQK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnGF3g/btrWQKNLX9T/SiYX37eKxz8YflYvQngQK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnGF3g%2FbtrWQKNLX9T%2FSiYX37eKxz8YflYvQngQK0%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;1640&quot; height=&quot;1295&quot; data-filename=&quot;IMG_0666.jpg&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;풀이&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 부분 수열의 합 / 부분 수열의 길이 = 해당 부분 수열의 평균임을 이용해 풀이 &lt;b&gt;(N까지의 누적합 / N = 평균)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. (N까지의 누적 합 - x까지의 누적 합) / (N - x) = x부터 N까지의 평균&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;인덱스&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; text-align: center; height: 20px;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;배열&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;누적합&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;평균&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 테이블에서 6까지의 평균은 당연히 1이다. 만일 찾으려는 값이 1이라면, 이를 만족하는 구간은 모든 구간인 N * (N + 1) / 2인 21이 나와야 함(1:1, 1:2, 1:3, 1:4, 1:5, 1:6, 2:2, 2:3 &amp;bull;&amp;bull;&amp;bull; 6:6)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 누적합을 구하고 평균을 계산해 해당 값이 나온 횟수를 구해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 평균을 계산하고 찾으려는 값 K와 평균의 차이가 몇 번 나왔는지 계산해 결과 값에 더해준다.(&lt;b&gt;DP[sum - idx * K]++&lt;/b&gt;)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 128px;&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: 12.5%; height: 20px;&quot;&gt;누적 합&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 20px;&quot;&gt;인덱스&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;평균&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DP[0]의 횟수&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;결과 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;0 + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1 + 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;3 + 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;6 + 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 12.5%; height: 18px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;10 + 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;평균이 K가 될 때마다 평균 - idx * K는 0이 됨.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;5. 최종적으로 1부터 N까지의 합도 연산에 포함시킴,&lt;span&gt; 결과 값 += &lt;/span&gt;&lt;/span&gt;&lt;b&gt;DP[0]&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;입력&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 &amp;lt;= N &amp;lt;= 200,000, -1e9 &amp;lt;= K &amp;lt;= 1e9&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수열 N개 입력 (입력 최적화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;map&amp;lt;long long, int&amp;gt; 누적합 long long이 int번 나왔음을 기록&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-ad-creative-wrap=&quot;outer&quot;&gt;
&lt;div data-ad-creative-wrap=&quot;inner&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;pre id=&quot;code_1663933155553&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;map&amp;gt;

using namespace std;
using ll = long long;

int main() {
	cin.tie(0); cout.tie(0);
	ios::sync_with_stdio(0);

	ll n, k, tmp, input, cnt = 0, sum = 0;
	map&amp;lt;ll, ll&amp;gt; dp;
	cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;
	for (int i = 1; i &amp;lt;= n; ++i) {
		cin &amp;gt;&amp;gt; input;
		sum += input;		//	현재까지의 누적합
		tmp = sum - i * k;	//	tmp = 현재까지의 누적합 - 만들어야할 누적합
		cnt += dp[tmp]++;	//	tmp가 만들어질 수 있는 부분 배열 기록
	} cnt += dp[0];			//	전체 부분 배열 중 평균이 K가 되는 횟수 추가
	cout &amp;lt;&amp;lt; cnt &amp;lt;&amp;lt; endl;	//	결과 값
	return 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(N)&lt;/p&gt;</description>
      <category>PS</category>
      <category>C++</category>
      <category>DP</category>
      <category>prefix sum</category>
      <category>누적합</category>
      <category>맵</category>
      <category>백준</category>
      <category>수열</category>
      <category>알고리즘</category>
      <category>자료구조</category>
      <category>컴퓨터 공학</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/66</guid>
      <comments>https://youngmon.tistory.com/entry/BOJ-19566-%EC%88%98%EC%97%B4%EC%9D%98-%EA%B5%AC%EA%B0%84-%ED%8F%89%EA%B7%A0#entry66comment</comments>
      <pubDate>Sat, 21 Jan 2023 02:14:33 +0900</pubDate>
    </item>
    <item>
      <title>자료구조) 세그먼트 트리, segment tree</title>
      <link>https://youngmon.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8-%ED%8A%B8%EB%A6%AC-segment-tree</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;당신이 만약 백준 플래티넘 티어에 도전하는 모험가라면 부스터 한개는 남겨놓았길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;a_w019d55001_121a6ac6d74690d016622fedf2131718c45bf72e.jpg&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOjFus/btrV0GkBGQb/GKljCCQDMLk9nv9JrseEZK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOjFus/btrV0GkBGQb/GKljCCQDMLk9nv9JrseEZK/img.jpg&quot; data-alt=&quot;세그먼트 트리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOjFus/btrV0GkBGQb/GKljCCQDMLk9nv9JrseEZK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOjFus%2FbtrV0GkBGQb%2FGKljCCQDMLk9nv9JrseEZK%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;167&quot; height=&quot;167&quot; data-filename=&quot;a_w019d55001_121a6ac6d74690d016622fedf2131718c45bf72e.jpg&quot; data-origin-width=&quot;360&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;최소 골드 2부터 시작하는 쉽지 않은 알고리즘임에도 불구, 트리를 초기화 및 업데이트하고 누적합만 구하는 accumulator가 된다면, 골1 수문장은 쉽게 돌파할 수 있을 것이기 때문이죠.&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;b&gt;특정 범위에 대한 쿼리&lt;/b&gt;를 효율적으로 수행하는 &lt;b&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;트리 내부의 각 노드는 요소의 범위를 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;트리의 각 내부 노드는 상위 노드가 표현하는 범위의 왼쪽과 오른쪽을 절반씩 나타내는 두 개의 하위 노드를 가지며, 상대적으로 적은 수의 노드로 어레이의 전체 범위를 나타낼 수 있으며 범위 값의 수정과 검색에 있어 O(logN)의 연산이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여기서 &lt;b&gt;상대적으로 적은 노드&lt;/b&gt;라는 표현은 테이블 구조에 대한 상대성을 의미하며, 실제로 변경이 없고 메모리가 여유 있는 경우 N^2 크기의 테이블을 통해 O(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;p data-ke-size=&quot;size16&quot;&gt;N 개의 자료를 전처리해 세그먼트 트리의 구조로 만들기 위해서는 깊이를 log2(N)로 가지는 이진 트리가 필요하기 때문에 2 ^ ceil( log2(N) ) + 1개의 크기를 가지며, 배열의 크기 * 4를 했을 때 항상 해당 식보다 크거나 같은 값이 나오기 때문에 메모리를 타이트하게 가져가지 않는다면 저렇게 여유를 주어도 됩니당. (4개일 땐 8, 5개일 땐 16개의 배열 개수 필요)&lt;/p&gt;
&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;b&gt;업데이트&lt;/b&gt;되는 과정, 트리를 이용해 &lt;b&gt;특정 구간의 값&lt;/b&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;style2&quot; /&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;1번 노드가 루트 노드가 되며, 모든 노드는 상위 노드의 범위의 절반을 표현. 즉 리프 노드들은 각자의 독립적인 값을 가지며, 루트 노드는 항상 전체 범위를 대표하는 값을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673636367007&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int array[n];
int segtree[1 &amp;lt;&amp;lt; (int)ceil(log2(n) + 1)];

void init(int node, int rangeS, int rangeE) {
	if (rangeS == rangeE) {	//	서브트리를 가지지 않는 리프노드는 독립적인 값을 가짐
    	segtree[node] = array[rangeS];
        return ;
    }
    int middle = rangeS + (rangeS + rangeE) / 2;
    
    init(node * 2, rangeS, middle);
    init(node * 2 + 1, middle + 1, rangeE);
    segtree[node] = 대충 comp(segtree[node * 2], segtree[node * 2 + 1]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재의 범위를 두 개의 범위로 분해한 후 하위 서브 트리들의 초기화가 완료되면 이를 통해 자기 자신의 대푯값을 설정함&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;업데이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범위를 절반씩 나누어가며 현재 범위에 수정하려는 인덱스가 포함되지 않는다면 연산 종료.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 요소를 나타내는 리프 노드에 도착했다면 해당 값을 수정 후, 호출된 함수들을 탈출하며 업데이트된 값으로 다시 연산함&lt;/p&gt;
&lt;pre id=&quot;code_1673974077806&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int child_update(int child_1, int child_2) {
	//	return max(TREE[child_1], TREE[child_2]);
    //	return min(TREE[child_1], TREE[child_2]);
    //	return sum(TREE[child_1], TREE[child_2]);
    //	etc ..
}

void update(int node, int rangeS, int rangeE, int idx, int afterValue) {
	if (rangeS &amp;gt; idx || idx &amp;gt; rangeE) return ;	//	찾으려는 값이 범위 내에 없으면 종료
    /**
     *	시작과 끝이 같은 상황, 찾으려는 인덱스의 값을 나타내는 리프노드에 도착했다면
     *	리프 노드의 값을 수정하고 재귀 호출 탈출
     */
    if (rangeS == rangeE) {
    	TREE[node] = afterValue;
        return ;
    }
    int child_1 = node * 2, child_2 = node * 2 + 1;	//	자식 노드
    int mid = rangeS + (rangeE - rangeS) / 2;
    update(child_1, rangeS, mid, idx, afterValue);
    update(child_2, mid + 1, rangeE, idx, afterValue);
    //	범위 값의 변경이 일어났으니 상위 노드 수정
    TREE[node] = child_update(child_1, child_2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;diff 값을 받아 호출 전 노드의 범위에 선반영 하는 등 다양한 바리에이션이 존재함&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;구간 값 인출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 호출은 찾으려는 시작 범위(from) - 끝 범위(to)와 현재 노드가 나타내는 범위 rangeS - rangeE에 따라 다음과 같은 케이스가 생김&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;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673975227175&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const int DEFAULT_VALUE = 0;

int child_compute(int child_1, int child_2) {
	//	return max(TREE[child_1], TREE[child_2]);
    //	return min(TREE[child_1], TREE[child_2]);
    //	return sum(TREE[child_1], TREE[child_2]);
    //	etc ..
}

int search(int node, int rangeS, int rangeE, int from, int to){
    if (to &amp;lt; rangeS || rangeE &amp;lt; from) return DEFAULT_VALUE;	//	#CASE 2
    if (rangeS &amp;lt;= from &amp;amp;&amp;amp; to &amp;lt;= rangeE) return TREE[node];	//	#CASE 1
    
    //	#CASE 3
    int child_1 = node * 2, child_2 = node * 2 + 1;
    int mid = rangeS + (rangeE - rangeS) / 2;
    return child_compute(	//	하위 두개의 노드를 검색해서 나온 값으로 반환 값 계산
    	search(child_1, rangeS, mid, from, to),
        search(child_2, mid + 1, rangeE, from, to)
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번에서는 찾으려는 범위 내에 해당 범위가 모두 들어있으므로 곧바로 값을 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번에서는 찾으려는 범위와 전혀 상관없는 범위이므로 곧바로 불필요한 연산 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 같은 경우에는 불필요하게 겹쳐있는 값을 반으로 쪼개 절반은 CASE1, 나머지 절반은 CASE2이 될 때까지 동일 연산을 반복해 필요한 범위의 값만 뽑아냄&lt;/p&gt;</description>
      <category>PS</category>
      <category>BOJ</category>
      <category>C++</category>
      <category>Segment Tree</category>
      <category>누적곱</category>
      <category>누적합</category>
      <category>백준</category>
      <category>세그먼트트리</category>
      <category>자료구조</category>
      <category>종만북</category>
      <category>쿼리</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/65</guid>
      <comments>https://youngmon.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8-%ED%8A%B8%EB%A6%AC-segment-tree#entry65comment</comments>
      <pubDate>Wed, 18 Jan 2023 02:34:43 +0900</pubDate>
    </item>
    <item>
      <title>도메인 사서 티스토리 연동하기</title>
      <link>https://youngmon.tistory.com/entry/%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%82%AC%EC%84%9C-%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 등록, 웹 호스팅을 지원하는 회사로, 국내에도 가비아, 후이즈 등 비슷한 업체가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 다른 일 할때 도메인을 살 일이 있었는데 해외 사이트 이용하면 국내에서 못 쓰는 줄 알고 거의 2만원? 주고 가비아에서 샀던 것 같음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멍청해서 생긴 비용이라 할 말은 없지만, 오히려 &quot;기존 구매 비용을 절감&quot;할 수 있는 기회가 주어졌다는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비아가 비싸서 안좋다고 하기엔 한글 지원 등 이점이 많고, 어차피 비싸봤자 2만원 정도임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 네임칩에서 도메인 0.17달러에 구입 가능, 파리바게트 소세지빵 가격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.21.54 AM.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6eLg8/btrVUy1pdyO/DF2kNpZUBWN30TcEqZKEfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6eLg8/btrVUy1pdyO/DF2kNpZUBWN30TcEqZKEfK/img.png&quot; data-alt=&quot;현재 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6eLg8/btrVUy1pdyO/DF2kNpZUBWN30TcEqZKEfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6eLg8%2FbtrVUy1pdyO%2FDF2kNpZUBWN30TcEqZKEfK%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;1919&quot; height=&quot;1022&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.21.54 AM.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1022&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;네임칩에 접속하면 일단 저런 화면이 뜨는데 원하는 도메인을 검색가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인을 구매 후 등록하려면 좌상단의 dashboard에 들어가서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.27.26 AM.png&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnEZGC/btrVStz2yGe/EhilHIFQhKrMNqMpkpy43K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnEZGC/btrVStz2yGe/EhilHIFQhKrMNqMpkpy43K/img.png&quot; data-alt=&quot;MANAGE 들어가서 Advanced DNS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnEZGC/btrVStz2yGe/EhilHIFQhKrMNqMpkpy43K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnEZGC%2FbtrVStz2yGe%2FEhilHIFQhKrMNqMpkpy43K%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;1115&quot; height=&quot;68&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.27.26 AM.png&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MANAGE 들어가서 Advanced DNS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.28.35 AM.png&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uU0ZM/btrVQOdqToG/tyJ2U1E5CW8Jzui2kWQXBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uU0ZM/btrVQOdqToG/tyJ2U1E5CW8Jzui2kWQXBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uU0ZM/btrVQOdqToG/tyJ2U1E5CW8Jzui2kWQXBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuU0ZM%2FbtrVQOdqToG%2FtyJ2U1E5CW8Jzui2kWQXBk%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;585&quot; height=&quot;128&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.28.35 AM.png&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CNAME을 통해 도메인을 alias해 내 도메인을 입력했을 때 들어올 수 있게 해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 네임에 관계 없이 전부 들어오게 해줬는데 blog.abc.com 또는 www.어쩌구 등 서브 도메인을 사용한다면 Host 부분을 수정해주면 된다.&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;style2&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.40.22 AM.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AypPT/btrVUxhapFV/tBfiUzJ6IpvXuvNbKQD210/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AypPT/btrVUxhapFV/tBfiUzJ6IpvXuvNbKQD210/img.png&quot; data-alt=&quot;블로그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AypPT/btrVUxhapFV/tBfiUzJ6IpvXuvNbKQD210/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAypPT%2FbtrVUxhapFV%2FtBfiUzJ6IpvXuvNbKQD210%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;274&quot; height=&quot;365&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.40.22 AM.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;블로그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.40.10 AM.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sYjcw/btrVSsuoR4P/liqXY3ckwskNYrXbuzFGcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sYjcw/btrVSsuoR4P/liqXY3ckwskNYrXbuzFGcK/img.png&quot; data-alt=&quot;SSL도 알아서 해준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sYjcw/btrVSsuoR4P/liqXY3ckwskNYrXbuzFGcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsYjcw%2FbtrVSsuoR4P%2FliqXY3ckwskNYrXbuzFGcK%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;904&quot; height=&quot;300&quot; data-filename=&quot;Screenshot 2023-01-11 at 1.40.10 AM.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSL도 알아서 해준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*.app 같은 경우 무조건 인증서 필요(https만 가능)해서 예전에 라즈베리파이에서 첨으로 openssl 써보고 했었는데, 티스토리에서 인증서도 관리해준다 굿〰️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 접속 인증서 발급 기다리면 잠시 후 바로 쓸 수 있다&lt;/p&gt;</description>
      <category>WEB</category>
      <category>dns</category>
      <category>Namecheap</category>
      <category>seo</category>
      <category>가비아</category>
      <category>검색어 노출</category>
      <category>검색엔진</category>
      <category>네임칩</category>
      <category>도메인</category>
      <category>애드센스</category>
      <category>애드핏</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/63</guid>
      <comments>https://youngmon.tistory.com/entry/%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%82%AC%EC%84%9C-%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0#entry63comment</comments>
      <pubDate>Wed, 11 Jan 2023 01:46:33 +0900</pubDate>
    </item>
    <item>
      <title>도메인이 생겼습니다.</title>
      <link>https://youngmon.tistory.com/notice/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;더 이상은 티스토리의 사내 벤처가 아닌 하청업체 정도로 봐도 무방할듯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEO 어찌 될지 모르겠는데 지금도 어차피 피씬 후기만 검색해서 들어오는데 더 나빠질 수가 있음? 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작년에 0.99달러 주고 산 도메인인데 애드핏으로 뽕 뽑기 고고〰️ ㅎㅎ&lt;/p&gt;</description>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/notice/62</guid>
      <pubDate>Wed, 11 Jan 2023 01:05:40 +0900</pubDate>
    </item>
    <item>
      <title>BOJ 2325) c++ 개코전쟁</title>
      <link>https://youngmon.tistory.com/entry/BOJ-2325-c-%EA%B0%9C%EC%BD%94%EC%A0%84%EC%9F%81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시간 제한 - 2s&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;메모리 제한 - 256MB&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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_0613.jpg&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;2074&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6BpB1/btrVaTEVTLw/iO3UFpG5rC3sGToKiFt1rk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6BpB1/btrVaTEVTLw/iO3UFpG5rC3sGToKiFt1rk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6BpB1/btrVaTEVTLw/iO3UFpG5rC3sGToKiFt1rk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6BpB1%2FbtrVaTEVTLw%2FiO3UFpG5rC3sGToKiFt1rk%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;1640&quot; height=&quot;2074&quot; data-filename=&quot;IMG_0613.jpg&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;2074&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 최단경로가 최대가 되기 위해서는 최단경로를 끊어야한다. 최단경로가 아닌 간선을 끊어봐야 최단경로는 그대로이기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 최단경로를 구해, 해당 경로에서 거치는 노드를 하나씩 끊고, 다시 최단경로를 구하는 방식으로 최대 값을 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 최단 경로가 여러 개일 때, 현재의 최단 경로만 확인하는게 의미가 있는지?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0634.jpg&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSBRzA/btrU8EBqbsI/HQHrOz5jln1K98Bu24IjZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSBRzA/btrU8EBqbsI/HQHrOz5jln1K98Bu24IjZ1/img.jpg&quot; data-alt=&quot;그림 1) 최단거리가 5인 여러가지 간선이 있는 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSBRzA/btrU8EBqbsI/HQHrOz5jln1K98Bu24IjZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSBRzA%2FbtrU8EBqbsI%2FHQHrOz5jln1K98Bu24IjZ1%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;576&quot; height=&quot;317&quot; data-filename=&quot;IMG_0634.jpg&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 1) 최단거리가 5인 여러가지 간선이 있는 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3.1) 동일한 최단경로가 없을 때(A-&amp;gt;B)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - A-&amp;gt;B가 최단경로이므로, A-&amp;gt;B를 끊으면 A-&amp;gt;C-&amp;gt;B로 최단경로가 1 늘어나며 A-C, C-&amp;gt;B 등 최단경로 이외의 간선을 끊어도 결과는 A-&amp;gt;B로 같은 걸 확인할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3.2) 동일한 최단 경로가 중복되지 않는 경로로 존재할 때(A-&amp;gt;G)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - A-&amp;gt;B-&amp;gt;D-&amp;gt;G 또는 A-&amp;gt;C-&amp;gt;E-&amp;gt;D-&amp;gt;G, A-&amp;gt;F-&amp;gt;G의 최단거리가 같음, 이 상황에서 어떤 간선을 끊던 기존 최단 경로는 변하지 않으므로 하나의 최단 경로를 통해 확인 가능(최단거리1, 최단거리2 =&amp;gt; 최단거리1(이제 아님), 최단거리2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3.3) 동일한 최단 경로가 중복되는 경로로 존재할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - A-&amp;gt;D-&amp;gt;G까지 경로에서 중복되지 않는 A-&amp;gt;D 구간은 3.2의 방식으로 생각해 A-&amp;gt;D의 어느 간선을 끊던 결과가 같음이 증명됨. 중복되는 D-&amp;gt;G 구간이 의미있는 간선제거가 이루어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 만일 D-&amp;gt;G의 제거 이후에도 최단 경로가 같다면 어떤 간선을 끊던 결과가 변하지 않음이 증명되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - D-&amp;gt;G 제거 이후에 최단 경로가 변한다면 의미있는 간선 제거가 이루어진 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 여러 최단경로가 존재할 때, 제거해야하는 간선은 여러 최단경로 사이에 중복되어 존재하거나, 제거할 필요가 없기 때문에 최단 경로가 여러 개라도 하나의 최단경로에서 결과를 얻을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;정점의 갯수 N, 간선의 갯수 M이 입력됨&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차원 배열,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작점부터 특정 정점까지의 최단거리를 기록할 Dp배열,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최단경로를 구하는 동안, 이전의 출발 지점을 기록할 Path map(map[now] = prev_node 형태로 저장)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;로직&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 최단 거리를 구하고, 최단거리에 속하는 경로를 순회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 최단거리 사이의 간선을 하나씩 제거하며 최단거리를 구해 차이 확인&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-ad-creative-wrap=&quot;outer&quot;&gt;
&lt;div data-ad-creative-wrap=&quot;inner&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;pre id=&quot;code_1663933155553&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;map&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace		std;
using pii=pair&amp;lt;int,int&amp;gt;;
using edg=pair&amp;lt;int,pii&amp;gt;;

vector&amp;lt;vector&amp;lt;pii&amp;gt;&amp;gt;	grp;
vector&amp;lt;int&amp;gt;	 		 dp;
map&amp;lt;int, int&amp;gt;		path;
int			n, m, x, y, z, q = -1, w = -1;

void dijkstra() {
	priority_queue&amp;lt;edg, vector&amp;lt;edg&amp;gt;, greater&amp;lt;edg&amp;gt;&amp;gt; pq;	//	pii &amp;lt; cost, &amp;lt; prev, next &amp;gt; &amp;gt;

	pq.push(edg(0, pii(1, 1)));
	while (!pq.empty()) {
		const pii&amp;amp; edge = pq.top().second;
		const int cost = pq.top().first, prev = edge.first, now = edge.second;
		pq.pop();

		if (dp[now] &amp;gt; cost) {
			dp[now] = cost;
			path[now] = prev;
			for (auto&amp;amp; beg : grp[now]) {
            	//	제거된 간선이라면 스킵
				if ((beg.first == q &amp;amp;&amp;amp; now == w) || (beg.first == w &amp;amp;&amp;amp; now == q)) continue ;
				if (dp[beg.first] &amp;gt; cost + beg.second) pq.push(edg(cost + beg.second, pii(now, beg.first)));
			}
		}
	}
}

int answer() {
	vector&amp;lt;int&amp;gt; paths;
	fill(dp.begin(), dp.end(), 987654321);
	dijkstra();
	int i = n;
	while (true) {	//	맵의 경로를 배열에 담아 사용
		paths.push_back(i);
		if (i == path[i]) break ;
		i = path[i];
	}

	int ret = dp[n];
	for (int i = 0; i &amp;lt; paths.size() - 1; i++) {
		fill(dp.begin(), dp.end(), 987654321);
		q = paths[i]; w = paths[i + 1];
		dijkstra();
		ret = max(ret, dp[n]);
	}
	return ret;
}

int main() {

	cin.tie(0); cout.tie(0);
	ios::sync_with_stdio(0);

	cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
	grp.resize(n + 1);
	dp.resize(n + 1);

	while (m--) {
		cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y &amp;gt;&amp;gt; z;
		grp[x].push_back(pii(y, z));
		grp[y].push_back(pii(x, z));
	}
	cout &amp;lt;&amp;lt; answer() &amp;lt;&amp;lt; endl;
	return 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 간선을 전부 제거하며 확인 시, O(간선의 수 * (V + E)logV)이나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최단 경로를 구해 필요한 간선만 확인 시 O(정점의 수 * (V + E)logV)이므로 M(V+E)logV =&amp;gt; N(V+E)logV로 최대 1000배 시간복잡도 감소&lt;/p&gt;</description>
      <category>PS</category>
      <category>BOJ</category>
      <category>C++</category>
      <category>DP</category>
      <category>개코전쟁</category>
      <category>그래프</category>
      <category>다이나믹프로그래밍</category>
      <category>다익스트라</category>
      <category>백준</category>
      <category>우선순위 큐</category>
      <category>최단경로</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/61</guid>
      <comments>https://youngmon.tistory.com/entry/BOJ-2325-c-%EA%B0%9C%EC%BD%94%EC%A0%84%EC%9F%81#entry61comment</comments>
      <pubDate>Mon, 2 Jan 2023 14:21:12 +0900</pubDate>
    </item>
    <item>
      <title>BOJ 2629) c++ 양팔 저울</title>
      <link>https://youngmon.tistory.com/entry/BOJ-2629-c-%EC%96%91%ED%8C%94-%EC%A0%80%EC%9A%B8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시간 제한 - 1s&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;메모리 제한 - 128MB&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&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-filename=&quot;Screenshot 2022-12-23 at 7.32.13 PM.png&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;1354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0TNFp/btrUuxbfjGV/sBRmQtt60KfcqPKuOBoXzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0TNFp/btrUuxbfjGV/sBRmQtt60KfcqPKuOBoXzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0TNFp/btrUuxbfjGV/sBRmQtt60KfcqPKuOBoXzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0TNFp%2FbtrUuxbfjGV%2FsBRmQtt60KfcqPKuOBoXzK%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;2088&quot; height=&quot;1354&quot; data-filename=&quot;Screenshot 2022-12-23 at 7.32.13 PM.png&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;1354&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 구슬과 추를 활용해 무게를 재는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1.1) 그림 1을 식으로 나타내면 구슬 + 추a + 추b == 추x + 추y ?로 표현 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1.2) 그림 2를 식으로 나타내면 구슬 == 추x + 추y ?로 표현 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; 방정식의 성질을 이용해 1.1의 식을 구슬 == 추x + 추y - 추a - 추b와 같이 나타냄으로 두 식을 같게 생각할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 1번의 추1부터 추n까지의 조합을 이용해 만들 수 있는 무게 중 구슬의 무게가 있으면 비교 가능하다고 판단 가능&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;입력&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추의 수 N,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N개의 추&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구슬의 수 M&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M개의 구슬&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;dp 테이블을 만들까했지만 추를 이용해 만들 수 있는 무게의 집합을 표현하기에 set 자료구조가 좋다고 판단함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추n-1개의 set을 사용해 추n개의 set을 만들기위해 set&amp;lt;int&amp;gt;형 배열을 사용(set&amp;lt;int&amp;gt;[n])&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;로직&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 추가 아무것도 없을 경우 표현 가능한 수는 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 첫번째 추를 사용해 조합할 경우, 가능한 경우는 0 - 첫번째 추의 무게, 0 + 첫번째 추의 무게와 해당 추를 사용하지 않을 경우의 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. n-1번째 조합을 이용해 n번째 조합을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; 구슬 = x - y일 수 있으나, 무게가 음수일 수 없기 때문에 조합되는 값을 절대 값으로 계산 시 0 ~ 15,000 사이의 연산 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; 로직 상 3^n 의 시간 복잡도를 가지나, set의 특성 상 중복되는 값일 경우 insert가 이루어지지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 최대 15000 * n번의 연산 수행&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-ad-creative-wrap=&quot;outer&quot;&gt;
&lt;div data-ad-creative-wrap=&quot;inner&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;pre id=&quot;code_1663933155553&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;set&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int main() {
	int n, g, input;

	cin &amp;gt;&amp;gt; n;
	vector&amp;lt;set&amp;lt;int&amp;gt; &amp;gt;	setvec(n + 1);
	setvec[0].insert(0);

	for (int i = 1; i &amp;lt;= n; ++i) {
		cin &amp;gt;&amp;gt; input;
		for (auto&amp;amp; it : setvec[i - 1]) {
			setvec[i].insert(it);		// 해당 추를 사용하지 않을 경우
			setvec[i].insert(it + input);	// 해당 추를 구슬의 반대편에 둘 경우
			setvec[i].insert(abs(it - input));	// 해당 추를 구슬과 함께 올릴 경우
		}
	}
	cin &amp;gt;&amp;gt; g;
	while (g--) {
		cin &amp;gt;&amp;gt; input;
		if (setvec.back().find(input) == setvec.back().end())
			cout &amp;lt;&amp;lt; &quot;N &quot;;	//	구슬의 무게가 만들어질 수 있는 조합 중에 있는지
		else cout &amp;lt;&amp;lt; &quot;Y &quot;;
	}cout &amp;lt;&amp;lt; endl;
	return 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(3^n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 냅색처럼 풀 수 있었으나, 자료구조도 좀 다르게 생각하고 해서 재밌게 풀었따 ㅋ&lt;/p&gt;</description>
      <category>PS</category>
      <category>C++</category>
      <category>DP</category>
      <category>PS</category>
      <category>set</category>
      <category>냅색</category>
      <category>다이나믹프로그래밍</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>양팔저울</category>
      <category>조합</category>
      <author>영모니</author>
      <guid isPermaLink="true">https://youngmon.tistory.com/60</guid>
      <comments>https://youngmon.tistory.com/entry/BOJ-2629-c-%EC%96%91%ED%8C%94-%EC%A0%80%EC%9A%B8#entry60comment</comments>
      <pubDate>Fri, 23 Dec 2022 20:37:43 +0900</pubDate>
    </item>
  </channel>
</rss>