<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>In der Ruhe</title>
    <link>https://proyen.tistory.com/</link>
    <description>연의 개발 및 자기계발 기록을 위한 블로그</description>
    <language>ko</language>
    <pubDate>Thu, 27 Aug 2026 03:02:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>기록해연</managingEditor>
    <image>
      <title>In der Ruhe</title>
      <url>https://tistory1.daumcdn.net/tistory/7007160/attach/30c41e0fe1ed4c19a0d9e8b98b694d29</url>
      <link>https://proyen.tistory.com</link>
    </image>
    <item>
      <title>AUTOSAR Basic Software(BSW) 개발환경(1)</title>
      <link>https://proyen.tistory.com/90</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오토사 개발시 개발툴 사용이 필수.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;A: Authoring Tool, B: BSW Configuration Tool&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(일반적으로 Authoring Tool, BSW Tool은 같은 회사 제품 사용)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Vector&lt;br /&gt;A: Davinci Developer&lt;br /&gt;B: Davinci Configuration&lt;/li&gt;
&lt;li&gt;현대오토에버&lt;br /&gt;Mobilgene (A, B 통합)&lt;/li&gt;
&lt;li&gt;ETAS&lt;br /&gt;A: ISONLAR-A&lt;br /&gt;B: ISONLAR-B&lt;/li&gt;
&lt;li&gt;EB&lt;br /&gt;B: EB Tresos&lt;/li&gt;
&lt;li&gt;DASSAULT SYSTEMS&lt;br /&gt;A: Autosar Builder&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AUTOSAR BSW Layer&amp;nbsp;&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;Service Layer&lt;/li&gt;
&lt;li&gt;Ecu Abstraction Layer&lt;/li&gt;
&lt;li&gt;MicroController Abstraction Layer (MCAL)&lt;br /&gt;엠칼 영역은 개발툴 회사에서 판매X. MCU제조사들이 제공.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Peripheral&lt;/b&gt; (페리펄럴): MCU 내부의 다양한 하드웨어 장치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCU SW는 MCU 내부의 각종 패리퍼럴을 컨트롤함으로써 실질적으로 동작 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하는 MCU마다 SW가 서로 달라 소프트웨어 재사용이 어려움.&lt;br /&gt;&amp;rarr; 이런 문제를 해결하기 위해 AUTOSAR에서 만든 영역이 &lt;b&gt;MCAL&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;MCU를 직접적으로 컨트롤하는 부분을 표준화시켜 BSW(MCAL) 영역에 위치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(원칙적으로 MCU 접근은 BSW MCAL 에서만 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCU 마다 내부 패리펄럴 구조가 달라 MCAL 소프트웨어 코드는 &lt;u&gt;MCU마다 별도로 개발&lt;/u&gt;되어야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCAL SW는 MCU 제조사에서 본인들의 제품에 맞게 제공(유/무료)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 MCU에 대해 지원하지는 않으므로 MCAL 지원하는 MCU 확인 필요.&lt;/li&gt;
&lt;li&gt;구현된 MCAL SW는 MCU마다 다르지만, MCAL Configuration Tool은 모두 EB사의 EB Tresos 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CDD&lt;/b&gt;(Complex Drivers)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 기능을 구현해야하는데 AUTOSAR에서 표준화가 안되어있는 경우, 기존에 만들어져 있는 AUTOSAR 아키텍쳐를 그대로 활용하기에는 비효율적인 상황이 있을 때 활용하는 영역.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AUTOSAR 개발시 사용되는 Tool&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Authoring Tool
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Application Layer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;BSW 모듈코드 &amp;amp; BSW Configuration Tool
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Runtime Environment(RTE)&lt;/li&gt;
&lt;li&gt;Services Layer(in BSW)&lt;/li&gt;
&lt;li&gt;ECU Abstraction Layer(in BSW)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MCAL SW 모듈코드 &amp;amp; MCAL Configuration Tool
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;MicroController Abstraction Layer(in BSW)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/90</guid>
      <comments>https://proyen.tistory.com/90#entry90comment</comments>
      <pubDate>Wed, 16 Jul 2025 11:28:46 +0900</pubDate>
    </item>
    <item>
      <title>AUTOSAR Basic Software(BSW) 모듈</title>
      <link>https://proyen.tistory.com/89</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Basic SW&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 자동차 SW에서 사용하는 여러 제어기들이 공통적으로 사용하는 기능들의 SW 아키텍쳐를 표준화 한 영역&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;OS&lt;/li&gt;
&lt;li&gt;통신&lt;/li&gt;
&lt;li&gt;메모리&lt;/li&gt;
&lt;li&gt;HW I/O (Dio, PWM, ADC, ICU 등)&lt;/li&gt;
&lt;li&gt;와치독&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW 모듈마다 각자 &lt;b&gt;다른 역할&lt;/b&gt;을 가지고 있고, 서로 &lt;b&gt;연계&lt;/b&gt;되어 동작함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OS&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;MCU SW 전체적인 실행 흐름을 총괄.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Task&lt;/b&gt; 기반으로 동작&lt;/li&gt;
&lt;li&gt;Task Mapping: OS에 태스크를 생성하고 러너블과 매핑하는 작업.&lt;br /&gt;※ BSW Configuration Tool 사용(SWC 영역 설계하는 Authoring Tool과 다른 툴)&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;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메시지 송수신&lt;/li&gt;
&lt;li&gt;진단통신(UDS 프로토콜)&lt;/li&gt;
&lt;li&gt;XCP(변수 계측, 변수 값 변경 등)&lt;/li&gt;
&lt;li&gt;Network Management&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HW I/O&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCU 핀을 통해 전기적 신호 생성, 전압 감지 등의 기능을 제공하는 SW표준화(DIO, ADC, PWM 등)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uS68Q/btsPhz7rQHS/uvAlyqDkwe363EjERLjTk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uS68Q/btsPhz7rQHS/uvAlyqDkwe363EjERLjTk1/img.png&quot; data-alt=&quot;은색 부분이 MCU pin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uS68Q/btsPhz7rQHS/uvAlyqDkwe363EjERLjTk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuS68Q%2FbtsPhz7rQHS%2FuvAlyqDkwe363EjERLjTk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;510&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;은색 부분이 MCU pin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DIO: Digital Input/Output (DPIO)&lt;/li&gt;
&lt;li&gt;ADC: Analogue to Digital Converter. 특정 Pin에 걸려있는 전압을 측정.&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;Watchdog&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: MCU가 비정상적 상태인지 감지해서 MCU를 강제로 Reset&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p 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;AUTOSAR는 SW모듈마다 각각 아키텍쳐 문서를 오토사&lt;span&gt;&amp;nbsp;&lt;/span&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;www.autosar.org&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SWS&lt;/b&gt;: Software Specification. 아키텍쳐 문서 약어.&lt;br /&gt;ex) 검색시 autosar sws can,&lt;span&gt;&amp;nbsp;&lt;/span&gt;autosar sws&lt;span&gt;&amp;nbsp;&lt;/span&gt;pdur,&lt;span&gt;&amp;nbsp;&lt;/span&gt;autosar sws nvm 이런식으로 검색&lt;/li&gt;
&lt;/ul&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;u&gt;아키텍쳐만 제공&lt;/u&gt;하고 실제 사용가능한 Code는 AUTOSAR에서 제공하지 않음.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 오토사 SW 모듈 및 개발 Tool 판매회사에서 BSW&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;SW 모듈 코드&lt;/b&gt;를 구현하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;BSW Configuration Tool&lt;/b&gt;과 함께 판매함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex) EB사의 EB Tresos AutoCore, Vector사의 MICROSAR, 현대오토에버사의 모빌진&lt;/p&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/89</guid>
      <comments>https://proyen.tistory.com/89#entry89comment</comments>
      <pubDate>Tue, 15 Jul 2025 12:39:40 +0900</pubDate>
    </item>
    <item>
      <title>AUTOSAR Port(3) - Client Server Inferface</title>
      <link>https://proyen.tistory.com/88</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Client Server Interface (C/S)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 SWC에 정의된 함수 호출시 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AUTOSAR 개발 방법론에서 외부 SWC에 구현된 함수를 코드 상에서 직접 호출해서 사용하면 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파라미터 Direction&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;in : 함수 내부에서 인풋으로 사용&lt;/li&gt;
&lt;li&gt;out : 함수 결과값을 담는 용도&lt;/li&gt;
&lt;li&gt;inout : 인풋 + 결과값 용도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;pre id=&quot;code_1752198422001&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Add(int a, int b, int* result)
{
    *result = a+b;
    
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a, b는 in, result는 out&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Direction에 따라&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;in : 포인터 형태 X&lt;/li&gt;
&lt;li&gt;out, inout : &lt;b&gt;포인터&lt;/b&gt; 형태의 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;CS Port Interface 설계 과정&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. CS Port Interface 만들기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. Operation 추가&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Operation&lt;/b&gt; : CS 인터페이스에서 정의하는 함수&lt;/li&gt;
&lt;li&gt;포트 인터페이스 설계시에는 함수 형태만 정하고, 함수 내부의 코드 구현은 유저가 별도로 구현.&lt;/li&gt;
&lt;li&gt;Operation의 리턴값은 의미있는 결과값 X, 문제가 생겼을 때 외부로 알리기위한 &lt;b&gt;에러코드를 리턴하는 용도&lt;/b&gt;로만 제한.&lt;/li&gt;
&lt;li&gt;예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752199274034&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Add(int a, int b)
{
    return a+b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 방식 대신 아래 처럼 작성해야 함.&lt;/p&gt;
&lt;pre id=&quot;code_1752199311802&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Add(int a, int b, int* result) // 결과값을 담기 위한 파라미터 추가
{
    int ret = 0;
    *result = a+b;
    
    return ret;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. Operation 이름 정하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Operation&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에서 사용할 파라미터 설정(파라미터명, 데이터타입, Direction)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시&lt;br /&gt;Name: Command&lt;br /&gt;Data Type: uint8&lt;br /&gt;Direction: In&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;5. Error Code 설정(필수X)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Application Errors(Possible Errors)에 Error Code 명, Error Code 값(0: 정상 / 1~63 : 사용자가 설정) 추가
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Error Code 사용하는 경우 리턴 타입&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;StdReturnType&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(unsigned 8bit 정수형 데이터타입)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Error Code 사용하지&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;않은 경우 리턴 타입&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Operation에서 사용할 Error Code 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. SWC에 Port Prototype을 추가&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Port Prototype의 이름 지정(Port Interface랑 Port Prototype은 별개이므로 따로 지정) - ex. LampPort&lt;/li&gt;
&lt;li&gt;Sever: 함수 호출받는 SWC / Provide Port (서비스 제공)&lt;/li&gt;
&lt;li&gt;Client: 함수 호출하는 SWC / Require Port (서비스를 제공 받음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eG5N2H/btsPg64eSU0/LVBGjLfTSCfvmJZNkztgak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eG5N2H/btsPg64eSU0/LVBGjLfTSCfvmJZNkztgak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eG5N2H/btsPg64eSU0/LVBGjLfTSCfvmJZNkztgak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeG5N2H%2FbtsPg64eSU0%2FLVBGjLfTSCfvmJZNkztgak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;242&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. RootComposition에 올려두고 Port 간 연결&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 설계 후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. SWC에 Runnable 추가&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client가 Operation 호출을 요청했을 때 실행될 서버 Runnable을 SWC에 추가하는 작업을 Authoring Tool로 해줘야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Server쪽에 &lt;b&gt;OperationInvokedEvent&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;Runnable의 이벤트 세팅. (호출 조건 세팅)&lt;/li&gt;
&lt;li&gt;서버 포트에 만들어져있는 오퍼레이션과 사용할 러너블 매칭.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Client 쪽에 &lt;b&gt;ServerCall Point&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;소프트웨어 컴포넌트 간의 연결은 RTE(Runtime Envirenment) 영역이 담당.&lt;br /&gt;&amp;rarr; SWC간의 함수 호출하는 경우에도 RTE가 담당해야함. 러너블을 직접 호출하면 오토사 규칙 위반.&lt;br /&gt;&amp;rarr;&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; RTE API를 호출(RTE API가 러너블 실행)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752461121783&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;Rte_SeatBelt.h&quot;

void SeatBelt_MainFunction(void)
{
    uint8 Lamp_Command;
    
    if(조건만족시)
    Rte_Call_LampPort_Lamp_Control(Lamp_Command);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 러너블마다 Call 하려는 Operation의&lt;b&gt; Server Call Point&lt;/b&gt;를 추가&lt;br /&gt;&amp;rarr; 그래야 Operation 호출을 위한 RTE API가 생성됨.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Synchronos방식: Client SWC에서 함수 호출하는 러너블에 Synchronous ServerCallPoint 세팅&lt;/li&gt;
&lt;li&gt;Asynchronos방식: Client SWC에서 함수 호출하는 러너블에 Asynchronous ServerCallPoint 세팅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 설계한 결과물은 모두 &lt;b&gt;Arxml&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;4. 설계 내용 Code Generation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 러너블 내부코드 구현 및 생성된 &lt;b&gt;RTE API&lt;/b&gt; 활용&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RTE API 네이밍룰&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Rte_Call_포트프로토타입명_오퍼레이션명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포트 인터페이스명: Pi_LampControl&lt;/li&gt;
&lt;li&gt;오퍼레이션명: Lamp_Control&lt;/li&gt;
&lt;li&gt;클라이언트 SWC의 Port Prototype명: LampPort&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752461834129&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Rte_Call_포트프로토타입명_오퍼레이션명
Rte_Call_LampPort_Lamp_Control&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Synchronous Call VS Asynchronous Call&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특이사항이 없다면 Sync방식 이용&lt;/p&gt;
&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;Synchronous 방식 (Blocking)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 함수 호출시 곧바로 실행.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Operation Call&lt;/li&gt;
&lt;li&gt;Operation Code 실행 &amp;nbsp;&lt;/li&gt;
&lt;li&gt;나머지 코드 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Asynchronous 방식 (Non Blocking)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;: 함수 실행 요청만 보낸 상태로 하던 작업 계속 수행. 서버 러너블(오퍼레이션)은 나중에 실행.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(오퍼레이션 실행시간이 오래 걸리는 경우 사용)&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Operation Call&lt;br /&gt;: OS에게 Operation 실행 요청&lt;/li&gt;
&lt;li&gt;나머지 코드 실행&lt;/li&gt;
&lt;li&gt;OS에 의해 나중에 Operation 실행&lt;br /&gt;&lt;b&gt;Rte_Result API &lt;/b&gt;: Operation 실행 결과를 받기 위한 추가 API 사용.&lt;br /&gt;ㄴ아직 실행되지 않아 결과값이 담겨있지않아서 따로 받아와야함.&lt;br /&gt;(결과값 전달 받을 러너블에 &lt;b&gt;AsynchronousServerCallResultPoint&lt;/b&gt; 세팅해줘야 Rte_result API 사용 가능)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1752469030470&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Rte_Call_TestPort_Add(data1, data2, &amp;amp;result);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위를 아래처럼 나누어 사용.&lt;/p&gt;
&lt;pre id=&quot;code_1752469064347&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Rte_Call_TestPort_Add(data1, data2);

Rte_Result_TestPort_Add(&amp;amp;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;Rte_Result API의 Return 값:&lt;/p&gt;
&lt;pre id=&quot;code_1752469316845&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Operation 수행 완료된 경우
#define RTE_E_OK       (0)  

// Operation 수행 안끝난 경우
#define RTE_E_NO_DATA  (131)&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;Operation 실행 완료 여부를 알림받고 싶다면 &lt;b&gt;AsynchronousServerCallReturnEvent&lt;/b&gt;를 활용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청한 Operation 실행 결과를 받기 위한 2가지 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Polling 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: RTE_Result API 호출시 오퍼레이션이 아직 완료 안되었다면, RTE_E_NO_DATA 리턴하여 알려주고 끝남. 결과 받으려면 나중에 다시 RTE_Result 호출해야 함.&lt;/p&gt;
&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;Waiting 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;RTE_Result API 호출시 오퍼레이션이 아직 완료 안되었다면,&lt;span&gt; 뒤쪽 코드가 먼저 실행되는게 아니라 오퍼레이션이 완료될 때까지 기다렸다가 뒤의 코드 실행.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Waiting Point 설정 필요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RTE Return Event&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Async 방식을 이용하여 오퍼레이션 호출시, 나중에 서버에서 오퍼레이션 실행이 완료되면 클라이언트의 특정 러너블을 실행시키는 동작 방식. (Polling 타입에서만 사용 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/88</guid>
      <comments>https://proyen.tistory.com/88#entry88comment</comments>
      <pubDate>Mon, 14 Jul 2025 17:13:19 +0900</pubDate>
    </item>
    <item>
      <title>AUTOSAR Port(2) - Sender Receiver Inferface</title>
      <link>https://proyen.tistory.com/87</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; Sender Receiver Inferface&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data Element&lt;/b&gt; : Sender Receiver 포트를 통해 주고받는 정보를 데이터.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Element와 별개로 Port Interface를 하나 설계했으면 &lt;u&gt;해당 Port Interface의 이름도 별도로 지정&lt;/u&gt;해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 인터페이스 만드는 단계에서는 어떤 정보를 주고받을 지에 대한 설계,&amp;nbsp;&lt;/p&gt;
&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;P Port&lt;/b&gt; (Provide Port) : 데이터를 보내는 쪽의 Port Prototype&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;R Port&lt;/b&gt; (Require Port) : 데이터를 받는 쪽의 Port Prototype&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ P포트용 인터페이스, R포트용 인터페이스가 따로 있는게 아니고, &lt;b&gt;동일한 포트 인터페이스를 사용&lt;/b&gt;해서 소프트웨어 컴포넌트에 포트를 추가하는데 그 포트가 연결되는 소프트웨어 컴포넌트의 &lt;b&gt;역할&lt;/b&gt;에 따라 P포트, R포트라고 지정해서 Port Prototype을 만드는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sender(P Port) &amp;rarr; Receiver(R Port)는 &lt;b&gt;1:N 연결&lt;/b&gt; 가능(N:1은 불가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트와 포트를 연결하는 작업은 SWC Type상태에서 X.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포지션의 SWC를 Prototype으로 만들어놓고 컴포지션 상에서 연결.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Sender Receiver Inferface 설계 과정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 포트 설계&lt;br /&gt;S/R 포트 인터페이스를 만들고 이름을 지정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 해당 포트로 주고받을 데이터 엘리먼트 설계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 엘리먼트의 이름을 정하고, 데이터 타입을 정함.&lt;/p&gt;
&lt;pre id=&quot;code_1752121761917&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BeltStatePort 
- Belt_State : uint32&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;BeltStatePort &amp;rarr; 포트 인터페이스 이름&lt;/li&gt;
&lt;li&gt;Belt_State &amp;rarr;&amp;nbsp; 엘리먼트 이름&lt;/li&gt;
&lt;li&gt;uint32&amp;nbsp;&amp;rarr; 데이터 타입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. SWC에 포트 추가&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포트 인터페이스를 사용하여 SWC에 Port Prototype 생성.&lt;br /&gt;(Sender SWC에는 P Port, Receiver SWC에는 R Port 생성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 컴포지션 상에서 P port 와 R Port를 연결.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;Runnable&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;툴의 Code Generation 기능을 이용하여 실제 C코드 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 컴포넌트에 정의된 Runnable마다 해당 Runnable이 실제로 포트를 통해 정보를 주고 받을지(&lt;b&gt;Variable Access&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;해당 세팅을 해줘야 실제 정보를 주고받기 위한 RTE API Code를 툴이 생성해줌.&lt;/li&gt;
&lt;li&gt;SWC에 포트를 추가하고 컴포지션 상의 포트연결까지 했더라도 Variable Access가 세팅되어 있지 않다면, 이 포트를 사용하는 Runnable 이 없다고 판단해 RTE API Code를 생성하지 않음.&lt;/li&gt;
&lt;li&gt;세팅방법&lt;br /&gt;툴을 사용하여 &lt;b&gt;각 Runnable 별로&lt;/b&gt; 사용하려는 Port의 데이터 엘리먼트에 대한 &lt;b&gt;Variable Access&lt;/b&gt;를 이 Runnable에 세팅.(정확히는 포트별로 세팅하는게 아니라 데이터 엘리먼트 별로 세팅)&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;[Explicit] Variable Access를 Sender에서는 &lt;b&gt;Data Send Point&lt;/b&gt;, Recei ver에서는 &lt;b&gt;Data Receive Point&lt;/b&gt; 라고 지칭.&lt;/li&gt;
&lt;li&gt;[Implicit] Variable Access를 Sender에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Data Write Access&lt;/b&gt;, Recei ver에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Data Read Access&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;라고 지칭.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T9Rix/btsPcg0vMCx/PYgWsrfJ1vyXqCyYPIEMW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T9Rix/btsPcg0vMCx/PYgWsrfJ1vyXqCyYPIEMW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T9Rix/btsPcg0vMCx/PYgWsrfJ1vyXqCyYPIEMW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT9Rix%2FbtsPcg0vMCx%2FPYgWsrfJ1vyXqCyYPIEMW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;357&quot; data-origin-width=&quot;413&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;※ 설계한 결과물은 모두 arxml형태.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용방식: Explicit 방식 VS Implicit 방식&lt;/h4&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;21강 교육자료 참조&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;파일명: 04_03_Port - Sender Receiver Port - 보충( Implicit &amp;amp; Explicit)_워터마크.pdf&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;Explicit 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SWC간에 주고 받을 데이터가 RTE변수로 선언되고 RTE Write API 호출시 곧바로 RTE 변수값이 업데이트, RTE Read API 호출시 현재RTE 변수에 쓰여있는 값(최신값)을 읽어가는 방식.&lt;/p&gt;
&lt;pre id=&quot;code_1752133555532&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 네이밍
Rte_Write_BeltState_Belt_State(1); // Explicit Write 
//Rte_Write_포트프로토타입명_데이터엘리먼트명

Rte_Read_BeltState_Belt_State($read_data); // Explicit Read
//Rte_Read_포트프로토타입명_데이터엘리먼트명&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Implicit 방식&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;(OS Task 스케줄 정책에 의해 특정 러너블 실행 도중, 다른 러너블이 중간에 먼저 실행되는 경우) 여러 데이터를 주고 받을 때, 데이터들의 일관성을 보장 받기 위해 사용.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보를 주고 받기 위한 RTE 변수 외에 추가로 버퍼 하나 더 추가.&lt;/p&gt;
&lt;pre id=&quot;code_1752134266307&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;Rte_Type.h&quot;

unit3 Rte_OutBuffer; // Implicit Write를 위한 버퍼

unit3 Rte_SeatBeltState_Data; // RTE변수. 러너블 종료 후 버퍼값 반영

unit3 Rte_InBuffer; // Implicit Read를 위한 버퍼&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; Implicit Write&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTE API 호출시 Write 요청값이 버퍼에 담겨있다가 러너블이 종료된 후 RTE데이터에 반영.&lt;/p&gt;
&lt;pre id=&quot;code_1752133962991&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 네이밍
Rte_IWrite_Seatbelt_MainFunction_BeltState_data(1); // Implicit Write
// Rte_IWrite_러너블명_포트프로토타입명_데이터엘리먼트명

Rte_IRead_Cluster_MainFunction_BeltState_data(&amp;amp;read_data);
// Rte_IRead_러너블명_포트프로토타입명_데이터엘리먼트명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Implicit&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Read&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTE API를 호출하는 러너블이 실행되기 직전에 RTE 변수에 담겨있는 값을 버퍼로 옮겨놓고, 러너블 내부에서 RTE API를 호출했을 때 RTE 변수에 쓰여있는 최신값 대신 미리 옮겨둔 버퍼 값을 읽어감.&lt;/p&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/87</guid>
      <comments>https://proyen.tistory.com/87#entry87comment</comments>
      <pubDate>Thu, 10 Jul 2025 17:11:42 +0900</pubDate>
    </item>
    <item>
      <title>AUTOSAR Port(1)</title>
      <link>https://proyen.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Port Interface&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: SWC에 포트를 추가하기 전 포트 설계시 만들어진 결과물 (&lt;span&gt;&amp;asymp; 설계도)&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;Port Prototype&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 포트 인터페이스를 실제로 사용할 때 SWC에 추가해서 사용한 포트 (&amp;asymp; 설계로 지은 건물)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※포트를 서로 연결하는 작업은 컴포지션에 SWC Prototype을 만든 후 가능.&lt;/p&gt;
&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;Connector&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 컴포지션 상에서 포트를 서로 &lt;b&gt;연결&lt;/b&gt;해 놓은 것.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Port Interface 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. SWC Type 설계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;SWC Type에 Runnable 생성&lt;/li&gt;
&lt;li&gt;&amp;nbsp;SWC Type에 Port Interface를 사용해서 Port Prototype 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 완성된 SCW Type을 사용해 RootComposition에 SWC Prototype 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Composition 상에서 Port들을 서로 연결&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Port Interface는 용도에 따라 총 6가지 종류가 있음.&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;b&gt;Sender Receiver Inferface (S/R Interface)&lt;/b&gt;&lt;br /&gt;: SWC간의 어떤 값을 주고받아야 할 때 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Client Server Interface (C/S Interface)&lt;/b&gt; &lt;br /&gt;: 다른 SWC에 정의된 함수 호출할 때 사용.&lt;/li&gt;
&lt;li&gt;Nv Data Interface&lt;/li&gt;
&lt;li&gt;Mode Switch Interface&lt;/li&gt;
&lt;li&gt;Parameter Interface&lt;/li&gt;
&lt;li&gt;Trigger Interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/86</guid>
      <comments>https://proyen.tistory.com/86#entry86comment</comments>
      <pubDate>Thu, 10 Jul 2025 14:24:24 +0900</pubDate>
    </item>
    <item>
      <title>AUTOSAR Software Architeture</title>
      <link>https://proyen.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지는 위의 링크 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ6bXW/btsPas1iyBs/Ig8kbak4PIDH8qGwXFClZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ6bXW/btsPas1iyBs/Ig8kbak4PIDH8qGwXFClZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ6bXW/btsPas1iyBs/Ig8kbak4PIDH8qGwXFClZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ6bXW%2FbtsPas1iyBs%2FIg8kbak4PIDH8qGwXFClZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;612&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ASW(Application SW)&lt;/b&gt; : OEM이나 부품사 고유 핵심기능 구현 부분.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;제품을 컨트롤하기 위한 실질적 로직 구현 영역.&lt;/li&gt;
&lt;li&gt;하드웨어로부터 독립적(MCU가 바껴도 재사용 가능).&lt;/li&gt;
&lt;li&gt;Software Component(SWC) 로 구성됨.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;SWC가 포함해야 하는 정보: &lt;br /&gt;SWC명, Runnable(소프트웨어 컴포넌트 내부에 정의된 함수. 하나의 SWC안에 여러 개의 러너블 추가 가능), Port(외부와 소통하기 위한 인터페이스 등)&lt;br /&gt;&amp;rarr; 이런 내용들이 전부 arxml 형태로 정의.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RTE&lt;/b&gt; : ASW와 BSW를 연결하기 위한 영역(직접구현X, Tool에서 코드 제너레이션으로 제공).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BSW&lt;/b&gt; : 여러 제어기들이 공통적으로 사용하는 기능 표준화해서 모아둔 영역.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;하드웨어에 의존적인 부분을 담당하여 Application SW를 하드웨어에서 분리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SWC 개발&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. SWC 생성(+ Runnable 설계)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Port 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 상호작용이 필요한 다른 SWC 또는 BSW 영역을 포트를 통해 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Autosar Authoring Tool 로 작업. 작업산출물은 arxml 파일.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Authoring Tool : App SWC, Port, Port 연결 등을 설계하는 툴&lt;/li&gt;
&lt;li&gt;BSW Configuration Tool : BSW 영역을 작업하는 툴&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Runnable&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: SWC의 동작을 정의하는 함수(유저가 SWC를 통해서 구현하려는 기능을 러너블 내부에 구현해서 사용)&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;1. 러너블 추가&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Runnable 속은 비어있으므로 내부코드 &lt;b&gt;구현은 개발자가 직접&lt;/b&gt; 해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 이벤트 세팅 (러너블이 호출될 조건)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;러너블 내부의 기능 구현은 사용자가 하지만, &lt;b&gt;러너블을 호출하는 코드를 사용자가 직접 구현X&lt;/b&gt;(툴을 통해 생성된 RTE코드와 OS에 의해 구현되기 때문)&lt;br /&gt;&amp;rarr; &lt;b&gt;Authoring 툴&lt;/b&gt;로 러너블 설계시 각 러너블이 실행될 조건도 설계 필요(&lt;b&gt;Event&lt;/b&gt;)&lt;br /&gt;ex) Init, Timing, Data Recevied, AsynchronousServerCallReturnsEvent 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. OS Task 생성 및 기타 설정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS모듈: 러너블들을 호출해서 소프트웨어 실행을 전체적으로 통제하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. Task 매핑&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Runnable에 이벤트를 세팅된 이벤트들을 OS와 연결해주는 &lt;b&gt;Configuration(설정) 작업&lt;/b&gt;을 추가로 해줘야 함.&lt;br /&gt;※ OS는 BSW 모듈이라 Authoring툴이 아니라 &lt;b&gt;BSW Configuration 툴을 이용&lt;/b&gt;해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Port&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 외부의 SWC와 소통하기 위한 &lt;b&gt;통로&lt;/b&gt; 역할 (AUTOSAR에서는 포트를 통해서만 다른 SWC와 소통하도록 정의되어 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 포트를 만드어서 Code Generation시 RTE API가 생성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 포트 설계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포트에 대한 각종 세부사항 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. SWC에 포트 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 컴포지션 상에서 포트 연결&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트들을 &lt;b&gt;컴포지션&lt;/b&gt;에 올려두고 컴포지션 상에서 포트 연결.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SWC Type&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 아직 컴포지션 상에 올라가지 않은 상태의 SWC.(&lt;span&gt;&amp;asymp;건물 설계도)&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; SWC ProtoType&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 실제로 SWC를 프로젝트에서 사용하기 위해 컴포지션 상에 올려놓은 SWC. (&amp;asymp;설계도를 이용해 지은 건물)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ SWC Type의 내용이 변경되면, SWC Prototype에도 자동으로 적용.&lt;/p&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/85</guid>
      <comments>https://proyen.tistory.com/85#entry85comment</comments>
      <pubDate>Thu, 10 Jul 2025 10:10:02 +0900</pubDate>
    </item>
    <item>
      <title>CAN통신, LIN통신, DBC, LDF</title>
      <link>https://proyen.tistory.com/84</link>
      <description>&lt;h2 data-end=&quot;153&quot; data-start=&quot;113&quot; data-ke-size=&quot;size26&quot;&gt;✅ 1. CAN 통신 (Controller Area Network)&lt;/h2&gt;
&lt;blockquote data-end=&quot;197&quot; data-start=&quot;155&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;197&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동차의 핵심 제어용 통신&lt;/b&gt; &amp;ndash; 빠르고 신뢰성 높은 다목적 네트워크&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;212&quot; data-start=&quot;199&quot; data-ke-size=&quot;size23&quot;&gt;  특징 요약&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 143px;&quot; border=&quot;1&quot; data-end=&quot;427&quot; data-start=&quot;214&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 21.0465%;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 78.8372%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;266&quot; data-start=&quot;242&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center; width: 21.0465%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;247&quot; data-start=&quot;242&quot;&gt;개발&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 78.8372%;&quot; data-end=&quot;266&quot; data-start=&quot;247&quot; data-col-size=&quot;sm&quot;&gt;BOSCH사 (1980년대)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;306&quot; data-start=&quot;267&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center; width: 21.0465%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;272&quot; data-start=&quot;267&quot;&gt;속도&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 78.8372%;&quot; data-end=&quot;306&quot; data-start=&quot;272&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;최대 1Mbps 이상 (CAN FD는 더 빠름)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;326&quot; data-start=&quot;307&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center; width: 21.0465%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;312&quot; data-start=&quot;307&quot;&gt;구조&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 78.8372%;&quot; data-end=&quot;326&quot; data-start=&quot;312&quot; data-col-size=&quot;sm&quot;&gt;멀티마스터, 버스형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;371&quot; data-start=&quot;327&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center; width: 21.0465%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;335&quot; data-start=&quot;327&quot;&gt;사용 위치&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 78.8372%;&quot; data-end=&quot;371&quot; data-start=&quot;335&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;엔진제어, 브레이크, 에어백, 변속기 등 핵심 제어&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;404&quot; data-start=&quot;372&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center; width: 21.0465%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;377&quot; data-start=&quot;372&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 78.8372%;&quot; data-end=&quot;404&quot; data-start=&quot;377&quot; data-col-size=&quot;sm&quot;&gt;고속, 충돌 방지(우선순위), 내구성 강함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;427&quot; data-start=&quot;405&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center; width: 21.0465%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;410&quot; data-start=&quot;405&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 78.8372%;&quot; data-end=&quot;427&quot; data-start=&quot;410&quot; data-col-size=&quot;sm&quot;&gt;복잡한 구조, 비용 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;440&quot; data-start=&quot;429&quot; data-ke-size=&quot;size23&quot;&gt;  예&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;484&quot; data-start=&quot;441&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;484&quot; data-start=&quot;441&quot;&gt;엔진 컨트롤러가 휠속도, 브레이크 상태, 변속기 정보를 실시간으로 주고받음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;489&quot; data-start=&quot;486&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;534&quot; data-start=&quot;491&quot; data-ke-size=&quot;size26&quot;&gt;✅ 2. LIN 통신 (Local Interconnect Network)&lt;/h2&gt;
&lt;blockquote data-end=&quot;573&quot; data-start=&quot;536&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;573&quot; data-start=&quot;538&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비교적 단순하고 저속&amp;middot;저비용 통신 방식&lt;/b&gt; &amp;ndash; 보조 시스템용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;588&quot; data-start=&quot;575&quot; data-ke-size=&quot;size23&quot;&gt;  특징 요약&lt;/h3&gt;
&lt;div&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 147px;&quot; border=&quot;1&quot; data-end=&quot;823&quot; data-start=&quot;590&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;650&quot; data-start=&quot;618&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;623&quot; data-start=&quot;618&quot;&gt;개발&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;650&quot; data-start=&quot;623&quot; data-col-size=&quot;sm&quot;&gt;LIN Consortium (2000년경)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;687&quot; data-start=&quot;651&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;656&quot; data-start=&quot;651&quot;&gt;속도&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;687&quot; data-start=&quot;656&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;최대 20kbps (CAN보다 훨씬 느림)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;718&quot; data-start=&quot;688&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;693&quot; data-start=&quot;688&quot;&gt;구조&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;718&quot; data-start=&quot;693&quot;&gt;&lt;b&gt;싱글 마스터&amp;ndash;멀티 슬레이브&lt;/b&gt; 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;766&quot; data-start=&quot;719&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;727&quot; data-start=&quot;719&quot;&gt;사용 위치&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;766&quot; data-start=&quot;727&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;창문, 시트 조절, 실내조명, 거울 제어 등 비핵심 기능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;793&quot; data-start=&quot;767&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;772&quot; data-start=&quot;767&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;793&quot; data-start=&quot;772&quot; data-col-size=&quot;sm&quot;&gt;간단함, 저비용, 배선 수 절약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;823&quot; data-start=&quot;794&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;799&quot; data-start=&quot;794&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;823&quot; data-start=&quot;799&quot; data-col-size=&quot;sm&quot;&gt;느린 속도, 신뢰성은 CAN보다 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;836&quot; data-start=&quot;825&quot; data-ke-size=&quot;size23&quot;&gt;  예&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;879&quot; data-start=&quot;837&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;879&quot; data-start=&quot;837&quot;&gt;조수석 창문 스위치를 누르면 LIN 통신으로 슬레이브 노드가 유리를 올림&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;884&quot; data-start=&quot;881&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;908&quot; data-start=&quot;886&quot; data-ke-size=&quot;size26&quot;&gt;⚖️ CAN vs LIN 비교 정리&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1193&quot; data-start=&quot;910&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody data-end=&quot;1193&quot; data-start=&quot;966&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt; CAN 통신 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt; LIN 통신 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1026&quot; data-start=&quot;966&quot;&gt;
&lt;td style=&quot;text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;972&quot; data-start=&quot;966&quot;&gt;사용처&lt;/td&gt;
&lt;td data-end=&quot;1000&quot; data-start=&quot;972&quot; data-col-size=&quot;sm&quot;&gt;엔진, 변속기, 브레이크 등 &lt;b&gt;핵심 제어&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1026&quot; data-start=&quot;1000&quot; data-col-size=&quot;sm&quot;&gt;창문, 시트, 조명 등 &lt;b&gt;보조 제어&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1069&quot; data-start=&quot;1027&quot;&gt;
&lt;td style=&quot;text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1034&quot; data-start=&quot;1027&quot;&gt;통신속도&lt;/td&gt;
&lt;td data-end=&quot;1052&quot; data-start=&quot;1034&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;최대 1Mbps 이상&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1069&quot; data-start=&quot;1052&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;최대 20kbps&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1117&quot; data-start=&quot;1070&quot;&gt;
&lt;td style=&quot;text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1077&quot; data-start=&quot;1070&quot;&gt;통신구조&lt;/td&gt;
&lt;td data-end=&quot;1095&quot; data-start=&quot;1077&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;멀티마스터&lt;/b&gt; (버스형)&lt;/td&gt;
&lt;td data-end=&quot;1117&quot; data-start=&quot;1095&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;마스터-슬레이브&lt;/b&gt; (직선형)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1148&quot; data-start=&quot;1118&quot;&gt;
&lt;td style=&quot;text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1123&quot; data-start=&quot;1118&quot;&gt;비용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1138&quot; data-start=&quot;1123&quot;&gt;상대적으로 &lt;b&gt;고가&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1148&quot; data-start=&quot;1138&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;저가&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1173&quot; data-start=&quot;1149&quot;&gt;
&lt;td style=&quot;text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1155&quot; data-start=&quot;1149&quot;&gt;신뢰성&lt;/td&gt;
&lt;td data-end=&quot;1163&quot; data-start=&quot;1155&quot; data-col-size=&quot;sm&quot;&gt;매우 높음&lt;/td&gt;
&lt;td data-end=&quot;1173&quot; data-start=&quot;1163&quot; data-col-size=&quot;sm&quot;&gt;비교적 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1193&quot; data-start=&quot;1174&quot;&gt;
&lt;td style=&quot;text-align: center;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1179&quot; data-start=&quot;1174&quot;&gt;배선&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1187&quot; data-start=&quot;1179&quot;&gt;약간 복잡&lt;/td&gt;
&lt;td data-end=&quot;1193&quot; data-start=&quot;1187&quot; data-col-size=&quot;sm&quot;&gt;단순&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1198&quot; data-start=&quot;1195&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1215&quot; data-start=&quot;1200&quot; data-ke-size=&quot;size26&quot;&gt;비유&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1287&quot; data-start=&quot;1217&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1252&quot; data-start=&quot;1217&quot;&gt;&lt;b&gt;CAN&lt;/b&gt; = 고속도로 (빠르고 정밀, 핵심 부품용)&lt;/li&gt;
&lt;li data-end=&quot;1287&quot; data-start=&quot;1253&quot;&gt;&lt;b&gt;LIN&lt;/b&gt; = 골목길 (천천히 가도 되는 기능에 적합)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-end=&quot;129&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;129&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;129&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;(AUTOSAR 실무에서 언급되는) DBC 파일과 LDF 파일은 &lt;b&gt;자동차 네트워크 통신 정의 파일&lt;/b&gt;. 각각의 파일은 &lt;b&gt;다른 프로토콜&lt;/b&gt;에 해당하고, AUTOSAR 툴에서 &lt;b&gt;통신 설정 자동화&lt;/b&gt;에 꼭 필요함.&lt;/p&gt;
&lt;hr data-end=&quot;134&quot; data-start=&quot;131&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;153&quot; data-start=&quot;136&quot; data-ke-size=&quot;size26&quot;&gt;✅ 1. DBC 파일이란?&lt;/h2&gt;
&lt;blockquote data-end=&quot;198&quot; data-start=&quot;155&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;198&quot; data-start=&quot;157&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CAN 통신용 데이터베이스 파일 (CAN Database File)&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;213&quot; data-start=&quot;200&quot; data-ke-size=&quot;size23&quot;&gt;  주요 내용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;331&quot; data-start=&quot;214&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;245&quot; data-start=&quot;214&quot;&gt;&lt;b&gt;CAN 통신 메시지와 신호(Signal)&lt;/b&gt; 정의&lt;/li&gt;
&lt;li data-end=&quot;287&quot; data-start=&quot;246&quot;&gt;송신/수신 노드, 메시지 ID, 주기, 데이터 길이, 스케일 정보 포함&lt;/li&gt;
&lt;li data-end=&quot;300&quot; data-start=&quot;288&quot;&gt;.dbc 확장자&lt;/li&gt;
&lt;li data-end=&quot;331&quot; data-start=&quot;301&quot;&gt;&lt;b&gt;Vector사의 CANdb++ 형식&lt;/b&gt;이 대표적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;345&quot; data-start=&quot;333&quot; data-ke-size=&quot;size23&quot;&gt;  구성 예&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752024169384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BO_ 123 ABS_Info: 8 ABS
 SG_ WheelSpeed : 0|16@1+ (0.01,0) [0|300] &quot;km/h&quot;  ECU1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;493&quot; data-start=&quot;444&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &quot;ABS_Info&quot;라는 메시지 ID 123에 &quot;WheelSpeed&quot;라는 신호가 정의됨&lt;/p&gt;
&lt;p data-end=&quot;493&quot; data-start=&quot;444&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;498&quot; data-start=&quot;495&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;517&quot; data-start=&quot;500&quot; data-ke-size=&quot;size26&quot;&gt;✅ 2. LDF 파일이란?&lt;/h2&gt;
&lt;blockquote data-end=&quot;561&quot; data-start=&quot;519&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;561&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LIN 통신용 설명 파일 (LIN Description File)&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;576&quot; data-start=&quot;563&quot; data-ke-size=&quot;size23&quot;&gt;  주요 내용&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;667&quot; data-start=&quot;577&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;603&quot; data-start=&quot;577&quot;&gt;&lt;b&gt;LIN 통신 프레임/신호/스케줄 정의&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;604&quot;&gt;Master/Slave 노드 정보 포함&lt;/li&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;628&quot;&gt;.ldf 확장자&lt;/li&gt;
&lt;li data-end=&quot;667&quot; data-start=&quot;641&quot;&gt;&lt;b&gt;LIN Consortium 표준 형식&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;681&quot; data-start=&quot;669&quot; data-ke-size=&quot;size23&quot;&gt;  구성 예&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752024187150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Node {
   Master: Master1;
   Slaves: Slave1, Slave2;
}
Frame {
   name: EngineData;
   id: 0x20;
   publisher: Master1;
   signals: RPM;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;878&quot; data-start=&quot;834&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Master 노드가 &quot;EngineData&quot;라는 프레임을 0x20 ID로 송신&lt;/p&gt;
&lt;p data-end=&quot;878&quot; data-start=&quot;834&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;883&quot; data-start=&quot;880&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;906&quot; data-start=&quot;885&quot; data-ke-size=&quot;size26&quot;&gt;✅ DBC vs LDF 요약 비교&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-end=&quot;1387&quot; data-start=&quot;908&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt; DBC 파일 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt; LDF 파일 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1158&quot; data-start=&quot;1076&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1085&quot; data-start=&quot;1076&quot;&gt;&lt;b&gt;통신 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1121&quot; data-start=&quot;1085&quot;&gt;&lt;b&gt;CAN&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1158&quot; data-start=&quot;1121&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;LIN&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1240&quot; data-start=&quot;1159&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1167&quot; data-start=&quot;1159&quot;&gt;&lt;b&gt;파일 확장자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1203&quot; data-start=&quot;1167&quot;&gt;.dbc&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1240&quot; data-start=&quot;1203&quot; data-col-size=&quot;sm&quot;&gt;.ldf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1307&quot; data-start=&quot;1241&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1252&quot; data-start=&quot;1241&quot;&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1280&quot; data-start=&quot;1252&quot; data-col-size=&quot;sm&quot;&gt;CAN 메시지/신호 정의&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1307&quot; data-start=&quot;1280&quot; data-col-size=&quot;sm&quot;&gt;LIN 프레임/신호/스케줄 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;1387&quot; data-start=&quot;1308&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1316&quot; data-start=&quot;1308&quot;&gt;&lt;b&gt;주요 제작&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1351&quot; data-start=&quot;1316&quot; data-col-size=&quot;sm&quot;&gt;Vector CANdb++ 등&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;1387&quot; data-start=&quot;1351&quot; data-col-size=&quot;sm&quot;&gt;LIN Configuration Tool 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1392&quot; data-start=&quot;1389&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1415&quot; data-start=&quot;1394&quot; data-ke-size=&quot;size26&quot;&gt;✅ AUTOSAR 실무에서의 활용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1539&quot; data-start=&quot;1417&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1539&quot; data-start=&quot;1417&quot;&gt;AUTOSAR 툴(Elektrobit, Vector DaVinci 등)에 DBC/LDF를 &lt;b&gt;Import&lt;/b&gt;해서&lt;br /&gt;&amp;rarr; 자동으로 &lt;b&gt;COM 설정 (PDUs, Signals, ECU Mapping 등)&lt;/b&gt;을 생성함&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/84</guid>
      <comments>https://proyen.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 9 Jul 2025 10:32:56 +0900</pubDate>
    </item>
    <item>
      <title>MCU, Micro Controller Unit (마이크로 컨트롤러 유닛)</title>
      <link>https://proyen.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인프런에서 AUTOSAR 강의를 듣기 시작했는데 MCU가 정확히 무슨 뜻인지 모르겠어서 정리해봄.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-end=&quot;101&quot; data-start=&quot;73&quot; data-ke-size=&quot;size20&quot;&gt;✅ MCU의 뜻 (자동차 SW 개발 맥락에서)&lt;/h4&gt;
&lt;blockquote data-end=&quot;149&quot; data-start=&quot;103&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;149&quot; data-start=&quot;105&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MCU = Micro &lt;b&gt;C&lt;/b&gt;ontroller Unit (마이크로컨트롤러 유닛)&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;151&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;151&quot; data-ke-size=&quot;size16&quot;&gt;즉, MCU는 &lt;b&gt;작은 컴퓨터 역할을 하는 칩&lt;/b&gt;으로, 자동차의 다양한 &lt;b&gt;전자 제어 시스템(ECU)&lt;/b&gt; 안에 들어가 있음.&lt;/p&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;151&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yS9Au/btsO9YGqZOy/krMgU9xv24TpnbAKbqIVV0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yS9Au/btsO9YGqZOy/krMgU9xv24TpnbAKbqIVV0/img.webp&quot; data-alt=&quot;ECU&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yS9Au/btsO9YGqZOy/krMgU9xv24TpnbAKbqIVV0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyS9Au%2FbtsO9YGqZOy%2FkrMgU9xv24TpnbAKbqIVV0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;232&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ECU&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ECU 위의 저 큰 검정 판이 MCU(작은 크기의 컴퓨터)&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;227&quot; data-start=&quot;224&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;250&quot; data-start=&quot;229&quot; data-ke-size=&quot;size20&quot;&gt;✅ 자동차에서 MCU가 쓰이는 예&lt;/h4&gt;
&lt;p data-end=&quot;301&quot; data-start=&quot;252&quot; data-ke-size=&quot;size16&quot;&gt;AUTOSAR에서는 보통 아래와 같은 &lt;b&gt;제어 소프트웨어의 기반 하드웨어&lt;/b&gt;가 MCU.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;505&quot; data-start=&quot;303&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;제어 대상&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt; MCU 역할 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;375&quot; data-start=&quot;347&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;358&quot; data-start=&quot;347&quot;&gt;전기차 구동모터&lt;/td&gt;
&lt;td data-end=&quot;375&quot; data-start=&quot;358&quot; data-col-size=&quot;sm&quot;&gt;모터 제어 및 속도 조절&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;436&quot; data-start=&quot;376&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;410&quot; data-start=&quot;376&quot;&gt;BMS (Battery Management System)&lt;/td&gt;
&lt;td data-end=&quot;436&quot; data-start=&quot;410&quot; data-col-size=&quot;sm&quot;&gt;배터리 잔량, 온도, 충전 상태 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;468&quot; data-start=&quot;437&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;453&quot; data-start=&quot;437&quot;&gt;충전기 (OBC/LDC)&lt;/td&gt;
&lt;td data-end=&quot;468&quot; data-start=&quot;453&quot; data-col-size=&quot;sm&quot;&gt;충전 전류&amp;middot;전압 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;505&quot; data-start=&quot;469&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;483&quot; data-start=&quot;469&quot;&gt;에어백, 조향장치 등&lt;/td&gt;
&lt;td data-end=&quot;505&quot; data-start=&quot;483&quot; data-col-size=&quot;sm&quot;&gt;센서 입력에 따른 빠른 제어 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;510&quot; data-start=&quot;507&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;533&quot; data-start=&quot;512&quot; data-ke-size=&quot;size20&quot;&gt;✅ AUTOSAR와 MCU의 관계&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;654&quot; data-start=&quot;535&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;570&quot; data-start=&quot;535&quot;&gt;AUTOSAR는 &lt;b&gt;자동차 소프트웨어의 표준 아키텍처&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;603&quot; data-start=&quot;571&quot;&gt;이 소프트웨어는 &lt;b&gt;MCU(하드웨어) 위에서 실행&lt;/b&gt;됨&lt;/li&gt;
&lt;li data-end=&quot;654&quot; data-start=&quot;604&quot;&gt;AUTOSAR를 적용하면 &lt;b&gt;다양한 MCU에서도&lt;/b&gt; &lt;b&gt;호환 가능한 소프트웨어 개발&lt;/b&gt;이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;659&quot; data-start=&quot;656&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;670&quot; data-start=&quot;661&quot; data-ke-size=&quot;size20&quot;&gt;  요약&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 84px;&quot; border=&quot;1&quot; data-end=&quot;897&quot; data-start=&quot;672&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; width: 13.1395%; height: 21px;&quot;&gt;&lt;b&gt;용어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 38.9535%; height: 21px;&quot;&gt;&lt;b&gt;뜻&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 47.7907%; height: 21px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;780&quot; data-start=&quot;710&quot;&gt;
&lt;td style=&quot;width: 13.1395%; text-align: center; height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;720&quot; data-start=&quot;710&quot;&gt;&lt;b&gt;MCU&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.9535%; height: 21px;&quot; data-end=&quot;743&quot; data-start=&quot;720&quot; data-col-size=&quot;sm&quot;&gt;Micro Controller Unit&lt;/td&gt;
&lt;td style=&quot;width: 47.7907%; height: 21px;&quot; data-end=&quot;780&quot; data-start=&quot;743&quot; data-col-size=&quot;sm&quot;&gt;자동차 부품(ECU) 안에서 동작하는 &lt;b&gt;소형 컴퓨터 칩&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;861&quot; data-start=&quot;781&quot;&gt;
&lt;td style=&quot;width: 13.1395%; text-align: center; height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;795&quot; data-start=&quot;781&quot;&gt;&lt;b&gt;AUTOSAR&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.9535%; height: 21px;&quot; data-end=&quot;833&quot; data-start=&quot;795&quot; data-col-size=&quot;sm&quot;&gt;Automotive Open System Architecture&lt;/td&gt;
&lt;td style=&quot;width: 47.7907%; height: 21px;&quot; data-end=&quot;861&quot; data-start=&quot;833&quot; data-col-size=&quot;sm&quot;&gt;자동차 SW를 표준화하는 &lt;b&gt;플랫폼 구조&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;897&quot; data-start=&quot;862&quot;&gt;
&lt;td style=&quot;width: 13.1395%; text-align: center; height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;867&quot; data-start=&quot;862&quot;&gt;&lt;b&gt;관계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.7442%; text-align: center; height: 21px;&quot; colspan=&quot;2&quot; data-end=&quot;897&quot; data-start=&quot;867&quot; data-col-size=&quot;sm&quot;&gt;AUTOSAR 기반 SW는 MCU 위에서 동작함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AUTOSAR</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/83</guid>
      <comments>https://proyen.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 9 Jul 2025 09:50:31 +0900</pubDate>
    </item>
    <item>
      <title>2025 상반기 회고</title>
      <link>https://proyen.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025년도 어느새 반이 지났다.&amp;nbsp;&lt;br&gt;사실 올해는 회고를 좀더 주기적으로 써보려했는데, 각종 일들이 꼬이면서 이렇게 상반기 회고로 기록하게 되었다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/96EfS/btsO19zvApA/KvA0ZjMp70J2lIzQP6FBJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/96EfS/btsO19zvApA/KvA0ZjMp70J2lIzQP6FBJ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/96EfS/btsO19zvApA/KvA0ZjMp70J2lIzQP6FBJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F96EfS%2FbtsO19zvApA%2FKvA0ZjMp70J2lIzQP6FBJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;464&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;지난해 &lt;b&gt;12월&lt;/b&gt; 나는 현재의 회사로 &lt;b&gt;이직&lt;/b&gt;하였다.&lt;br&gt;기존에 1월부터 투입되기로했던 큰 &lt;b&gt;프로젝트가 무산&lt;/b&gt;되면서 강제로 일을 쉬게되었다. 처음에는 그냥 조금 시기가 밀린 것으로 생각되어 크게 신경쓰지 않았으나 몇차례 시작이 밀리며 문제의 심각성을 뒤늦게 받아드리게 되었다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;물론 일이 없다고해서 무작정 논 것은 아니었고, 몇달간 &lt;b&gt;Outsystems&lt;/b&gt; 교육도 받고 시험에도 도전했으나 아쉽게 한 문제 차이로 떨어졌다. 공부는 꽤 해서 나름 자신 있었는데, 시험이 영어로 되어있다보니 오역으로 인해 그렇게 된 거 같다는 생각도 들었다. 시험비가 비싸고, 상황이 불확실해서 재시도는 우선은 미뤄뒀다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;3월부터 5월, 약 3달간 주 2회씩 다낭의 직원들에게 &lt;b&gt;한국어를 가르치는 봉사 프로그램&lt;/b&gt;에 참여했다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;수업은 &lt;b&gt;온라인&lt;/b&gt;으로 진행되었고, 다행이도 어느정도 한국어가 되는 분들이라 수업은 한국어로 무리없이 진행되었다. 누군가를 가르친다는 것은 항상 생각보다 폼이 많이들고, 스스로도 그 준비과정에 있어 꽤나 많은 공부가 필요한 것이라는 것을 이번에도 깨닫게 되었다.&lt;br&gt;&amp;nbsp;&lt;br&gt;중간에는 이걸 왜 한다고 했을까 후회도 잠깐 한 적이 있고, 가끔은 관성에 젖어 기계적으로 준비한 적도 있으나 그래도 꽤나 보람차게 진행했던 것 같다. 아쉬운 점은 온라인이다보니 조금 제한적인 커뮤니케이션과 직접 교감할 수 없다는 점 정도였다. 쓰다보니 맡았던 반 학생동료(?)분들이 보고싶다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1345&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btsFpZ/btsO1iYALLl/hcNAiGupBm0pLmU07tMxe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btsFpZ/btsO1iYALLl/hcNAiGupBm0pLmU07tMxe0/img.png&quot; data-alt=&quot;수업중 팀즈 녹화 캡쳐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btsFpZ/btsO1iYALLl/hcNAiGupBm0pLmU07tMxe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtsFpZ%2FbtsO1iYALLl%2FhcNAiGupBm0pLmU07tMxe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1345&quot; height=&quot;713&quot; data-origin-width=&quot;1345&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수업중 팀즈 녹화 캡쳐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;+ 당시에 예습자료로 준비했던 노션자료 (수업자료는 따로 ppt로 준비했었음)&lt;br&gt;&lt;a href=&quot;https://proyen.notion.site/Korean-Class-Danang-T3-T5-6203c2171c9849bba7823cbe844cd5dc?source=copy_link&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://proyen.notion.site/Korean-Class-Danang-T3-T5-6203c2171c9849bba7823cbe844cd5dc?source=copy_link&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;5월에는 팀원들과 함께 팀에서 써볼만한 웹페이지를 만들어보기로 했는데 갑작스러운 팀원 변경 등 여러문제가 있어서 순조롭지는 못했다.&lt;br&gt;&amp;nbsp;&lt;br&gt;우리는 Figma, Erd Cloud 등의 툴의 도움을 받았고, 회의는 팀즈로 진행했다.&lt;br&gt;뭐로 개발할지 고민했는데 SI 프로젝트에서 주로 만날 수 있는 &lt;b&gt;Java&lt;/b&gt;와&lt;b&gt; Spring Boot&lt;/b&gt;,&lt;b&gt; Thymeleaf&lt;/b&gt;를 이용한 웹 개발로 진행했다.&lt;br&gt;&amp;nbsp;&lt;br&gt;나는 기본 화면 틀을 만들고, 투표 게시판을 만들었는데 간단히 이미지도 첨부할 수 있게 만들었다. 백엔드는 딱히 기억에 남는 건 없었고, 화면 CSS 따위에서 고전하며 비교적 시간을 많이 썼다.&lt;br&gt;&amp;nbsp;&lt;br&gt;아래는 다 만들고나서 진행했던 &lt;b&gt;Demo 시연 &lt;/b&gt;팀즈 녹화본 캡쳐.&lt;br&gt;녹화된 영상은 사실 캡쳐하면서 처음 봤는데 라이브 캡션이 제법 잘 인식되어있어서 조금 신기.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crRtYe/btsO1IJC6H4/0pz4ncCJyzgkf8SSEx8foK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crRtYe/btsO1IJC6H4/0pz4ncCJyzgkf8SSEx8foK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crRtYe/btsO1IJC6H4/0pz4ncCJyzgkf8SSEx8foK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrRtYe%2FbtsO1IJC6H4%2F0pz4ncCJyzgkf8SSEx8foK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;466&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dG9yty/btsO2AKtive/iDTUdf4xnvV54d1HYukcHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dG9yty/btsO2AKtive/iDTUdf4xnvV54d1HYukcHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dG9yty/btsO2AKtive/iDTUdf4xnvV54d1HYukcHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdG9yty%2FbtsO2AKtive%2FiDTUdf4xnvV54d1HYukcHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;453&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6wXH/btsO1jcfEjb/ZiWc0JnRgBNsW0ZDl8yzo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6wXH/btsO1jcfEjb/ZiWc0JnRgBNsW0ZDl8yzo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6wXH/btsO1jcfEjb/ZiWc0JnRgBNsW0ZDl8yzo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6wXH%2FbtsO1jcfEjb%2FZiWc0JnRgBNsW0ZDl8yzo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;466&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n9O3q/btsO0JWKlKc/0r66dGvvTRbafXSDoC8s10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n9O3q/btsO0JWKlKc/0r66dGvvTRbafXSDoC8s10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n9O3q/btsO0JWKlKc/0r66dGvvTRbafXSDoC8s10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn9O3q%2FbtsO0JWKlKc%2F0r66dGvvTRbafXSDoC8s10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;459&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;발표는 &lt;b&gt;영어&lt;/b&gt;로 진행했고, 각자 자기가 맡은 부분 &lt;b&gt;스크립트&lt;/b&gt;를 따로 준비했었다.&lt;br&gt;영어로 내가 개발한 것을 설명하는 게 처음이라 조금 긴장되었으나 미리 준비해둔 스크립트와 함께라 어찌저찌 해내었다. &lt;i&gt;&lt;s&gt;&lt;span style=&quot;color: #9D9D9D;&quot;&gt;만약 스크립트를 못보는 상황이었다면 정말 어렵지 않았을까 싶다.&lt;/span&gt;&lt;/s&gt;&lt;/i&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;그리고 6월, 시간을 그냥 죽이고 싶지 않아서 뭐라도 만들어보자는 생각에 &lt;b&gt;[KBO 구장별 날씨 예보 어플]&lt;/b&gt;을 만들었다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;그 유명한 AI를 이용한 '&lt;b&gt;바이브코딩&lt;/b&gt;'이란 걸 해봤는데 생각보다 꽤나 매끄럽게 진행되었다. 작년까지만해도 only 폐쇄망에서만 개발을 해왔기 때문에 AI를 이용해서 개발하는게 내게는 익숙치 않은 일이었는데, 생각보다 꽤 많은 도움이 되고 매끄럽게 진행됐다. AI를 어르고 달래서(?) 일하는게 나와 잘 맞는듯하다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&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/xKvyt/btsO12U3L9z/k4IBWVu5zvjgko8tnJsp7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xKvyt/btsO12U3L9z/k4IBWVu5zvjgko8tnJsp7k/img.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;2632&quot; style=&quot;width: 35.05%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xKvyt/btsO12U3L9z/k4IBWVu5zvjgko8tnJsp7k/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxKvyt%2FbtsO12U3L9z%2Fk4IBWVu5zvjgko8tnJsp7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;2632&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltmyO/btsO2aezzmq/4uDqcIg9xVGax8FicYiGi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltmyO/btsO2aezzmq/4uDqcIg9xVGax8FicYiGi1/img.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;2898&quot; style=&quot;width: 31.8328%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltmyO/btsO2aezzmq/4uDqcIg9xVGax8FicYiGi1/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FltmyO%2FbtsO2aezzmq%2F4uDqcIg9xVGax8FicYiGi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;2898&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byrX1P/btsO1TqD6hQ/7IvCNL6u2sK5tVRX7ZeFm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byrX1P/btsO1TqD6hQ/7IvCNL6u2sK5tVRX7ZeFm1/img.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;2996&quot; style=&quot;width: 30.7916%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byrX1P/btsO1TqD6hQ/7IvCNL6u2sK5tVRX7ZeFm1/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyrX1P%2FbtsO1TqD6hQ%2F7IvCNL6u2sK5tVRX7ZeFm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;2996&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;최대한 직관적이고 단순한 UI를 사용했다.&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/dALnJ0/btsO1WgAf65/qi6tHcVXWG0rhLt6vUqzY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dALnJ0/btsO1WgAf65/qi6tHcVXWG0rhLt6vUqzY0/img.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2097&quot; style=&quot;width: 32.5581%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dALnJ0/btsO1WgAf65/qi6tHcVXWG0rhLt6vUqzY0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdALnJ0%2FbtsO1WgAf65%2Fqi6tHcVXWG0rhLt6vUqzY0%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;2097&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCvpm/btsO2bdthW9/KWSfY14iKb4LkLjsDJdGu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCvpm/btsO2bdthW9/KWSfY14iKb4LkLjsDJdGu1/img.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2097&quot; style=&quot;width: 32.5581%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCvpm/btsO2bdthW9/KWSfY14iKb4LkLjsDJdGu1/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCvpm%2FbtsO2bdthW9%2FKWSfY14iKb4LkLjsDJdGu1%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;2097&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPxBqL/btsO1iErgyP/NbmADuQZG1bfcgcKKeNWA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPxBqL/btsO1iErgyP/NbmADuQZG1bfcgcKKeNWA1/img.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2097&quot; style=&quot;width: 32.5581%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPxBqL/btsO1iErgyP/NbmADuQZG1bfcgcKKeNWA1/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPxBqL%2FbtsO1iErgyP%2FNbmADuQZG1bfcgcKKeNWA1%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;2097&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;추후 현재 위치받아서 우선 출력해주는 기능도 추가했다.&lt;br&gt;&amp;nbsp;&lt;br&gt;배포 경험이 별로 없어서 실제로 남들이 직접 사용할 수 있게 &lt;b&gt;vercel&lt;/b&gt;과 &lt;b&gt;railway&lt;/b&gt;를 이용해서 &lt;b&gt;배포/운영&lt;/b&gt;도 해봤다.&lt;br&gt;안드로이드는 capacitor 로 감싸서 &lt;b&gt;apk &lt;/b&gt;파일로 만들어 설치도 했다. 아이폰은 작업할 수 있는 맥 기기가 없어서 PWA (Progressive Web App)를 이용. 혹은 웹사이트로 이용하게 했다.&lt;br&gt;&amp;nbsp;&lt;br&gt;아래는 실운영중인 사이트.&lt;br&gt;&lt;a href=&quot;https://kbo-ballpark-weather.vercel.app/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://kbo-ballpark-weather.vercel.app/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Ballpark Weather&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;&quot; data-og-host=&quot;kbo-ballpark-weather.vercel.app&quot; data-og-source-url=&quot;https://kbo-ballpark-weather.vercel.app/&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://kbo-ballpark-weather.vercel.app/&quot;&gt;&lt;a href=&quot;https://kbo-ballpark-weather.vercel.app/&quot; target=&quot;_blank&quot; data-source-url=&quot;https://kbo-ballpark-weather.vercel.app/&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Ballpark Weather&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;kbo-ballpark-weather.vercel.app&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;아래는 리드미를 포함한 깃허브.&lt;br&gt;&lt;a href=&quot;https://github.com/yennie37/kbo-ballpark-weather/tree/main&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://github.com/yennie37/kbo-ballpark-weather/tree/main&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;GitHub - yennie37/kbo-ballpark-weather: KBO Ballpark Weather Application&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;KBO Ballpark Weather Application. Contribute to yennie37/kbo-ballpark-weather development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/yennie37/kbo-ballpark-weather/tree/main&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uZDr7/hyZfXJaoK2/awfDDPr1TbDRnlUkipMDhk/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_118_1040_179,https://scrap.kakaocdn.net/dn/wsSyJ/hyZfZ720DG/wgLAttIWxTVqtN9N61giU0/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_118_1040_179&quot; data-og-url=&quot;https://github.com/yennie37/kbo-ballpark-weather&quot;&gt;&lt;a href=&quot;https://github.com/yennie37/kbo-ballpark-weather&quot; target=&quot;_blank&quot; data-source-url=&quot;https://github.com/yennie37/kbo-ballpark-weather/tree/main&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uZDr7/hyZfXJaoK2/awfDDPr1TbDRnlUkipMDhk/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_118_1040_179,https://scrap.kakaocdn.net/dn/wsSyJ/hyZfZ720DG/wgLAttIWxTVqtN9N61giU0/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_118_1040_179')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;GitHub - yennie37/kbo-ballpark-weather: KBO Ballpark Weather Application&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;KBO Ballpark Weather Application. Contribute to yennie37/kbo-ballpark-weather development by creating an account on GitHub.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;도움을 준 테스터들은 주변 야구덕후 친구/지인들, 그리고 나.&lt;br&gt;사실 테스트랄만한게 없는 사이트라 약간 민망하다.&amp;nbsp;&lt;br&gt;사소한 오류같은건 친구들에게 보내기 전에 다 잡아뒀던 상황이라 따로 문제가 있거나 불편하다고 들어온 건 없었다. 괜히 섭섭(?).&lt;br&gt;&amp;nbsp;&lt;br&gt;사실 나는 어플로 깔아두고 거의 매일 들어가 날씨를 확인한다. 지역별로 따로 검색을 안해도되니 제법 유용하다. 나만의 맞춤 어플이랄까 ㅎㅎ.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5rqwS/btsO0Hrbn9C/dQWfhsc2rUqzM3KzAfhKCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5rqwS/btsO0Hrbn9C/dQWfhsc2rUqzM3KzAfhKCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5rqwS/btsO0Hrbn9C/dQWfhsc2rUqzM3KzAfhKCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5rqwS%2FbtsO0Hrbn9C%2FdQWfhsc2rUqzM3KzAfhKCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;926&quot; height=&quot;585&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;근데 Trial plan이 이 회고를 쓰고있는 오늘자로 끝나버려서 운영은 한동안 종료할 듯 싶다. 조금 아쉽다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;개발 외의 영역에 대해 말해보자면, 퇴근 후엔 &lt;b&gt;영어&lt;/b&gt;와 &lt;b&gt;재봉&lt;/b&gt;을 배우러 다니고 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;영어&lt;/b&gt;는 말할 기회가 너무 없어서 문제인가 싶어 &lt;b&gt;컬컴&lt;/b&gt;을 다니고 있다. 늘고 있는지는 모르겠는데 적어도 지금보다 줄지는 않겠거니 생각하며 다니는 중. 이번에 요일을 바꿨는데 새로 만나게 된 리더분이 엄청 댕댕이 같으시다. 여기서 더 많은 시너지 얻고 갈 수 있기를. 언젠간 프리토킹반에 갈 실력이 되려나...?&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;재봉&lt;/b&gt;은 홑겹 하의만드는 과정인데 생각보다 몸이 꽤 고되다. 특히 눈이. 하루라도 어릴 때 배웠으면 좋았을 것을 이라는 생각을 계속하게 된다. 이것들을 이후에 혼자 해낼 수 있을지 정말 미지수. 재봉으로 먹고사시는 분들 진짜 대단하다는 생각만이 든다.&amp;nbsp;&lt;br&gt;처음에는 시원한 재질의 &lt;b&gt;파자마 바지&lt;/b&gt;를 만들었고, 지금은 &lt;b&gt;A라인 스커트&lt;/b&gt;를 만들고 있다. 잘하면 이번주에 완성할지도.&lt;br&gt;&amp;nbsp;&lt;br&gt;그리고 올해 들어 글을 읽는 게 다시 재밌어져서 꽤나 &lt;b&gt;책&lt;/b&gt;을 많이 읽었다. 웹소설부터 일반문학, 에세이, 기사, 비문학 등 장르도 가리지 않고 마구잡이로 읽었다. 차근차근 기록해뒀으면 좋았을텐데 라는 생각도 들지만 그러기엔 너무 많이 건너왔나 싶기도.&lt;br&gt;&amp;nbsp;&lt;br&gt;최근에는 &lt;b&gt;[개발자를 위한 IT 영어 온보딩 가이드]&lt;/b&gt; 라는 책을 샀는데, 엄청 실무성 영어라 좋은데 꺼려지고 막 그렇다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bjpld/btsO0bTiWb6/xTOAAGXB4KBlY0K6rzO7XK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bjpld/btsO0bTiWb6/xTOAAGXB4KBlY0K6rzO7XK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bjpld/btsO0bTiWb6/xTOAAGXB4KBlY0K6rzO7XK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBjpld%2FbtsO0bTiWb6%2FxTOAAGXB4KBlY0K6rzO7XK%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;186&quot; height=&quot;271&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;여전히 회사도 갈피가 안잡힌 상황에 집 계약까지 문제가 생겨서 &lt;b&gt;거주/고용 불안정&lt;/b&gt;을 동시에 느끼고 있는데, 이제는 그냥 운명이 이끄는 대로 흘러가는 대로 가는 수 밖에는 방법이 없을 거 같아서 최대한 신경쓰지 않으려고 하고 있다.&lt;br&gt;'집은 정 안되면 그냥 모든 것을 정리하고 쉐어든 고시원이든 들어가지뭐.', '회사는 정규직 전환 안되면 그 기회에 회사 다니며 못해봤던거 해보고 살면 좋지 뭐.', '커리어는 다시 쌓으면 되지 뭐.', 근데 이렇게 생각하면서도 종종 심란해서 잠이 안온다. 빨리 해결되기만을 빌어본다.&lt;br&gt;&lt;br&gt;반년을 허송세월 보냈다고 생각했는데 또 적다보니 생각보다 많은 것을 하기는 했다. 이제는 또 무엇을 해볼까. 나는 어디로 가게되려나. 정말 인생 앞을 한치도 알 수가 없다. 그래도 되도록 긍정적으로 생각해보려고 노력중.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZCeCJ/btsO07WXspa/ItyGf2hTToOfDfvP6uAcPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZCeCJ/btsO07WXspa/ItyGf2hTToOfDfvP6uAcPk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZCeCJ/btsO07WXspa/ItyGf2hTToOfDfvP6uAcPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZCeCJ%2FbtsO07WXspa%2FItyGf2hTToOfDfvP6uAcPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;298&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: right;&quot;&gt;- 상반기 한줄: 탈서울하기 진짜 힘들다.&lt;/p&gt;</description>
      <category>Retrospectives</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/82</guid>
      <comments>https://proyen.tistory.com/82#entry82comment</comments>
      <pubDate>Wed, 2 Jul 2025 16:34:37 +0900</pubDate>
    </item>
    <item>
      <title>map(), 전개연산자 ...</title>
      <link>https://proyen.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1751420732150&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;백엔드 속이는 프론트엔드 성능 최적화, &amp;lsquo;Optimistic UI&amp;rsquo; | 요즘IT&quot; data-og-description=&quot;구글의 'INP(Interaction to Next Paint)' 지표는 사용자 인터랙션 후 화면 업데이트 속도를 측정합니다. 2024년 3월부터 구글은 INP를 Core Web Vitals의 공식 지표로 채택했습니다. 'Optimistic UI' 패턴은 이 INP 지&quot; data-og-host=&quot;yozm.wishket.com&quot; data-og-source-url=&quot;https://yozm.wishket.com/magazine/detail/3211/&quot; data-og-url=&quot;https://yozm.wishket.com/magazine/detail/3211/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q2f5H/hyZfYHZKZG/PGte6N7lkqWuL6311tpye1/img.gif?width=994&amp;amp;height=552&amp;amp;face=0_0_994_552,https://scrap.kakaocdn.net/dn/b8cxOO/hyZfyvQ1rz/WLleRUCf95xbcUxqQkUsIK/img.gif?width=994&amp;amp;height=552&amp;amp;face=0_0_994_552,https://scrap.kakaocdn.net/dn/nucXw/hyZf9vZTdO/g6Khi1DRyoxeZKRuS1CTuk/img.png?width=608&amp;amp;height=286&amp;amp;face=0_0_608_286&quot;&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3211/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yozm.wishket.com/magazine/detail/3211/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q2f5H/hyZfYHZKZG/PGte6N7lkqWuL6311tpye1/img.gif?width=994&amp;amp;height=552&amp;amp;face=0_0_994_552,https://scrap.kakaocdn.net/dn/b8cxOO/hyZfyvQ1rz/WLleRUCf95xbcUxqQkUsIK/img.gif?width=994&amp;amp;height=552&amp;amp;face=0_0_994_552,https://scrap.kakaocdn.net/dn/nucXw/hyZf9vZTdO/g6Khi1DRyoxeZKRuS1CTuk/img.png?width=608&amp;amp;height=286&amp;amp;face=0_0_608_286');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 속이는 프론트엔드 성능 최적화, &amp;lsquo;Optimistic UI&amp;rsquo; | 요즘IT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;구글의 'INP(Interaction to Next Paint)' 지표는 사용자 인터랙션 후 화면 업데이트 속도를 측정합니다. 2024년 3월부터 구글은 INP를 Core Web Vitals의 공식 지표로 채택했습니다. 'Optimistic UI' 패턴은 이 INP 지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yozm.wishket.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;글 내용과는 상관없음. 소스만 참조.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;131&quot; data-start=&quot;110&quot; data-ke-size=&quot;size26&quot;&gt;.map() 함수&lt;/h2&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;133&quot; data-ke-size=&quot;size16&quot;&gt;.map()은 배열에서 &lt;b&gt;각 요소를 순회하면서 변형한 새 배열을 만드는 함수&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;133&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;133&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751420335686&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, 2, 3];
const doubled = numbers.map(num =&amp;gt; num * 2);

console.log(doubled); // [2, 4, 6]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;387&quot; data-start=&quot;315&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;315&quot;&gt;numbers.map(...)는 배열의 각 요소에 * 2를 적용&lt;/li&gt;
&lt;li data-end=&quot;387&quot; data-start=&quot;357&quot;&gt;원본 배열은 그대로 있고, &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;새 배열을 반환&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;구조&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751420366308&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const newArray = oldArray.map((item, index) =&amp;gt; {
  return 변경할값;
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;언제 사용?&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;560&quot; data-start=&quot;493&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;511&quot; data-start=&quot;493&quot;&gt;목록 데이터 UI로 출력할 때&lt;/li&gt;
&lt;li data-end=&quot;540&quot; data-start=&quot;512&quot;&gt;리스트 항목 수정할 때 (특정 요소만 바꿀 때)&lt;/li&gt;
&lt;li data-end=&quot;560&quot; data-start=&quot;541&quot;&gt;배열을 변형하고 싶은 모든 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-end=&quot;589&quot; data-start=&quot;567&quot; data-ke-size=&quot;size26&quot;&gt;Spread Operator 전개 연산자 (...)&amp;nbsp;&lt;/h2&gt;
&lt;p data-end=&quot;631&quot; data-start=&quot;591&quot; data-ke-size=&quot;size16&quot;&gt;...은 &lt;b&gt;객체나 배열을 펼쳐서 복사하거나 합칠 때&lt;/b&gt; 사용.&lt;/p&gt;
&lt;p data-end=&quot;631&quot; data-start=&quot;591&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;in 배열&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751420512347&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4]; // [1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;770&quot; data-start=&quot;729&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;770&quot; data-start=&quot;729&quot;&gt;arr1을 펼쳐서 [1, 2, 3, 4] &lt;b&gt;새 배열&lt;/b&gt;을 만듦&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;788&quot; data-start=&quot;777&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;in 객체&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1751420566693&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj1 = { name: 'Yeon', age: 26 };
const obj2 = { ...obj1, age: 31 };

console.log(obj2); // { name: 'Yeon', age: 31 }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;963&quot; data-start=&quot;927&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;963&quot; data-start=&quot;927&quot;&gt;obj1을 복사해서 &lt;b&gt;새 객체&lt;/b&gt;를 만들고, age만 덮어씀&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;982&quot; data-start=&quot;970&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 필요할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1054&quot; data-start=&quot;984&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불변성 유지&lt;/b&gt;를 위해. React에서는 상태를 직접 바꾸지 않고, &lt;b&gt;새 객체/배열을 만들어 교체&lt;/b&gt;해야 함.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751420627501&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const newTodo = { ...oldTodo, completed: true };&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1172&quot; data-start=&quot;1116&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 원본 oldTodo는 그대로 있고, completed만 바뀐 &lt;b&gt;새 객체&lt;/b&gt;가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-end=&quot;1205&quot; data-start=&quot;1179&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1205&quot; data-start=&quot;1179&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;b&gt;odo 예제 코드(맨위 링크) 일부&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751420811783&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;setTodos(prevTodos =&amp;gt;
  prevTodos.map(todo =&amp;gt;
    todo.id === tempId
      ? { ...response.data, isTemporary: false }  // 서버 응답으로 대체
      : todo
  )
);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1388&quot; data-start=&quot;1291&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1319&quot; data-start=&quot;1291&quot;&gt;todo.id와 tempId가 같은 경우 todo에 서버 응답 대체.&lt;/li&gt;
&lt;li data-end=&quot;1319&quot; data-start=&quot;1291&quot;&gt;response.data는 서버에서 온 객체.&lt;/li&gt;
&lt;li data-end=&quot;1352&quot; data-start=&quot;1320&quot;&gt;...response.data &amp;rarr; 기존 속성 펼치기&lt;/li&gt;
&lt;li data-end=&quot;1388&quot; data-start=&quot;1353&quot;&gt;isTemporary: false &amp;rarr; 거기에 덮어쓰기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;+&amp;nbsp;❓ &lt;b&gt;왜 React에서는 상태를 직접 바꾸지 않고, 새 객체/배열을 만들어 교체해야 할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;132&quot; data-start=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;React는 &quot;값이 바뀌었는지&quot;를 &quot;겉보기로&quot; 판단하기 때문.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;188&quot; data-start=&quot;134&quot; data-ke-size=&quot;size16&quot;&gt;React는 컴포넌트 상태가 변경되었는지 판단할 때 &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-end=&quot;211&quot; data-start=&quot;195&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1751421233813&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const [user, setUser] = useState({ name: 'Yeon' });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;293&quot; data-start=&quot;277&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;293&quot; data-start=&quot;277&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;293&quot; data-start=&quot;277&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상태를 직접 바꾸면(틀린 방법),&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751421278048&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user.name = 'Lee';  // 이렇게 하면 내부 값은 바뀌지만
setUser(user);      // 이걸 해도 React는 &quot;어? 참조는 그대로네?&quot; &amp;rarr; 변경된 걸 모름&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;411&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;413&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;413&quot; data-ke-size=&quot;size16&quot;&gt;이건 React 입장에서 user === user &amp;rarr; true니까, &lt;b&gt;&quot;변화 없음&quot;으로 착각&lt;/b&gt;함.&lt;/p&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;413&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;500&quot; data-start=&quot;478&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;500&quot; data-start=&quot;478&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;새 객체로 교체시(올바른 방법),&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1751421376034&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;setUser({ ...user, name: 'Lee' });&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;658&quot; data-start=&quot;548&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;548&quot;&gt;...user로 기존 값 복사&lt;/li&gt;
&lt;li data-end=&quot;596&quot; data-start=&quot;569&quot;&gt;name: 'Lee'로 새로운 값 덮어쓰기&lt;/li&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;597&quot;&gt;이건 새로운 객체이기 때문에 user !== 새객체 &amp;rarr; React가 &lt;b&gt;&quot;변화 있음&quot; 으로 인식&lt;/b&gt;함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;689&quot; data-start=&quot;665&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;689&quot; data-start=&quot;665&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;React의 렌더링 조건&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;786&quot; data-start=&quot;691&quot; data-ke-size=&quot;size16&quot;&gt;React는 &lt;b&gt;상태(state)나 props가 바뀌었을 때만&lt;/b&gt; 렌더링을 다시 하고,&amp;nbsp;&lt;b&gt;&quot;바뀌었는지&quot; 판단할 때 값이 아니라 주소(참조)를 비교&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-end=&quot;786&quot; data-start=&quot;691&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;975&quot; data-start=&quot;803&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 48.3721%;&quot;&gt;&lt;b&gt;직접변경&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 51.5116%;&quot;&gt;&lt;b&gt;새 객체로 교체&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;918&quot; data-start=&quot;864&quot;&gt;
&lt;td style=&quot;text-align: center; width: 48.3721%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;882&quot; data-start=&quot;864&quot;&gt;obj.key = val&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 51.5116%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;918&quot; data-start=&quot;882&quot;&gt;setState({ ...obj, key: val })&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;951&quot; data-start=&quot;919&quot;&gt;
&lt;td style=&quot;text-align: center; width: 48.3721%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;934&quot; data-start=&quot;919&quot;&gt;React는 못 알아챔&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 51.5116%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;951&quot; data-start=&quot;934&quot;&gt;React가 변경 감지함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;975&quot; data-start=&quot;952&quot;&gt;
&lt;td style=&quot;text-align: center; width: 48.3721%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;962&quot; data-start=&quot;952&quot;&gt;렌더링 안 됨&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 51.5116%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;975&quot; data-start=&quot;962&quot;&gt;렌더링 정상 작동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;992&quot; data-start=&quot;982&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;한줄정리&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;1098&quot; data-start=&quot;994&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1098&quot; data-start=&quot;996&quot; data-ke-size=&quot;size16&quot;&gt;React는 &quot;얕은 비교(shallow compare)&quot;로 상태 변화 감지하기 때문에, &lt;b&gt;불변성(immutability)&lt;/b&gt; 을 유지하면서 새 객체/배열을 만들어줘야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Javascript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>map()</category>
      <category>React</category>
      <category>shallowcompare</category>
      <category>spreadoperator</category>
      <category>리액트</category>
      <category>자바스크립트</category>
      <category>전개연산자</category>
      <author>기록해연</author>
      <guid isPermaLink="true">https://proyen.tistory.com/81</guid>
      <comments>https://proyen.tistory.com/81#entry81comment</comments>
      <pubDate>Wed, 2 Jul 2025 11:17:07 +0900</pubDate>
    </item>
  </channel>
</rss>