<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>보조기억장치</title>
    <link>https://hand-mk.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 08:03:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hand-mk</managingEditor>
    <image>
      <title>보조기억장치</title>
      <url>https://tistory1.daumcdn.net/tistory/7472780/attach/2b0eccad3b424e6e8cdb9796187f3f42</url>
      <link>https://hand-mk.tistory.com</link>
    </image>
    <item>
      <title>[programmers] 의상 - 해시, 조합론</title>
      <link>https://hand-mk.tistory.com/33</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&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://school.programmers.co.kr/learn/courses/30/lessons/42578&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42578&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780979112170&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42578&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zPMBN/dJMb85vW2UK/kvzZ9fvp8jaqU8xukJmcC1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/c3F5uh/dJMb86n5CCU/EVoYl9iCD8m5mJNGC6AUU1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42578&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42578&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zPMBN/dJMb85vW2UK/kvzZ9fvp8jaqU8xukJmcC1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/c3F5uh/dJMb86n5CCU/EVoYl9iCD8m5mJNGC6AUU1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 본론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제의 핵심은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 옷 여러벌을 같은 종류에서 고르면 안됨 (중복 x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 1, 2, ... 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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 필자는 다음과 같이 구조를 짜보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) n과 r 을 파라미터로 갖는 조합 함수 `comb()` 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 입력 clothes 배열 for 문 조회 -&amp;gt; HashMap 카테고리 별 count 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) 1 ~ 카테고리 종류수 (HashMap.size()) 만큼 for 문 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(3.1.) `comb(총개수, i)` 결과에 합산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(3.2.)&amp;nbsp; HashMap value &amp;gt; 1 이고,&amp;nbsp; `comb(value, i)` 를 결과에서 뺌 - 같은 종류에서의 i 개 선택 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(4) return 결과&lt;/p&gt;
&lt;pre id=&quot;code_1780994848364&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 0;
        HashMap&amp;lt;String, Integer&amp;gt; hm = new HashMap&amp;lt;&amp;gt;();
        
        for (String[] arr : clothes){
            String kind = arr[1];
            int value = hm.getOrDefault(kind, 0);
            
            if (value == 0){
                hm.put(kind, 1);
            }else{
                int updated = value + 1;
                hm.put(kind, updated);    
            }
            
        }
        
        // 모든 옷 개수 산출
        int total = 0;
        
        for (int value : hm.values()){
            total += value;
        }
        
        // 종류 총 개수 산출
        int kindAmt = hm.size();
        
        // total 중에 1 -&amp;gt; 총 종류수까지 선택하는 조합 합산 
        for (int i=1; i&amp;lt;= kindAmt; i++){
            
            // 1개만 선택할 땐 조합 더하기
            if (i==1){
                answer += comb(total, i);
            } 
            
            // 1 이상 일 때는 value 가 1이상 (중복 가능성 있는 애들) 빼기
            else{
                answer += comb(total, i);
                
                for (int value : hm.values()){
                    if (value == 1 || value &amp;lt; i) continue;
                    
                    answer -= comb(value, i);
                }
            }
        }
                
        return answer;
    }
    
    public int comb(int n, int r){
        long child = 1; long momA = 1; long momB = 1;
        
        for (int i=n; i&amp;gt;0; i--){
            child *= i;
        }
        
        for (int j=r; j&amp;gt;0; j--){
            momA *= j;
        }
        
        for (int k=n-r; k&amp;gt;0; k--){
            momB *= k;
        }
        
        int result = (int) (child / (momA * momB));
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 로직에선 다음 케이스가 반영되지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i = 3 일때, 동일 종류 2개 + 다른 종류 1개 케이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. A | B | C -&amp;gt; A1, A2, C1 (x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2 | 2 | 2&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조합론을 활용한 접근법은 옳았으나, 뽑는 개수(r) 별로 더하는 방법이 적절하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 내에서 의류 종류 별로 독립적인 경우의 수 이기 때문에, 각 종류 별 경우의 수를 곱해주면 0개 ~ 최대 종류수 까지 뽑는 모든 경우의 수가 나오게 된다. 여기에 모든 종류에서 안뽑히는 경우를 한번 빼주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1780996002965&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap&amp;lt;String, Integer&amp;gt; hm = new HashMap&amp;lt;&amp;gt;();
        
        for (String[] arr : clothes){
            String kind = arr[1];
            int value = hm.getOrDefault(kind, 0);
            
            if (value == 0){
                hm.put(kind, 1);
            }else{
                int updated = value + 1;
                hm.put(kind, updated);    
            }
            
        }
        
        for (int value : hm.values()){
            answer *= value + 1;
        }
                
        return answer -1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘 문제를 풀 때마다 처음 설계에서 부분 부분의 테스트 케이스가 틀릴 경우 반례만 찾게 되는거 같다. 우연히 맞아 떨어지는 설계를 하진 않았는지 검토하는 습관을 들여야 할 것 같다.&lt;/p&gt;</description>
      <category>programming/algorithm</category>
      <category>조합론</category>
      <category>해시</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/33</guid>
      <comments>https://hand-mk.tistory.com/33#entry33comment</comments>
      <pubDate>Tue, 9 Jun 2026 18:13:59 +0900</pubDate>
    </item>
    <item>
      <title>[TS] 실시간 채팅 시 권한 관리 개선</title>
      <link>https://hand-mk.tistory.com/32</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;1. 서론&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;채팅 기능 개발을 하던 도중 문득 그런 생각이 들었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;현재 플로우는 사용자가 공방에 제작 의뢰를 하면 DB에 채팅방이 생성되고 생성된 고유 id 값을 STOMP 채팅 시의 구독경로로 넣어야 한다.&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;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;그럼 채팅을 보낼때마다 DB에서 조회를 해야 하는가?&lt;/li&gt;
&lt;li&gt;그럼 채팅을 보낼때마다 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;2. 본론&lt;/h3&gt;
&lt;h3 id=&quot;1번-해결&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1번 해결&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일단 1번은 확실히 아닌 것 같다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;DB 조회 연산이 많아지면 서버가 느려지는것 정도는 어느정도 생각했고, 지금이야 테스트 하고 있어서 돌아가겠지만 사용자가 4명일 때 채팅만 해도 한번 채팅 주고 받을 때 조회 4번, 저장 4번 총 8번이 생긴다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나의 생각은 이랬다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'소켓을 연결할 때 커스텀 헤더에서 토큰 값을 추출하는데, 어짜피 채팅을 한번 하고 끊고 한번 하고 끊을 게 아니라면 소켓 연결 시에만 DB 조회를 해서 세션에 {user : ok} 이런식으로 저장해두고 세션에 user 키 유무만 확인하면 되지 않을까?'&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;StompHandler.java&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dart&quot; style=&quot;background-color: #fbfcfd; color: #24292e; text-align: left;&quot;&gt;&lt;code&gt;@Slf4j
@RequiredArgsConstructor
@Component
@Order(Ordered.HIGHEST_PRECEDENCE + 99) // 스프링의 빈 순서를 지정하는 애노테이션으로, StompHandler 의 우선순위를 설정한다.
public class StompHandler implements ChannelInterceptor {
    private final JwtTokenProvider jwtTokenProvider;

    /**
     * preSend 는 메시지가 채널로 전송되기 전에 호출되는 메소드.
     * @param message payload + Headers
     * @param channel
     * @return
     */
    @Override
    public Message&amp;lt;?&amp;gt; preSend(Message&amp;lt;?&amp;gt; message, MessageChannel channel) {
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
        // 메세지의 STOMP 헤더를 쉽게 접근하기 위한 유틸리티 클래스

        // websocket 연결시 헤더의 jwt token 유효성 검증
        if(StompCommand.CONNECT == accessor.getCommand()){
            log.info(&quot;[stomphandler] extract header&quot;);
            String token = accessor.getFirstNativeHeader(&quot;Authorization&quot;);
            log.info(&quot;[stomphandler] token : {}&quot;,token);
            if(!token.isEmpty()){
                token = token.replace(&quot;Bearer &quot;,&quot;&quot;).trim();
                String nickName = jwtTokenProvider.getUserNickName(token);
                log.info(&quot;[stomphandler] nickname : {}&quot;,nickName);

                accessor.getSessionAttributes().put(&quot;senderNickname&quot;, nickName); // 기존 헤더에 nickname 정보를 추가해 저장한다.
            }else{
                throw new TokenNotFoundException(&quot;토큰이 필요합니다.&quot;);
            }

        }
        return message;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;accessor.getSessionAttributes().put(&quot;senderNickname&quot;, nickName);&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 부분에서 소켓 연결을 할 때 STOMP 세션 속성에 메세지 송신자의 닉네임을 저장해둔다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ChatController.java&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #fbfcfd; color: #24292e; text-align: left;&quot;&gt;&lt;code&gt;@MessageMapping(&quot;/gagu-chat/{roomNumber}&quot;) // mapping ex)/pub/gagu-chat/{roomNumber}
    public void sendMessage(RequestChatContentsDto message,
                                         SimpMessageHeaderAccessor accessor,
                                         @DestinationVariable Long roomNumber) throws Exception {

        log.info(&quot;[chat] room id : {}&quot;,roomNumber);

        String nickname = (String) accessor.getSessionAttributes().get(&quot;senderNickname&quot;);
        log.info(&quot;[chat] check memeber....&quot;);
        if (nickname == null) {
            throw new IllegalArgumentException(&quot;세션에 닉네임이 없습니다.&quot;);
        }

        Long sessionRoomId = (Long) accessor.getSessionAttributes().get(&quot;chatRoomId&quot;);

        if(sessionRoomId==null){ // 처음 메세지 보내는 경우
            log.info(&quot;[chat] chatting session is empty room id : {}, nickname : {}&quot;, roomNumber,nickname);
            User user = userRepository.findByNickName(nickname);
            if(user == null){
                throw new NotFoundUserException();
            }
            Optional&amp;lt;ChatRoom&amp;gt; foundChatRoomList = chatRoomRepository.findById(roomNumber);
            if(!foundChatRoomList.isEmpty()){
                ChatRoom chatRoom = foundChatRoomList.get();
                if(checkMember(chatRoom, user)){ // 채팅방 권한이 있다면
                    accessor.getSessionAttributes().putIfAbsent(&quot;chatRoomId&quot;, roomNumber);// 세션에 저장되어 있지 않을때, 세션에 저장
                    log.info(&quot;[chat] successfully put room id to session&quot;);
                }
                log.info(&quot;[chat] complete check member&quot;);
                Thread.sleep(1000); // 비동기적으로 메시지를 처리하기 위해서 1초 지연(옵션)
                log.info(&quot;[chat] question : {}&quot;, message.getContents());
                ResponseChatDto responseChatDto = chatService.sendContents(message,roomNumber,nickname);
                template.convertAndSend(&quot;/sub/chatroom/&quot;+roomNumber,responseChatDto); // 구독하고 있는 채팅방에 전송
            }else{
                throw new ChatRoomNotFoundException();
            }
        }else{
            log.info(&quot;[chat] complete check member&quot;);
            Thread.sleep(1000); // 비동기적으로 메시지를 처리하기 위해서 1초 지연(옵션)
            log.info(&quot;[chat] question : {}&quot;, message.getContents());
            ResponseChatDto responseChatDto = chatService.sendContents(message,roomNumber,nickname);
            template.convertAndSend(&quot;/sub/chatroom/&quot;+roomNumber,responseChatDto); // 구독하고 있는 채팅방에 전송
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;accessor.getSessionAttributes().get(&quot;senderNickname&quot;);&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 통해 소켓 연결 시 미리 넣어 두었던 송신자 닉네임을 확인한다.&lt;/li&gt;
&lt;li&gt;메세지를 처음 보내는 경우에는 DB 조회를 해서 메세지 송신자가 채팅방에 속해 있는지 확인한다. 만약, 정상적으로 확인되면 {nickname : 방번호} 형식으로 세션에 넣고 만약 이미 세션에 닉네임을 키로 가진 채팅방 번호가 있을 때 DB 조회 없이 메세지를 전송한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 관리 하니 처음보다 훨씬 DB 조회 연산이 줄었다!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #212529;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/MinkeySon/GAGU-SERVER&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/MinkeySon/GAGU-SERVER&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming/ts</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/32</guid>
      <comments>https://hand-mk.tistory.com/32#entry32comment</comments>
      <pubDate>Fri, 17 Apr 2026 00:39:01 +0900</pubDate>
    </item>
    <item>
      <title>[TS] 3D-랜더링 시 텍스처 파일 분리</title>
      <link>https://hand-mk.tistory.com/31</link>
      <description>&lt;h2 id=&quot;-에러-발견&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;에러 발견&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이전에 2D 이미지 생성 후 3D glb 파일로 변환하는 기능을 구현했는데, 앱단에서 사용하는 라이브러리가 gltf 형식을 읽을 수 있어, 파일 형식을 변경하는데 텍스처 파일이 분리돼서 생성됐다. 때문에 색깔을 빼놓고 렌더링 되는 예외가 발생하였다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jcj7o/dJMcag6f3WI/7mk6JIhXsF7qkCwQM8um1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jcj7o/dJMcag6f3WI/7mk6JIhXsF7qkCwQM8um1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jcj7o/dJMcag6f3WI/7mk6JIhXsF7qkCwQM8um1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJcj7o%2FdJMcag6f3WI%2F7mk6JIhXsF7qkCwQM8um1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;668&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;668&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;h2 id=&quot;-해결&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;사용한 라이브러리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #12b886; text-align: start;&quot; href=&quot;https://products.aspose.com/3d/java/conversion/glb-to-gltf/&quot;&gt;Aspose&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에서 참고하였고, 사실 이전에 obj 형식으로도 생성해서 연동을 시도해본 적이 있다. 해당 라이브러리에 obj 형식으로도 변환이 가능하니 필요에 따라 공식문서를 참고하면 좋을 듯 싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dependency&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;Dependency는 Aspose repository 에서 직접 불러와야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;xml&quot; style=&quot;background-color: #fbfcfd; color: #212529; text-align: start;&quot;&gt;&lt;code&gt;&amp;lt;repository&amp;gt;
&amp;lt;id&amp;gt;AsposeJavaAPI&amp;lt;/id&amp;gt;
&amp;lt;name&amp;gt;Aspose Java API&amp;lt;/name&amp;gt;
&amp;lt;url&amp;gt;https://repository.aspose.com/repo/&amp;lt;/url&amp;gt;
&amp;lt;/repository&amp;gt;

&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;com.aspose&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;aspose-3d&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;version of aspose-3d API&amp;lt;/version&amp;gt;
&amp;lt;classifier&amp;gt;jdk17&amp;lt;/classifier&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용하는 방법은 그닥 어렵진 않았는데,&lt;/p&gt;
&lt;pre class=&quot;abnf&quot; style=&quot;background-color: #fbfcfd; color: #212529; text-align: start;&quot;&gt;&lt;code&gt;import com.aspose.threed;

Scene scene = Scene.fromFile(&quot;3d.glb&quot;);
scene.save(&quot;Output.3ds&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제는 이렇게 save() 메서드만 사용하게 되면 텍스처 파일이 분리돼서 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/17DQb/dJMcagZsWip/gZRPaJqMXCpdIysOzOpmlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/17DQb/dJMcagZsWip/gZRPaJqMXCpdIysOzOpmlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/17DQb/dJMcagZsWip/gZRPaJqMXCpdIysOzOpmlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F17DQb%2FdJMcagZsWip%2FgZRPaJqMXCpdIysOzOpmlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;88&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 buffer.bin 이라는 이름으로 생성되는데, 실제로 gltf 파일을 웹 viewer 로 보려고 하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt2wPr/dJMcaaLKcRD/znkKGOONd8oKWyw5dLvE5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt2wPr/dJMcaaLKcRD/znkKGOONd8oKWyw5dLvE5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt2wPr/dJMcaaLKcRD/znkKGOONd8oKWyw5dLvE5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt2wPr%2FdJMcaaLKcRD%2FznkKGOONd8oKWyw5dLvE5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;834&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;THREE.GLTFLoader: Failed to load buffer &quot;buffer.bin&quot;. 라는 문구로 읽을 수 없다고 한다.&lt;br /&gt;3D 를 클라이언트에서 보이게 할 때 Three.js 를 사용하게 되는데 이때 3D 랜더링 된 이미지와 텍스처 파일(색상, 각도, 그림자 등의 정보가 있는 파일)이 꼭 필요하다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다행히 이미지 파일과 텍스처 파일을 합쳐서 생성하는 옵션을 줄 수 있는 GLTFSaveOptions 객체가 있었다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #fbfcfd; color: #212529; text-align: start;&quot;&gt;&lt;code&gt;GLTFSaveOptions opt = new GLTFSaveOptions(FileContentType.ASCII);

opt.EmbedAssets = true;

scene.Save(&quot;d:\\test.gltf&quot;, opt);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 생성 하게 되면 텍스처 정보를 담은 gltf 파일을 생성할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejHU6z/dJMcaiwcBYn/8KKT8xhsy6FyzZ572kMXS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejHU6z/dJMcaiwcBYn/8KKT8xhsy6FyzZ572kMXS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejHU6z/dJMcaiwcBYn/8KKT8xhsy6FyzZ572kMXS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejHU6z%2FdJMcaiwcBYn%2F8KKT8xhsy6FyzZ572kMXS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;491&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTqX7/dJMcafM4KNW/fBwfpcxWpkqqgVbnor4b30/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTqX7/dJMcafM4KNW/fBwfpcxWpkqqgVbnor4b30/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTqX7/dJMcafM4KNW/fBwfpcxWpkqqgVbnor4b30/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTqX7%2FdJMcafM4KNW%2FfBwfpcxWpkqqgVbnor4b30%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;1080&quot; height=&quot;2259&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/p&gt;</description>
      <category>programming/ts</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/31</guid>
      <comments>https://hand-mk.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 16 Apr 2026 23:35:18 +0900</pubDate>
    </item>
    <item>
      <title>[항공] 기상 (METAR/SPECI, TAF) 공부</title>
      <link>https://hand-mk.tistory.com/30</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;METAR vs TAF?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 METAR TAF&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;METAR&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;TAF&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;현재 관측된 실황 보고&lt;/td&gt;
&lt;td&gt;미래 기상 예보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;발행 주기&lt;/td&gt;
&lt;td&gt;1시간(또는 30분)마다&lt;/td&gt;
&lt;td&gt;하루 4회(6시간 간격)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유효 기간&lt;/td&gt;
&lt;td&gt;발행 시점의 기상&lt;/td&gt;
&lt;td&gt;보통 24~30시간 동안의 예보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;td&gt;실제 관측값&lt;/td&gt;
&lt;td&gt;예보(예상)값, 변화 그룹 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;적용 범위&lt;/td&gt;
&lt;td&gt;공항(ARP) 중심&lt;/td&gt;
&lt;td&gt;공항 및 반경 8km 이내&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;METAR RKJY 200400Z 18007KT 150V240 9999 BKN025 27/21 Q1010
          NOSIG=
          
METAR RKJJ 200400Z 23006KT 9999 BKN025 27/24 Q1009 RMK CIG025
          SLP096 8/500 9/700=          

METAR RKTU 200400Z 26010G20KT 9999 SCT030 28/22 Q1008 RMK
          SLP077 8/500 9/300=          
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;METAR/SPECI&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;{보고 형식} (METAR or SPECI) - [0]&lt;/h2&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;METAR
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;METAR&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;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SPECI&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;METAR 보고 후 특별한 보고 상황 야기된 기상일 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;{ICAO 비행장 코드} - [1]&lt;/h2&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;RKJJ
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;{보고 일자 및 시간} - [2]&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;200700Z
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;utc 기준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 20일 07 시 00분 UTC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;{풍향}{풍속}{단위} {변화 풍향}&lt;/h2&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;18005KT // 바람이 180도(남쪽)에서 5노트로 불고 있음.

18007KT 150V240 // 바람이 180도에서 7노트로 불고 있는데, 풍향이 150도에서 240도 사이에서 가변적으로 변화함.

18007G20KT 150V240 // 바람이 180도에서 7노트로 불고, 순간 최대 풍속(돌풍)은 20노트까지 기록됨. 풍향은 150도~240도 사이에서 가변적.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풍향/풍속(Wind)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풍향 및 풍속을 5자리 숫자로 표현&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풍향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;북쪽 (North) 기준 10단위 표시 [:3]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;180 = 180˚&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풍속(kts 단위)&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;18005KT
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;북쪽 기준 + 180˚ &amp;rArr; 남쪽에서 바람이 불어 오고 있음.&lt;/li&gt;
&lt;li&gt;일반적인 풍속 5kts 로 불고 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;18007KT 150V240
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시계 방향으로 변화 즉, 150˚는 남동쪽&lt;/li&gt;
&lt;li&gt;북쪽 기준 + 180˚ &amp;rArr; 남쪽에서 바람이 불어 오고 있음.&lt;/li&gt;
&lt;li&gt;V 가변 바람.&lt;/li&gt;
&lt;li&gt;북쪽에서 (180˚) 7kts 불고 있고, 남동쪽(150˚)에서 남서쪽(240˚) 로 가변적으로 바람이 분다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;18007G20KT 150V240
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lsquo;G&amp;lsquo; 는 돌풍(Gust)&lt;/li&gt;
&lt;li&gt;북쪽에서 (180˚) 7kts 불고 있고, 순간 최대 풍속은 20kts 이다. 남동쪽(150˚)에서 남서쪽(240˚) 로 가변적으로 바람이 분다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VRB03KT
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VRB : 풍향이 일정하지 않을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VRB05G12KT&lt;/li&gt;
&lt;li&gt;P99KT
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;강속일 때,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;{시정}&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대기 중에서 물체를 육안으로 식별할 수 있는 최대의 수평 거리&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;9999

또는

CAVOK - 시정이 10km 이상이고, 저층운이나 중요한 기상현상이 없음을 의미
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시정치가 10km 이상인 경우 : ex) 9999 또는 CAVOK&lt;/li&gt;
&lt;li&gt;시정치가 5000m 이상 10km 이하인 경우 : 1000m 단위 ex)3000&lt;/li&gt;
&lt;li&gt;시정치가 800m 이상 5000m 미만인 경우 : 100m 단위 ex) 800&lt;/li&gt;
&lt;li&gt;시정이 800m 이하인 경우 : 50m 단위로 사용&lt;/li&gt;
&lt;li&gt;SM : ex) 5SM 5마일&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;{기압}&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q1013 or A2992 (Q 뒤에 숫자 4자리 또는 A 뒤에 숫자 4자리)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Q 고도 수정치 : QNH/기압 1013hpa&lt;/li&gt;
&lt;li&gt;A altimeter setting : 29.92 inches&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;{구름 양}&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 200px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;약어&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미(영문)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미(한글)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;SKC&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Sky Clear&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;하늘에 구름 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;FEW&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Few&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;매우 조금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;FEW&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Scattered&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;조금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;SCT&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Broken&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;약간 흩어짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;SCT&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;약간 흩어짐&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;약간 흩어짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;BKN&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;대부분 흐림&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;대부분 흐림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;BKN&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;대부분 흐림&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;대부분 흐림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;OVC&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;거의 다 덮임&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;거의 다 덮임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;OVC&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;완전히 덮임&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;완전히 덮임 (흐림)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;VV&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;시계 제로&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;시계 제로&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RMK + {보충정보}&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;- METAR RKTU 290800Z 31009KT 6000 -TSRA FEW018CB BKN060 23/16 Q1012 
RMK CIG060 SLP123 TS B00 SW 8/300 9/700=

- METAR RKNW 290800Z 02005KT 9999 SCT060 27/12 A2989 
RMK SLP116 8/500 9/400= 

- METAR RKTN 290800Z 18004KT 9999 BKN050 BKN100 24/15 Q1012 
RMK CIG050 SLP126 8/520 9/510=

- METAR RKJK 290755Z 33014KT 5SM HZ SCT050 24/13 A2992 
RMK AO2A SLPNO T02350128 $=

- METAR RKJK 300655Z 28010KT 7SM CLR 21/13 A2988 
RMK AO2A SLPNO T02130129 $=
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NSW : 중요 일기 현상이 종료 될 때&lt;/li&gt;
&lt;li&gt;NSC : 시정만 CAVOK 조건이 안될 경우&lt;/li&gt;
&lt;li&gt;WR : 활주로가 젖어 있는 상태&lt;/li&gt;
&lt;li&gt;SLR : 군데군데 눈이 녹아 물이 괴어 있는 상태&lt;/li&gt;
&lt;li&gt;LSR : 눈이 엷게 쌓여 있음&lt;/li&gt;
&lt;li&gt;PSR : 눈이 완전히 덮여 있음&lt;/li&gt;
&lt;li&gt;IR : 얼음이 깔려 있음&lt;/li&gt;
&lt;li&gt;RCR : 활주로 제동 상태를 표시&lt;/li&gt;
&lt;li&gt;PKWIND 28045/15 : Peak Wind 45kts 가 15분 있었음&lt;/li&gt;
&lt;li&gt;WSHFT 30 FROPA : 바람이 30분경에 전선통과로 변화되었음&lt;/li&gt;
&lt;li&gt;RADAT : 빙결 고도 정보&lt;/li&gt;
&lt;li&gt;T02350128 : &lt;b&gt;T&lt;/b&gt;&amp;nbsp;+ [온도 부호][온도 3자리][이슬점 부호][이슬점 3자리]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0235 0128 &amp;rArr; 온도 23.5도, 이슬점 12.8도&lt;/li&gt;
&lt;li&gt;온도는 안해도 ㄱㅊ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SLP116 : 해면기압 1011.6 hpa
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SLPNO 일 경우, 기압계 고장 등으로&amp;nbsp;해면기압 값을 산출할 수 없을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AO1 : 강수현상을 측정 할 수 없는 자동 기상 관측소&lt;/li&gt;
&lt;li&gt;AO2 : 강수현상을 측정 할 수 있는 자동 기상 관측소&lt;/li&gt;
&lt;li&gt;FBL : Feeble/Light 약한 강도를 나타내는 약어&lt;/li&gt;
&lt;/ul&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;TS : 뇌전, 천둥 번개
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BO : 뇌우가 언제 시작되는지&lt;/li&gt;
&lt;li&gt;ex) BOO : Thunderstrom Began at 관측소 기준 시각 00분&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DR : 미미한 쏠림 현상으로 지상위로부터 2M 미만&lt;/li&gt;
&lt;li&gt;SH : 소나기&lt;/li&gt;
&lt;li&gt;MI : 농도가 낮은 현상&lt;/li&gt;
&lt;li&gt;FZ : 착빙&lt;/li&gt;
&lt;li&gt;BC : 여러 곳에 산재&lt;/li&gt;
&lt;li&gt;BL : 날아가는 현상&lt;/li&gt;
&lt;li&gt;PR : 부분적으로 일어나는 현상&lt;/li&gt;
&lt;/ul&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;RA : 비&lt;/li&gt;
&lt;li&gt;GR : 우박 덩어리 크기가 1/4인치 이상&lt;/li&gt;
&lt;li&gt;DZ : 이슬비&lt;/li&gt;
&lt;li&gt;GS : 눈싸라기 / 작은 알갱이 우박&lt;/li&gt;
&lt;li&gt;SN : 눈&lt;/li&gt;
&lt;li&gt;SG : 송이 눈&lt;/li&gt;
&lt;li&gt;PL : 얼음 알갱이&lt;/li&gt;
&lt;li&gt;IC : 수정빛 얼음 시정이 1~5KM 인 경우&lt;/li&gt;
&lt;li&gt;UP : 미확인 자동관측 시스템에서만 사용&lt;/li&gt;
&lt;/ul&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;FG : 안개, 시정이 1000m 미만&lt;/li&gt;
&lt;li&gt;HZ : 아지랑이, 시정이 5000m 이하인 경우&lt;/li&gt;
&lt;li&gt;BR : 박무, 시정이 1000m 이상 5000m 미만&lt;/li&gt;
&lt;li&gt;FU : 연무, 시정이 5000m 이하인 경우&lt;/li&gt;
&lt;li&gt;PY : 분사무&lt;/li&gt;
&lt;li&gt;VA : 화산재&lt;/li&gt;
&lt;li&gt;SA : 황사, 시정이 5000m 이하인 경우&lt;/li&gt;
&lt;li&gt;DU : 먼지, 시정이 5000m 이하인 경우&lt;/li&gt;
&lt;/ul&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;SQ : 국지성 폭우나 눈&lt;/li&gt;
&lt;li&gt;SS : 황사 폭풍&lt;/li&gt;
&lt;li&gt;DS : 먼지 폭풍&lt;/li&gt;
&lt;li&gt;PO : 황사 먼지 회오리 바람&lt;/li&gt;
&lt;li&gt;FC : 용오름 현상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;구름 종류 코드(ex. 8/300)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;코드&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;의미(저층 구름)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;참고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;구름 없음&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;적운(공정적운)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;적운(발달형)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;적란운(뇌우성 구름)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;층적운(적운에서 발달)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;층적운(적운 아닌 것)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;층운/조각층운(좋은 날씨)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;조각적운/조각층운(나쁜 날씨)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;적운+층적운&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;width: 55.6589%;&quot;&gt;적란운(뇌우성 구름)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&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;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;TAF&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변화 지시자&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비고&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BECMG(Becoming)&lt;/td&gt;
&lt;td&gt;특정기간 내 불특정 시간에 예상되는 규칙적 / 불규칙적 기상 변화를 표현하기 위해 사용&lt;/td&gt;
&lt;td&gt;50% 이상 확률 일 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TEMPO(Temporary)&lt;/td&gt;
&lt;td&gt;특정기간 내 어느 시간에 예상되는 일시적 기상변화를 표현하기 위해 사용&lt;/td&gt;
&lt;td&gt;50% 이상 확률 일 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FM(From)&lt;/td&gt;
&lt;td&gt;일련의 우세한 기상 현상이 뚜렷하게 변하여 다른 기상현상으로 변화할 것으로 예상 될 때 사용&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROB(Probably)&lt;/td&gt;
&lt;td&gt;기상 현상의 변화에 대한 확신이 높지 않지만, 변화가 예상되는 기상 요소가 항공기 운항에 중대한 영향을 줄 것으로 예상 될 때 사용&lt;/td&gt;
&lt;td&gt;30~40% 확률 일 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>공부/도메인</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/30</guid>
      <comments>https://hand-mk.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 16 Apr 2026 22:37:03 +0900</pubDate>
    </item>
    <item>
      <title>[항공] 항공고시보 (NOTAM) 공부</title>
      <link>https://hand-mk.tistory.com/29</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;항공관련시설, 업무, 절차 또는 장애요소, 항공기 운항관련자가 필수적으로 적시에 알아야할 지식 등의 신설, 상태 또는 변경과 관련된 정보를 포함하는 통신수단을 통해 배포되는 공고문을 말함&lt;/blockquote&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;3개월, 장기간 유지 되려면 고시보에 보충판으로 고지해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NOTAM 해석&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;GG RKZZNAXX
260706 RKRRYNYX
(C0910/25 NOTAMN  
Q)RKRR/QILXX/I/NBO/A/000/999/3324N12643E005
A)RKPD B)2505260705 C)2507310830
E)ILS LOC RWY 01 RESUMED NML OPS , REF AIP SUP 38/25)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;dns&quot;&gt;&lt;code&gt;{
  &quot;ntm&quot;: &quot;GG RKZZNAXX \\n260841 RKRRYNYX \\n(C0913/25 NOTAMN  \\nQ)RKRR/QMXLC/IV/BO/A/000/999/3727N12707E005 \\nA)RKSM B)2505281230 C)2505282000 \\nE)TWY C, TWY K(BTN G8 AND G10) CLSD DUE TO MAINT)&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;{전문의 우선순위} {배포처}&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;GG RKZZNAXX
&lt;/code&gt;&lt;/pre&gt;
&lt;p 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;SS&lt;/li&gt;
&lt;li&gt;DD, FF&lt;/li&gt;
&lt;li&gt;GG, KK&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;RKZZNAXX : 국내에서 배포하는 주소&lt;/li&gt;
&lt;li&gt;RKZZNKXX : 국제로 배포하는 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;{발행 날짜} {관제소 주소}&lt;/h3&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;260706 RKRRYNYX
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;260706 : 26일 07시 06분 UTC&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RKRRYNYX : 대한민국 국토교통부 인천공항교통&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;{사용처 + 몇번째인지}/{년도} {발행종류}&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;(C0910/25 NOTAMN
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 25년도 910번째 새로 발행된 일반 규칙, 항행용 항행 안전시설 및 통신 시설과 공항에 관한 국내 노탐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;사용처&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uAgUt/dJMcacQjylQ/K6PRT16NmyKcJJslLyDbg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uAgUt/dJMcacQjylQ/K6PRT16NmyKcJJslLyDbg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uAgUt/dJMcacQjylQ/K6PRT16NmyKcJJslLyDbg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuAgUt%2FdJMcacQjylQ%2FK6PRT16NmyKcJJslLyDbg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;184&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRoJF/dJMcaiXfVJr/uurQaKf64WApoDkSyWs2kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRoJF/dJMcaiXfVJr/uurQaKf64WApoDkSyWs2kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRoJF/dJMcaiXfVJr/uurQaKf64WApoDkSyWs2kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRoJF%2FdJMcaiXfVJr%2FuurQaKf64WApoDkSyWs2kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;641&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발행종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOTAM&lt;b&gt;N&lt;/b&gt; - New NOTAM (새로 발간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOTAM&lt;b&gt;R&lt;/b&gt; - Replaces a previous NOTAM (다시 발간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOTAM&lt;b&gt;C&lt;/b&gt; - Cancels a NOTAM(취소)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOTAM&lt;b&gt;S&lt;/b&gt; - SNOWTAM (눈 관련)&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;Q) {FIR} / {Q Code} / {IFR + VFR} / {목적} / {Scope(범위) A/000/999} {반경}&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Q)RKRR/QILXX/I/NBO/A/000/999/3324N12643E005
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; RKRR 공역 노탐, 계기비행(IFR) 운항에만 적용, 항공기 운영자가 즉각적인 주의를 해야 하고, IFR 운항 시에 중요하다. 공항 관련 정보이며 0ft 에서 999fl 까지 적용됨.&lt;/p&gt;
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;N : 항공기 운영자의 &lt;b&gt;즉각적인 주의&lt;/b&gt;를 위해 선택됨.&lt;/li&gt;
&lt;li&gt;B : 비행 전 정보 게시&lt;/li&gt;
&lt;li&gt;O : IFR 운항 상 중요&lt;/li&gt;
&lt;li&gt;M : 기타&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;Q-code Scope(범위)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Scope&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;의미(영문)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;설명&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Aerodrome&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;공항(비행장) 관련 정보. 활주로, 유도로, 계류장 등 지상 시설 및 공항 운영에 영향을 주는 사항.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;En-route&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;항로(En-route) 관련 정보. 비행 중 항로상의 공역, 항행시설, 절차 등 운항 중간 단계에 영향을 주는 사항.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;W&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Navigation Warning&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;항행 경보(Navigation Warning). 공역 제한, 위험구역, 임시 비행 제한(TFR) 등 항로상 위험이나 제한에 관한 경보.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;A){공항이나 FIR}&lt;/h3&gt;
&lt;pre class=&quot;dns&quot;&gt;&lt;code&gt;A)RKPD
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RKRR : 인천비행정보구역 (FIR)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B, C) {시간}&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;B)2505260705 C)2507310830
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;B : NOTAM 적용되는 날짜 - 시간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;25년 05월 26일 07:05 UTC 적용 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;C : NOTAM 적용 종료되는 날짜 - 시간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;25년 07월 31일 08:30 UTC 적용 만료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;D) {변경 시에만}&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;D)25 2300-2359, 26 0000-1300 2300-2359, 27 0000-0200 0330-1300 
2300-2359, 28 29 0000-1300 2300-2359, 30 0000-1300
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;E) {Q Code 를 평문으로 설명}&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;E)ILS LOC RWY 01 RESUMED NML OPS , REF AIP SUP 38/25)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F,G) {하한, 상한}&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;F)SFC G)5000FT AMSL)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 지상부터 해발 5,000 피트까지 적용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SFC : Surface(지상 표면)&lt;/li&gt;
&lt;li&gt;5000FT : 해발 5,000 피트&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부/도메인</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/29</guid>
      <comments>https://hand-mk.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 16 Apr 2026 22:31:56 +0900</pubDate>
    </item>
    <item>
      <title>[항공] 비행계획서(FPL) 공부</title>
      <link>https://hand-mk.tistory.com/28</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;AFTN : 항공고정통신망&lt;br /&gt;ATN : 항공종합통신망&lt;br /&gt;RKSIZPZX - 인천 항공교통관제센터(ATC)&lt;br /&gt;RKRRZQZX - 한국 지역 항공교통관제시스템&lt;br /&gt;ATC : 항공 교통 관제&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 FPL&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;(FPL-SIA605-IS-A359/H-SDE1E2E3GHIJ2J3J5M1P2RWXYZ/LB1D1-RKSI1450-N0491F380 BOPTA2C BOPTA Z51 BEDES Y711 MUGUS Y742 SALMI/N0494F380Q11 TACLE/N0492F390 Q12 KABAM/M085F400 N892 MIGUG/N0489F400 N892 MELAS DCT MABAL-WSSS0543 WSAP-PBN/A1B1C1D1L1O1S2 NAV/RNP2 DAT/1FANS SUR/RSP180 DOF/250518REG/9VSHT EET/RJJJ0108 RCAA0123 RPHI0226 ZJSA0323 VVHM0331WSJC0437 WMFC0518 WSJC0534 WIIF0535 WSJC0540 SEL/FMLP CODE/76CD14 OPR/SIA PER/C RMK/ACASII EQUIPPED TCAS)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;dns&quot;&gt;&lt;code&gt;{
  &quot;fpl&quot;: &quot;(FPL-SIA605-IS-A359/H-SDE1E2E3GHIJ2J3J5M1P2RWXYZ/LB1D1-RKSI1450-N0491F380 BOPTA2C BOPTA Z51 BEDES Y711 MUGUS Y742 SALMI/N0494F380Q11 TACLE/N0492F390 Q12 KABAM/M085F400 N892 MIGUG/N0489F400 N892 MELAS DCT MABAL-WSSS0543 WSAP-PBN/A1B1C1D1L1O1S2 NAV/RNP2 DAT/1FANS SUR/RSP180 DOF/250518REG/9VSHT EET/RJJJ0108 RCAA0123 RPHI0226 ZJSA0323 VVHM0331WSJC0437 WMFC0518 WSJC0534 WIIF0535 WSJC0540 SEL/FMLP CODE/76CD14 OPR/SIA PER/C RMK/ACASII EQUIPPED TCAS)&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;{전문 타입}-{항공기 식별번호}-{비행 종류}&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(FPL-SIA605-IS&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;{전문 타입}-{항공기 식별번호}-{비행 종류}&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 607px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;비행계획서 제출&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;FPL&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;새 비행계획을 제출할 때 사용. 관제기관에 비행계획을 알리는 기본 메시지.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;(FPL-EVA105-IS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 262px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 262px;&quot;&gt;변경 통보&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 262px;&quot;&gt;CHG&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 262px;&quot;&gt;이미 제출된 비행계획의 일부(항공기, 경로 등)를 변경할 때 사용.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 262px;&quot;&gt;(CHG-JNA262-RJFF0030-RKSI-DOF/250313-7/JNA262/A6147 -10/SDE2GHIJ3J4J7M3RWZ/LB1D1 -15/N0467F300 BEETL INVOK Z91 PSN Y782 BITUX Z53 BASEM Y685 GUKDO -18/PBN/A1B1C1D1L1O1S2T1 DAT/1FANS SUR/RSP180 260B DOF/250313 REG/HL8353 EET/RKRR0023 SEL/FMGS CODE/71C353 OPR/JNA RMK/TCAS II EQUIPPED) (CHG-CES2039-ZSQD0025-RKSI-DOF/250313-7/CES2039/A0111)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 35px;&quot;&gt;지연 통보 1가지&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 35px;&quot;&gt;DLA&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 35px;&quot;&gt;출발 예정 시간이 지연될 때 사용.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 35px;&quot;&gt;(DLA-KAL1806-RKPK0005-RKSS-DOF/250313)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;취소 통보 1가지&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;CNL&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;이미 제출된 비행계획을 취소할 때 사용.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;(CNL-CQH6239-ZSPD2300-RJBB-DOF/250312)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;출발 통보 1가지&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;DEP&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;실제로 항공기가 출발했음을 알릴 때 사용.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;(DEP-KAL1429/A7274-RKSI0009-RKPK-DOF/250312)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;도착 통보 1가지&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;ARR&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;항공기가 목적지에 도착했음을 알릴 때 사용.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;(ARR-VJC979-RKSI1810-VVPQ0026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 122px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 122px;&quot;&gt;보충 비행계획&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 122px;&quot;&gt;SPL&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 122px;&quot;&gt;추가 정보가 필요할 때 제출하는 보충 비행계획서.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 122px;&quot;&gt;(SPL-ABCD1234 -N123AB -B737/M-SDE2E3FGHIJ1J2RWXYZ/S -RKSI1200 -N0450F350 DCT KMC DCT -RJTT0200 -DOF/250521 RMK/DESTINATION CHANGED FROM RJAA TO RJTT DUE WX)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;도착예정 통보&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;EST&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;특정 지점(경계, 관제구역 등)에 도착 예정 시간을 알릴 때 사용.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;(EST-CSZ673/A4453-ZSWX0047-LAMEN/0116-RJBB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SIA605 : 항공기 식별 번호&lt;/li&gt;
&lt;li&gt;IS : IFR&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;span data-token-index=&quot;0&quot;&gt;비행 규칙&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;코드&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;I&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;IFR&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;계기비행방식 (Instrument Flight Rules)&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;대부분의 상업 항공편&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;V&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;VFR&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;시계비행방식 (Visual Flight Rules)&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;경비행기, 훈련비행 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Y&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;IFR &amp;rarr; VFR&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;처음 IFR로 시작 후 VFR 전환&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;훈련 비행 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;Z&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;VFR &amp;rarr; IFR&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;처음 VFR로 시작 후 IFR 전환&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;비행 조건에 따라 변경되는 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;비행 유형&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;코드&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;S&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Scheduled Air Service&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;정기 항공편&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;대한항공 KE123, 아시아나 OZ102 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;N&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Non-scheduled Air Transport&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;비정기 항공 운항&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;전세기, 화물 전세기 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;G&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;General Aviation&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;일반 항공&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;개인용 비행기, 레저 비행 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;M&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Military&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;군용&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;군 작전, 수송 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;X&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Other&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;기타&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;특별 임무, 특수 작전 등 (별도 신고 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;{항공기 기종} / {항적 난류 강도(Wake Turblance)} - {장비(Equipment)} / {장비(Equipment)}&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. -A359/H-SDE1E2E3GHIJ2J3J5M1P2RWXYZ/LB1D1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Wake-Turblacne - 항공기 날개 끝에 발생하는 소용돌이가 공기 중에 남는 현상&lt;/li&gt;
&lt;li&gt;그래서 뒤에 따르는 항공기에 위험을 줄 수 있어 항적 간격을 결정할 때 중요함.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;코드&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;범주&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;기준&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;예시 항공기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;L&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Light&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;le; 7,000 kg (MTOW 기준)&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Cessna 172, Piper PA-28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;M&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Medium&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;7,001 ~ 136,000 kg&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;B737, A320, Embraer E190&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;H&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Heavy&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;gt; 136,000 kg&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;B777, A340, &lt;span data-token-index=&quot;1&quot;&gt;A350&lt;/span&gt;, B747&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;J&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Super&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;특수 초대형 항공기&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;A380&lt;/span&gt; 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L &amp;rarr; J 로 갈 수록 간격을 더 띄워야 함.&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;{출발공항}{출발시간 UTC 기준}&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. -RKSI1450&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Departure Aerodrome 과 출발 시간&lt;/li&gt;
&lt;li&gt;RKSI : 인천공항 / 14:50분 출발&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;{순항속도 + 순항고도} {비행경로들} / {순항속도 + 순항고도 이면 앞선 비행 경로에서 속도 및 고도 변경}&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. -N0491F380 BOPTA2C BOPTA Z51 BEDES Y711 MUGUS Y742 SALMI/N0494F380 Q11 TACLE/N0492F390 Q12 KABAM/M085F400 N892 MIGUG/N0489F400 N892 MELAS DCT MABAL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;{순항속도 + 순항고도} {비행경로들} / {순항속도 + 순항고도 이면 앞선 비행 경로에서 속도 및 고도 변경}&lt;/li&gt;
&lt;li&gt;N~~ : 순항속도(Crusing Speed) + 순항고도(Crusing Level)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Crusing Speed : 항공기 상승 후 고도 도착하여 &amp;lsquo;순항&amp;rsquo; 단계에서 유지하는 속도&lt;/li&gt;
&lt;li&gt;Crusing Level : 고도&lt;/li&gt;
&lt;li&gt;ex) N0491F380
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;N: 노트 (단위)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;표기&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;의미&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;예시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;해석&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Nxxxx&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;노트(knots)&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;N0485&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;485노트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Kxxxx&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;km/h&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;K0830&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;830km/h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Mxxx&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;마하(Mach)&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;M082&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;마하 0.82&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0491 : 속도 (491 노트 순항)&lt;/li&gt;
&lt;li&gt;F : 비행고도(100피트 단위) &amp;rarr; 38,000피트 고도&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 114px;&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;&lt;span data-token-index=&quot;0&quot;&gt;표기&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;의미&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;예시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;해석&lt;/span&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;Fxxx&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;Flight Level (100ft 단위)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;F380&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;FL380, 38,000피트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;Axxx&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;Altitude (100ft 단위)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;A045&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;4,500피트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;Sxxxx&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;Metric level (10m 단위)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;S1130&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;11,300미터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;Mxxxx&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;Altitude (10m 단위)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;M0840&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;8,400미터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;VFR&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;VFR&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;VFR 운항(고도 자유)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rst : 38,000 피트에서 491 노트로 순항&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;ex. -WSSS0543 WSAP&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;WSSS0543 : 싱가포르 창이 공항까지 5:43분 소요&lt;/li&gt;
&lt;li&gt;WSAP : 파야 레바 공항에 대체 착륙 가능&lt;/li&gt;
&lt;li&gt;rst : 싱가포르 창이 공항까지 5:43분 소요 되며, 파야 레바 공항에 대신 착륙 할 수 있습니다.&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;DOF/{비행날짜}&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. -PBN/A1B1C1D1L1O1S2 NAV/RNP2 DAT/1FANS SUR/RSP180 DOF/250518 REG/9VSHT EET/RJJJ0108 RCAA0123 RPHI0226 ZJSA0323 VVHM0331 WSJC0437 WMFC0518 WSJC0534 WIIF0535 WSJC0540 SEL/FMLP CODE/76CD14 OPR/SIA PER/C RMK/ACASII EQUIPPED TCAS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PBN/{장비}&lt;/li&gt;
&lt;li&gt;NAV/{장비}&lt;/li&gt;
&lt;li&gt;DAT/{장비}&lt;/li&gt;
&lt;li&gt;SUR/{장비스펙}&lt;/li&gt;
&lt;li&gt;DOF/{비행날짜}
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;250518 : 25년 05월 18일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REG/{항공기 등록 부호}
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;차량 번호판 같은 느낌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부/도메인</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/28</guid>
      <comments>https://hand-mk.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 16 Apr 2026 22:27:03 +0900</pubDate>
    </item>
    <item>
      <title>[멋쟁이사자처럼] 전국 대학 연합 아이디어톤 1등 수상 회고</title>
      <link>https://hand-mk.tistory.com/27</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&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;대신, 학부생 시절 '멋쟁이사자처럼' 이라는 전국 대학 연합 IT 학술 동아리에 들어가 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;필자는 11기, 12기 활동을 했고 이 중 12기 아이디어톤에서 운좋게 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;h2 data-ke-size=&quot;size26&quot;&gt;2. 본론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 기획&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공모전 주제는 다음과 같았다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;IT 기술을 활용하여 현대인의 건강 (wellness) 문제를 해결할 수 있는 아이디어를 제시하시오.&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'현대인의&amp;nbsp;건강(wellness)'&amp;nbsp;이라는&amp;nbsp;단어를&amp;nbsp;봤을&amp;nbsp;때&amp;nbsp;많은&amp;nbsp;팀들이&amp;nbsp;신체&amp;nbsp;건강과&amp;nbsp;관련된&amp;nbsp;내용을&amp;nbsp;많이&amp;nbsp;다룰거라고&amp;nbsp;예상했다.&amp;nbsp;때문에 수상을 위해서라면 단순 신체 건강이 아닌 정신 건강 문제를 해결해야 한다고 생각했다. 호기롭게 여러 논문과 기사들을 스크랩하기 시작했으나, 보통 다양한게 아니였다... 그렇게 기획이 산으로 가는 중 공모전 경험이 많은 동기가 '사회와 연관된 공모전에서는 정부 정책을 봐야 한다' 고 팁을 주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 2024 정부 정책 보고서를 확인해보니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2024 정책보고서.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLJPnH/dJMcajoduHF/5KeHYYWaPdfFyktV97y3ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLJPnH/dJMcajoduHF/5KeHYYWaPdfFyktV97y3ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLJPnH/dJMcajoduHF/5KeHYYWaPdfFyktV97y3ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLJPnH%2FdJMcajoduHF%2F5KeHYYWaPdfFyktV97y3ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1136&quot; height=&quot;1396&quot; data-filename=&quot;2024 정책보고서.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 갈등 관리 플랫폼을 구축 해서 집단간 갈등을 완화하는 것이 2024 정부의 목표였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'AI 를 접목한 갈등을 완화할 수 있는 플랫폼'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 만드는 것을 목표로 하고 해당 아이디어톤 주제와 어떻게 연관을 지어서 기획 의도를 설명할지가 관건이였다. 갈등과 현대인 건강과의 연관관계를 증명하면 우리의 서비스가 공모전 주제에 부합하게 되는 것이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에 정말 많은 시간을 투자하였고, 당시 정권 대립이 고조 됐던 탓이라 핫 키워드였던 &lt;b&gt;확증 편향 &lt;/b&gt;현상과 연관지어 갈등의 원인과 이로 인한 정신적인 스트레스가 현대 정신 건강을 해한다는 결론으로 이어졌다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGmnVx/dJMcafsELKH/x7lYk4Xm7Ii3NVjoITLcp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGmnVx/dJMcafsELKH/x7lYk4Xm7Ii3NVjoITLcp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGmnVx/dJMcafsELKH/x7lYk4Xm7Ii3NVjoITLcp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGmnVx%2FdJMcafsELKH%2Fx7lYk4Xm7Ii3NVjoITLcp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;412&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 추론과 뒷받침하는 근거는 대학이나 연구소 논문을 출처로 두었고, 발표자료에 모두 기입하였다..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. 예선 2차&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차는 멋쟁이사자처럼 대학이 조별로 묶어준 대학들끼리 진행하는 방식이였다. 필자를 포함한 각 학교 대표들이 초대된 톡방에서 예선 2차 진행 방식에 대해 정했고, 오프라인으로 진행하기로 결정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 학교 대표 분들이 꼼꼼하게 준비해주시고 배려해주셔서 원활히 진행할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 우리 학교가 본선에 올라갈 수 있었다!&lt;/p&gt;
&lt;p&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/bnWm5U/dJMcaf7fYw8/x8omrhMofQoNZHDNOirLY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnWm5U/dJMcaf7fYw8/x8omrhMofQoNZHDNOirLY1/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.5814%; margin-right: 10px;&quot; data-widthpercent=&quot;36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnWm5U/dJMcaf7fYw8/x8omrhMofQoNZHDNOirLY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnWm5U%2FdJMcaf7fYw8%2Fx8omrhMofQoNZHDNOirLY1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDULnc/dJMb99TvP4q/xRcZute4gMP0wym6K28KOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDULnc/dJMb99TvP4q/xRcZute4gMP0wym6K28KOK/img.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.2558%;&quot; data-widthpercent=&quot;64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDULnc/dJMb99TvP4q/xRcZute4gMP0wym6K28KOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDULnc%2FdJMb99TvP4q%2FxRcZute4gMP0wym6K28KOK%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;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.3. 본선&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;본선 장소는 멋쟁이사자처럼 본사 서울 종로구 청진동 246번지 디타워에서 진행됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;명찰.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMRRLO/dJMcaf0tMR2/HmtmokqKD4E7edK7P6kXDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMRRLO/dJMcaf0tMR2/HmtmokqKD4E7edK7P6kXDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMRRLO/dJMcaf0tMR2/HmtmokqKD4E7edK7P6kXDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMRRLO%2FdJMcaf0tMR2%2FHmtmokqKD4E7edK7P6kXDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;704&quot; data-filename=&quot;명찰.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0f7HS/dJMb990jYBF/W9oQ6i5BhrkbZsA8EvT0u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0f7HS/dJMb990jYBF/W9oQ6i5BhrkbZsA8EvT0u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0f7HS/dJMb990jYBF/W9oQ6i5BhrkbZsA8EvT0u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0f7HS%2FdJMb990jYBF%2FW9oQ6i5BhrkbZsA8EvT0u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;920&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(본사가 꽤 이뻐서 사진 찍고 싶었는데.... 발표자는 맨 앞에 앉으라고 해서......ㅠ)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;발표 순서는 제비뽑기로 발표자 한명씩 나와서 뽑았다...ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제비뽑기.png&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qZaTX/dJMcahDZP2N/kn29GX1j4BXOsUOrBN1pjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qZaTX/dJMcahDZP2N/kn29GX1j4BXOsUOrBN1pjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qZaTX/dJMcahDZP2N/kn29GX1j4BXOsUOrBN1pjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqZaTX%2FdJMcahDZP2N%2Fkn29GX1j4BXOsUOrBN1pjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1263&quot; height=&quot;603&quot; data-filename=&quot;제비뽑기.png&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;필자는 8번째 순서를 뽑았다..!&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;1258&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBADrK/dJMcag6bImr/P48KR8fjNzdFPE5TQFOjX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBADrK/dJMcag6bImr/P48KR8fjNzdFPE5TQFOjX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBADrK/dJMcag6bImr/P48KR8fjNzdFPE5TQFOjX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBADrK%2FdJMcag6bImr%2FP48KR8fjNzdFPE5TQFOjX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;910&quot; data-filename=&quot;순서.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;본사 오면서 지인들에게 연락을 많이 받았다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;많이 떨리냐는 질문을 많이 받았는데, 에이 뭐 1차 2차 예선 때 하던 것 처럼 하면 되는건데 왜 떨리냐. 라고 말을 했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;발표 순서가 돼서 앞에 나가고 그 말을 한 걸 후회했다. 발표 직전까지 심장 bpm 이 120 이상 찍혀서 애플워치 알람이 한번 울렸고, 발표를 시작하고 나서부터는 별로 안떨렸다.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ4q8s/dJMcaf7f1SH/lvhv8pdrv50hPI5hxiK6e0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ4q8s/dJMcaf7f1SH/lvhv8pdrv50hPI5hxiK6e0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ4q8s/dJMcaf7f1SH/lvhv8pdrv50hPI5hxiK6e0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ4q8s%2FdJMcaf7f1SH%2Flvhv8pdrv50hPI5hxiK6e0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?si=SfzB3kEg4v8UHLfC&amp;amp;v=62aRn6VFvRM&amp;amp;feature=youtu.be&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;본선 발표 영상&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;영상엔 빠져 있지만 발표 후 심사 위원분들의 QnA 시간이 있다. 길진 않고 1-2개 정도 질문을 하신다.(안한 팀들도 있긴 했다.)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 질문은 '&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;감정 분석 기능은 어떻게 구현 했나요?' 라는 질문이였고 &lt;/span&gt;어느정도 생각 해 둔 답변이 있어서 나름 유연하게 답변했던 것 같다..&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 질문은 '&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;주요 타깃이 누구인가?' &lt;/span&gt;에 대한 질문이였다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인적으로 두번째 질문이 제일 어려웠는데, 공공성을 띄는 서비스라 '이걸 타깃을 확정 지을 수 있나?' 라는 생각이 들었다. 그래서 답변은 '아직 잘 모르겠습니다..!' 라고 했지만, 지금와서 생각해보면 B2B 느낌으로 정부 부처를 대상으로 판다고 했다면 어땠을까라는 아쉬움이 든다..&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 대학 발표를 마치고 잠깐의 쉬는 시간을 가졌다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3등, 2등, 1등 순으로 발표가 진행됐는데, 2등까지 안나와서 올해도 떨어졌구나 하는 순간 우리 학교 이름이 1등 차례에 발표됐다..!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;137&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj84Un/dJMcahYjF9r/jAvTc0naTKarO1jdiopw0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj84Un/dJMcahYjF9r/jAvTc0naTKarO1jdiopw0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj84Un/dJMcahYjF9r/jAvTc0naTKarO1jdiopw0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj84Un%2FdJMcahYjF9r%2FjAvTc0naTKarO1jdiopw0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;137&quot; height=&quot;302&quot; data-origin-width=&quot;137&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(놀라는 모습을 잘 담아주신 멋사 대학 관계자 분 감사합니다...)&lt;/p&gt;
&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 widthContent&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/cSVqOH/dJMcabDOmhQ/FPsFhgSHZFeerZQtdVZOi1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSVqOH/dJMcabDOmhQ/FPsFhgSHZFeerZQtdVZOi1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSVqOH/dJMcabDOmhQ/FPsFhgSHZFeerZQtdVZOi1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSVqOH%2FdJMcabDOmhQ%2FFPsFhgSHZFeerZQtdVZOi1%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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 결론&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;필자가 발표를 맡아서 이목이 집중됐지만 사실 팀원들이 부족한 부분을 묵묵히 채워나가줘서 이런 좋은 성과를 얻을 수 있었던 것 같다. 12기 우수 수료자로 선정 될 수 있었던 것도 이 프로젝트를 정성스럽게 준비한 결과라고 생각한다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xUJ3o/dJMcagSELA6/PZOC7KP7xzRoYitSIIKJN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUJ3o/dJMcagSELA6/PZOC7KP7xzRoYitSIIKJN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUJ3o/dJMcagSELA6/PZOC7KP7xzRoYitSIIKJN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUJ3o%2FdJMcagSELA6%2FPZOC7KP7xzRoYitSIIKJN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;690&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>회고록</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/27</guid>
      <comments>https://hand-mk.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 10 Apr 2026 18:15:17 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] AWS Certified Solutions Architect &amp;ndash; Associate 자격증 취득 회고</title>
      <link>https://hand-mk.tistory.com/26</link>
      <description>&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AWS SAA 자격증을 합격하였다 :)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRUC7M/dJMcaax3beg/BWKnkyYeYDe0T8lJ3fbdd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRUC7M/dJMcaax3beg/BWKnkyYeYDe0T8lJ3fbdd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRUC7M/dJMcaax3beg/BWKnkyYeYDe0T8lJ3fbdd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRUC7M%2FdJMcaax3beg%2FBWKnkyYeYDe0T8lJ3fbdd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;993&quot; height=&quot;503&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 글을 쓰고 있는 현재 SI 업계 개발자로 딱 1년째 일하고 있다. 부족한 실력에도 불구하고 인천국제공항 공사 발주 프로젝트를 2개 담당하고 있는데, 큰 문제 없이 수행하고 있어 감사하게도 긍정적인 평가를 받고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 회사 생활에서는 큰 부담이나 걱정이 없으나, 앞으로의 나의 기술적인 비전은 걱정되는건 사실이였다. SI 특성상 안정성을 추구하기 때문에 새로운 기술을 습득하기 어렵기 때문이다. 부족한 부분을 채워 나가보고자 2026 상반기 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;빅테크&lt;span&gt; &lt;/span&gt;&lt;/span&gt;채용공고들을 보았고, 많은 부분들이 부족하지만..ㅎ 크게 AI, 클라우드 경험과 영어 스펙이 부족하다고 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해 첫 자격증으로는 클라우드를 공부해보고자 마음 먹었고 이를 준비하는 방법과 느낌점을 공유하고자 회고록을 작성해보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 본론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 왜 AWS SAA 였을까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 필자는 AWS, GCP, NCP 를 사이드 프로젝트 하면서 인스턴스 생성, 방화벽 설정 등 간단하게만 사용해본 경험이 있다. 그 중 AWS 가 가장 친밀하지 못했다.. 일단 개발 공부를 하면 'AWS 해킹썰' 하나씩은 갖고 있을거다. 본인도 마찬가지로 이유 없는 과금을 맞았던 경험이 있었고, 결국 어디서 돈이 새는지 못찾고 해당 계정을 비활성화 시켜둔 경험이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시는 이런 바보같은 짓을 하고 싶지 않았고, 나 뿐만 아니라 모두에게 빈번하게 발생하는 일이라면 더더욱 많이 써보고 공부를 해야 하지 않을까라는 생각을 했다. (물론, 가고 싶은 회사들에서도 요구하는 역량이라는 것이 가장 크다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 기회로 개발자 지인 추천을 통해 AWS 한국사용자모임-&lt;a href=&quot;https://www.awskr.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AWSKRUG&lt;/a&gt; 에 들어갈 수 있었고, 타이밍이 좋게 여기서 &lt;b&gt;AWS SAA 자격증 취득 스터디&lt;/b&gt;가&amp;nbsp;새로 생겼다. 실무에서 클라우드를 사용하지도 않아 노베이스인 내 입장에선 좋은 기회라고 생각이 들어 고민없이 스터디에 참여했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.2. SAA&amp;nbsp;스터디&amp;nbsp;-&amp;nbsp;AWSKRUG&amp;nbsp;자격증&amp;nbsp;소모임&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWSKRUG 자격증 소모임은 첫 오프라인 OT 를 제외하곤 모두 온라인으로 진행된다고 하여 직장인인 나에겐 더더욱 좋은 소모임이였다. 오프라인 OT 는 테헤란로에 있는 AWS Korea 본사에서 이뤄졌고, &lt;a href=&quot;https://www.meetup.com/awskrug/events/313093617/?utm_medium=referral&amp;amp;utm_campaign=announce_event&amp;amp;utm_source=link&amp;amp;utm_version=v2&amp;amp;member_id=276037823&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;meetup.com&lt;/a&gt; 을 통해 신청 할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1078&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctHOUf/dJMcaarhyob/GNo2jL23p5BpfNR8BmPE9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctHOUf/dJMcaarhyob/GNo2jL23p5BpfNR8BmPE9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctHOUf/dJMcaarhyob/GNo2jL23p5BpfNR8BmPE9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctHOUf%2FdJMcaarhyob%2FGNo2jL23p5BpfNR8BmPE9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1078&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1078&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리베이터 내리자마자 AWS 로고가 반겨주는데, 가슴이 웅장해진다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입장할 때 출입증을 나눠준다. 사진으로 남기진 못했는데, 여러 다과가 준비돼 있었고 Nespresso 캡슐커피 &amp;amp; 머신이 있어 무한대로 먹을 수 있었다. 전반적인 스터디 일정을 30분 가량 설명해주시고 김선우 멘토님께서 '이런 느낌으로 나올꺼에요!' 일깨워주시기 위해 만드신 25문제 웹앱 모의고사를 풀어보는 시간도 가졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 제외하고 대략 30명 정도 오셨다. 재학생도 있긴 했지만 거의 대부분 직장 퇴근하고 오셔서 대단하다고 생각이 들었다.&amp;nbsp;&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/bhC8Cw/dJMb99Tqnv1/Jh74tJFLXBEm6jJo2Vpq01/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhC8Cw/dJMb99Tqnv1/Jh74tJFLXBEm6jJo2Vpq01/img.jpg&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;2048&quot; data-is-animation=&quot;false&quot; style=&quot;width: 61.2651%; margin-right: 10px;&quot; data-widthpercent=&quot;61.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhC8Cw/dJMb99Tqnv1/Jh74tJFLXBEm6jJo2Vpq01/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhC8Cw%2FdJMb99Tqnv1%2FJh74tJFLXBEm6jJo2Vpq01%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;1536&quot; height=&quot;2048&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbzwRP/dJMcagLOgBQ/vS1Pwyp0dB66LQefyeD2fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbzwRP/dJMcagLOgBQ/vS1Pwyp0dB66LQefyeD2fk/img.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2622&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.5722%;&quot; data-widthpercent=&quot;38.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbzwRP/dJMcagLOgBQ/vS1Pwyp0dB66LQefyeD2fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbzwRP%2FdJMcagLOgBQ%2FvS1Pwyp0dB66LQefyeD2fk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;2622&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오프라인 OT 이후 본격적인 자격증 스터디가 시작됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자격증은 3월 내 취득을 목표로 준비했고, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;김선우 멘토님께서 정적 페이지에 Lambda 기반 스터디 기록 웹을 배포해주셔서 여기에 공부한 내용을 기록했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJ1I4/dJMcadnXKvs/TKkuzr1hBWEVc8LyzBiSCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJ1I4/dJMcadnXKvs/TKkuzr1hBWEVc8LyzBiSCk/img.png&quot; data-origin-width=&quot;1871&quot; data-origin-height=&quot;783&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.0287%; margin-right: 10px;&quot; data-widthpercent=&quot;54.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJ1I4/dJMcadnXKvs/TKkuzr1hBWEVc8LyzBiSCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJ1I4%2FdJMcadnXKvs%2FTKkuzr1hBWEVc8LyzBiSCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1871&quot; height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdd7uS/dJMcafMUHet/tEnB5uNLO1FzFiNMZx0BH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdd7uS/dJMcafMUHet/tEnB5uNLO1FzFiNMZx0BH1/img.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;767&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.8085%;&quot; data-widthpercent=&quot;45.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdd7uS/dJMcafMUHet/tEnB5uNLO1FzFiNMZx0BH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdd7uS%2FdJMcafMUHet%2FtEnB5uNLO1FzFiNMZx0BH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1520&quot; height=&quot;767&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SApn2/dJMcaakvmbi/HmpUuE5hih03SgpgSMk8a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SApn2/dJMcaakvmbi/HmpUuE5hih03SgpgSMk8a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SApn2/dJMcaakvmbi/HmpUuE5hih03SgpgSMk8a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSApn2%2FdJMcaakvmbi%2FHmpUuE5hih03SgpgSMk8a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;862&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.3. 개인 학습 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소모임에서는 AWS SkillBuilder 를 먼저 공부해보고, 추가적인 내용은 외부 강의나 블로그를 참고하여 공부하는 것을 추천했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://skillbuilder.aws/category/exam-prep/solutions-architect-associate-SAA-C03&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://skillbuilder.aws/category/exam-prep/solutions-architect-associate-SAA-C03&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775198663932&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;AWS Skill Builder&quot; data-og-description=&quot;&quot; data-og-host=&quot;skillbuilder.aws&quot; data-og-source-url=&quot;https://skillbuilder.aws/category/exam-prep/solutions-architect-associate-SAA-C03&quot; data-og-url=&quot;https://skillbuilder.aws/category/exam-prep/solutions-architect-associate-SAA-C03&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/J7yqb/dJMb9lMbW0J/UmKcACP9M2EUCoSlcSsjS1/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://skillbuilder.aws/category/exam-prep/solutions-architect-associate-SAA-C03&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://skillbuilder.aws/category/exam-prep/solutions-architect-associate-SAA-C03&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/J7yqb/dJMb9lMbW0J/UmKcACP9M2EUCoSlcSsjS1/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AWS Skill Builder&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;skillbuilder.aws&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGR9oj/dJMcagdX75j/A4RPw2KJdz0Q6GvTkUKKCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGR9oj/dJMcagdX75j/A4RPw2KJdz0Q6GvTkUKKCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGR9oj/dJMcagdX75j/A4RPw2KJdz0Q6GvTkUKKCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGR9oj%2FdJMcagdX75j%2FA4RPw2KJdz0Q6GvTkUKKCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;574&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;574&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;본격적인 서비스 공부에 앞서 아래 링크에 있는 Official Practice Question Set: AWS Certified Solutions Architect - Associate 를 한번 풀어보는 걸 추천한다. SAA 시험과 유사하게 나오는데, 이 시험을 70% 이상 맞출 수 있으면 바로 시험 보러 간다고 될 수준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://skillbuilder.aws/learn/6NV91XYP1P/official-practice-question-set-aws-certified-solutions-architect--associate-saac03--/C4X6F66JQX&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://skillbuilder.aws/learn/6NV91XYP1P/official-practice-question-set-aws-certified-solutions-architect--associate-saac03--/C4X6F66JQX&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775199051315&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;AWS Skill Builder&quot; data-og-description=&quot;&quot; data-og-host=&quot;skillbuilder.aws&quot; data-og-source-url=&quot;https://skillbuilder.aws/learn/6NV91XYP1P/official-practice-question-set-aws-certified-solutions-architect--associate-saac03--/C4X6F66JQX&quot; data-og-url=&quot;https://skillbuilder.aws/learn/6NV91XYP1P/official-practice-question-set-aws-certified-solutions-architect--associate-saac03--/C4X6F66JQX&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6yosE/dJMb9kmdcPT/9Tm1OFpg4XbrNSkwvinr2K/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://skillbuilder.aws/learn/6NV91XYP1P/official-practice-question-set-aws-certified-solutions-architect--associate-saac03--/C4X6F66JQX&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://skillbuilder.aws/learn/6NV91XYP1P/official-practice-question-set-aws-certified-solutions-architect--associate-saac03--/C4X6F66JQX&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6yosE/dJMb9kmdcPT/9Tm1OFpg4XbrNSkwvinr2K/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AWS Skill Builder&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;skillbuilder.aws&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 결과는.... 처참했다..ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 오답을 정리하고 조오금은 나아졌지만, 솔직히 처음 풀 때 맞췄던 5문제도 제대로 알고 푼 건 아닌거 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZnHF3/dJMcadIfTNz/TU6Zv5t4E3i8lPuvCPS0y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZnHF3/dJMcadIfTNz/TU6Zv5t4E3i8lPuvCPS0y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZnHF3/dJMcadIfTNz/TU6Zv5t4E3i8lPuvCPS0y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZnHF3%2FdJMcadIfTNz%2FTU6Zv5t4E3i8lPuvCPS0y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;404&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위기감을 느껴 SkillBuilder 에 있는 강의들을 들어봤다. 솔직히 온프레미스 환경에서 일하고 있는 나에겐 어려웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스에 대해 '이걸 어디에 쓰는지', '왜 쓰는지', 정리된 내용이 아니였고 '시험에서 이런 서비스들이 나오니 공부하세요.' 의 느낌이 강했다. 그래서 찾게 된게 가장 유명한 &lt;b&gt;Udemy 강의&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/?srsltid=AfmBOoqhEgHDqlrLNx2a5sLzkztiVJgF9zXae8qZ8piVJDTypUi5BnsP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/?srsltid=AfmBOoqhEgHDqlrLNx2a5sLzkztiVJgF9zXae8qZ8piVJDTypUi5BnsP&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775199731272&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;【한글자막】 AWS Certified Solutions Architect Associate시험합격! 2025&quot; data-og-description=&quot;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;[2023년 3월]: &amp;lt;/strong&amp;gt;AWS UI 변경 및 시험 내용 변경에 맞춰 강의 내용이 업데이트 되었습니다! (&amp;lt;strong&amp;gt;SAA-C03)&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;AWS 초보도 &amp;lt;/strong&amp;gt;학습할 수 있는 친절한 강의!&amp;lt;&quot; data-og-host=&quot;www.udemy.com&quot; data-og-source-url=&quot;https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/?srsltid=AfmBOoqhEgHDqlrLNx2a5sLzkztiVJgF9zXae8qZ8piVJDTypUi5BnsP&quot; data-og-url=&quot;https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eV8Fz/dJMb8UHPzOB/PvMBhsLsnI2UM9DJrTclr0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=267_60_341_141,https://scrap.kakaocdn.net/dn/qd7cI/dJMb9kmdcUG/c5TGIPOUNFyUmvCBmJG11k/img.jpg?width=480&amp;amp;height=270&amp;amp;face=267_60_341_141,https://scrap.kakaocdn.net/dn/so0Sy/dJMb8TB93fm/T0V5RBkWmPvH2toxR53QK1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=267_60_341_141&quot;&gt;&lt;a href=&quot;https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/?srsltid=AfmBOoqhEgHDqlrLNx2a5sLzkztiVJgF9zXae8qZ8piVJDTypUi5BnsP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/?srsltid=AfmBOoqhEgHDqlrLNx2a5sLzkztiVJgF9zXae8qZ8piVJDTypUi5BnsP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eV8Fz/dJMb8UHPzOB/PvMBhsLsnI2UM9DJrTclr0/img.jpg?width=480&amp;amp;height=270&amp;amp;face=267_60_341_141,https://scrap.kakaocdn.net/dn/qd7cI/dJMb9kmdcUG/c5TGIPOUNFyUmvCBmJG11k/img.jpg?width=480&amp;amp;height=270&amp;amp;face=267_60_341_141,https://scrap.kakaocdn.net/dn/so0Sy/dJMb8TB93fm/T0V5RBkWmPvH2toxR53QK1/img.jpg?width=480&amp;amp;height=270&amp;amp;face=267_60_341_141');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;【한글자막】 AWS Certified Solutions Architect Associate시험합격! 2025&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;[2023년 3월]: &amp;lt;/strong&amp;gt;AWS UI 변경 및 시험 내용 변경에 맞춰 강의 내용이 업데이트 되었습니다! (&amp;lt;strong&amp;gt;SAA-C03)&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;AWS 초보도 &amp;lt;/strong&amp;gt;학습할 수 있는 친절한 강의!&amp;lt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.udemy.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람들 후기가 많아 별 고민 없이 결제해서 퇴근하고 주중에 최소 2시간씩, 주말에는 4시간씩 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 강의에서는 단순 AWS 서비스에 대해 줄줄줄 설명만 하는게 아니라 간단하게 실습하는 영상이 있다. 때문에, 나같이 온프레미스에서 개발을 하고 있고 클라우드에 대한 지식이 전무한 분들에게 매우 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Udemy 강의를 전부 듣고, 이전보단 AWS 서비스들에 대해 넓게 이해할 수 있었지만 워낙 서비스들이 많았기에 시험을 패스할 수 있겠다란 확신이 없었다. 그래서 찾아보니 유명한 dump 문제 사이트를 찾을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://free-braindumps.com/amazon/free-saa-c03-braindumps/page-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://free-braindumps.com/amazon/free-saa-c03-braindumps/page-2&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1775200936004&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;Free SAA-C03 Practice Questions &amp;amp; AI Tutor | Free-Braindumps.com&quot; data-og-description=&quot;Hay! I&amp;rsquo;m your AI study assistant for the SAA-C03 exam. Ask me anything about the exam or the questions on this page, and I&amp;rsquo;ll break it down so it actually makes sense. You want it in a different language? Just say it.&quot; data-og-host=&quot;free-braindumps.com&quot; data-og-source-url=&quot;https://free-braindumps.com/amazon/free-saa-c03-braindumps/page-2&quot; data-og-url=&quot;https://free-braindumps.com/amazon/free-saa-c03-braindumps/page-2&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://free-braindumps.com/amazon/free-saa-c03-braindumps/page-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://free-braindumps.com/amazon/free-saa-c03-braindumps/page-2&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;Free SAA-C03 Practice Questions &amp;amp; AI Tutor | Free-Braindumps.com&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hay! I&amp;rsquo;m your AI study assistant for the SAA-C03 exam. Ask me anything about the exam or the questions on this page, and I&amp;rsquo;ll break it down so it actually makes sense. You want it in a different language? Just say it.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;free-braindumps.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;다른 분들은 600문제, 800 문제를 푸신 분들도 계셨는데, 애초에 준비기간이 3주였던 나로썬 100문제가 최선이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 문제들을 접해보니, 처음보는 서비스들이 꽤 있었고 오답을 정리하면서 부족한 지식들을 채워나갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.4. 시험 당일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 SRTC 에서 시험을 봤다. 오전 9시가 시험 시작이라 8시 30분에 도착했는데, 보안 서약서 작성하고 희망하면 바로 시험 응시 할 수 있다고 해서 바로 시험장으로 들어갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://maps.app.goo.gl/b4KnUybt6RiX6R7y7&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://maps.app.goo.gl/b4KnUybt6RiX6R7y7&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775201361794&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;SRTC &amp;middot; TGL 402호 KR 서울특별시 강남구 봉은사로 303 경복빌딩 4F&quot; data-og-description=&quot;★★★★☆ &amp;middot; 교육 테스트 서비스&quot; data-og-host=&quot;www.google.com&quot; data-og-source-url=&quot;https://maps.app.goo.gl/b4KnUybt6RiX6R7y7&quot; data-og-url=&quot;https://www.google.com/maps/place/SRTC/@37.509418,127.0401406,17z/data=!3m1!4b1!4m6!3m5!1s0x357ca5bca19c8f15:0xac5eb0cd56e5c8bf!8m2!3d37.509418!4d127.0401406!16s%2Fg%2F11lg2tndfq?entry=tts&amp;amp;g_ep=EgoyMDI2MDMzMS4wIPu8ASoASAFQAw%3D%3D&amp;amp;skid=540321fa-8653-4030-8134-ff064464890b&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yy7E8/dJMb82MDwx6/tXsqJDx0OV7ehKp7W62HX1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900&quot;&gt;&lt;a href=&quot;https://maps.app.goo.gl/b4KnUybt6RiX6R7y7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://maps.app.goo.gl/b4KnUybt6RiX6R7y7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yy7E8/dJMb82MDwx6/tXsqJDx0OV7ehKp7W62HX1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_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;SRTC &amp;middot; TGL 402호 KR 서울특별시 강남구 봉은사로 303 경복빌딩 4F&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;www.google.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;시험장 내부는 독서실 같은 느낌이였고, 책상에 모니터가 보인다. 화면에 보이는 버튼을 누르면 시험에 응시할 수 있다. 오전 시험이라 사람들이 많이 없을 줄 알았는데, 생각보다 많이 있었다. 대략 15명정도..?&amp;nbsp;&lt;/p&gt;
&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.5. 결과 발표&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 당일 저녁 8시쯤 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실, 시험 보고 나오면서 70%는 다시 봐야지... 생각하고 있었다. 15문제 정도 플래그를 걸어뒀는데 사실상 처음보는 서비스들이였다. 65문제 중에 15문제는 채점이 안되는 문제라고 해도 불안했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더군다나, 응시 후 5시간 이내로 메일로 결과 알려준다고 했는데 저녁 시간까지 안와서 '떨어졌구나..' 싶었다. 혹시나 하는 마음으로 &lt;a href=&quot;https://cp.certmetrics.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cp.certmetrics.com/&lt;/a&gt; 에 들어가서 확인해보니 합격 결과가 나와있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq6BdY/dJMcaaLz9RA/EsKzGKcLBp0duW3LKts5i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq6BdY/dJMcaaLz9RA/EsKzGKcLBp0duW3LKts5i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq6BdY/dJMcaaLz9RA/EsKzGKcLBp0duW3LKts5i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq6BdY%2FdJMcaaLz9RA%2FEsKzGKcLBp0duW3LKts5i1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1608&quot; height=&quot;1050&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yYgIY/dJMcacikqJA/CHqEoqghp1GDOnSKiOgc5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yYgIY/dJMcacikqJA/CHqEoqghp1GDOnSKiOgc5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yYgIY/dJMcacikqJA/CHqEoqghp1GDOnSKiOgc5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyYgIY%2FdJMcacikqJA%2FCHqEoqghp1GDOnSKiOgc5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1422&quot; height=&quot;322&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;749점으로 간당간당하긴 했다..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;섹션별로 성적을 간략하게 보여주는데, 도메인 2에서 공부가 부족했던 것 같다. HA 관련 아키텍처를 좀 더 고민하고 공부해야겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvCXRF/dJMcagLOo7F/8spC2kDYYeEkUok5UaeEG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvCXRF/dJMcagLOo7F/8spC2kDYYeEkUok5UaeEG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvCXRF/dJMcagLOo7F/8spC2kDYYeEkUok5UaeEG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvCXRF%2FdJMcagLOo7F%2F8spC2kDYYeEkUok5UaeEG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;765&quot; height=&quot;232&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 자격증 취득이 목적이였긴 하지만, 강의 실습을 통해 왜 클라우드가 좋은지를 몸소 느꼈던 경험이였다. 로드밸런싱 실습을 할 때 버튼 딸깍으로 ALB 를 만들고, AMI, Auto-Scailing 이 적용된 EC2 인스턴스 여러개를 단 몇초만에 생성하여 물리적인 서버 없이 운영환경을 만들 수 있다는 점이 가장 큰 장점인 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, AWS 에는 일반적으로 알고있는 EC2 서비스 외에 좋은 서비스가 너무 많다. 그런 서비스들이 운영 오버헤드를 줄임으로써 개발자가 오로지 프러덕팅에만 집중 할 수 있는게 또 하나의 장점인 것 같다. 이래서 AWS AWS 하는구나.... 서비스 운영 환경에 가서 내 지식을 토대로 기여해보고 싶은 생각이 더 확고해졌다..!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 ALB 연습하다가 녹화한 영상으로 마무리..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면-기록-2026-03-11-오후-11.48.52.gif&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NUNWG/dJMcaa5U7FB/H3GtTNmPysC4UXsAmfJOQ0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NUNWG/dJMcaa5U7FB/H3GtTNmPysC4UXsAmfJOQ0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NUNWG/dJMcaa5U7FB/H3GtTNmPysC4UXsAmfJOQ0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/NUNWG/dJMcaa5U7FB/H3GtTNmPysC4UXsAmfJOQ0/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;1854&quot; height=&quot;1006&quot; data-filename=&quot;화면-기록-2026-03-11-오후-11.48.52.gif&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>공부/자격증</category>
      <category>AWS</category>
      <category>SAA</category>
      <category>자격증</category>
      <category>클라우드</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/26</guid>
      <comments>https://hand-mk.tistory.com/26#entry26comment</comments>
      <pubDate>Fri, 3 Apr 2026 17:00:07 +0900</pubDate>
    </item>
    <item>
      <title>[MCP] Claude + IntelliJ IDEA 2025.2.4 (Ultimate Edition) 연동</title>
      <link>https://hand-mk.tistory.com/25</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 MCP 가 개발 업계에서 매우 핫하다. 필자의 경우 Gemini 유료 구독 (3.1 Pro Model) 를 사용하여 개발을 했으나, 프롬프트에 단순히 입력하고 답변받는 구조에 지쳤다. 그래서 Claude 로 갈아타서 MCP 서버 구성을 진행해보고자 하였고 그 중 IntelliJ 연동을 첫번째로 진행하였다. 이에 관한 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 본론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. MCP 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`MCP(Model Context Protocol)` 는 AI 를 외부 시스템에 연결하기 위한 일종의 프로토콜이다. 우리가 흔히 얘기하던 HTTP 프로토콜과 같이 AI 를 다른 응용프로그램이나 서버에 연동하는 프로토콜이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP를 사용하면 Claude나 ChatGPT와 같은 AI 를 단순히 프롬프트를 웹에서 입력하고 답변 받는것이 아닌, 로컬에 있는 파일에 접근 가능하게끔 할 수 있어 일일이 복붙을 안해도 된다. 뿐만 아니라, 다른 서버에 연동 (ex. Slack, Gmail 등) 하여 업무를 시킬 수 도 있다.&lt;/p&gt;
&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://modelcontextprotocol.io/docs/getting-started/intro&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://modelcontextprotocol.io/docs/getting-started/intro&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771829136126&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;What is the Model Context Protocol (MCP)? - Model Context Protocol&quot; data-og-description=&quot;What is the Model Context Protocol (MCP)?&quot; data-og-host=&quot;modelcontextprotocol.io&quot; data-og-source-url=&quot;https://modelcontextprotocol.io/docs/getting-started/intro&quot; data-og-url=&quot;https://modelcontextprotocol.io/docs/getting-started/intro&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dtIROZ/dJMb8RjYOsv/VkQQOXLhd3yhblE8zFKhxK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/b48iY7/dJMb8T9WjDh/HLjJfo01oti7McWTLdLcYK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/nuulg/dJMb8RjYOsx/rBaowCinPAs624RrrLCfwk/img.png?width=3840&amp;amp;height=1500&amp;amp;face=0_0_3840_1500&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/docs/getting-started/intro&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://modelcontextprotocol.io/docs/getting-started/intro&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dtIROZ/dJMb8RjYOsv/VkQQOXLhd3yhblE8zFKhxK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/b48iY7/dJMb8T9WjDh/HLjJfo01oti7McWTLdLcYK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/nuulg/dJMb8RjYOsx/rBaowCinPAs624RrrLCfwk/img.png?width=3840&amp;amp;height=1500&amp;amp;face=0_0_3840_1500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What is the Model Context Protocol (MCP)? - Model Context Protocol&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;What is the Model Context Protocol (MCP)?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;modelcontextprotocol.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;h3 data-ke-size=&quot;size23&quot;&gt;2.2. Claude Desktop 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://claude.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://claude.com/download&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771829356271&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;Download Claude | Claude&quot; data-og-description=&quot;Download Claude for desktop and mobile. Access AI assistance natively on Mac, Windows, iOS, and Android across all your devices.&quot; data-og-host=&quot;claude.com&quot; data-og-source-url=&quot;https://claude.com/download&quot; data-og-url=&quot;https://claude.com/download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AvVdw/dJMb8865JZQ/hMfwgkB5KFqJXOSAr3u070/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cuyQaq/dJMb84XVCkn/wC2oT6pAbqycDxrgk1eyr1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://claude.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://claude.com/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AvVdw/dJMb8865JZQ/hMfwgkB5KFqJXOSAr3u070/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cuyQaq/dJMb84XVCkn/wC2oT6pAbqycDxrgk1eyr1/img.jpg?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;Download Claude | Claude&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download Claude for desktop and mobile. Access AI assistance natively on Mac, Windows, iOS, and Android across all your devices.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;claude.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;공식 홈페이지에서 해당하는 OS 에 맞게 설치하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6DHJk/dJMcahXLa48/7ZnfErLka4cN28a0RqNV2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6DHJk/dJMcahXLa48/7ZnfErLka4cN28a0RqNV2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6DHJk/dJMcahXLa48/7ZnfErLka4cN28a0RqNV2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6DHJk%2FdJMcahXLa48%2F7ZnfErLka4cN28a0RqNV2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;994&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. IntelliJ Plugin MCP Server 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude 에서 IntelliJ 에 연동을 하려면 `MCP Server` 플러그인을 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ 상에서 다음과 같이 입력해 Setting &amp;gt; Plugins 창을 연다.&lt;/p&gt;
&lt;pre id=&quot;code_1771829511854&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 윈도우
Ctrl + Alt + S

# 맥
Command +&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단에&lt;b&gt; MCP Server&lt;/b&gt; 를 입력하여 해당 플러그인을 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EDzrI/dJMb996u1sW/b1WdZaXxdLkKwywalojSU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EDzrI/dJMb996u1sW/b1WdZaXxdLkKwywalojSU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EDzrI/dJMb996u1sW/b1WdZaXxdLkKwywalojSU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEDzrI%2FdJMb996u1sW%2Fb1WdZaXxdLkKwywalojSU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;735&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 플러그인을 설치하면 &lt;b&gt;Settings&lt;/b&gt; 왼쪽 탭에 &lt;b&gt;MCP Server&amp;nbsp;&lt;/b&gt;가 생긴걸 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`Enable MCP Server` 체크 &amp;gt; Clients Auto-Configuration 하위 Claude App `Auto-Configure` 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하면 오른쪽에 초론색 체크표시가 뜬다. 이러면 사실상 연동이 끝이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1968&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q4NFj/dJMcac3bO4u/nktgRBNVAlPDmENsE4OBkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q4NFj/dJMcac3bO4u/nktgRBNVAlPDmENsE4OBkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q4NFj/dJMcac3bO4u/nktgRBNVAlPDmENsE4OBkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq4NFj%2FdJMcac3bO4u%2FnktgRBNVAlPDmENsE4OBkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1968&quot; height=&quot;1470&quot; data-origin-width=&quot;1968&quot; data-origin-height=&quot;1470&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;blockquote data-ke-style=&quot;style2&quot;&gt;이전 레거시 IntelliJ 의 경우 자동으로 claude_desktop_config.json 업데이트가 안된다고 알고있다.&lt;br /&gt;해당 방법으로 되지 않을 경우, 수동으로 json 파일을 수정해줘야 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.4. MCP 연동 확인 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연동을 확인하는 방법은 `Claude Desktop` 앱 상에서 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 하단 &lt;b&gt;설정 &lt;/b&gt;&amp;gt;&amp;nbsp; &lt;b&gt;커넥터 &lt;/b&gt;&amp;gt; 연동된 환경 확인 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dixhv0/dJMcabb9FFi/j3p05ej492Y5zFAleJO9X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dixhv0/dJMcabb9FFi/j3p05ej492Y5zFAleJO9X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dixhv0/dJMcabb9FFi/j3p05ej492Y5zFAleJO9X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdixhv0%2FdJMcabb9FFi%2Fj3p05ej492Y5zFAleJO9X1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2444&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.5. 연동안됨?&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;왼쪽 하단&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;설정&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;b&gt;개발자 &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&amp;gt; &lt;b&gt;구성 편집 &lt;/b&gt;을 눌러 ` &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;claude_desktop_config.json` 을 확인해보라고 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1ruAO/dJMcagLkF9k/4nOnoF9p9Dozk6U5UlUVLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1ruAO/dJMcagLkF9k/4nOnoF9p9Dozk6U5UlUVLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1ruAO/dJMcagLkF9k/4nOnoF9p9Dozk6U5UlUVLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1ruAO%2FdJMcagLkF9k%2F4nOnoF9p9Dozk6U5UlUVLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2444&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자의 경우 애초에 AppData\Roaming\Claude 경로가 없다고 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종종 이런일이 발생할 수 있다고 한다. 이럴땐 그냥 삽질하지 말고 지웠다가 다시 설치하면 자동으로 해당 경로에 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연동이 잘 되면, 실제로 설정 json 파일에 다음과 같이 자동으로 jetbrains mcpServers 설정이 들어가 있어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LS72i/dJMcabQLkSO/iYFtc2BiLvK2LVk77bgKOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LS72i/dJMcabQLkSO/iYFtc2BiLvK2LVk77bgKOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LS72i/dJMcabQLkSO/iYFtc2BiLvK2LVk77bgKOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLS72i%2FdJMcabQLkSO%2FiYFtc2BiLvK2LVk77bgKOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1840&quot; height=&quot;746&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 연동 잘 됐는지 실제로 프롬프트를 넣어보면 프로젝트를 읽어 분석하고 답변해주는걸 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rEMTR/dJMcahjbAfB/onB4hnKgjIgbqswdLaR7sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rEMTR/dJMcahjbAfB/onB4hnKgjIgbqswdLaR7sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rEMTR/dJMcahjbAfB/onB4hnKgjIgbqswdLaR7sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrEMTR%2FdJMcahjbAfB%2FonB4hnKgjIgbqswdLaR7sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1476&quot; height=&quot;1218&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>programming/ai</category>
      <category>claude</category>
      <category>IntelliJ</category>
      <category>mcp</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/25</guid>
      <comments>https://hand-mk.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 23 Feb 2026 16:18:31 +0900</pubDate>
    </item>
    <item>
      <title>[비동기 이벤트 처리] Inotify + RabbitMQ를 활용한 실시간 파일 감지 및 비동기 처리 파이프라인 구축</title>
      <link>https://hand-mk.tistory.com/24</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;회사에서 폐쇄망 운영 환경의 SI 사업에 투입됐다.&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;본 사업의 목표는 일 평균 10만건 데이터를 송수신 하는 인터페이스를 구축 및 고도화 하는 것이다. 보안상 상세하게 기재하진 못하지만 간단하게 운영환경을 기술하자면, &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;총 3대의 서버 (Rocky Linux 9.5) 가 구동된다. 물리적인 서버 3대가 있는 이유는 &lt;b&gt;서버 이중화&lt;/b&gt; 와 &lt;b&gt;예비 서버 용도&lt;/b&gt;이다. 이 3대 중 한 1대만 Active 상태를 유지하고 해당 서버를 통해 항공 데이터(.txt) 가 송수신된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;데이터 양은&lt;b&gt; 하루 평균 10만건&lt;/b&gt;이다. 또한, 데이터 종류가 8가지이고 데이터 종류별로 타깃 단위 시스템에 매핑해서 송수신 해야 하는데 이 단위 시스템 수만 118개이다.... ㄷㄷ 처음엔 막막했지만 다행히 이 중 15개 시스템에만 연계가 되게끔 인터페이스를 구현하면 된다는 얘기를 듣고 조금 괜찮아졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;개발이 마무리 된 시점에서 연계 시스템을 구축하면서 겪었던 문제와 고민했던 내용을 기록해보고자 블로그에 작성해보고자 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 본론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 양을 보고 예전 &amp;lt;GAGU&amp;gt; 사이드 플젝에서 채팅 기능 구현할 때 사용했던 `RabbitMQ` 를 무조건 사용해야겠다고 생각이 들었다. 문제는 &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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. 시스템 내 FDS (File Delivery System) 에 송신 하고자 하는 파일 삽입 -&amp;gt; Gateway 의 /*/temp 디렉토리로 파일 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. /temp 디렉토리에서 해당 데이터 바디 값이 MDD 를 준수하였는지 유효성 검증 후 /succ 또는 /fail 폴더로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3. /succ 디렉토리로 들어오는 데이터만 연계 시스템으로 전송 (.txt 파일 생성)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;ordm; 보안상 문제로 System A, System B 로 정의&lt;br /&gt;&amp;ordm; System A 를 기준으로 송수신 정의됨&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfTbl/dJMcagLSS3F/JGyYlC3t7kqqh93fMwLqV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfTbl/dJMcagLSS3F/JGyYlC3t7kqqh93fMwLqV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfTbl/dJMcagLSS3F/JGyYlC3t7kqqh93fMwLqV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwfTbl%2FdJMcagLSS3F%2FJGyYlC3t7kqqh93fMwLqV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1413&quot; height=&quot;372&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 1번과 2번은 레거시 FDS 시스템에 종속적이여서 바꾸기 힘들다고 해서 /succ 파일에 들어오는 데이터만 문제없이 연계하면 되는 상황이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자가 이러한 요구사항을 구현하기 위한 시나리오는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 메시지 및 타깃 시스템별 데이터를 담는 Queue 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. /*/succ 로 들어오는 데이터를 &lt;b&gt;실시간으로 감지&lt;/b&gt; (단, 중복으로 데이터를 감지하면 안됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 실시간으로 감지된 데이터를 정의된 라우팅 키로 Queue 에 삽입&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Queue 에 적재된 데이터를 타깃 시스템에서 비동기로 처리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시나리오에서의 핵심은 &lt;b&gt;실시간 감지&lt;/b&gt;였다..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 리눅스 환경과 호환이 잘 되는 디렉토리 이벤트 감지 서비스를 부지런히 찾아보았고, 이 과정에서 &lt;b&gt;Polling 감지&lt;/b&gt;, &lt;b&gt;Telegraf 사용&lt;/b&gt;, &lt;b&gt;Inotify 커널 이벤트&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;2.1. 신규 데이터 실시간 감지&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2.1.1. polling (full-scan) - 성능 이슈 염려하여 기각&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일단 가장 간단하게 '구현만' 할 수 있는 방법은 polling 방식이 있을 것 같았다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;주기적으로 `linux date(서버 현재 시각)`과 파일 생성시간을 비교하여 최신 일자일 경우 신규 데이터로 감지하는 것이다.&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;span&gt;&amp;nbsp;&lt;/span&gt;할텐데, 예외 상황이 많을 것 같았다. 스케줄러가 동작하지 않거나 지연이 됐을 때 데이터가 누락되는 현상이 발생할 수 있고, polling 으로 불필요한 조회 연산을 지속적으로 호출하게끔 되어 해당 방법은 소거하였다.&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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1.2. Telegraf - Queue 삽입까지 너무 오래걸려서 기각&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모니터링 시스템 구현 관련 라이브러리를 찾던 중 `Telegraf` + `Grafana` 조합을 많이들 사용한다는 것을 알게 되었고, 이 중 `Telegraf` 에 실시간 감지 기능이 내장돼 있다는 걸 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`Telegraf`는 `InfluxData`에서 개발하였으며 데이터베이스나 서버의 데이터 (디렉토리도 가능) 를 수집하는 Agent 역할을 한다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Docker hub 에도 공식 이미지가 있고, `telegraf.conf` 라는 설정 파일로 Agent 를 조작하는 느낌이라 설정이 간편했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hub.docker.com/_/telegraf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hub.docker.com/_/telegraf&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1767933974109&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;telegraf - Official Image | Docker Hub&quot; data-og-description=&quot;Quick reference Supported tags and respective Dockerfile links Quick reference (cont.) What is telegraf? Telegraf is an open source agent for collecting, processing, aggregating, and writing metrics. Based on a plugin system to enable developers in the com&quot; data-og-host=&quot;hub.docker.com&quot; data-og-source-url=&quot;https://hub.docker.com/_/telegraf&quot; data-og-url=&quot;https://hub.docker.com/_/telegraf&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://hub.docker.com/_/telegraf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hub.docker.com/_/telegraf&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;telegraf - Official Image | Docker Hub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Quick reference Supported tags and respective Dockerfile links Quick reference (cont.) What is telegraf? Telegraf is an open source agent for collecting, processing, aggregating, and writing metrics. Based on a plugin system to enable developers in the com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hub.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 용으로 해당 디렉토리에 새로 생성 + 이동 됐을 때 로그로 바디 값을 출력하는 설정을 주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;telegraf.conf&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767933576489&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[agent]

# 데이터 수집 주기
interval = &quot;10s&quot; 

# 수집된 데이터 처리 주기
flush_interval = &quot;10s&quot;

[[inputs.tail]] # 파일 내용 추적 섹션

# 감시할 파일 경로
files = [&quot;/watch-data/*.txt&quot;]

# 파일 새로 생겼을 때 조작
from_beginning = true

# 파일 안에 있는 값 그대로 사용
data_format = &quot;value&quot;

# 데이터 타입 지정
data_type = &quot;string&quot;
name_override = &quot;txtfile_monitor&quot;

[[outputs.file]]

# 파일 바디 값 출력
files = [&quot;stdout&quot;]
data_format=&quot;json&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;이후 Docker hub 에 기재돼 있는대로 container 구동을 하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1767935184612&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d --name telegraf
  -v {telegraf.conf 실제 경로}:/etc/telegraf/telegraf.conf:ro \
  -v {타겟 디렉토리 경로}:/watch-data \
  telegraf&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;1. 새로운 txt 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. /test 폴더 mv 명령어로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 로그 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3288&quot; data-origin-height=&quot;1750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvPrSF/dJMcadOb1jh/FktGXHXtFDMKRCb92s0Kf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvPrSF/dJMcadOb1jh/FktGXHXtFDMKRCb92s0Kf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvPrSF/dJMcadOb1jh/FktGXHXtFDMKRCb92s0Kf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvPrSF%2FdJMcadOb1jh%2FFktGXHXtFDMKRCb92s0Kf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3288&quot; height=&quot;1750&quot; data-origin-width=&quot;3288&quot; data-origin-height=&quot;1750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 단순 출력하는 부분을 RabbitMQ Queue 로 삽입 되게끔 수정하여 테스트 했을 때, 정상적으로 삽입되어 원하는 기능을 테스트 해볼 수 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1767940579646&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[agent]
interval = &quot;10s&quot;
flush_interval = &quot;10s&quot;
metric_batch_size = 1

[[inputs.tail]]
files = [&quot;/watch-data/*.txt&quot;]
from_beginning = true
data_format = &quot;value&quot;
data_type = &quot;string&quot;
name_override = &quot;txtfile_monitor&quot;

[[outputs.amqp]] # rabbitMQ 로 삽입
brokers = [&quot;amqp://guest:guest@{서버 IP}:5672&quot;]
data_format = &quot;json&quot;
exchange = &quot;test.exchange&quot;
exchange_type = &quot;direct&quot;
routing_key = &quot;test.routing.key&quot;
delivery_mode = &quot;persistent&quot;
exchange_durability = &quot;durable&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lVX3n/dJMcachvrrD/Qb9IXq1S9QHBQQyIPytSfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lVX3n/dJMcachvrrD/Qb9IXq1S9QHBQQyIPytSfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lVX3n/dJMcachvrrD/Qb9IXq1S9QHBQQyIPytSfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlVX3n%2FdJMcachvrrD%2FQb9IXq1S9QHBQQyIPytSfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;752&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 아쉬운건 이벤트 감지는 즉각적으로 일어나지만, Queue 까지 가기까지의 시간이 너무 오래 걸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 데이터 1건을 이벤트 감지하고 Queue 에 삽입하는데 10초가 소요됐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqkoqA/dJMcab4QNB5/MTQiwVL1wUWHGUdAnzmI0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqkoqA/dJMcab4QNB5/MTQiwVL1wUWHGUdAnzmI0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqkoqA/dJMcab4QNB5/MTQiwVL1wUWHGUdAnzmI0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqkoqA%2FdJMcab4QNB5%2FMTQiwVL1wUWHGUdAnzmI0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;858&quot; height=&quot;640&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 `Telegraf` 가 `Node-exporter` 처럼 메트릭 수집 도구 용도로 만들어졌기 때문이다. 어떤 데이터가 들어오든 내부적으로 `Telegraf Metric` 이라는 타입의 데이터로 변환한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;`데이터 읽기` -&amp;gt; `Telegraf Metric 변환` -&amp;gt; `버퍼에 저장` -&amp;gt; `Output 플러그인에서 다시 JSON으로 변환` -&amp;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;단순히 데이터를 감지하고 Queue 에 삽입하는 것이 아닌 앞단에 데이터 변환 과정이 있어 오래 걸린다고 한다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 커스텀 하는 것이 어려워 보였고, 만약 &lt;b&gt;10만건이 동시에 몰렸을 때 수행&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;또 다른 문제는 Queue 에 보낼 때이다. '하나 보낼 때 오래걸리면, 대량을 묶어서 보내면 되지 않나?' 라고 생각이 들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`Telegraf` 는 효율성을 위해 &lt;b&gt;기본적으로 데이터를 Batch 로 묶어&lt;/b&gt; 보낸다. 그래서 앞선 `Telegraf.conf` 에서 `metric_batch_size = 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;만약 1000개를 한 배치로 보내는데 이 중 100번째 데이터가 문제가 있다고 하면 데이터 정합성 문제가 발생할 수 있겠다 싶었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러 저러한 이유로 `Telegraf` 도 아쉽게 기각됐다.&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.1.3. Linux Inotify - 제일 적합&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`Telegraf` 를 떠나보내고.. 지친 상태로 README.md 를 읽던 중 Telegraf 가 Linux-Inotify 기반으로 만들어진 것을 알게 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tail/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tail/README.md&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1767943864109&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;telegraf/plugins/inputs/tail/README.md at master &amp;middot; influxdata/telegraf&quot; data-og-description=&quot;Agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data. - influxdata/telegraf&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tail/README.md&quot; data-og-url=&quot;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tail/README.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Itvc0/hyZRp5SLdN/zmwpyvaDUCkJoojnMc4ZJk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bhWRQ8/hyZRgOD1HS/bDjCEBkpKSjOE08sDWzb9k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tail/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tail/README.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Itvc0/hyZRp5SLdN/zmwpyvaDUCkJoojnMc4ZJk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bhWRQ8/hyZRgOD1HS/bDjCEBkpKSjOE08sDWzb9k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;telegraf/plugins/inputs/tail/README.md at master &amp;middot; influxdata/telegraf&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data. - influxdata/telegraf&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAeKiL/dJMcacu2LJu/ELdTPBRIXKx24ZXgPoFkVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAeKiL/dJMcacu2LJu/ELdTPBRIXKx24ZXgPoFkVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAeKiL/dJMcacu2LJu/ELdTPBRIXKx24ZXgPoFkVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAeKiL%2FdJMcacu2LJu%2FELdTPBRIXKx24ZXgPoFkVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;498&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이래서 README.md 를 잘 읽어야.....)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 이유로 Inotify 를 써보게 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`Inotify` 는 리눅스 커널에 &lt;b&gt;내장된 파일 시스템 감시 서브시스템&lt;/b&gt;으로 별도의 설치가 필요 없지만, 이를 특정 디렉토리를 감시하게끔 커스텀하고 RabbitMQ 와 연동하기 위해선 `inotify-tools` 패키지를 써야 된다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 내장 기능이기 때문에, Docker 기본 이미지는 가벼운 Linux 이미지를 사용하였고 관련된 패키지들을 빌드할 때 설치하였다.&lt;/p&gt;
&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;Dockerfile&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767944548684&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. Alpine Linux 기반
FROM alpine:3.18

# 2. inotify-tools, python3, pip 설치
RUN apk add --no-cache inotify-tools python3 py3-pip

# Python 전용 RabbitMQ 통신 프로토콜 라이브러리 패키지
RUN pip3 install pika --break-system-packages

# 이벤트 발생시 RabbitMQ Queue 삽입 로직
COPY publisher.py /publisher.py

# Inotify-tools 스크립트
COPY watch-and-publish.sh /watch-and-publish.sh
RUN chmod +x /watch-and-publish.sh

# 실행
CMD [&quot;/watch-and-publish.sh&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;`Dockerfile` 에 있는 `/watch-and-publish.sh` 가 `inotify-tools` 를 사용해 특정 디렉토리에 신규 파일 생성 이벤트를 감지하는 스크립트고, `publisher.py` 가 Linux - RabbitMQ 서버 간 연동을 해주는 파이썬 코드다.&lt;/p&gt;
&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;watch-and-publish.sh&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767945150984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WATCH_DIR_INSIDE_CONTAINER=${WATCH_DIR:-&quot;/data&quot;}

echo &quot;&amp;gt;&amp;gt;&amp;gt; File Watcher started.&quot;
echo &quot;&amp;gt;&amp;gt;&amp;gt; Watching: $WATCH_DIR_INSIDE_CONTAINER&quot;
echo &quot;&amp;gt;&amp;gt;&amp;gt; Target RabbitMQ: $RMQ_HOST (AMQP)&quot;

inotifywait -m -q -e close_write -e moved_to --format '%w%f' &quot;$WATCH_DIR_INSIDE_CONTAINER&quot; | \
python3 -u /publisher.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 inotifywait이 특정 디렉토리를 관측하다가, 이동 이벤트를 감지하면 해당 파일 경로를 stdout 하고 파이프 구조를 통해 publisher.py 이 stdin으로 받는 구조다. 결국 python 에는 이벤트가 감지된 파일 경로가 들어간다.&lt;/p&gt;
&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;publisher.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767945203048&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
import os
import pika
import json
import time
import select

# 환경 변수 설정
RMQ_HOST = os.environ.get('RMQ_HOST', 'localhost')
RMQ_PORT = int(os.environ.get('RMQ_PORT', 5672))
RMQ_USER = os.environ.get('RMQ_USER', 'guest')
RMQ_PASS = os.environ.get('RMQ_PASS', 'guest')
EXCHANGE = os.environ.get('RMQ_EXCHANGE', 'file.events')
ROUTING_KEY = os.environ.get('RMQ_ROUTING_KEY', 'file.new')

def connect_to_rabbitmq():
    &quot;&quot;&quot;RabbitMQ 연결 생성 및 채널 반환&quot;&quot;&quot;
    credentials = pika.PlainCredentials(RMQ_USER, RMQ_PASS)
    parameters = pika.ConnectionParameters(
        host=RMQ_HOST,
        port=RMQ_PORT,
        credentials=credentials,
        heartbeat=60,
        blocked_connection_timeout=300
    )

    while True:
        try:
            print(f&quot;&amp;gt;&amp;gt;&amp;gt; Connecting to {RMQ_HOST}:{RMQ_PORT}...&quot;)
            connection = pika.BlockingConnection(parameters)
            channel = connection.channel()
            channel.exchange_declare(exchange=EXCHANGE, exchange_type='direct', durable=True)
            # channel.confirm_delivery()
            print(&quot;&amp;gt;&amp;gt;&amp;gt; Connection established.&quot;)
            return connection, channel
        except Exception as e:
            print(f&quot;!!! Connection failed: {e}. Retrying in 5 seconds...&quot;, file=sys.stderr)
            time.sleep(5)

# 초기 연결
connection, channel = connect_to_rabbitmq()
input_buffer = &quot;&quot;
count = 0

print(&quot;&amp;gt;&amp;gt;&amp;gt; Waiting for input...&quot;)

try:
    while True:
        try:
            # 평상시 Heartbeat 처리
            if connection and connection.is_open:
                connection.process_data_events()
            
            rlist, _, _ = select.select([sys.stdin], [], [], 1.0)
        except Exception as e:
            print(f&quot;!!! Connection lost during idle: {e}. Reconnecting...&quot;, file=sys.stderr)
            connection, channel = connect_to_rabbitmq()
            continue

        if rlist:
            try:
                # [최적화 1] 버퍼 크기 1MB 유지
                chunk = os.read(sys.stdin.fileno(), 1024 * 1024)
                if not chunk:
                    break 
                input_buffer += chunk.decode('utf-8')
            except OSError:
                break

            if '\n' in input_buffer:
                parts = input_buffer.split('\n')
                
                # 마지막 요소는 '완전하지 않은 줄'일 수 있으므로 버퍼에 남겨둠
                # 예: &quot;file1\nfile2\nfi&quot; -&amp;gt; parts=[&quot;file1&quot;, &quot;file2&quot;, &quot;fi&quot;]
                # lines_to_process = [&quot;file1&quot;, &quot;file2&quot;]
                # input_buffer = &quot;fi&quot;
                lines_to_process = parts[:-1]
                input_buffer = parts[-1]

                for file_path in lines_to_process:
                    file_path = file_path.strip()
                    if not file_path:
                        continue

                    # 파일 읽기 및 전송
                    try:
                        with open(file_path, 'r', encoding='utf-8') as f:
                            content = f.read()
                    except Exception as e:
                        print(f&quot;Error reading file {file_path}: {e}&quot;, file=sys.stderr)
                        continue

                    payload = {
                        &quot;filePath&quot;: file_path,
                        &quot;fileContent&quot;: content
                    }
                    body = json.dumps(payload)

                    # 전송 재시도 루프 (안정성)
                    while True:
                        try:
                            channel.basic_publish(
                                exchange=EXCHANGE,
                                routing_key=ROUTING_KEY,
                                body=body,
                                properties=pika.BasicProperties(
                                    delivery_mode=2,
                                    content_type='application/json'
                                )
                            )
                            
                            # RabbitMQ 네트워크 막힘 방지
                            # 1000개 보낼 때마다 RabbitMQ와 신호 교환 (ACK 처리)
                            count += 1
                            if count % 1000 == 0:
                                connection.process_data_events()
                                print(f&quot;Processed {count} files. Last: {file_path}&quot;)
                            
                            break
                        except Exception as e:
                            print(f&quot;!!! Failed to send {file_path}: {e}. Reconnecting...&quot;, file=sys.stderr)
                            try:
                                if connection and connection.is_open:
                                    connection.close()
                            except:
                                pass
                            connection, channel = connect_to_rabbitmq()

except KeyboardInterrupt:
    print(&quot;Stopping...&quot;)
finally:
    if connection and connection.is_open:
        connection.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`publisher.py` 에서 stdin 으로 받은 파일명으로 직접 읽어서 해당 바디값을 페이로드로 Queue 에 삽입하는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 스트립트들을 구성하고 docker container 로 구동시켰다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mt7mY/dJMcafsDVHA/okTSkJJVkDsb9J56XN6Npk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mt7mY/dJMcafsDVHA/okTSkJJVkDsb9J56XN6Npk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mt7mY/dJMcafsDVHA/okTSkJJVkDsb9J56XN6Npk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmt7mY%2FdJMcafsDVHA%2FokTSkJJVkDsb9J56XN6Npk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2184&quot; height=&quot;36&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 발주처에서 제공한 파일들을 mv 명령어로 이동 됐을 때 Queue 에 정상적으로 삽입 되는 걸 확인 할 수 있었다..!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbQRB/dJMcabqhhxh/O66XFMUPLKutxKyICCC640/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbQRB/dJMcabqhhxh/O66XFMUPLKutxKyICCC640/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbQRB/dJMcabqhhxh/O66XFMUPLKutxKyICCC640/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbQRB%2FdJMcabqhhxh%2FO66XFMUPLKutxKyICCC640%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;294&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kR7qt/dJMcafzq8zH/qYiCgABcNeOS61ENyPVeb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kR7qt/dJMcafzq8zH/qYiCgABcNeOS61ENyPVeb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kR7qt/dJMcafzq8zH/qYiCgABcNeOS61ENyPVeb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkR7qt%2FdJMcafzq8zH%2FqYiCgABcNeOS61ENyPVeb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;437&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3652&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxhWDn/dJMcaarmcVT/y9SUGudPgT9JibMNQ4KbSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxhWDn/dJMcaarmcVT/y9SUGudPgT9JibMNQ4KbSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxhWDn/dJMcaarmcVT/y9SUGudPgT9JibMNQ4KbSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxhWDn%2FdJMcaarmcVT%2Fy9SUGudPgT9JibMNQ4KbSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3652&quot; height=&quot;1192&quot; data-origin-width=&quot;3652&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2.1.4. 부하 테스트 후 개선&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 기술했다시피 꽤 대량의 데이터가 송수신된다. 그렇기 때문에 부하테스트를 해보기로 했고, 발주처에서 정의한 부하 정도는 3천건이라고 얘기하긴 했지만 필자는 발주처에서 제공한 데이터 전부를 넣어보고 부하테스트를 진행하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JCJpP/dJMcadatnt5/y95rvtImvfOy6Gn1rLEc7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JCJpP/dJMcadatnt5/y95rvtImvfOy6Gn1rLEc7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JCJpP/dJMcadatnt5/y95rvtImvfOy6Gn1rLEc7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJCJpP%2FdJMcadatnt5%2Fy95rvtImvfOy6Gn1rLEc7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;1632&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;1632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20781 건을 동시에 감시 디렉토리로 이동하는 테스트를 진행했고, 결과는 처참했다ㅋㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;old-1.png&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l67ok/dJMcaibRNs8/DE5k9Ddxem2BEgGqMIMPNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l67ok/dJMcaibRNs8/DE5k9Ddxem2BEgGqMIMPNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l67ok/dJMcaibRNs8/DE5k9Ddxem2BEgGqMIMPNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl67ok%2FdJMcaibRNs8%2FDE5k9Ddxem2BEgGqMIMPNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1021&quot; height=&quot;432&quot; data-filename=&quot;old-1.png&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;old-2.png&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNA8bc/dJMcadO4Xko/5pIcj2mqXJkfZhNQNB9Gx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNA8bc/dJMcadO4Xko/5pIcj2mqXJkfZhNQNB9Gx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNA8bc/dJMcadO4Xko/5pIcj2mqXJkfZhNQNB9Gx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNA8bc%2FdJMcadO4Xko%2F5pIcj2mqXJkfZhNQNB9Gx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1059&quot; height=&quot;464&quot; data-filename=&quot;old-2.png&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pYPeS/dJMcaiCX5u4/dkpJrpcMwKF57DBDDhKbkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pYPeS/dJMcaiCX5u4/dkpJrpcMwKF57DBDDhKbkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pYPeS/dJMcaiCX5u4/dkpJrpcMwKF57DBDDhKbkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpYPeS%2FdJMcaiCX5u4%2FdkpJrpcMwKF57DBDDhKbkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;410&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초당 약 148건의 속도로 삽입됐는데 약 2분정도? 소요됐다. 근데 데이터는 2,465 건 누락됐다..ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 웃으면서 쓰지만 당시에 매우 식은땀이 났다. 이대로 가면 중요한 항공 데이터를 내가 날려먹는 상황이 나온다는 생각에 AI 의 힘을 빌렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 가 알려준 문제로는 크게 3가지였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 동기 ACK 대기: 데이터 하나 송신 후 제대로 갔는지 체크하는 대기 시간 발생하여 대량 전송 시 병목현상 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. readLine(): readline()은&amp;nbsp;한&amp;nbsp;줄씩&amp;nbsp;시스템콜을&amp;nbsp;발생시켜&amp;nbsp;대량&amp;nbsp;입력&amp;nbsp;시&amp;nbsp;I/O&amp;nbsp;오버헤드가&amp;nbsp;큼.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. max_queued_events: inotify 이벤트 큐에 적재할 수 있는 최대 이벤트 수가 기본 값으로 2만건 수용이 안됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결 하기 위해서 다음과 같은 개선 사항을 알려줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 동기 ACK 대기 제거 (Publisher Confirm 비활성화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pika 패키지의 confirm_delivery()는 메시지를 1건 보낼 때마다 RabbitMQ broker가 &quot;잘 받았어&quot;라고 응답(ACK)을 줄 때까지 기다리는 기능이다. 비유하자면 택배를 보내는데, 한 박스 보내고 &amp;rarr; 상대방이 &quot;받았습니다&quot; 전화할 때까지 기다리고 &amp;rarr; 다음 박스 보내고 &amp;rarr; 또 전화 기다리고&amp;hellip; 이걸 2만번 반복하는 셈이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;vala&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;# Before: 매 건마다 broker ACK를 동기적으로 기다림
channel.confirm_delivery()

# After: ACK 대기 없이 연속 전송 (fire-and-forget)
# channel.confirm_delivery()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 끄면 택배를 쉬지 않고 연속으로 보내는 것과 같다. 대신 1000건마다 process_data_events()로 broker와 상태를 한번씩 확인하여 연결이 막히지 않게 했다. 참고로 confirm을 꺼도 TCP 연결 위에서 AMQP 프로토콜로 통신하기 때문에 메시지가 broker에 도달하는 것 자체는 보장된다.&lt;/p&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. readline() &amp;rarr; os.read() 청크 단위 읽기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sys.stdin.readline()은 파이프에서 데이터를 &lt;b&gt;한 줄씩&lt;/b&gt; 읽는다. 파일 경로가 2만건 들어오면 시스템콜이 2만번 발생한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;vala&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;# Before: readline() - 한 줄씩 읽기
# 파이프에 &quot;file1\nfile2\nfile3\n...&quot; 이 들어오면
#   1번째 시스템콜 &amp;rarr; &quot;file1\n&quot; 획득
#   2번째 시스템콜 &amp;rarr; &quot;file2\n&quot; 획득
#   3번째 시스템콜 &amp;rarr; &quot;file3\n&quot; 획득
#   ... 2만번 반복

line = sys.stdin.readline()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;vala&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;# After: os.read() - 1MB를 한번에 읽기
# 파이프에 &quot;file1\nfile2\nfile3\n...&quot; 이 들어오면
#   1번째 시스템콜 &amp;rarr; &quot;file1\nfile2\nfile3\n...file800\n&quot; 한번에 획득
#   직접 \n 기준으로 split해서 처리

chunk = os.read(sys.stdin.fileno(), 1024 * 1024)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마트에서 장바구니 없이 물건 하나 집고 계산하고, 다시 하나 집고 계산하는 것(readline)과, 카트에 한번에 담아서 한번에 계산하는 것(os.read)의 차이다. 시스템콜 횟수가 줄어드니 당연히 빨라진다.&lt;/p&gt;
&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. max_queued_events 파라미터 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;max_queued_events는 inotify 이벤트 큐에 적재할 수 있는 최대 이벤트 수(건수)다. 기본값은 16,384건인데, 2만건을 한번에 mv하면 이 큐가 넘쳐서 초과분 이벤트가 버려진다. 2,465건이 누락된 원인이 바로 이것이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dts&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;# 기본값 확인
cat /proc/sys/fs/inotify/max_queued_events
# 16384

# 영구 적용 (reboot 후에도 유지)
echo &quot;fs.inotify.max_queued_events = 49152&quot; | sudo tee /etc/sysctl.d/99-inotify.conf
sudo sysctl -p /etc/sysctl.d/99-inotify.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정은 호스트 커널 레벨 파라미터이므로, Docker 컨테이너 안이 아니라 &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;다시 테스트 해봤을 때 초당 2520건 삽입 되는 걸 확인 할 수 있었고, 데이터 누락없이 10초만에 모두 Queue 에 삽입 된 걸 볼 수 있었다. 대략 2분 -&amp;gt; 10초로 감소된 셈이다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;latest-1.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4MhWP/dJMcagE7N7A/R48yiKufZGJyvpwvYbEK91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4MhWP/dJMcagE7N7A/R48yiKufZGJyvpwvYbEK91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4MhWP/dJMcagE7N7A/R48yiKufZGJyvpwvYbEK91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4MhWP%2FdJMcagE7N7A%2FR48yiKufZGJyvpwvYbEK91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;399&quot; data-filename=&quot;latest-1.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;latest-2.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCfvyF/dJMb990i4yz/CPOr17aBtj1X63dD571KPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCfvyF/dJMb990i4yz/CPOr17aBtj1X63dD571KPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCfvyF/dJMb990i4yz/CPOr17aBtj1X63dD571KPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCfvyF%2FdJMb990i4yz%2FCPOr17aBtj1X63dD571KPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1055&quot; height=&quot;346&quot; data-filename=&quot;latest-2.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;latest-3.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUKfWF/dJMcaiv699z/5kG1rKE9L3xCkcetGuuPY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUKfWF/dJMcaiv699z/5kG1rKE9L3xCkcetGuuPY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUKfWF/dJMcaiv699z/5kG1rKE9L3xCkcetGuuPY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUKfWF%2FdJMcaiv699z%2F5kG1rKE9L3xCkcetGuuPY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;357&quot; data-filename=&quot;latest-3.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가에겐 간단한 문제였을 수 있지만.. 처음 실시간 연계 파이프라인을 구축해보는 입장에서 꽤 어려웠고, 그만큼 많이 고민하면서 시스템 설계를 하였다. 이런 경험들이 쌓여서 다음 유사한 케이스에선 좀 더 삽질을 덜 해서 더욱 탄탄한 구조를 만들 수 있음 좋겠다!&lt;/p&gt;</description>
      <category>programming/backend</category>
      <category>inotify</category>
      <category>linux</category>
      <category>RabbitMQ</category>
      <category>telegraf</category>
      <author>hand-mk</author>
      <guid isPermaLink="true">https://hand-mk.tistory.com/24</guid>
      <comments>https://hand-mk.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 9 Jan 2026 17:06:56 +0900</pubDate>
    </item>
  </channel>
</rss>