<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>flances-kwon.log</title>
        <link>https://velog.io/</link>
        <description>초보개발자</description>
        <lastBuildDate>Tue, 10 Feb 2026 17:55:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>flances-kwon.log</title>
            <url>https://velog.velcdn.com/images/flances-kwon/profile/cbb12d1f-9574-4aef-a39b-39f957ff6398/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. flances-kwon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/flances-kwon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[유니티]]></title>
            <link>https://velog.io/@flances-kwon/%EC%9C%A0%EB%8B%88%ED%8B%B0</link>
            <guid>https://velog.io/@flances-kwon/%EC%9C%A0%EB%8B%88%ED%8B%B0</guid>
            <pubDate>Tue, 10 Feb 2026 17:55:57 GMT</pubDate>
            <description><![CDATA[<h4 id="기본개념-및-용어">기본개념 및 용어</h4>
<pre><code>Time.deltaTime: 이전 프레임으로부터 경과된 시간. 
                이 값을 곱해주면 프레임 속도와 관계없이 초당 이동 거리가 일정해져 부드럽고 일관된 움직임을 만들 수 있음. 프레임 독립적인 움직임에 필수.

Vector3.Normalize() : 벡터의 정규화(Normalization)는 벡터의 방향은 그대로 두되, 벡터의 길이를 정확히 1로 만드는 과정. 
                         이렇게 만들어진 벡터를 단위 벡터(Unit Vector)라고 부르며, 주로 방향 정보를 나타낼 때 사용.

오일러 각은 특정 회전 조합에서 두 축이 겹쳐 회전 자유도를 잃는 짐벌 잠금 문제가 발생할 수 있습니다. 
Quaternion은 수학적으로 복잡하지만, 이러한 문제를 방지하여 부드럽고 안정적인 회전을 제공하기 위해 사용됩니다.

prefab : 플릿으로 만들어 게임 내 여러 곳에 반복적으로 배치하거나 코드로 쉽게 생성할 수 있게 해줘요. 또한 원본 프리팹을 수정하면 이를 사용하는 모든 인스턴스에 변경 사항이 적용되어 관리가 편리해지죠.

충돌 : 물리적 힘에 영향을 받아 오브젝트가 서로 밀치거나 튕겨 나가는 등의 물리적 반응이 동반되는 반면, 트리거(Trigger)는 물리적인 영향 없이 단순히 특정 영역에 들어오거나 나갔음을 감지하는 용도로 사용됨

Rigidbody
    -Mass : 중량(kg)
    -use Gravity(중력)
    -is Kinematic(

OnCollisionEnter나 OnTriggerEnter와 같은 이벤트는 Unity의 물리 엔진에 의해 감지되어 호출. 물리 엔진의 영향을 받으려면 Rigidbody 컴포넌트가 필요하며, 일반적으로 두 오브젝트 중 하나 이상에 Rigidbody가 있어야 이벤트가 발생.

2D 화면의 클릭 위치에서 3D 공간으로 가상의 광선(레이)을 발사하여 이 광선이 어떤 오브젝트와 부딪혔는지 판정하는 기술을 레이캐스팅이라고 합니다. 이를 통해 3D 공간의 오브젝트를 선택하는 등의 기능을 구현할 수 있어요.

레이어 마스크를 사용하면 레이캐스트 연산을 할 때 특정 레이어에 속한 오브젝트만 검사 대상에 포함시키거나 제외할 수 있어요. 이를 통해 불필요한 연산을 줄여 성능을 최적화하는 데 도움이 된답니다.

OnCollisionEnter: A나 B에게 RigidBody가 있어야함(IsKinematic: off)
            A에게 Collider가 있어야함(IsTrigger: off)
            B에게 Collider가 있어야함(IsTrigger: off)

OnTriggerEnter: A, B 둘다 Collider가 있어야 함
                A || B isTrigger가 On
                A || B RigidBody가 있어야함</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[게임개발] 자료구조, 알고리즘]]></title>
            <link>https://velog.io/@flances-kwon/%EA%B2%8C%EC%9E%84%EA%B0%9C%EB%B0%9C-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-n8yz1p2o</link>
            <guid>https://velog.io/@flances-kwon/%EA%B2%8C%EC%9E%84%EA%B0%9C%EB%B0%9C-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-n8yz1p2o</guid>
            <pubDate>Fri, 16 Jan 2026 17:46:10 GMT</pubDate>
            <description><![CDATA[<h4 id="big-o-표기법">BIG-O 표기법</h4>
<pre><code>Big O는 연산 횟수를 추정해 데이터 증가에 따른 성능 변화를 파악
Big O는 데이터 규모 증가에 따른 성능 변화 추세를 보는 거라, 가장 영향력이 큰 최고차항만 남기고 상수나 낮은 차수의 항은 무시
O(n²)는 데이터 크기(n)가 커질수록 연산 횟수가 n의 제곱에 비례해 매우 빠르게 증가해요. 대규모 데이터에선 큰 부담</code></pre><h4 id="게임-프로그램에서-반복적으로-실행되는-메인-루프">게임 프로그램에서 반복적으로 실행되는 메인 루프</h4>
<pre><code>입력 처리, 게임 로직 실행, 화면 렌더링</code></pre><h4 id="선형구조">선형구조</h4>
<pre><code>자료를 순차적으로 나열한 구조
-배열 : 배열은 크기가 고정되어 있고 메모리에 연속적으로 저장, 동적 배열과 연결 리스트는 크기 변경이 자유로운 편
-연결리스트 : 연결 리스트는 노드의 다음/이전 연결만 바꿔주면 되기에 O(1)로 삽입/삭제가 빠름. 동적 배열은 뒤따르는 요소들을 모두 이동시켜야 해서 O(n)이 걸림</code></pre><h4 id="비선형-구조">비선형 구조</h4>
<pre><code>하나의 자료 뒤에 다수의 자료가 올수 있는 형태
-트리, 그래프</code></pre><h4 id="미로생성-알고리즘">미로생성 알고리즘</h4>
<pre><code>1, Binary Tree : 각 셀에서 오른쪽이나 아래 중 하나를 무작위로 생성
2, SideWinder : 오른쪽으로 연속된 셀 중 하나를 골라 아래로 파는 방식  
맵은 가로, 세로 좌표를 가지는 2차원 공간. 각 좌표의 타일 정보를 저장하고 접근하기 위해 2차원 배열이 가장 기본적인 형태로 사용</code></pre><h4 id="길찾기-알고리즘">길찾기 알고리즘</h4>
<pre><code>1, 우수(오른손) 법칙 : 진행 방향을 기준으로 오른쪽에 벽이 있는지, 앞으로 갈 수 있는지, 아니면 왼쪽으로 돌아야 하는지를 우선순위에 따라 체크하며 이동
    1-1, 현재 바라보는 방향을 기준으로 오른쪽으로 갈수 있는 지 확인
    2-1, 현재 바라보는 방향을 기준으로 전진할수 있는 지 확인
    3-1, 왼쪽 방향으로 회전 

    ex)
    Up: 0, 
    Left: 1,
    Down: 2,
    Right: 3 
    오른쪽:  (N - 1 + 4) % 4
    왼쪽:  (N + 1 + 4) % 4
  * 델타 타임은 이전 프레임과 현재 프레임 사이의 경과 시간. 이 시간을 누적하여 일정 기준을 넘으면 움직임을 실행하는 방식으로 속도를 조절.      </code></pre><h4 id="그래프-이론">그래프 이론</h4>
<pre><code>현실세계의 사물과 추상적인 개념간 연결관계 표현, 수학적그래프와 무관
정점: 데이터를 표현(사물, 개념 등)
간선: 정점들을 연결하는데 사용

*가중치 그래프: 간선에 수치
*방향 그래프: 간선에 화살표 표현

*그래프 순회방법
1, DFS(Depth First Search) : 깊이 우선 탐색
2, BFS(Breadth First search) : 너비 우선 탐색    </code></pre><h4 id="트리">트리</h4>
<pre><code>계층적 구조를 갖는 데이터를 표현하기 위한 자료구조
노드: 데이터
간선: 노드의 계층구조를 표현

이진 검색 트리: 각 노드가 최대 두개의 자식노드를 갖는 트리
-왼쪽을 타고 가면 현재 값보다 작음
-오른쪽을 타고 가면 현재 값보다 큼
-기준없이 추가하면 한쪽으로 기울어져 균형이 깨지므로, 트리 재배치를 통해 균형을 유지하는게 중요(AVL, Red-Black)

힙 트리 1법칙: [부모노드]의 값은 [자식노드]의 값보다 크다
    제악조건: 1, 마지막 레벨을 제외한 모든레벨에 노드가 다 차있다
            2, 마지막 레벨에 노드가 있을 경우 항상 왼쪽부터 순서대로 채워야 한다
힙 트리 2법칙: 노드 개수를 알면, 트리 구조는 무조건 확정할 수 있다.
    -&gt; 배열을 통해 힙 구조를 바로 표현할 수 있다.
        1) i번 노드의 왼쪽 자식은 [ (2*i)+1 ] 번
        2) i번 노드의 왼쪽 자식은 [ (2*i)+2 ] 번
        2) i번 노드의 부모는 [ (i-1)/2 ] 번

A Star
점수 매기기 : F = G+H
            F: 최종점수(작을 수록 좋음, 경로에 따라 달라짐)
            G: 시작점에서 해당 좌표까지 이동하는데 드는 비용(작을수록 좋음, 경로에 따라 달라짐)
            H: 목적지에서 얼마나 가까운지(작을수록 좋음, 고정값)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[c#]]]></title>
            <link>https://velog.io/@flances-kwon/c</link>
            <guid>https://velog.io/@flances-kwon/c</guid>
            <pubDate>Wed, 05 Nov 2025 11:00:47 GMT</pubDate>
            <description><![CDATA[<h4 id="대리자">대리자</h4>
<pre><code>delegate : 메서드를 안전하게 캡슐화하는 형식
Func : 반환값이 있는 메서드 캡슐화 : 제네릭이 들어가며, 마지막 매개변수는 반환값
Action : 반환값이 없는 메서드 캡슐화 : 제네릭에 대리하려는 메서드 매개변수 할당
Predicate : 조건에 따라 bool 값을 반환하는 메서드 캡슐화
Comparison : 두 값을 비교하고 정렬순서를 나타내는 int 반환
Event : 이벤트의 추가(+=) 및 제거(-=)만 가능하다. 할당이 불가능하다.(= 으로 이벤트 할당 불가), 클래스 외부에서 직접 이벤트를 호출할 수 없다.</code></pre><h4 id="virtual">virtual</h4>
<pre><code> 부모 클래스에서 virtual 키워드를 사용하여 함수를 만들면, 자식 클래스에서 이 함수를 재정의 할 수 있도록 허용</code></pre><h4 id="critical-section-임계영역">Critical Section (임계영역):</h4>
<pre><code>다중 쓰레드 환경에서 여러 쓰레드가 동시에 접근하면 문제가 발생할 수 있는 공유 자원이나 코드 블록
이를 잘 관리하지 않으면 Race Condition (경합상태) 발생
lock
monitor
    Pulse: 대기중 스레드에 알림
    Wait: 신호대기
mutex
    WaitOne() : 뮤텍스 점유 기다림
semaphore</code></pre><h4 id="task">Task:</h4>
<pre><code>  Run() : 무거운 연산처리 작업 : 가벼운 쓰레드풀 사용
  Factory.StartNew() : Task.Run에서 더 다양한 지원
      TaskCreationOptions:
        LongRunning : 새로운 쓰레드를 생성해서 작업
        AttachedToParent : 부모작업 동기적 대기
  WhenAll(Task1, Task2) : 여러 개의 `Task` 객체가 모두 완료될 때까지 기다리고자 할 때</code></pre><h4 id="configureawaitfalse-">ConfigureAwait(false) :</h4>
<pre><code>    Context swiching 이 일어나지 않고 남는 쓰레드 풀에서 실행</code></pre><h4 id="cancelationtokensource">CancelationTokenSource:</h4>
<pre><code>                    cancel() : 비동기 중지
                    Dispose() : 자원 삭제
                    token : 비동기 상태 토큰
                    ThrowIfCancelationRequested() : 취소요청시 예외처리 발생 (OperationCanceledException) 
                    IsCannellationRequested() : 취소시 true 반환</code></pre><h4 id="reflection-">Reflection :</h4>
<pre><code>Assembly의 내용을 확인(메서드, 속성, 생성자 등)의 내용을 확인하거나 검사하려는 경우 사용, 인스턴스의 데이터 타입에 대한 정보 확인
애플리케이션을 개발할 때, 디버깅 또는 런타임에 알 수 없는 객체의 동작을 분석하기 위해 사용하거나 외부 라이브러리에 존재하는 클래스 및 메서드를 분석
GetType() : 객체의 데이터 타입 반환

Property() : 
    GetCustomAttributes() : 속성에 추가된 어트리뷰트 가져오기
        OfType&lt;T&gt; : 해당 어트리뷰트를 추가한 프로퍼티 가져오기</code></pre><h4 id="attribute-">Attribute :</h4>
<pre><code>코드 요소(클래스, 메서드, 속성 등) 추가적인 정보를 제공하는 메타데이터
이를 통해 컴파일러를 수행하거나 코드에 대한 추가정보를 활용할 수 있다.

*메타데이터 제공: 코드에 대한 추가정보 제공
*컴파일러 지시: 컴파일러 동작을 제어
*런타임 정보
*재사용 가능

메소드 
    [Obsolete] 선언시: 더이상 사용하지 않는다 표기
    [Conditional(환경)] 선언시: 해당 환경일때만 실행
매개변수: 반드시 선택적 매개변수로 선언
    [CallerMemeberName] : 호출한 메서드 반환
    [CallerFilePath]: 호출한 메서드의 파일 위치
    [CallerLineNumber]: 호출된 메서드의 라인넘버

Attribute 만들떄
AttributeUsage(AttributeTargets.범위) : 어트리뷰트 범위설정</code></pre><h4 id="interceptor-">Interceptor :</h4>
<pre><code>Nuget Package -&gt; Castle.core 설치
Interceptor 상속 : Invocation.Proceed() 
ProxyGenerator
    CreateClassProxyWithTarget(서비스, 인터셉터)

서비스 클래스에 virtual 키워드 사용</code></pre><h4 id="dependency-injection">Dependency Injection</h4>
<pre><code> Nuget Package에서 Microsoft.Extensions.DependencyInjection 설치

 컨테이너 생성
 IServiceCollection
     AddTransient&lt;&gt; : 의존성 주입할때 매번 새로운 인스턴스 생성
    AddSingleton : 어플리케이션 전체에서 하나만 생성
    AddScoped : 스코프 내에서 인스턴스 생성

 컨테이너 빌드
 IServiceProvider
     = service.BuildServiceProvider()
    .getRequiredService</code></pre><h4 id="api-통신">API 통신</h4>
<pre><code>HttpClient() : API 통신을 위한 함수
    .GetAsync(&quot;url&quot;) : Get방식 호출

Response.ReadAsStringAsync(): 리스펀스 값 읽기

{이름}Controller : 컨트롤러 경로{이름}으로 됨
HttpGet(&quot;{PathParameter:int}&quot;) : 패스파라미터 설정
리턴형식을 ActionResult&lt;타입&gt; 으로 설정시 오류코드(ex: NotFound()) 반환가능</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[C# - Thread]]></title>
            <link>https://velog.io/@flances-kwon/C-Thread</link>
            <guid>https://velog.io/@flances-kwon/C-Thread</guid>
            <pubDate>Mon, 27 Oct 2025 14:25:08 GMT</pubDate>
            <description><![CDATA[<p>Interrupts - 중지요청
Join - 해당 쓰레드가 끝날때까지 메인쓰레드 멈춤</p>
<p>Race Condition - 임계영역으로 관리(lock , monitor, mutex, Semaphore)</p>
<p>Monitor.Pulse : 대기중인 스레드에 알림
Monitor.Wait : 신호 대기</p>
<p>mutex.WaitOne() : 뮤텍스 점유 기다림</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GIT ACTION [Java with gradle] -3-]]></title>
            <link>https://velog.io/@flances-kwon/GIT-ACTION-Java-with-gradle-3-</link>
            <guid>https://velog.io/@flances-kwon/GIT-ACTION-Java-with-gradle-3-</guid>
            <pubDate>Wed, 07 Feb 2024 09:15:46 GMT</pubDate>
            <description><![CDATA[<p>서비스로 올라간 프로젝트의 로그를 보기위해 로그백을 이용해보기로 했다.</p>
<ol>
<li><p>프로젝트의 build.gradle 파일안 디펜던시 안에 로그백을 추가해준다.
(<a href="https://mvnrepository.com">https://mvnrepository.com</a> 에서 검색가능)
<img src="https://velog.velcdn.com/images/flances-kwon/post/7a855ec2-2e7e-49ea-865e-4bfc66f131c1/image.png" alt=""></p>
</li>
<li><p>gradle refresh</p>
</li>
<li><p>resources 폴더 안 logback-spring.xml 파일 생성</p>
</li>
<li><p>해당 내용 기입</p>
 <configuration>
 <property name="LOCAL_DIR" value="./local-log" />
 <property name="LOCAL_LOG_FILE" value="${LOCAL_DIR}/local" />
 <property name="DEV_DIR" value="/home/flanceskwon/log" />
 <property name="DEV_LOG_FILE" value="${DEV_DIR}/dev" />
 <springProfile name="local">
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <pattern>%green(%d{HH:mm:ss.SSS}) %magenta([%thread]) %highlight(%5level) %cyan(%logger{36}) - %yellow(%msg%n)</pattern>
         </encoder>
     </appender>
     <logger name="kr.co.core.api" level="debug" />
     <root level="info">
         <appender-ref ref="console" />
     </root>
 </springProfile>
 <springProfile name="dev">
     <appender name="console" class="ch.qos.logback.core.rolling.RollingFileAppender">

<pre><code>     &lt;encoder class=&quot;ch.qos.logback.classic.encoder.PatternLayoutEncoder&quot;&gt;
         &lt;pattern&gt;%d{HH:mm:ss.SSS} [%thread] %5level %logger{36} - %msg%n&lt;/pattern&gt;
     &lt;/encoder&gt;
     &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;${DEV_LOG_FILE}_%d{yyyy-MM-dd}.log&lt;/fileNamePattern&gt;
     &lt;/rollingPolicy&gt;

 &lt;/appender&gt;
 &lt;logger name=&quot;kr.co.core.api&quot; level=&quot;debug&quot; /&gt;
 &lt;root level=&quot;info&quot;&gt;
     &lt;appender-ref ref=&quot;console&quot; /&gt;
 &lt;/root&gt;</code></pre> </springProfile>
</configuration>

<ul>
<li>우선 로컬환경과 개발환경(라즈베리파이) 이 있기에 springProfile 로 구분</li>
<li>로컬에서는 파일로 굳이 만들필요없어, 바로 콘솔로 확인할수 있도록 설정</li>
<li>개발에서는 일자별로 로그를 쌓을수 있도록 설정</li>
</ul>
</li>
</ol>
<p>여기선 최소한의 내용만 작성한 설정이다.
작성한 설정외에 용량에 따른 설정 등 다양한 설정은 관련 레퍼런스를 찾아서 적용시키면 될듯하다.</p>
<ol start="5">
<li>개발서버에 생성된 로그파일 확인
<img src="https://velog.velcdn.com/images/flances-kwon/post/aeebebb0-269d-475d-9b3d-e82526f0f192/image.png" alt=""></li>
</ol>
<p>(로그파일이 생성되는 디렉토리에 대한 권한설정은 따로 필요할 수 있다.)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GIT ACTION [Java with gradle] -2-]]></title>
            <link>https://velog.io/@flances-kwon/GIT-ACTION-Java-with-gradle-2-</link>
            <guid>https://velog.io/@flances-kwon/GIT-ACTION-Java-with-gradle-2-</guid>
            <pubDate>Tue, 06 Feb 2024 00:24:26 GMT</pubDate>
            <description><![CDATA[<p>보통은 로컬환경, 개발서버환경, 운영환경 각각 다르기 때문에 프로퍼티를 분리해서 개발하는 경우가 많다.
전편에서 그레들을 이용해서 Jar 빌드후 라즈베리파이에 올리는 깃액션을 포스팅했으니 본편에선 이 Jar파일을
각 환경에 맞게 Active profile을 설정해 올리는 법을 포스팅하려 한다.</p>
<ol>
<li><p>본인은 서비스를 이용해서 서버를 띄우기 때문에 먼저 서비스를 하나 추가해준다.
해당 디렉토리에 서비스를 추가해주면 된다.
<img src="https://velog.velcdn.com/images/flances-kwon/post/89cb98b7-575c-41c3-b22a-ec2064815968/image.png" alt=""></p>
</li>
<li><p>그냥 간단하게 Jar를 푸는 간단한 서비스를 작성해봤다
Servie의 명령을 보면 --spring.profiles.active=dev 가 작성이 되어있다
이부분이 액티브프로파일을 결정하는 옵션이다.
파일명은 api.service 로 작성했다.
<img src="https://velog.velcdn.com/images/flances-kwon/post/1f3d8748-9374-4d9c-b1fa-3022d3c79f77/image.png" alt=""></p>
</li>
<li><p>해당 서비스를 실행시킬수 있도록 권한을 644로 열어준다
<img src="https://velog.velcdn.com/images/flances-kwon/post/50d9d872-b80d-4a7e-8d0f-f94ef1feafc2/image.png" alt=""></p>
</li>
<li><p>이렇게 작성하면 서비스를 등록을 해줘야한다. 아래 명령어를 내리면 서비스가 등록이 될것이다
<img src="https://velog.velcdn.com/images/flances-kwon/post/c36acee3-a890-488c-a63d-19e5cfae147f/image.png" alt="">
<img src="https://velog.velcdn.com/images/flances-kwon/post/d9b498f8-fe9c-4ddd-baed-0b5d0b0cbbdf/image.png" alt="">
<img src="https://velog.velcdn.com/images/flances-kwon/post/f970eb8d-44dc-4be2-a670-bcf04b87e383/image.png" alt=""></p>
</li>
</ol>
<ol start="5">
<li>서비스 등록상태
정상적으로 서버가 올라온것을 확인할수 있다.
<img src="https://velog.velcdn.com/images/flances-kwon/post/0e5c4f4c-51c1-4703-a81b-7dac4d2c9048/image.png" alt=""></li>
</ol>
<ol start="6">
<li><p>전편에서 작성한 Git action의 gradle.yml파일을 확인해보면
마지막에 작성한 아래내용을 확인할수 있을것이다.
이는 미리 작성한 쉘 스크립트를 실행시키는 명령어이다.
ssh_after: sh /home/flanceskwon/_deploy/deploy.sh</p>
</li>
<li><p>해당 스크립트 내용도 간단하게 작성해봤다.
7-1. 서비스중인 api.service를 정지
7-2. 10초 슬립
7-3. api.service 서비스 실행
<img src="https://velog.velcdn.com/images/flances-kwon/post/bcd59acb-d7bd-4751-b095-4d9107e1cebf/image.png" alt=""></p>
</li>
<li><p>푸쉬작업이 일어났을때 깃허브 액션탭에서 성공여부를 확인할수 있다
<img src="https://velog.velcdn.com/images/flances-kwon/post/02c9f048-3d61-4f08-84e4-2541a6c47b6d/image.png" alt=""></p>
</li>
</ol>
<p>이렇게 깃 액션을 이용해 자동배포하는 일련의 작업들을 포스팅 해봤다.
다음편에서는 자동배포된 서비스에 대해 로그를 확인하는법을 포스팅 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GIT ACTION [Java with gradle] -1-]]></title>
            <link>https://velog.io/@flances-kwon/GIT-ACTION-Java-with-gradle-1-</link>
            <guid>https://velog.io/@flances-kwon/GIT-ACTION-Java-with-gradle-1-</guid>
            <pubDate>Sat, 03 Feb 2024 05:44:04 GMT</pubDate>
            <description><![CDATA[<ol>
<li>상단 메뉴의 Actions 클릭
<img src="https://velog.velcdn.com/images/flances-kwon/post/bcec077b-6c38-454e-bd91-602f07b13ac6/image.png" alt=""></li>
</ol>
<ol start="2">
<li>그레이들을 이용한 자바프로젝트를 배포를 위해 해당 메뉴 선택
<img src="https://velog.velcdn.com/images/flances-kwon/post/0bd062d7-b743-4985-b53c-c54d39c3d964/image.png" alt=""></li>
</ol>
<ol start="3">
<li>샘플파일 편집창 확인
<img src="https://velog.velcdn.com/images/flances-kwon/post/b9b8ed3d-f5f5-4691-bbf4-381e3611287c/image.png" alt=""></li>
</ol>
<ol start="4">
<li><p>본인의 환경에 맞게 편집</p>
<pre><code> name: Java CI with Gradle

 on:
   push:
     branches: [ &quot;dev&quot; ] #해당 깃 브런치에 Push가 발생할 경우 깃액션 실행
   pull_request:
     branches: [ &quot;dev&quot; ] #해당 깃 브런치에 Pull Request가 발생할 경우 깃액션 실행

 jobs:
   build:
     runs-on: ubuntu-latest
     env:
       working-directory: ./api #프로젝트 루트 디렉토리

     steps:    #깃액션 실행시 일련의 작업단위
       - name: Checkout repository    #깃액션 실행단위의 이름
         uses: actions/checkout@v2

       - name: Set up JDK 11            
         uses: actions/setup-java@v2
         with:
           java-version: &#39;11&#39;        
           distribution: &quot;temurin&quot;

       #Gradlew 권한 수정
       - name: Run chmod to make gradlew executable #
         run: chmod +x ./api/gradlew    

       #JAR 파일로 빌드
       - name: Build with Gradle
         run : |
               cd api
               ./gradlew clean bootJar --exclude-task test

       #JAR 파일 이동시킬 디렉토리 생성
       - name: Make Directory for deliver
         run : |
               cd api
               mkdir deploy

       #생성시킨 디렉토리로 JAR 파일 이동      
       - name : Copy jar
         run : |
               cd api
               cp ./build/libs/*.jar ./deploy/

        #라즈베리파이에 JAR 전송 
       - name: Transfer to Raspberry Pi
         uses: appleboy/scp-action@master #파일 전송은 scp-action
         with:
           host: ${{ secrets.RASPBERRY_PI_HOST }}
           username: ${{ secrets.RASPBERRY_PI_USERNAME }}
           key: ${{ secrets.RASPBERRY_PI_PRIVATE_KEY }}
           port: ${{ secrets.RASPBERRY_PI_PORT }}
           timeout: 40s
           source: &quot;./api/deploy/api-server.jar&quot;
           target: &quot;/home/flanceskwon&quot;
           strip_component: 1

        #쉘스크립트 실행
       - name: Exec script to Raspberry Pi
         uses: appleboy/ssh-action@master #쉘스크립트 명령은 ssh-action
         with:
           host: ${{ secrets.RASPBERRY_PI_HOST }}
           username: ${{ secrets.RASPBERRY_PI_USERNAME }}
           key: ${{ secrets.RASPBERRY_PI_PRIVATE_KEY }}
           port: ${{ secrets.RASPBERRY_PI_PORT }}
           timeout: 40s
           script: |
             whoami
             cd /home/flanceskwon/_deploy
             sh deploy.sh      </code></pre></li>
<li><p>내용 저장 후 커밋&amp;푸시 작업 후 깃액션 메뉴에서 해당 실행로그를 확인가능
<img src="https://velog.velcdn.com/images/flances-kwon/post/5da008f2-13e2-4102-9d6d-20e3891dd4dc/image.png" alt=""></p>
</li>
<li><p>개발진행시 위 파일과같이 푸시, 피알 작업이 일어나면 해당 깃액션 실행됨</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[아두이노 설치]]></title>
            <link>https://velog.io/@flances-kwon/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@flances-kwon/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 13 Nov 2023 09:24:36 GMT</pubDate>
            <description><![CDATA[<h3 id="port-미인식-문제">Port 미인식 문제</h3>
<p>  <a href="https://ftdichip.com/drivers/vcp-drivers/">https://ftdichip.com/drivers/vcp-drivers/</a></p>
<p>  각 환경에 맞는 FTDI Chip Driver 설치 </p>
<h3 id="arduino-ide-설치">Arduino IDE 설치</h3>
<p>  <a href="https://www.arduino.cc/en/software">https://www.arduino.cc/en/software</a></p>
<p>  각 환경에 맞는 IDE 설치   </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux]Spring boot jar파일 서비스 등록]]></title>
            <link>https://velog.io/@flances-kwon/LinuxSpring-boot-jar%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%93%B1%EB%A1%9D</link>
            <guid>https://velog.io/@flances-kwon/LinuxSpring-boot-jar%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%93%B1%EB%A1%9D</guid>
            <pubDate>Sun, 28 May 2023 07:43:45 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>서비스 등록을 위한 설정 파일 생성
 sudo vi /etc/systemd/system/[서비스명].service</p>
</li>
<li><p>내용작성
 [Unit]
 Description=Service Description</p>
<p> <em>해당 서비스에 대한 설명이다. 서비스의 status를 확인했을 때 표시</em></p>
<p> [Service]
 ExecStart=/bin/bash -c &quot;exec java -jar /home/flanceskwon/api/deploy/api
 --server.jar --spring.profiles.active=dev&quot;</p>
<p> <em>Jar 실행시키는 부분 그 외 서비스 시작/재시작 등에 대한옵션도 설정할수 있다</em></p>
<p> [Install]
 WantedBy=multi-user.target</p>
<p> <img src="https://velog.velcdn.com/images/flances-kwon/post/adb0ebdc-72e5-4415-98a8-9042e093812c/image.png" alt=""></p>
<p> <em>서비스 run level을 설정하는 부분. &#39;multi-user.target&#39;로 설정하면 다중 사용자</em></p>
</li>
<li><p>서비스 설정파일로 서비스 등록하기
 sudo systemctl daemon-reload</p>
</li>
<li><p>현재 구동되는 서비스들 목록 조회
 systemctl -t service list-unit-files</p>
<p> <img src="https://velog.velcdn.com/images/flances-kwon/post/b5d7ecc3-d1dc-450b-a419-454cf9663059/image.png" alt=""></p>
</li>
<li><p>서비스 활성화
 4 의 과정에서 방금 등록한 서비스가 disabled 되어있다면 enable 시켜줘야한다
 systemctl enable [서비스 명]</p>
</li>
</ol>
<ol start="6">
<li><p>서비스 시작/종료/재시작</p>
<ul>
<li><p>systemctl start [서비스 명]</p>
</li>
<li><p>systemctl stop [서비스 명]</p>
</li>
<li><p>systemctl restart [서비스 명]</p>
</li>
</ul>
</li>
<li><p>상태 확인
 systemctl status [서비스명]</p>
</li>
</ol>
<p>여러 가지 옵션들은 아래 링크확인
<a href="https://www.freedesktop.org/software/systemd/man/systemd.service.html">https://www.freedesktop.org/software/systemd/man/systemd.service.html</a>    </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Raspberry PI 4 Linux 설치 - 2]]></title>
            <link>https://velog.io/@flances-kwon/Raspberry-PI-4-Linux-%EC%84%A4%EC%B9%98-2</link>
            <guid>https://velog.io/@flances-kwon/Raspberry-PI-4-Linux-%EC%84%A4%EC%B9%98-2</guid>
            <pubDate>Sun, 28 May 2023 07:23:01 GMT</pubDate>
            <description><![CDATA[<h2 id="ssh-enable">SSH Enable</h2>
<ol>
<li><p>1 과정에서 저장완료된 SD카드 해제후 재연결</p>
</li>
<li><p>boot로 된 드라이브 확인
<img src="https://velog.velcdn.com/images/flances-kwon/post/bf53eaa8-e718-42a0-be79-7796909ba191/image.png" alt=""></p>
</li>
<li><p>해당 드라이브에 (확장자가 없는) ssh파일 생성</p>
</li>
</ol>
<p>-리눅스가 부팅되면서 ssh 활성화
<img src="https://velog.velcdn.com/images/flances-kwon/post/57197921-62e9-460b-a4c0-6efe72f8d4d8/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Raspberry PI 4 Maria DB 외부접속]]></title>
            <link>https://velog.io/@flances-kwon/Raspberry-PI-4-Maria-DB-%EC%99%B8%EB%B6%80%EC%A0%91%EC%86%8D</link>
            <guid>https://velog.io/@flances-kwon/Raspberry-PI-4-Maria-DB-%EC%99%B8%EB%B6%80%EC%A0%91%EC%86%8D</guid>
            <pubDate>Sat, 27 May 2023 12:50:57 GMT</pubDate>
            <description><![CDATA[<h2 id="외부-모든-접속을-허용">외부 모든 접속을 허용</h2>
<ol>
<li><p>먼저 mysql 로 접속
 use mysql
 <img src="https://velog.velcdn.com/images/flances-kwon/post/c3ab5ff3-adac-413c-89f9-9c70bf72da9b/image.png" alt=""></p>
</li>
<li><p>계정 암호 변경
 GRANT USAGE ON <em>.</em> TO &#39;root&#39;@&#39;%&#39; IDENTIFIED BY &#39;[암호]&#39;;
 <img src="https://velog.velcdn.com/images/flances-kwon/post/77224bff-1d1a-41b6-9aee-280cd419e2f3/image.png" alt=""></p>
</li>
<li><p>grant 테이블을 reload함으로서 변경 사항을 즉시 반영하도록 한다.
 flush privileges;
 <img src="https://velog.velcdn.com/images/flances-kwon/post/2f7f7a43-32b9-4bc5-b1db-f4b7623f8be9/image.png" alt=""></p>
</li>
<li><p>iptable 설정
 sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
 sudo iptables -A OUTPUT -p tcp --dport 3306 -j ACCEPT
 <img src="https://velog.velcdn.com/images/flances-kwon/post/03cfaae3-4264-45c5-87e7-86f5dbb90f15/image.png" alt=""></p>
<p> sudo iptables-save
 <img src="https://velog.velcdn.com/images/flances-kwon/post/0ef7732e-259b-416b-8858-1c0fefd5df84/image.png" alt=""></p>
<p> <img src="https://velog.velcdn.com/images/flances-kwon/post/d3d82c95-8d3f-4a03-8a70-dd1a76e2ea69/image.png" alt=""></p>
</li>
</ol>
<ol start="5">
<li><p>외부 ip 허용
 sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf 
 <img src="https://velog.velcdn.com/images/flances-kwon/post/e84a22de-6eb3-49a1-a917-397dd0465958/image.png" alt="">
 해당 라인을 0.0.0.0 으로 변경
 <img src="https://velog.velcdn.com/images/flances-kwon/post/0692c6c6-2aa8-4be3-bbbf-cf2f0f2a876f/image.png" alt=""></p>
</li>
<li><p>mysql restart
 service mysql restart</p>
</li>
<li><p>접속시도해보기</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Raspberry PI 4 Maria DB 설치]]></title>
            <link>https://velog.io/@flances-kwon/Raspberry-PI-4-Maria-DB-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@flances-kwon/Raspberry-PI-4-Maria-DB-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sat, 27 May 2023 12:37:37 GMT</pubDate>
            <description><![CDATA[<h2 id="maria-db-설치">Maria DB 설치</h2>
<ol>
<li><p>설치전 
 sudo apt-get update
<img src="https://velog.velcdn.com/images/flances-kwon/post/42007425-f6eb-4966-8954-898c8a903731/image.png" alt=""></p>
</li>
<li><p>관련패키지 검색
 apt-cache search mariadb
<img src="https://velog.velcdn.com/images/flances-kwon/post/a36ca327-069e-48f7-a969-4489d6cd3e2e/image.png" alt=""></p>
</li>
<li><p>설치
 sudo apt-get install mariadb-server
<img src="https://velog.velcdn.com/images/flances-kwon/post/0b1967aa-b1b0-4aa0-99a1-3a78e17b24e1/image.png" alt=""></p>
</li>
<li><p>접속해보기
 sudo mysql -u root
 show databases;
 <img src="https://velog.velcdn.com/images/flances-kwon/post/5826f526-cbd1-45fc-80ea-027170f6eaef/image.png" alt=""></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Raspberry PI 4 Linux 설치 - 4(공개키등록)]]></title>
            <link>https://velog.io/@flances-kwon/Rasberry-PI-4-Linux-%EC%84%A4%EC%B9%98-4%EA%B3%B5%EA%B0%9C%ED%82%A4%EB%93%B1%EB%A1%9D</link>
            <guid>https://velog.io/@flances-kwon/Rasberry-PI-4-Linux-%EC%84%A4%EC%B9%98-4%EA%B3%B5%EA%B0%9C%ED%82%A4%EB%93%B1%EB%A1%9D</guid>
            <pubDate>Fri, 26 May 2023 07:23:05 GMT</pubDate>
            <description><![CDATA[<h2 id="ssh-연결할때마다-비밀번호-입력하지-않고-엑세스하기">SSH 연결할때마다 비밀번호 입력하지 않고 엑세스하기</h2>
<ol>
<li>개인 컴퓨터에 이미 키가 있는지 확인
 ls ~/.ssh</li>
</ol>
<ol start="2">
<li>키가 없다면 새로 생성
 ssh-keygen</li>
</ol>
<ol start="3">
<li>키 여부 확인
 ls ~/.ssh</li>
</ol>
<pre><code>id_rsa : 개인키
id_rsa.pub : 공개키</code></pre><ol start="4">
<li>SSH를 통해 라즈베리파이에 공개키 추가 (비밀번호 인증 필요)
   ssh-copy-id [계정]@[호스트]</li>
</ol>
<ol start="5">
<li><p>키가 다른경로에 있다면
   ssh-copy-id -i /[공개키 경로]/공개키.pub [계정]@[호스트]</p>
<p>   개인 피시에 저장되어 있는 공개키 확인
 cat ~/.ssh/id_rsa.pub
 <img src="https://velog.velcdn.com/images/flances-kwon/post/9d7c3982-33ec-4ed4-ba64-9b44881e1f7f/image.png" alt=""></p>
<p>   라즈베리에 저장된 공개키 확인
 cat ~/.ssh/authorized_keys
<img src="https://velog.velcdn.com/images/flances-kwon/post/cbd3703a-e6c0-47ad-a3aa-86652712a8c6/image.png" alt=""></p>
</li>
</ol>
<ol start="6">
<li>확인<br> ssh [계정]@[호스트]</li>
</ol>
<p>번외. SSH기존에 접속한 ip의 서버가 달라지면 재 접속 시<br>     서버를 밀고 새로 작업하거나, 동일한 아이피로 다른 서버를 세팅시 </p>
<p><img src="https://velog.velcdn.com/images/flances-kwon/post/9d517856-d24f-4a7a-8771-219372b50d11/image.png" alt=""></p>
<p>해당 메시지를 볼수 있을것이다.</p>
<p>이땐 
    ssh-keygen -R [호스트]
명령어로 초기화를 시켜주자    </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Raspberry PI 4 Linux 설치 - 3]]></title>
            <link>https://velog.io/@flances-kwon/Rasberry-PI-4-Linux-%EC%84%A4%EC%B9%98-3</link>
            <guid>https://velog.io/@flances-kwon/Rasberry-PI-4-Linux-%EC%84%A4%EC%B9%98-3</guid>
            <pubDate>Sun, 21 May 2023 12:13:40 GMT</pubDate>
            <description><![CDATA[<h2 id="실제-라즈베리파이에-설치">실제 라즈베리파이에 설치</h2>
<ol>
<li><p>1, 2 과정을 거친 SD 카드 해제 후 라즈베리파이에 삽입</p>
</li>
<li><p>라즈베리파이에 할당된 IP 주소 확인</p>
</li>
<li><p>SSH 접속시도
<img src="https://velog.velcdn.com/images/flances-kwon/post/c87c754c-b924-4262-8f17-5c50ba053555/image.png" alt=""></p>
</li>
<li><p>접속 성공
<img src="https://velog.velcdn.com/images/flances-kwon/post/435efa5c-cfb5-4cb9-941f-8fc4f149052f/image.png" alt=""></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Raspberry PI 4 Linux 설치 - 1]]></title>
            <link>https://velog.io/@flances-kwon/Rasberry-PI-4-Linux-%EC%84%A4%EC%B9%98-1</link>
            <guid>https://velog.io/@flances-kwon/Rasberry-PI-4-Linux-%EC%84%A4%EC%B9%98-1</guid>
            <pubDate>Sun, 21 May 2023 02:49:30 GMT</pubDate>
            <description><![CDATA[<h2 id="리눅스-설치를-위한-sd-카드-만들기">리눅스 설치를 위한 SD 카드 만들기</h2>
<ol>
<li><p>OS 설치를 위한 SD 카드 준비</p>
</li>
<li><p>준비된 SD 카드를 OS설치를 위한 컴퓨터에 삽임</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/flances-kwon/post/1cc7aa46-090a-4c0c-a56b-48a4d1c9a72c/image.png" alt="">
3. 라즈베리 파이 이미저 검색 후 해당 홈페이지 방문</p>
<p><img src="https://velog.velcdn.com/images/flances-kwon/post/2053f7d9-81e2-4ed1-af29-76a5de5f8a4c/image.png" alt=""></p>
<ol start="4">
<li>OS (Recommended) 선택 및 저장할 SD 카드 선택
<img src="https://velog.velcdn.com/images/flances-kwon/post/1da22416-b684-4164-a5a8-2bb1369cd951/image.png" alt=""></li>
</ol>
<p><img src="https://velog.velcdn.com/images/flances-kwon/post/d5353232-a698-4a7f-8c82-f6924108c29c/image.png" alt=""></p>
<ol start="5">
<li>설정버튼(톱니바퀴) SSH 접속을 위한 정보 미리 입력
<img src="https://velog.velcdn.com/images/flances-kwon/post/9499949f-982e-4f1d-b3fa-61a134290596/image.png" alt="">
<img src="https://velog.velcdn.com/images/flances-kwon/post/6f1ec015-7197-49fb-8eb1-d1d971788098/image.png" alt=""></li>
</ol>
<ol start="6">
<li>WRITE 클릭
<img src="https://velog.velcdn.com/images/flances-kwon/post/072b384c-032b-4c97-a9cf-38d2dd8dc588/image.png" alt=""></li>
</ol>
]]></description>
        </item>
    </channel>
</rss>