<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Dev Gin</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sat, 30 Aug 2025 11:26:41 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Dev Gin</title>
            <url>https://velog.velcdn.com/images/sjgaru-dev/profile/b84e5050-88ec-46d7-9727-efdc4fc85350/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Dev Gin. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sjgaru-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[node npm]]></title>
            <link>https://velog.io/@sjgaru-dev/node-npm</link>
            <guid>https://velog.io/@sjgaru-dev/node-npm</guid>
            <pubDate>Sat, 30 Aug 2025 11:26:41 GMT</pubDate>
            <description><![CDATA[<p>sudo apt update &amp;&amp; sudo apt upgrade -y
curl -fsSL <a href="https://deb.nodesource.com/setup_20.x">https://deb.nodesource.com/setup_20.x</a> | sudo -E bash -
sudo apt install -y nodejs
node -v
npm -v</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[센트리 팀, 유저 삭제]]></title>
            <link>https://velog.io/@sjgaru-dev/%EC%84%BC%ED%8A%B8%EB%A6%AC-%ED%8C%80-%EC%9C%A0%EC%A0%80-%EC%82%AD%EC%A0%9C</link>
            <guid>https://velog.io/@sjgaru-dev/%EC%84%BC%ED%8A%B8%EB%A6%AC-%ED%8C%80-%EC%9C%A0%EC%A0%80-%EC%82%AD%EC%A0%9C</guid>
            <pubDate>Wed, 27 Aug 2025 04:24:21 GMT</pubDate>
            <description><![CDATA[<p>docker exec web bash
sentry shell</p>
<h3 id="먼저-관련-데이터들을-단계별로-삭제">먼저 관련 데이터들을 단계별로 삭제</h3>
<pre><code>from sentry.models import Organization, Project, Release, Group, Event, Team

orgs_to_delete = Organization.objects.exclude(id=1)

for org in orgs_to_delete:
    print(f&quot;\n=== {org.name} (ID: {org.id}) 삭제 시작 ===&quot;)

    # 프로젝트별로 관련 데이터 삭제
    projects = Project.objects.filter(organization=org)
    for project in projects:
        print(f&quot;  프로젝트 삭제: {project.name}&quot;)

        # Groups (이슈들) 삭제
        groups = Group.objects.filter(project=project)
        group_count = groups.count()
        if group_count &gt; 0:
            print(f&quot;    Groups 삭제: {group_count}개&quot;)
            groups.delete()

        # Events 삭제
        events = Event.objects.filter(project_id=project.id)
        event_count = events.count()
        if event_count &gt; 0:
            print(f&quot;    Events 삭제: {event_count}개&quot;)
            events.delete()

    # Releases 삭제
    releases = Release.objects.filter(organization=org)
    release_count = releases.count()
    if release_count &gt; 0:
        print(f&quot;  Releases 삭제: {release_count}개&quot;)
        releases.delete()

    # Teams 삭제
    teams = Team.objects.filter(organization=org)
    team_count = teams.count()
    if team_count &gt; 0:
        print(f&quot;  Teams 삭제: {team_count}개&quot;)
        teams.delete()

    # Projects 삭제
    project_count = projects.count()
    if project_count &gt; 0:
        print(f&quot;  Projects 삭제: {project_count}개&quot;)
        projects.delete()

    # 마지막으로 Organization 삭제
    print(f&quot;  Organization 삭제: {org.name}&quot;)
    org.delete()
    print(f&quot;  완료: {org.name}&quot;)  
</code></pre><h3 id="사용자-삭제">사용자 삭제</h3>
<p>```
from django.contrib.auth import get_user_model</p>
<p>User = get_user_model()</p>
<h1 id="삭제할-사용자-확인">삭제할 사용자 확인</h1>
<p>user_to_delete = User.objects.get(id=3)
print(f&quot;삭제할 사용자: {user_to_delete.email} (ID: {user_to_delete.id})&quot;)</p>
<h1 id="사용자-삭제-1">사용자 삭제</h1>
<p>user_to_delete.delete()
print(f&quot;삭제 완료: {user_to_delete.email}&quot;)</p>
<h1 id="삭제-후-확인">삭제 후 확인</h1>
<p>remaining_users = User.objects.all()
print(&quot;\n=== 남은 사용자들 ===&quot;)
for user in remaining_users:
    print(f&quot;User: {user.email} (ID: {user.id})&quot;)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 하드]]></title>
            <link>https://velog.io/@sjgaru-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%95%98%EB%93%9C</link>
            <guid>https://velog.io/@sjgaru-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%95%98%EB%93%9C</guid>
            <pubDate>Sun, 24 Aug 2025 00:40:09 GMT</pubDate>
            <description><![CDATA[<p>  📊 기본 디스크 정보 확인</p>
<ol>
<li><p>df - 디스크 사용량 확인</p>
<p>df -h                    # 사람이 읽기 쉬운 형태로 표시
df -T                    # 파일시스템 타입도 함께 표시
df -i                    # inode 사용량 확인</p>
</li>
<li><p>lsblk - 블록 디바이스 트리 구조로 확인</p>
<p>lsblk                    # 기본 트리 구조
lsblk -f                 # 파일시스템 정보 포함
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE</p>
</li>
<li><p>fdisk - 파티션 테이블 확인</p>
<p>sudo fdisk -l           # 모든 디스크 파티션 목록
sudo fdisk -l /dev/sda  # 특정 디스크만 확인</p>
<p>🔧 상세 하드웨어 정보</p>
</li>
<li><p>lshw - 하드웨어 상세 정보</p>
<p>sudo lshw -class disk    # 디스크 하드웨어만
sudo lshw -class storage # 스토리지 컨트롤러 포함</p>
</li>
<li><p>hwinfo - 하드웨어 검색 도구</p>
<p>sudo hwinfo --disk      # 디스크 정보만
sudo hwinfo --short     # 간략한 전체 하드웨어 정보</p>
</li>
<li><p>smartctl - 디스크 건강 상태 (SMART)</p>
<p>sudo smartctl -i /dev/sda     # 디스크 기본 정보
sudo smartctl -A /dev/sda     # SMART 속성값들
sudo smartctl -t short /dev/sda # 짧은 자가진단 테스트</p>
<p>💾 실시간 성능 모니터링</p>
</li>
<li><p>iostat - I/O 통계</p>
<p>iostat -x 1             # 1초마다 상세 I/O 통계
iostat -h               # 사람이 읽기 쉬운 형태</p>
</li>
<li><p>iotop - 실시간 I/O 모니터링</p>
<p>sudo iotop              # 프로세스별 I/O 사용량
sudo iotop -o           # 실제 I/O 발생하는 것만</p>
</li>
<li><p>dstat - 종합 시스템 통계</p>
<p>dstat -d                # 디스크 통계만
dstat -D sda            # 특정 디스크만</p>
<p>🔍 파일시스템 분석</p>
</li>
<li><p>du - 디렉터리 사용량</p>
<p>du -sh /home/*          # 홈 디렉터리별 사용량
du -sh * | sort -hr     # 크기순 정렬</p>
</li>
<li><p>ncdu - 인터랙티브 디스크 사용량 분석</p>
<p>ncdu /                  # 루트부터 탐색
ncdu /home             # 특정 디렉터리만</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[aws]]></title>
            <link>https://velog.io/@sjgaru-dev/aws</link>
            <guid>https://velog.io/@sjgaru-dev/aws</guid>
            <pubDate>Sun, 04 May 2025 11:08:53 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@hsh111366/5%EB%B6%84-%EB%A7%8C%EC%97%90-AWS-140%EB%A7%8C%EC%9B%90-%EB%B2%8C%EA%B8%B0">AWS Activate Startups Credit</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 마운트]]></title>
            <link>https://velog.io/@sjgaru-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%9A%B4%ED%8A%B8</link>
            <guid>https://velog.io/@sjgaru-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%9A%B4%ED%8A%B8</guid>
            <pubDate>Sat, 03 May 2025 05:48:02 GMT</pubDate>
            <description><![CDATA[<p>sudo fdisk /dev/xvdb
n(새 파티션 생성) -&gt; p(주 파티션) -&gt; 1(파티션 번호) -&gt; Enter(기본값 사용) -&gt; Enter(기본값 사용) -&gt; w(저장 및 종료)</p>
<p>sudo mkfs.ext4 /dev/xvdb</p>
<p>sudo mkdir -p /mnt/data
sudo mount /dev/xvdb /ssd
echo &#39;/dev/xvdb /ssd ext4 defaults 0 0&#39; | sudo tee -a /etc/fstab</p>
<hr>
<p>lsblk -f
sudo fdisk -l /dev/xvdb</p>
<p>sudo mount /dev/xvdb1 /ssd</p>
<hr>
<p>sudo cp -av /ssd/* /llama/
-a: 아카이브 모드 (권한, 소유권, 타임스탬프 등 모든 속성 유지)
-v: 상세 출력 (어떤 파일이 복사되고 있는지 확인 가능)</p>
<p>watch -n 1 du -sh /llama</p>
<p>df -h .
du -sh ./*</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ollama]]></title>
            <link>https://velog.io/@sjgaru-dev/ollama</link>
            <guid>https://velog.io/@sjgaru-dev/ollama</guid>
            <pubDate>Sat, 03 May 2025 03:32:38 GMT</pubDate>
            <description><![CDATA[<p><a href="https://sysdocu.tistory.com/2036">https://sysdocu.tistory.com/2036</a></p>
<h2 id="1-모델-다운로드">1. 모델 다운로드</h2>
<p>mkdir -p /data/Llama4/Q4_K_M
cd /data/Llama4/Q4_K_M</p>
<p>wget <a href="https://huggingface.co/unsloth/Llama-4-Scout-17B-16E-Instruct-GGUF/resolve/main/Q4_K_M/Llama-4-Scout-17B-16E-Instruct-Q4_K_M-0000%7B1..2%7D-of-00002.gguf">https://huggingface.co/unsloth/Llama-4-Scout-17B-16E-Instruct-GGUF/resolve/main/Q4_K_M/Llama-4-Scout-17B-16E-Instruct-Q4_K_M-0000{1..2}-of-00002.gguf</a>
</br></p>
<h2 id="2-llamacpp">2. Llama.cpp</h2>
<p>apt -y install cmake libopenblas-dev g++ libcurl4-openssl-dev
git clone <a href="https://github.com/ggerganov/llama.cpp.git">https://github.com/ggerganov/llama.cpp.git</a></p>
<p> cd llama.cpp
 mkdir build
 cd build
 cmake ..</p>
<p> cmake --build . --config Release</p>
 </br>



<h2 id="3-분할된-파일-합치기">3. 분할된 파일 합치기</h2>
<p> cd bin</p>
<p> ./llama-gguf-split --merge <br>  /data/Llama4/Q4_K_M/Llama-4-Scout-17B-16E-Instruct-Q4_K_M-00001-of-00002.gguf <br>  /data/Llama4/Q4_K_M/Llama-4-Scout-17B-16E-Instruct-Q4_K_M.gguf</p>
 </br>



<h2 id="4-llm-실행">4. LLM 실행</h2>
<p> ./llama-cli -m /data/Llama4/Q4_K_M/Llama-4-Scout-17B-16E-Instruct-Q4_K_M.gguf -p &quot;오늘은 며칠이야?&quot;</p>
<p> ./llama-server -m /data/Llama4/Q4_K_M/Llama-4-Scout-17B-16E-Instruct-Q4_K_M.gguf --host 0.0.0.0 --port 8080</p>
</br>
 apt -y install jq

<p> curl http://{서버IP}:8080/completion -H &quot;Content-Type: application/json&quot; -d &#39;{
  &quot;prompt&quot;: &quot;오늘은 며칠이야?&quot;,
  &quot;n_predict&quot;: 100
}&#39; | jq</p>
<h2 id="도커-gpu">도커 gpu</h2>
<p>distribution=$(. /etc/os-release;echo $ID$VERSION_ID)  # ubuntu20.04 → ubuntu20.04</p>
<p>curl -s -L <a href="https://nvidia.github.io/libnvidia-container/gpgkey">https://nvidia.github.io/libnvidia-container/gpgkey</a> | sudo apt-key add -
curl -s -L <a href="https://nvidia.github.io/libnvidia-container/ubuntu22.04/libnvidia-container.list">https://nvidia.github.io/libnvidia-container/ubuntu22.04/libnvidia-container.list</a> | <br>  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list</p>
<p>sudo apt update
sudo apt install -y nvidia-container-toolkit</p>
<p>sudo nvidia-ctk runtime configure --runtime=docker</p>
<p>sudo systemctl restart docker</p>
<p>docker run --rm --gpus all nvidia/cuda:12.3.2-base-ubuntu22.04 nvidia-smi</p>
<h2 id="gpu">gpu</h2>
<p>sudo lshw -C system
sudo lshw -C display</p>
<p>cat /proc/cpuinfo</p>
<p>lspci | grep -i VGA
lspci | grep -E &quot;VGA|3D|Display&quot;
lspci -v</p>
<p>apt search nvidia-driver</p>
<p>nvidia-smi --query | fgrep &#39;Product Name
watch nvidia-smi</p>
<p>sudo ubuntu-drivers autoinstall</p>
<p>sudo apt-get update
sudo apt-get install -y curl ca-certificates gnupg</p>
<p>curl -fsSL <a href="https://nvidia.github.io/libnvidia-container/gpgkey">https://nvidia.github.io/libnvidia-container/gpgkey</a> | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg</p>
<p>curl -s -L <a href="https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list">https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list</a> | <br>sed &#39;s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g&#39; | <br>sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list</p>
<p>sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit</p>
<p>sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker</p>
<p>docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu20.04 nvidia-smi</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[비전, 미션, 핵심가치]]></title>
            <link>https://velog.io/@sjgaru-dev/%EB%B9%84%EC%A0%84-%EB%AF%B8%EC%85%98-%ED%95%B5%EC%8B%AC%EA%B0%80%EC%B9%98</link>
            <guid>https://velog.io/@sjgaru-dev/%EB%B9%84%EC%A0%84-%EB%AF%B8%EC%85%98-%ED%95%B5%EC%8B%AC%EA%B0%80%EC%B9%98</guid>
            <pubDate>Tue, 22 Apr 2025 01:39:37 GMT</pubDate>
            <description><![CDATA[<h3 id="비즈니스-모델">비즈니스 모델</h3>
<p>회사의 비즈니스 모델은 간단함.
맛있는 빵을 만들어 고객에게 전하는 것.</p>
<p>크리스마스 기획전에서 2단짜리 케이스를 한정 수량으로 판매.
프로젝트는 성공했지만 예상치 못한 문제 발생.
2단 케이크라 서울 지역 외 배송이 불가한데 대전에 사는 한 어머니의 주문이 옴.
CS 담당자가 “서울 지역 외에는 배송이 불가하다&quot; 안내.
이를 보던 다른 담당자가 “맛있는 빵을 만들어 고객에게 전한다”라는 원칙에 근거해 다시 응대.</p>
<p>문의 내용은 밀가루 알레르기가 있어 케이크를 못 먹는 아이를 키우고 있는데 우리 회사 케이크는 먹을 수 있다는 것.
이번 크리스마스만큼은 꼭 케이크를 선물해 주고 싶다는 요청.
퀵 서비스 업체의 원칙이 아니라 우리 회사 원칙에 따라 고객에게 전할 방법 모색.
퀵 배송으로 가능한 지역까지 배달하고 중간지점에서 어머니가 픽업하는 방법으로 2단 케이크 전달.
이 고객은 충성 고객이 되어 서울에 올 때마다 수십만 원어치 빵을 구매.</p>
<p>모든 구성원이 “맛있는 빵을 만들어 고객에게 전한다” 원칙으로 응대하니 이와 같은 충성 고객 다수 확보.
지방에서 베이커리 카페를 운영하는 사업가들과 협업으로 회사 크게 성장.
단순히 지침만 따르는 수동적인 직원은 고객의 니즈를 제대로 이해하지 못함.
이에 관리자는 자연히 잔소리가 많아짐.</p>
<p>반면 회사의 비즈니스 모델을 이해해 주도적으로 일하는 직원은 스스로 판단해 고객에게 최상의 서비스 제공 가능.
기획, 개발, 디자인, 마케팅, CS 포함 모든 구성원이 회사의 비즈니스 모델에 대한 근본적인 이해를 갖고 있으면 주도적인 업무 수행으로 효율을 높일 수 있음.
예를 들어 “맛있는 빵을 만들어 고객에게 전하는 것”라는 원칙을 갖고 있으면 마케팅 메세지를 뽑는 것도 간단.
이 경우 할인이나 1+1 프로모션은 원칙에 어긋남.
우리가 어떻게 맛있는 빵을 만들기 위해 노력하고 고객에게 전하려고 애쓰는지를 보여주는 데만 집중하면 됨.</p>
<p><a href="https://eopla.net/magazines/21234">https://eopla.net/magazines/21234</a></p>
<hr>
<h3 id="피터의-법칙">피터의 법칙</h3>
<p>IT 업계가 빠르게 성장하는 만큼, 역량 부재 상태로 승진된 관리자가 조직 성과를 저해하는 현실을 적나라하게 보여준다. 그러나 구글이나 인텔, 일부 스타트업 사례가 증명하듯이, 인사제도 개선(역량 기반 승진·듀얼 트랙)과 체계적인 매니저 교육을 병행한다면 이러한 부작용을 상당히 줄일 수 있다. 신임 매니저라면 “승진이 곧 끝이 아니라, 본격적인 리더십 학습의 시작”이라는 사실을 명심하고, 꾸준히 성장 마인드셋을 유지하기 바란다. 결국, 피터의 법칙에 휘말릴 것인지 넘어서 성장할 것인지는 조직과 개인이 얼마나 적극적으로 학습하고 개선하려 하는가에 달려 있다.</p>
<p><a href="https://brunch.co.kr/@unicornjungle/146">https://brunch.co.kr/@unicornjungle/146</a></p>
<hr>
<h3 id="핵심인재">핵심인재</h3>
<ol>
<li>핵심인재가 하고 있는 일에 대해서 책임과 소명을 가지고 일할만큼의 전권을 가지고 있는가?</li>
<li>성과를 냈을 때 해당 핵심인재가 원하는 만큼의 보상을 타 업체보다 줄 수 있는가?</li>
<li>회사의 성장 그리고 개인도 끊임없이 성장을 추구할 수 있는가?</li>
<li>몰입할 수 있는 조직문화와 환경을 제공하고 있는가?</li>
</ol>
<p><a href="https://eopla.net/magazines/12481">https://eopla.net/magazines/12481</a></p>
<hr>
<h3 id="게이미피케이션">게이미피케이션</h3>
<ol>
<li>도전목표 : 사용자에게 미션이나 도전 과제를 제시하고 도전 의식을 자극해 재미와 동시에 성취감을 제공</li>
<li>경쟁관계 : 사용자들 간의 사회적인 경쟁 관계를 형성하고, 사용자가 자신과 타 사용자와의 상태를 직관적으로 비교 </li>
<li>보상 : 여러 도전 과제들을 달성하면 사용자에게 보상을 제공, 그저 겉치레에 불과하다는 불쾌한 경험을 제공하지 않는 것</li>
<li>성취 : 사용자의 장기적인 도전과 경쟁을 이어나갈 핵심 동력</li>
</ol>
<p><a href="https://ditoday.com/lets-get-it-right-gamification-ux/">https://ditoday.com/lets-get-it-right-gamification-ux/</a></p>
<hr>
<h3 id="랜딩페이지"><a href="https://disquiet.io/@sid_/makerlog/20%EC%82%B4%EC%9D%B4-6%EA%B0%9C%EC%9B%94%EA%B0%84-3%EC%B2%9C-%EB%B2%8C%EB%A9%B4%EC%84%9C-%EC%95%8C%EA%B2%8C%EB%90%9C-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-%EB%9E%9C%EB%94%A9%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B8%B0%ED%9A%8D-%EB%B0%A9%EB%B2%95">랜딩페이지</a></h3>
<ol>
<li>CTA가 직관적이고 명확한가?</li>
<li>이 서비스가 도대체 뭐지? (Hero)  5초 안에 이 서비스가 어떤 서비스인지 스캔 가능</li>
<li>이게 나에게 맞는 서비스인가? (Problem &amp; Solution)</li>
<li>이 사이트가 신뢰할만한가?</li>
<li>누가 실제로 사용 중인가? (Testimonials)</li>
<li>그래서 내가 얻는게 무엇인가? (Benefit)</li>
<li>어디서 도움을 받을 수 있는가?</li>
</ol>
<hr>
<h3 id="no-mvp--mvt--mlp"><a href="https://dewberry9.github.io/why-mvp-as-a-product-fails-try-mvt?utm_source=share_link&amp;utm_medium=referral">No MVP , MVT / MLP </a></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[배터리 , 성능test]]></title>
            <link>https://velog.io/@sjgaru-dev/%EB%B0%B0%ED%84%B0%EB%A6%AC-%EB%A6%AC%EB%88%85%EC%8A%A4</link>
            <guid>https://velog.io/@sjgaru-dev/%EB%B0%B0%ED%84%B0%EB%A6%AC-%EB%A6%AC%EB%88%85%EC%8A%A4</guid>
            <pubDate>Fri, 18 Apr 2025 06:47:37 GMT</pubDate>
            <description><![CDATA[<p>free -m
free -g</p>
<p>sudo sh -c &quot;echo 1 &gt; /proc/sys/vm/drop_caches&quot;</p>
<p>iostat<br>uptime 
htop</p>
<p>sudo powertop
cat /sys/class/power_supply/BAT1/status
upower -i /org/freedesktop/UPower/devices/battery_BAT1</p>
<p>sudo apt install sysbench
sysbench cpu --cpu-max-prime=20000 run
sysbench memory run
sysbench fileio --file-total-size=1G prepare
sysbench fileio --file-total-size=1G --file-test-mode=seqrd run</p>
<pre><code>
#!/bin/bash

echo &quot;CPU TEST&quot;
sysbench cpu --threads=4 --time=10 run

echo &quot;MEMORY TEST&quot;
sysbench memory --memory-block-size=1M --memory-total-size=10G run

echo &quot;DISK I/O TEST&quot;
sysbench fileio --file-test-mode=seqrd --file-total-size=2G prepare
sysbench fileio --file-test-mode=seqrd --file-total-size=2G --time=10 run
sysbench fileio --file-test-mode=seqrd --file-total-size=2G cleanup

echo &quot;NETWORK TEST&quot;
iperf3 -c &lt;target IP&gt;</code></pre><p><img src="https://velog.velcdn.com/images/sjgaru-dev/post/f60fe770-962b-48f0-b9c8-d0419736bb70/image.png" alt=""></p>
<p>sysbench cpu, stress-ng, Geekbench, 7zip benchmark
sysbench memory, mbw, stream, stress-ng
sysbench fileio, fio, dd, ioping
ioping, fio
bonnie++, fio
iperf3, ping, netperf</p>
<p>sysbench --threads=N, stress-ng, ab, wrk
stress-ng, sysbench, locust, wrk
wrk, ab, bombardier
lmbench, sysbench
phoronix-test-suite, unixbench</p>
<p></br></br></p>
<ul>
<li><p>시스템 리소스 사용량:
CPU 사용률 (top, htop, mpstat)
메모리 사용량 (free, vmstat)
디스크 사용량 (df -h, du)
I/O 활동 (iostat, iotop)</p>
</li>
<li><p>네트워크 상태:
네트워크 트래픽 (iftop, nethogs)
연결 상태 (netstat, ss)
패킷 손실 (ping, mtr)</p>
</li>
<li><p>시스템 로그:
시스템 로그 (/var/log/syslog 또는 /var/log/messages)
커널 로그 (dmesg)
서비스별 로그 파일</p>
</li>
<li><p>프로세스 모니터링:
좀비 프로세스 확인
비정상적인 CPU/메모리 사용 프로세스 식별</p>
</li>
<li><p>스토리지 상태:
SMART 상태 확인 (smartctl)
파일시스템 무결성 (fsck - 정기적인 확인)</p>
</li>
<li><p>보안 관련:
실패한 로그인 시도 (auth.log)
열린 포트 확인 (netstat -tulpn)
예상치 못한 사용자 활동</p>
</li>
<li><p>백업 상태:
백업 작업 성공/실패 로그
백업 공간 사용량</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker compose v2]]></title>
            <link>https://velog.io/@sjgaru-dev/docker-compose-v2</link>
            <guid>https://velog.io/@sjgaru-dev/docker-compose-v2</guid>
            <pubDate>Thu, 17 Apr 2025 12:56:47 GMT</pubDate>
            <description><![CDATA[<p>sudo apt remove docker-compose -y</p>
<p>sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo mv ~/.docker/cli-plugins/docker-compose /usr/local/lib/docker/cli-plugins/</p>
<p>curl -SL <a href="https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64">https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64</a> -o ~/.docker/cli-plugins/docker-compose</p>
<p>chmod +x ~/.docker/cli-plugins/docker-compose</p>
<hr>
<ol>
<li><p>기존 docker-compose 제거
sudo apt remove docker-compose -y</p>
</li>
<li><p>디렉토리 생성
mkdir -p ~/.docker/cli-plugins</p>
</li>
<li><p>최신 버전 다운로드 (v2.27.1 기준)
curl -SL <a href="https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64">https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64</a> -o ~/.docker/cli-plugins/docker-compose</p>
</li>
<li><p>실행 권한 부여
chmod +x ~/.docker/cli-plugins/docker-compose</p>
</li>
<li><p>docker-compose v2 버전 확인
docker compose version</p>
</li>
</ol>
<hr>
<p>docker compose version</p>
</br>
</br>
</br>

<p>mkdir -p auth</p>
<p>htpasswd -Bbn username password &gt; auth/htpasswd
docker run --entrypoint htpasswd httpd:2 -Bbn username password &gt; auth/htpasswd</p>
<p>sudo sh -c &quot;htpasswd -Bbn username &#39;password!&#39; &gt; auth/htpasswd&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트 문서]]></title>
            <link>https://velog.io/@sjgaru-dev/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%AC%B8%EC%84%9C</link>
            <guid>https://velog.io/@sjgaru-dev/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%AC%B8%EC%84%9C</guid>
            <pubDate>Mon, 24 Mar 2025 04:45:46 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sjgaru-dev/post/107b55b2-7cd8-4b2c-b396-4390ff94b0e9/image.png" alt="">
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/04c557eb-c6e7-485c-b9fe-e76fdb1c13a9/image.png" alt=""></p>
<blockquote>
</blockquote>
<hr>
<h1 id="프로젝트-정의서"><strong>프로젝트 정의서</strong></h1>
<h2 id="개요"><strong>개요</strong></h2>
<h3 id="프로젝트명"><strong>프로젝트명</strong></h3>
<h3 id="목표"><strong>목표</strong></h3>
<h3 id="사용자-정의"><strong>사용자 정의</strong></h3>
<h2 id="요구사항"><strong>요구사항</strong></h2>
<hr>
<p>요구사항 정의서 참고</p>
<h2 id="시스템-아키텍처"><strong>시스템 아키텍처</strong></h2>
<hr>
<h3 id="아키텍처-개요"><strong>아키텍처 개요</strong></h3>
<ul>
<li>프론트엔드:</li>
<li>백엔드:</li>
<li>데이터베이스:</li>
</ul>
<h3 id="모듈-구성"><strong>모듈 구성</strong></h3>
<ul>
<li>프론트엔드:</li>
<li>백엔드:</li>
<li>데이터베이스:</li>
</ul>
<h3 id="인터페이스-설계"><strong>인터페이스 설계</strong></h3>
<ul>
<li>프론트엔드-백엔드 인터페이스:</li>
<li>백엔드-데이터베이스 인터페이스:</li>
</ul>
<h2 id="설계-상세"><strong>설계 상세</strong></h2>
<hr>
<h3 id="사용자-스토리"><strong>사용자 스토리</strong></h3>
<h2 id="구현-계획"><strong>구현 계획</strong></h2>
<hr>
<h3 id="개발-환경"><strong>개발 환경</strong></h3>
<ul>
<li>프론트엔드: React, TypeScript,</li>
<li>백엔드:</li>
<li>데이터베이스:</li>
<li>도구: Visual Studio Code, Git</li>
</ul>
<h3 id="개발-일정"><strong>개발 일정</strong></h3>
<ul>
<li>요구사항 분석 및 설계</li>
<li>UI/UX 디자인</li>
<li>백엔드 개발</li>
<li>프론트엔드 개발</li>
<li>통합 및 테스트</li>
<li>배포 및 유지보수</li>
</ul>
<h3 id="자원-계획"><strong>자원 계획</strong></h3>
<ul>
<li>프론트엔드 개발자: 3명</li>
</ul>
<h3 id="테스트-계획"><strong>테스트 계획</strong></h3>
<p><strong>품질 보증</strong></p>
<p>코드 리뷰, 자동화 테스트(E2E)</p>
<h3 id="배포-계획"><strong>배포 계획</strong></h3>
<p><strong>배포 전략</strong></p>
<p>스테이징 환경에서 충분한 테스트 후 프로덕션 환경에 배포</p>
<p><strong>유지보수 계획</strong></p>
<p>버그 수정 및 기능 개선을 위한 정기 업데이트</p>
<h3 id="문서화"><strong>문서화</strong></h3>
<p><strong>사용자 매뉴얼</strong></p>
<p>시스템 사용법을 상세히 설명하는 매뉴얼 작성</p>
<p><strong>개발자 문서</strong></p>
<p>시스템 아키텍처, API 명세서, 코드 설명서 작성</p>
<p><strong>용어 정의</strong></p>
<p>주요 용어와 약어 정의</p>
<blockquote>
</blockquote>
<hr>
<h2 id="api-및-인프라-협업-가이드라인">API 및 인프라 협업 가이드라인</h2>
<h3 id="프론트엔드">프론트엔드</h3>
<ul>
<li><p><strong>API 호출 및 상태 관리</strong></p>
<ul>
<li>api 호출하기 전에 무조건 useEffect 폭주하는 거 없는지 확인하고 호출해주세요. (서버가 아파해요)</li>
<li>불필요한 API 호출을 피하기 위해 useEffect 등 훅 사용 시 의존성 배열을 신중하게 관리해주세요</li>
<li>빠른 연속 호출(예: 버튼 클릭 시)에는 디바운스(또는 스로틀)를 적용하여 서버 과부하를 방지해주세요</li>
</ul>
<ul>
<li><strong>응답 데이터 캐싱</strong><pre><code>- 코드 내 직접 캐싱보다는 react-query와 같은 라이브러리의 응답 캐싱 기능을 활용하여 최신 데이터를 하지 말아주세요. ( 에디터 부분 한정 )
- 에디터 같은 동시 편집도구에서 캐시하면 동기화 문제가 발생할 수 있어요.</code></pre></li>
</ul>
</li>
<li><p><strong>파일 업로드 구현</strong></p>
<pre><code>  - presigned URL 사용하니 백엔드 문서 참고해서 업로드 기능 구현해주세요.</code></pre></li>
<li><p><strong>배포 및 CDN 활용</strong></p>
<pre><code>  - 배포 시 CloudFront + S3 또는 Cloudflare와 같은 CDN 솔루션을 활용해주세요.
  - 기존의 EC2 + Nginx 방식에 의존하지 않는 것이 좋을 것 같습니다. (자신있으면 해도 상관없어요! ex) 모니터링, 로그 분석 등등등 )</code></pre></li>
</ul>
</br>
</br>

<h3 id="백엔드">백엔드</h3>
<ul>
<li><p><strong>입력 데이터 검증</strong></p>
<ul>
<li>프론트엔드에서 전달받은 데이터에 대해 반드시 철저한 검증을 실시하여 보안을 강화.</li>
</ul>
</li>
<li><p><strong>REST API 규칙</strong>    </p>
<ul>
<li>HATEOAS 등 과도한 규칙 적용보다는 기본 REST 규칙을 준수.</li>
<li>응답 상태코드는 상황에 맞게 200, 201, 204, 400, 401, 403, 404, 429(필요시 415 등)로 명확히 구분.</li>
<li>GET 요청은 Body 없이 처리할 것.</li>
<li>PUT 요청은 멱등성 원칙을 고려하되, 과도한 오버엔지니어링은 피할 것.</li>
</ul>
</li>
<li><p><strong>API 응답 구조 (flat vs. nested)</strong></p>
<ul>
<li>프론트엔드와의 협의 하에 필요한 데이터만 전달하여 불필요한 네트워크 부하를 줄이고 캐시 관리에 용이하도록 설계.</li>
<li>혼합 방식 사용 시 프론트엔드에서 과도한 API 호출 없이 단일 응답으로 필요한 정보를 받을 수 있도록 고려.</li>
</ul>
</li>
<li><p><strong>API 응답 포맷 (Response 배열, 페이지 처리)</strong></p>
<ul>
<li>응답 형식은 프론트엔드와 협의하여 단일 API 호출로 필요한 데이터를 제공할 수 있도록 설계할 것.</li>
<li>예: 단일 객체 내에 blogs: [] 배열 및 페이지 정보를 포함.</li>
</ul>
</li>
<li><p><strong>읽기 전용 API 설계</strong></p>
<ul>
<li><p>모듈 분리 후 읽기 전용 엔티티를 별도로 설계하여 성능 및 확장성을 고려할 것.</p>
</li>
<li><p>Jooq, CQRS, 또는 replica DB 활용 등 읽기 전용 환경 구축 방안을 적극 검토.</p>
<pre><code class="language-jsx">200, { [ {}, {} ] }
vs
200, { &quot;result&quot;: [ {}, {} ] }</code></pre>
</li>
</ul>
</li>
<li><p><strong>ResponseEntity 사용</strong></p>
<ul>
<li>기본적으로 ResponseEntity를 사용할 필요가 없으나, 특별한 케이스(예외 처리 등)에서 유용하게 활용할 수 있음.</li>
</ul>
</li>
<li><p><strong>Service Entity 반환</strong></p>
<ul>
<li>OSIV 사용 여부와 관계없이, 직접 Service의 Entity를 반환하는 것은 문제가 될 수 있지만 적용함.</li>
<li>OSIV를 비활성화한 경우라 하더라도 반환 객체의 범위를 명확히 관리할 것.</li>
</ul>
</li>
<li><p><strong>보안 및 인증 (JWT)</strong></p>
<ul>
<li>JWT 기반 인증을 기본으로 하고, Access/Refresh Token 관리 정책(예: RefreshToken은 Cookie, AccessToken은 Response Body)에 따라 구현.</li>
<li>필요 시 Redis 등 캐시 솔루션을 활용하여 세션 및 토큰 관리를 최적화.</li>
</ul>
</li>
<li><p><strong>파일 업로드 처리</strong></p>
<ul>
<li>서버 리소스 절감을 위해 멀티파트 파일 업로드 대신 presigned URL 방식을 적극 활용.</li>
<li>파일 업로드의 단계(초기화, 중간 발송, 확인, 중단, 삭제)를 구현하며 <a href="https://techblog.woowahan.com/11392/">관련 기술 블로그</a> 참고.</li>
</ul>
</li>
<li><p><strong>S3 및 이미지 관리</strong></p>
<ul>
<li>S3 관리 주체(백엔드/프론트엔드)와 역할 분담을 명확히 하고, 이미지 압축 작업의 책임 범위를 결정.</li>
<li>이미지 업로드는 presigned URL을 통한 직접 업로드를 적용하며, 서버에서 최종 검증 및 ID 연동 처리.</li>
</ul>
</li>
<li><p><strong>캐싱 및 트래픽 관리</strong></p>
<ul>
<li>캐시 전략(캐시 쇄도, 지터 등) 관련 이슈를 사전에 논의하여 전체 시스템에 영향을 주지 않는 방향으로 설정.</li>
<li><a href="https://toss.tech/article/cache-traffic-tip">캐시 트래픽 관련 참고 자료</a>를 기반으로 최적 방안을 마련.</li>
</ul>
</li>
</ul>
<p></br></br></p>
<blockquote>
</blockquote>
<hr>
<h1 id="api-명세서">API 명세서</h1>
<h3 id="apiv1projectsid"><code>/api/v1/projects/{id}</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 지정된 ID를 가진 프로젝트의 세부 정보를 조회합니다. 프로젝트 이름, 활성 상태, 데이터, 버전 등의 정보를 반환합니다.</p>
</li>
<li><p><strong>파라미터</strong>: <code>id</code> (path, 필수, int64) - 조회할 프로젝트의 고유 ID</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>ProjectDetailResponse</code></p>
<pre><code class="language-json">  {
    &quot;id&quot;: 1,
    &quot;name&quot;: &quot;Sample Project&quot;,
    &quot;active&quot;: true,
    &quot;data&quot;: &quot;{\\&quot;key\\&quot;: \\&quot;value\\&quot;}&quot;, // 미정
    &quot;version&quot;: 2,
    &quot;lastAccessedAt&quot;: &quot;2025-03-19T10:00:00Z&quot;,
    &quot;createdAt&quot;: &quot;2025-01-01T09:00:00Z&quot;,
    &quot;updatedAt&quot;: &quot;2025-03-18T15:30:00Z&quot;
  }
</code></pre>
</li>
</ul>
</li>
<li><p><strong>PUT</strong></p>
<ul>
<li><p><strong>설명</strong>: 지정된 ID를 가진 프로젝트의 정보를 업데이트합니다. 이름이나 데이터 등의 필드를 수정할 수 있습니다.</p>
</li>
<li><p><strong>파라미터</strong>: <code>id</code> (path, 필수, int64) - 업데이트할 프로젝트의 고유 ID</p>
</li>
<li><p><strong>요청 본문</strong>: <code>ProjectUpdateRequest</code></p>
<pre><code class="language-json">  {
    &quot;name&quot;: &quot;Updated Project&quot;,
    &quot;data&quot;: &quot;{\\&quot;newKey\\&quot;: \\&quot;newValue\\&quot;}&quot;
  }
</code></pre>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>ProjectDetailResponse</code></p>
<pre><code class="language-json">  {
    &quot;id&quot;: 1,
    &quot;name&quot;: &quot;Updated Project&quot;,
    &quot;version&quot;: 3,
    &quot;createdAt&quot;: &quot;2025-01-01T09:00:00Z&quot;,
    &quot;updatedAt&quot;: &quot;2025-03-19T12:00:00Z&quot;
</code></pre>
</li>
<li><p>응답: 409 Conflict - 버전 충돌이 발생한 경우 (버전 3→2 또는 2→4 등)</p>
<pre><code class="language-json">  {
      &quot;message&quot;: &quot;meeor message&quot;,
      &quot;exceptionCode&quot;: &quot;error code&quot;
  }</code></pre>
</li>
</ul>
</li>
<li><p><strong>DELETE</strong></p>
<ul>
<li><strong>설명</strong>: 지정된 ID를 가진 프로젝트를 삭제합니다.</li>
<li><strong>파라미터</strong>: <code>id</code> (path, 필수, int64) - 삭제할 프로젝트의 고유 ID</li>
<li><strong>응답</strong>: 200 OK - 응답 본문 없음</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1templatessuggest"><code>/api/v1/templates/suggest</code></h3>
<ul>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 주어진 텍스트(예: 기사)를 기반으로 적합한 템플릿을 추천합니다. 템플릿 추천 시스템을 활용한 기능입니다.</p>
</li>
<li><p><strong>요청 본문</strong>: <code>TemplateSuggestRequest</code></p>
<pre><code class="language-json">  {
    &quot;article&quot;: &quot;This is a sample article about technology.&quot;
  }
</code></pre>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>TemplateSuggestResponse</code></p>
<pre><code class="language-json">  {
    &quot;items&quot;: [
      {
        &quot;id&quot;: 101,
        &quot;priority&quot;: 1,
        &quot;data&quot;: {
          &quot;name&quot;: &quot;Tech Template&quot;,
          &quot;category&quot;: &quot;Social&quot;,
          &quot;size&quot;: {
            &quot;width&quot;: 1920,
            &quot;height&quot;: 1080
          },
          &quot;background&quot;: {
            &quot;id&quot;: 10,
            &quot;name&quot;: &quot;Tech BG&quot;,
            &quot;priority&quot;: 1,
            &quot;type&quot;: &quot;Image&quot;,
            &quot;fileUrl&quot;: &quot;&lt;http://example.com/tech-bg.jpg&gt;&quot;,
            &quot;size&quot;: {
              &quot;width&quot;: 1920,
              &quot;height&quot;: 1080
            },
            &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
            &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
          },
          &quot;avatar&quot;: {
            &quot;id&quot;: 20,
            &quot;name&quot;: &quot;Tech Avatar&quot;,
            &quot;priority&quot;: 2,
            &quot;fileUrl&quot;: &quot;&lt;http://example.com/tech-avatar.png&gt;&quot;,
            &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
            &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
          }
        },
        &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
      }
    ],
    &quot;_info&quot;: {
      &quot;category&quot;: {
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;Social&quot;
      }
    }
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1taskstaskidretry"><code>/api/v1/tasks/{taskId}/retry</code></h3>
<ul>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 지정된 작업(task)을 재시도합니다. 실패한 작업을 다시 실행하거나 재처리할 때 사용됩니다.</p>
</li>
<li><p><strong>파라미터</strong>: <code>taskId</code> (path, 필수, int64) - 재시도할 작업의 고유 ID</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>TaskResponse</code></p>
<pre><code class="language-json">  {
    &quot;id&quot;: 50,
    &quot;projectId&quot;: 1,
    &quot;jobId&quot;: &quot;job-12345&quot;,
    &quot;type&quot;: &quot;VIDEO&quot;,
    &quot;status&quot;: &quot;PENDING&quot;,
    &quot;output&quot;: {},
    &quot;retryCount&quot;: 2,
    &quot;createdAt&quot;: &quot;2025-03-18T10:00:00Z&quot;,
    &quot;updatedAt&quot;: &quot;2025-03-19T12:00:00Z&quot;
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1projects"><code>/api/v1/projects</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 모든 프로젝트 목록을 조회합니다. 프로젝트의 기본 정보(이름, 활성 상태 등)를 반환합니다.</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>ListResponseProjectResponse</code></p>
<pre><code class="language-json">  {
    &quot;data&quot;: [
      {
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;Project A&quot;,
        &quot;active&quot;: true,
        &quot;version&quot;: 1,
        &quot;lastAccessedAt&quot;: &quot;2025-03-19T10:00:00Z&quot;,
        &quot;createdAt&quot;: &quot;2025-01-01T09:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-03-18T15:00:00Z&quot;
      },
      {
        &quot;id&quot;: 2,
        &quot;name&quot;: &quot;Project B&quot;,
        &quot;active&quot;: false,
        &quot;version&quot;: 2,
        &quot;lastAccessedAt&quot;: &quot;2025-03-15T14:00:00Z&quot;,
        &quot;createdAt&quot;: &quot;2025-02-01T09:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-03-16T10:00:00Z&quot;
      }
    ]
  }
</code></pre>
</li>
</ul>
</li>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 새로운 프로젝트를 생성합니다. 생성된 프로젝트의 세부 정보를 반환합니다.</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>ProjectDetailResponse</code></p>
<pre><code class="language-json">  {
    &quot;id&quot;: 3,
    &quot;name&quot;: &quot;New Project&quot;,
    &quot;active&quot;: true,
    &quot;data&quot;: &quot;{\\&quot;key\\&quot;: \\&quot;value\\&quot;}&quot;,
    &quot;version&quot;: 1,
    &quot;lastAccessedAt&quot;: &quot;2025-03-19T12:00:00Z&quot;,
    &quot;createdAt&quot;: &quot;2025-03-19T12:00:00Z&quot;,
    &quot;updatedAt&quot;: &quot;2025-03-19T12:00:00Z&quot;
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1authrefresh"><code>/api/v1/auth/refresh</code></h3>
<ul>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 리프레시 토큰을 사용하여 새로운 액세스 토큰을 발급받습니다. 인증 연장을 위해 사용됩니다.</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>LoginResponse</code></p>
<pre><code class="language-json">  {
    &quot;accessToken&quot;: &quot;new-access-token-123&quot;,
    &quot;refreshToken&quot;: &quot;new-refresh-token-456&quot;
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1authlogout"><code>/api/v1/auth/logout</code></h3>
<ul>
<li><strong>POST</strong><ul>
<li><strong>설명</strong>: 현재 사용자의 세션을 종료하고 로그아웃합니다.</li>
<li><strong>응답</strong>: 204 No Content - 응답 본문 없음</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1authlogin"><code>/api/v1/auth/login</code></h3>
<ul>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 사용자 이름과 비밀번호를 사용하여 로그인하고 인증 토큰을 발급받습니다.</p>
</li>
<li><p>access token과 refesh token을 응답으로 반환하며 쿠키에 refresh token을 설정합니다.</p>
</li>
<li><p><strong>요청 본문</strong>: <code>LoginRequest</code></p>
<pre><code class="language-json">  {
    &quot;username&quot;: &quot;user@example.com&quot;,
    &quot;password&quot;: &quot;securepassword123&quot;
  }
</code></pre>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>LoginResponse</code></p>
<pre><code class="language-json">  {
    &quot;accessToken&quot;: &quot;access-token-789&quot;,
    &quot;refreshToken&quot;: &quot;refresh-token-101&quot;
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1accountregister"><code>/api/v1/account/register</code></h3>
<ul>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 새로운 사용자 계정을 등록합니다. 이메일, 비밀번호, 이름 등의 정보를 받아 계정을 생성합니다.</p>
</li>
<li><p><strong>요청 본문</strong>: <code>RegisterRequest</code></p>
<pre><code class="language-json">  {
    &quot;email&quot;: &quot;newuser@example.com&quot;,
    &quot;code&quot;: &quot;ABC123&quot;,
    &quot;password&quot;: &quot;newpassword456&quot;,
    &quot;name&quot;: &quot;John Doe&quot;,
    &quot;nickname&quot;: &quot;johndoe&quot;,
    &quot;phone&quot;: &quot;123-456-7890&quot;
  }
</code></pre>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>RegisterResponse</code></p>
<pre><code class="language-json">  {
    &quot;memberId&quot;: 1001
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1accountregisterverify-email"><code>/api/v1/account/register/verify-email</code></h3>
<ul>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 계정 등록 시 이메일 인증을 수행합니다. 이메일과 인증 코드를 확인합니다.</p>
</li>
<li><p><strong>요청 본문</strong>: <code>VerifyEmailRequest</code></p>
<pre><code class="language-json">  {
    &quot;email&quot;: &quot;newuser@example.com&quot;,
    &quot;code&quot;: &quot;ABC123&quot;
  }
</code></pre>
</li>
<li><p><strong>응답</strong>: 204 No Content - 응답 본문 없음</p>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1accountregistercheck-email"><code>/api/v1/account/register/check-email</code></h3>
<ul>
<li><p><strong>POST</strong></p>
<ul>
<li><p><strong>설명</strong>: 이메일 인증을 시도합니다. 요청한 이메일로 인증 메일을 보냅니다.</p>
</li>
<li><p><strong>요청 본문</strong>: <code>CheckEmailRequest</code></p>
<pre><code class="language-json">  {
    &quot;email&quot;: &quot;newuser@example.com&quot;
  }
</code></pre>
</li>
<li><p><strong>응답</strong>: 204 No Content - 응답 본문 없음</p>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1templates"><code>/api/v1/templates</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 모든 템플릿 목록을 조회합니다. 카테고리 ID를 선택적으로 지정하여 필터링할 수 있습니다.</p>
</li>
<li><p><strong>파라미터</strong>: <code>categoryId</code> (query, 선택, int32) - 필터링할 카테고리 ID</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>ListResponseTemplateResponse</code></p>
<pre><code class="language-json">  {
    &quot;data&quot;: [
      {
        &quot;id&quot;: 101,
        &quot;priority&quot;: 1,
        &quot;data&quot;: {
          &quot;name&quot;: &quot;Social Media Template&quot;,
          &quot;category&quot;: &quot;Social&quot;,
          &quot;size&quot;: {
            &quot;width&quot;: 1080,
            &quot;height&quot;: 1080
          },
          &quot;background&quot;: {
            &quot;id&quot;: 10,
            &quot;name&quot;: &quot;Social BG&quot;,
            &quot;priority&quot;: 1,
            &quot;type&quot;: &quot;Image&quot;,
            &quot;fileUrl&quot;: &quot;&lt;http://example.com/social-bg.jpg&gt;&quot;,
            &quot;size&quot;: {
              &quot;width&quot;: 1080,
              &quot;height&quot;: 1080
            },
            &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
            &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
          },
          &quot;avatar&quot;: {
            &quot;id&quot;: 20,
            &quot;name&quot;: &quot;Social Avatar&quot;,
            &quot;priority&quot;: 2,
            &quot;fileUrl&quot;: &quot;&lt;http://example.com/social-avatar.png&gt;&quot;,
            &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
            &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
          }
        },
        &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
      }
    ]
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1templatesid"><code>/api/v1/templates/{id}</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 지정된 ID를 가진 템플릿의 세부 정보를 조회합니다.</p>
</li>
<li><p><strong>파라미터</strong>: <code>id</code> (path, 필수, int64) - 조회할 템플릿의 고유 ID</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>TemplateResponse</code></p>
<pre><code class="language-json">  {
    &quot;id&quot;: 101,
    &quot;priority&quot;: 1,
    &quot;data&quot;: {
      &quot;name&quot;: &quot;Social Media Template&quot;,
      &quot;category&quot;: &quot;Social&quot;,
      &quot;size&quot;: {
        &quot;width&quot;: 1080,
        &quot;height&quot;: 1080
      },
      &quot;background&quot;: {
        &quot;id&quot;: 10,
        &quot;name&quot;: &quot;Social BG&quot;,
        &quot;priority&quot;: 1,
        &quot;type&quot;: &quot;Image&quot;,
        &quot;fileUrl&quot;: &quot;&lt;http://example.com/social-bg.jpg&gt;&quot;,
        &quot;size&quot;: {
          &quot;width&quot;: 1080,
          &quot;height&quot;: 1080
        },
        &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
      },
      &quot;avatar&quot;: {
        &quot;id&quot;: 20,
        &quot;name&quot;: &quot;Social Avatar&quot;,
        &quot;priority&quot;: 2,
        &quot;fileUrl&quot;: &quot;&lt;http://example.com/social-avatar.png&gt;&quot;,
        &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
      }
    },
    &quot;createdAt&quot;: &quot;2025-01-01T00:00:00Z&quot;,
    &quot;updatedAt&quot;: &quot;2025-01-01T00:00:00Z&quot;
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1templatescategories"><code>/api/v1/templates/categories</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 템플릿 카테고리 목록을 조회합니다. 카테고리 ID와 이름을 반환합니다.</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>ListResponseTemplateCategoryDto</code></p>
<pre><code class="language-json">  {
    &quot;data&quot;: [
      {
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;Social&quot;
      },
      {
        &quot;id&quot;: 2,
        &quot;name&quot;: &quot;Politic&quot;
      },
      {
        &quot;id&quot;: 3,
        &quot;name&quot;: &quot;Economy&quot;
      }
    ]
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1tasks"><code>/api/v1/tasks</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 모든 작업(task) 목록을 조회합니다. 작업 상태, 출력물 등의 정보를 포함합니다.</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>ListResponseTaskResponse</code></p>
<pre><code class="language-json">  {
    &quot;data&quot;: [
      {
        &quot;id&quot;: 50,
        &quot;projectId&quot;: 1,
        &quot;jobId&quot;: &quot;job-12345&quot;,
        &quot;type&quot;: &quot;VIDEO&quot;,
        &quot;status&quot;: &quot;SUCCESS&quot;,
        &quot;output&quot;: {},
        &quot;retryCount&quot;: 0,
        &quot;createdAt&quot;: &quot;2025-03-18T10:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-03-18T12:00:00Z&quot;
      },
      {
        &quot;id&quot;: 51,
        &quot;projectId&quot;: 2,
        &quot;jobId&quot;: &quot;job-67890&quot;,
        &quot;type&quot;: &quot;VIDEO&quot;,
        &quot;status&quot;: &quot;FAILED&quot;,
        &quot;output&quot;: {},
        &quot;retryCount&quot;: 1,
        &quot;createdAt&quot;: &quot;2025-03-18T14:00:00Z&quot;,
        &quot;updatedAt&quot;: &quot;2025-03-19T10:00:00Z&quot;
      }
    ]
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1taskstaskid"><code>/api/v1/tasks/{taskId}</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 지정된 ID를 가진 작업의 세부 정보를 조회합니다.</p>
</li>
<li><p><strong>파라미터</strong>: <code>taskId</code> (path, 필수, int64) - 조회할 작업의 고유 ID</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>TaskResponse</code></p>
<pre><code class="language-json">  {
    &quot;id&quot;: 50,
    &quot;projectId&quot;: 1,
    &quot;jobId&quot;: &quot;job-12345&quot;,
    &quot;type&quot;: &quot;VIDEO&quot;,
    &quot;status&quot;: &quot;SUCCESS&quot;,
    &quot;output&quot;: {},
    &quot;retryCount&quot;: 0,
    &quot;createdAt&quot;: &quot;2025-03-18T10:00:00Z&quot;,
    &quot;updatedAt&quot;: &quot;2025-03-18T12:00:00Z&quot;
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="apiv1membersmy"><code>/api/v1/members/my</code></h3>
<ul>
<li><p><strong>GET</strong></p>
<ul>
<li><p><strong>설명</strong>: 현재 로그인한 사용자의 프로필 정보를 조회합니다. 회원 ID와 이메일을 반환합니다.</p>
</li>
<li><p><strong>응답</strong>: 200 OK - <code>MyProfileResponse</code></p>
<pre><code class="language-json">  {
    &quot;memberId&quot;: 1001,
    &quot;email&quot;: &quot;user@example.com&quot;
  }
</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<p>위 내용은 각 엔드포인트에 대한 설명과 응답의 JSON 포맷 예시를 포함합니다. 요청 본문이 필요한 경우에는 그에 맞는 예시도 추가했습니다. 추가적인 수정이나 더 구체적인 예시가 필요하면 말씀해주세요!</p>
<blockquote>
</blockquote>
<hr>
<blockquote>
</blockquote>
<hr>
<blockquote>
</blockquote>
<hr>
<blockquote>
</blockquote>
<hr>
<blockquote>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[inspire note ]]></title>
            <link>https://velog.io/@sjgaru-dev/inspire-note</link>
            <guid>https://velog.io/@sjgaru-dev/inspire-note</guid>
            <pubDate>Sun, 19 Jan 2025 15:15:42 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>MVP vs MRP(Minimum Remarkable Product)</p>
</li>
<li><p>스타트업은 결국 PMF를 찾는 여정이다
스타트업은 아이디어 - 프로토타입 - 출시 - 트랙션 - 수익화 - 성장이라는 단계를 거친다.
아이디어에서 트랙션까지 가는 회사는 많지만, PMF를 찾는 회사는 거의 드물다.
PMF는 한 번 찾는다고 끝나지 않고 계속해서 개선하고 구축해야 한다.
PMF를 찾고 유지하는 것이 스타트업에게 가장 어려운 일이다.
트랙션이 생기고 성장하고 있더라도, PMF는 계속 개선해야 한다는 사실을 잊지 말아야 한다.
<a href="https://eopla.net/magazines/21189#">https://eopla.net/magazines/21189#</a></p>
</li>
<li><p><a href="https://layla.ai/">https://layla.ai/</a></p>
</li>
<li><p>지속적인 넛지로 구매 전환율을 더욱 올린다.
온사이트 마케팅의 또 다른 핵심은 지속적인 넛지입니다. 넛지란 원래 ‘팔꿈치로 쿡쿡 찌르다’라는 뜻을 가진 단어인데요. 이 효과를 쇼핑몰에서 적용해 본다면, 고객이 쇼핑몰에서 상품을 탐색하는 동안 은근하게 구매를 유도하는 요소들을 심어놓는 방법을 생각해볼 수 있어요. 넛지에서 가장 중요한 점은 강압적이지 않다는 점이에요. 구매를 부드럽게 유도하지만, 선택은 고객이 자유롭게 결정하도록 두는 거죠. 이러한 넛지 마케팅은 고객의 거부감을 줄일 수 있고, 구매 결정 과정을 단순화하는 데에 도움이 될 수 있어요.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241220 시나리오 프론트 ]]></title>
            <link>https://velog.io/@sjgaru-dev/241220-%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4-%ED%94%84%EB%A1%A0%ED%8A%B8</link>
            <guid>https://velog.io/@sjgaru-dev/241220-%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4-%ED%94%84%EB%A1%A0%ED%8A%B8</guid>
            <pubDate>Sat, 21 Dec 2024 11:45:20 GMT</pubDate>
            <description><![CDATA[<h2 id="생산성">생산성</h2>
<ol>
<li>요구사항 세분화</li>
<li>세분화된 모듈 단위 개발</li>
<li>유닛테스트를 통한 구현 검증</li>
<li>모듈간 의존성 파악</li>
<li>의존성 파악을 통한 수정범위 최소화</li>
<li>수정 시, 유닛테스트를 통한 사이드 이펙트 검출</li>
</ol>
<h3 id="요구사항-분석--5ws-1h--5ws--6ws">요구사항 분석 : 5Ws 1H / 5Ws / 6Ws</h3>
<ul>
<li>무엇을 만들어야 하는지 (What?)</li>
<li>왜 하는 것인지 (Why?)</li>
<li>언제까지 해야 하는 것인지 (When?)</li>
<li>개발 과정에 참여자는 누구인지 (Who?)</li>
<li>개발 프로덕트는 어디에 사용되나 (Where?)</li>
<li>어떻게 만들 것인가? (How?)</li>
</ul>
<h3 id="요구사항-세부-분석">요구사항 세부 분석</h3>
<ul>
<li><em><strong>자료 흐름도 Data Flow Diagram</strong></em></li>
<li><em><strong>유즈케이스 Use Case Diagram</strong></em></li>
<li><em><strong>상태 전이도 State Transition Diagram</strong></em></li>
<li>자료 사전 Data Dictionary</li>
<li>소단위 명세서 Mini Specification</li>
<li>개체 관계도 Entity Relation Diagram</li>
</ul>
<h3 id="유닛테스트-pass">유닛테스트 (Pass)</h3>
<ul>
<li>Test Driven Development (TDD)</li>
<li>Jest</li>
</ul>
<ul>
<li>리액트 테스팅 패턴 : UI 인터렉션 단위 검증<ul>
<li>Arrange </li>
<li>Act</li>
<li>Assert</li>
</ul>
</li>
</ul>
<p><br /><br /><br /></p>
<h2 id="조직간-동기맞추기---배포형상관리">조직간 동기맞추기 - 배포/형상관리</h2>
<h3 id="형상관리---git">형상관리 - Git</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[241218 UXUI - 2]]></title>
            <link>https://velog.io/@sjgaru-dev/241218-UXUI-2</link>
            <guid>https://velog.io/@sjgaru-dev/241218-UXUI-2</guid>
            <pubDate>Wed, 18 Dec 2024 08:44:34 GMT</pubDate>
            <description><![CDATA[<h2 id="도메인---이커머스">도메인 - 이커머스</h2>
<h3 id="함정">함정</h3>
<ul>
<li>이커머스의 함정<ul>
<li>사용자가 궁극적으로 원하는 것은 구매뿐 아니라 상품을 사용하면서 느끼는 지속적인 만족감.  </li>
<li>이커머스에서 흔히 쓰이는 속임수가 있어도 <em><strong>다크패턴</strong></em> 에 가깝다면 지양한다. </li>
<li>사용자를 쇼핑에 중독되게 하는 기능은 처음부터 고려하지 않는다. <em><strong>Attention economy</strong></em> 에 현혹되지 않는다.</li>
</ul>
</li>
</ul>
<br />

<ul>
<li>데이터 드리븐의 함정                                <ul>
<li>성공지표 재점검. ex) 고객센터콜, 긍정적인 앱 리뷰<pre><code>  - 매출, 구매 전환율 외에 사용자의 만족도를 측정할 수 있는 CX 성공지표도 함께 생각한다. </code></pre></li>
<li>A/B 테스트에 성공하는 것만 생각하지 않는다.<pre><code>  - 큰 버튼 , 무한 스크롤 , 광고 문구를 터무니없이 작게 표기, 광고로 화면상단 도배, 명확한 동의 및 예시 없이 사용자가 정보를 공유</code></pre></li>
<li>스프린트 이상의 장기적 비전을 생각한다.                      <ul>
<li>고객이 서비스를 사용하여 더 나은 하루를 보낼 수 있게 하기 O<ul>
<li>소비자가 더 구매하게 만들기 X<br /></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>디자인 패턴의 함정<ul>
<li>유명한 패턴도 시간이 지나면 모를 일이다. 반드시 따라야 할 필요는 없다. 
구글 머티리얼 가이드 라인도, 타기업 A/B 테스트 결과도 고객을 위한 최선의 UI일지는 테스트해봐야 안다.</li>
<li>패턴을 사용하기 전에 작동하는 원리를 이해하고 비슷하게 사용될 수 있을지 알아보기 위해 적용 전 반드시 테스트한다.</li>
<li>PC 중심 UI에 제한받지 않는다. 메뉴버튼, 체크박스, 라디오 버튼 등 기존 UI 어포던스에서 벗어나 최적의 인터랙션 디자인을 스스로 탐색해본다. 모바일용 제스쳐와 애니메이션을 사용해 더 직관적이고 미니멀한 UX를 생각해본다.</li>
<li>Frictionless design만 지향하지 않는다. 사용자가 필요로 할 때; 주의사항이나 사용에 대한 만족감, 기억에 남는 UX를 만들기 위해 때로는 단계를 늘리거나 자동화하지 않거나, 아날로그로 남겨두는 것이 좋을 때도 있다. 무엇이 최선일지 때에 따라 늘 생각해보자.</li>
</ul>
</li>
</ul>
<br />

<ul>
<li>사용자 중심 디자인의 함정<ul>
<li>사용자 여정을 파악할 때 조직 담당 포트폴리오 외, 혹은 서비스 외 영역까지 다 살펴본다.</li>
<li>많은 경우 사용자는 스스로 자신이 무엇을 원하는지 모른다. 새로운 가치를 창출한다는 뜻은 그것이 현재 존재하지 않는다는 뜻이기도 하다.</li>
<li>사용자가 아이디어를 제안해도 그대로 받아들이지 않고 숨겨진 이유 생각해본다</li>
<li>사용자가 당면한 문제뿐 아니라 그 너머 목표와 가치에 집중하여 해결책을 생각한다</li>
<li>사용자 중심 디자인이 빠질 수 있는 흔한 함정 2가지, 과도한 커스텀 옵션과 초기 부정적인 반응에 속단하여 기능 롤백하기.</li>
</ul>
</li>
</ul>
<br />

<ul>
<li>레퍼런스의 함정<ul>
<li>회사의 규모와 비즈니스 모델을 먼저 이해하고 사례를 참고한다.</li>
<li>경쟁사가 왜 그렇게 했는지에 집중한다.</li>
<li>무엇을 적용하든 반드시 테스트해본다.</li>
<li>경쟁사의 사용자가 다르다는 것을 숙지한다. 특히 타 국가의 서비스를 참고할 때 늘 주의한다.<ul>
<li>동북아시아: 트렌드 위주, 이미지 중심, 조금 더 인지부하에 익숙하다.<ul>
<li>북미/유럽: 정보 위주, 번역과 웹 접근성이 가능한 텍스트 위주 페이지 구성, 인지 부하에 민감<ul>
<li>데이터 사용 가격, 선호하는 디바이스, 선호하는 배송 방법, 프로모션 적용 방식, 결제 방식이 모두 다르고 그에 따라 기능의 우선순위도 제각각이다. </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h3 id="비즈니스-규모에-따라-설계">비즈니스 규모에 따라 설계</h3>
<ul>
<li>MVP &amp; Scale <ul>
<li>Low hanging fruitsY</li>
<li>사용자를 위해 어떤 해결책에 투자하는 것이 가장 좋을까?</li>
<li>지속 가능한 개발이 이루어질 수 있는 MVP인가?</li>
</ul>
</li>
<li>Impact &amp; Outcome <ul>
<li>필터를 개발하는 바람에 사용자의 탐색 기회를 좁혀 매출에 악영향을 주지는 않을까?</li>
<li>필터를 제공하기 위해 DB 수작업을 진행하는 것이 더 나은 투자일까?</li>
</ul>
</li>
<li>End-State &amp; Vision <ul>
<li>비즈니스 골에 부합하는가</li>
<li>궁극적으로 사용자에게 줄 가치는 무엇인가</li>
<li>추천과 필터 중에 어떤 것에 투자하는 것이 더 합당한가?</li>
</ul>
</li>
<li>One way door (번복X) vs Two way door (롤백가능)<ul>
<li>개발한 UI가 잘못되었을 때 되돌릴 수 있는 종류인가?</li>
<li>테스트했을 때 우리가 배울 수 있는 것이 명확한가?</li>
</ul>
</li>
</ul>
<br/>
<br/>
<br/>

<h3 id="랜딩페이지와-위젯">랜딩페이지와 위젯</h3>
<p>패턴, 위젯 , 컴포넌트 : 카테고리가  달라도 컨텐츠가 어느 정도 통일된 디자인</p>
<ul>
<li>고려사항 <ul>
<li>Content Strategy , Design Audit , Consistency </li>
</ul>
</li>
</ul>
<h3 id="그리드와-리스트-유닛">그리드와 리스트 유닛</h3>
<ul>
<li>정보 그룹화 . 규칙 만들기 . 디자인 시스템</li>
<li>Grouping 그룹 &amp; 우선순위 &gt; variation : 유닛화 &amp; 규칙 &gt; component &gt; Pattern : 컴포넌트를 패턴 별로 적용 &gt; Application : 그리드 적용</li>
</ul>
<h3 id="상세페이지">상세페이지</h3>
<ul>
<li>모듈화하기 </li>
<li>정보구조 </li>
</ul>
<ul>
<li>ATF : Above the fold - 스크롤 하기 전 보여지는 화면</li>
<li>BTF : Below the fold </li>
</ul>
<ul>
<li>고려사항 <ul>
<li>Content Strategy , Design Principle , Cognitive Load 인지부하</li>
</ul>
</li>
</ul>
<h3 id="리뷰">리뷰</h3>
<ul>
<li>고려사항 <ul>
<li>최소한의 장벽 , 동기부여 , 데이터 퀄리티</li>
</ul>
</li>
</ul>
<ul>
<li>gamification</li>
<li>모더레이션 : 컨텐츠의 퀄리티 평가, 윤리기준에 위반하지 않는지 필터링</li>
</ul>
<ul>
<li>flywheel : 좋은 리뷰 &lt;&gt; 다른 사람에게 도움 &lt;&gt; 동기부여<br>좋은 고객경험 , 더 많은 트래픽 , 더 많은 판매자 , 더 다양한 제품 . 지속적인 성장 , 성장하며 낮춘 비용 구조 , 낮아진 가격 , 더 나은 고객경험 , 더 빨라진 성장
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/56a6dee1-0c86-409b-8e4c-57627ce20e44/image.png" alt=""><img src="https://velog.velcdn.com/images/sjgaru-dev/post/6bde2e25-1b43-49cf-9dd6-e6d96e22c179/image.png" alt=""></li>
</ul>
<h3 id="결제">결제</h3>
<ul>
<li>카드소팅 : 사용자의 멘탈모델에 부합하는 정보구조를 만들기 위해 참여자가 주제별 카드를 그룹으로 구성하고 연결하여 패튼을 발견하는 리서치 기법</li>
</ul>
<ul>
<li>고려사항 <ul>
<li>Company Leadership principle , Team Tenets , Design principle</li>
</ul>
</li>
</ul>
<h3 id="새-비즈니스">새 비즈니스</h3>
<ul>
<li>고려사항 <ul>
<li>Branding , CX , Marketing</li>
<li>Data Analysis , End-to-end Journey , Priority , Context-Design<del>(Page-drivne)</del>
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/77c564c4-93fc-42e1-95a6-92c7f45d04b5/image.png" alt=""><img src="https://velog.velcdn.com/images/sjgaru-dev/post/31c6369a-c6a5-4600-baf9-20ae5a19ee68/image.png" alt=""></li>
</ul>
</li>
</ul>
<br />
<br />

<h2 id="soft-skill">Soft Skill</h2>
<h3 id="ux-advocate">UX Advocate</h3>
<ul>
<li>(책) Inspired : User &gt; Person &gt; Revenue/Impact &gt; Value &gt; Output &gt; Outcome &gt; Feature Team &gt; Product Team<ul>
<li>사용자 테스트 적극 공유 : 요약 보고서 작성, 공유</li>
<li>로드맵에 영향주기 : 비즈니스가 아닌 사용자 중심관점에서 우선순위 보기</li>
<li>매커니즘 만들기 : 반복적 발생문제를 프로세스화</li>
<li>프로덕트 비전 세우기 : PRFAQ (아이디어를 새로 제안 할 때)</li>
<li>디자인 팀의 과업 : 채용, 브랜딩, 커뮤니티 &amp; 사회 활동</li>
</ul>
</li>
</ul>
<br />

<br />

<br />


<h2 id="도메인-핀테크">도메인 핀테크</h2>
<ul>
<li>좋은 지표 vs 나쁜 지표<ul>
<li>상대적 : (지난달보다) 리텐션이 2% 증가했다</li>
<li>비율로 표현 </li>
<li>행동방식을 바꾼다 : 허상지표, <em><strong>실행 지표 ㅡ 코호트 분석</strong></em></li>
</ul>
</li>
<li>가설과 우선순위 </li>
<li>5 whys 기법 계속 왜? 라며 원인을 dipping</li>
</ul>
<ul>
<li>RACI 모델 (R&amp;R)<ul>
<li>Responsible 실무수행자</li>
<li>Accountable 의사결정자</li>
<li>Consulted 업무 수행 조언자</li>
<li>Informed 결과통보 대상자
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/935d8100-f72e-4ae2-a69f-9b31a9080705/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="체크포인트-프로세스">체크포인트 프로세스</h3>
<ol>
<li><p>문제정의 : 프로덕트 매니저
명확한 문제정의, 성공 지표, 프로젝트 목표, 이해관계자 식별, 열린 질문 문서화, 잠재 솔루션</p>
</li>
<li><p>컨셉리뷰 : 디자이너 &amp; 리서처
디자인 리뷰 완료, 디자인 피드백 적용, 선택 솔루션 의견 합일</p>
</li>
<li><p>제품 솔루션 : 디자이너
디자인 리뷰 완료, 디자인과 개발팀 의견 합일, 디자인 세부사항 문서화, 최종 디자인 승인</p>
</li>
<li><p>사전 실험 : 엔지니어, 마케팅 매니저
마켓 플래닝 구축, 개발 완료, 디자인 QA 완료, 출시결정</p>
</li>
<li><p>정식 출시와 회고 : 모두 
성공 지표, 다음 스텝</p>
</li>
</ol>
<p><br /><br /><br /></p>
<h2 id="도메인-콘텐츠">도메인 콘텐츠</h2>
<p><br /><br /><br /></p>
<h2 id="도메인-saas">도메인 SaaS</h2>
<p><br /><br /><br /></p>
<h2 id="ux-라이팅">UX 라이팅</h2>
<h3 id="ux-라이팅-1">UX 라이팅</h3>
<ul>
<li><p>역할</p>
<ul>
<li>단계별로 필요한 정보를 인지/이해 시킨다. Awareness, Understanding</li>
<li>기능/서비스를 수행할 수 있도록 행동을 끌어낸다. Guidance, Nudge</li>
</ul>
</li>
<li><p>특징 </p>
<ol>
<li>기본 원칙과 제약 존재 
프로덕트의 UX 플로우에서 각 여정마다의 맥락을 살피며 UI컴포넌트, 그래픽에 적합해야 함 = 간결하고 직관적인 글</li>
<li>프로덕트 = 서비스
고객의 목표 달성을 도와 신뢰와 충성도 구축 / 서비스 효율과 이용 가치를 높여 비즈니스 성과에 기여</li>
</ol>
</li>
<li><p>Copywriting vs UX Writing</p>
</li>
</ul>
<h3 id="보이스앤톤">보이스앤톤</h3>
<ul>
<li>브랜드만의 라이팅 기준, 원칙 <img src="https://velog.velcdn.com/images/sjgaru-dev/post/13c35d45-d99f-48c3-8e2e-92712344ee1f/image.png" alt=""></li>
</ul>
<ul>
<li><p>Voice 목소리</p>
<ul>
<li>브랜드의 핵심 가치를 전하는 수단(기조)</li>
<li>핵심 가치와 동일하게 변함 없는 목소리</li>
</ul>
</li>
<li><p>Tone 말투</p>
<ul>
<li>고객을 응대하는 브랜드의 태도</li>
<li>고객이 놓인 상황에 맞춰 다르게 적용</li>
</ul>
</li>
<li><p>Vision System &gt; Brand Definition &gt; Core Value &gt; Voice &amp; Tone</p>
</li>
</ul>
<ul>
<li>A list of 37 words describing tone of voice by Nielsen Norman Group 
<code>권위 있는    배려하는, 보살피는        발랄한, 쾌활한    거친        보수적인        구어체의
격식을 차리지 않는        건조한, 딱딱한        예민한, 신랄한        열광하는 ...</code></li>
</ul>
<br />

<h3 id="ux-writing-기본-원칙">UX Writing 기본 원칙</h3>
<ul>
<li><p>고객 관점에서 쓰기 
서비스 제공자의 입장이 아닌 고객 중심의 용어 
극도로 부정적인 표현은 지양
능동형을 기본으로 (행위의 주체 고려)</p>
</li>
<li><p>쉽고 명료하게 쓰기
모두가 이해할 수 있도록 복잡한 표현, 전문 용어, 유행어 지양
문제가 발생한 상황: 원인과 해결방법을 쉽게 파악할 수 있도록!
새로운 기능을 설명할 땐 목적과 쓰임을 예상할 수 있게
버튼은 고객이 해야 할 행동이나 결과 = 고객의 대답
다음 화면을 예상할 수 있도록!
핵심부터 빠르게 파악하도록 결론부터 언급</p>
</li>
<li><p>간결하게 쓰기
의미 없거나 중복된 표현, 과도한 수식어, 불필요한 행정 용어는 최소화
전달하고자 하는 내용이 많을 땐 한 문장에 한 내용만
여러 내용을 안내해야 할 땐 bullet point 혹은 컴포넌트 분리
제 위치의 역할을 못하는 문장 가지치기</p>
</li>
<li><p>일관성 있게 쓰기
기능명, 서비스명, 용어, 가리키는 말 모두 통일!</p>
</li>
</ul>
<h3 id=""></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[241217 UXUI - 1]]></title>
            <link>https://velog.io/@sjgaru-dev/241217-UXUI</link>
            <guid>https://velog.io/@sjgaru-dev/241217-UXUI</guid>
            <pubDate>Tue, 17 Dec 2024 08:26:11 GMT</pubDate>
            <description><![CDATA[<h2 id="개론">개론</h2>
<ul>
<li>UX user experience (사용자 경험) : <strong>전체</strong></li>
<li>UI interface (사용자 인터페이스) : <strong>접점</strong></li>
<li>Usability(사용성) : <strong>측정</strong><pre><code>- 효과(Effectiveness), 효율성(Efficiency), 만족도(Satisfaction)를 가지고 특정 목표를 달성할 수 있는 정도나 범위
- 사용 편의성(Ease of use) 및 학습성(Learnability)</code></pre></li>
<li>UCD (User Centered Design) : <strong>철학</strong><pre><code>- 철학적 접근 방법이자 디자인 사상
- 시스템, 기능중신, 직관적, 연구중심</code></pre></li>
</ul>
<ul>
<li>UX user &lt; CX customer &lt; BX brand</li>
<li>Design Thinking : 비즈니스 전략에 대한 요구를 충족시키기 위해 디자이너의 감수성과 작업방식을 이용하는 사고방식 ( 협업 + 공감 )
<br /><br /></li>
<li>비즈니스 모델 캔버스 
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/63e92ccd-9d39-4c2f-9005-efc7a2c50838/image.png" alt=""><br /></li>
<li>린 캔버스
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/b68ca790-7a42-45d5-9736-d61ae468ec1b/image.png" alt=""></li>
<li>제품, 고객, 시장 리스크
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/48fc2145-682c-45eb-8571-2b7fd82a6f18/image.png" alt=""></li>
</ul>
<p><br/><br/><br/></p>
<h2 id="유저-리서치">유저 리서치</h2>
<h3 id="페르소나">페르소나</h3>
<ul>
<li>사용자 세분화 : 목적, 불만사항, 니즈 등을 X, Y축으로 구분<pre><code>- 사진, 이름, 직업 
- 나는 누구? (평소 생활 : 전기) ,  관심사, 사고방식 
- 제품 사용 이유, 사용을 꺼려하는 이유
- 숙련도 , 목표 , 사회활동</code></pre></li>
</ul>
<h3 id="조사">조사<img src="https://velog.velcdn.com/images/sjgaru-dev/post/8854c915-7153-4c9c-8c1e-eac9bda1415a/image.png" alt=""><img src="https://velog.velcdn.com/images/sjgaru-dev/post/e04aebd5-6897-4aa4-8c9b-971780db0da4/image.png" alt=""><img src="https://velog.velcdn.com/images/sjgaru-dev/post/c2260d0f-2dfa-411f-9c35-09119ce1e1d2/image.png" alt=""></h3>
<h3 id="유의점">유의점</h3>
<ul>
<li>인터뷰 : 집단사고 (Ground think) <pre><code>- 흔히 집단 구성원들간에 강한 응집력을 보일 때 발생
- 의사결정시에 만장일치에 도달하려는 분위기로 인해
- 현실적인 다른 대안들을 외면하게 되는 왜곡되고 비합리적인 사고방식</code></pre></li>
<li>포트 저널 : 호손효과 (Hawthorne effect)<pre><code>- 다른 사람의 시선을 인식할 때, 본래 의도나 천성과 다르게 행동하는 현상
- 사전동의하에 카메라 설치 후, 하루 이틀후면 조사대상도 무신경해짐
- 이때부터 무의식적인 사용자의 실제 행동관찰 가능 </code></pre></li>
<li>온라인 설문조사 : 리커트 척도 (Likert Scale)<pre><code>- 설문조사에 사용되는 심리검사 응답척도의 하나 : 반대되는 질문(R)을 숨겨놓음 
- 응답자가 제시된 문장에 대해 얼마나 동의하는지를 답변하도록 함 : 그냥 무조건 5점, R도 5점 X </code></pre></li>
</ul>
<p><br /><br /></p>
<h2 id="ux-데이터-모델링">UX 데이터 모델링</h2>
<h3 id="친화도-분석">친화도 분석<img src="https://velog.velcdn.com/images/sjgaru-dev/post/12512ea3-ecf7-4a2c-abed-dee66611dfcf/image.png" alt=""></h3>
<h3 id="이해관계자-관계-표시">이해관계자 관계 표시<img src="https://velog.velcdn.com/images/sjgaru-dev/post/b48be3e1-56a8-430a-a792-66337d8fca04/image.png" alt=""></h3>
<h3 id="공감지도-생각">공감지도 (생각) <img src="https://velog.velcdn.com/images/sjgaru-dev/post/a4d346be-48a4-4f1f-b06e-ac6fdf045bcb/image.png" alt=""></h3>
<h3 id="여정지도-jouney-map">여정지도 Jouney Map</h3>
<ul>
<li>퍼소나 &gt; 단계와 개요 &gt; 스토리보드 &gt; 터치포인트 및 채널 &gt; 백스테이지 &gt; 스토리보드 &gt; 만족도 &gt; 문제 및 원하는 것 &gt; 해결 방안 및 아이디어</li>
</ul>
<h3 id="서비스-디자인-참고용">서비스 디자인 (참고용)</h3>
<ul>
<li>서비스의 품질과 서비스 제공자와 그 고객 사이의 상호작용을 개선하기 위해 서비스의 인력, 인프라, 통신 및 구성요소를 계획하고 구성하는 활동<pre><code>- 인간중심 : 서비스에 영향 받는 모든 사람들의 경험을 고려
- 협업 : 다양한 배경과 역할을 담당하는 이해관계자들이 디자인 프로세스에 활발히 참여
- 반복 : 반복적인 실험과 검증을 통해 접근
- 순서 : 관련 행동들이 순차적으로 시작
- 실제 : 요구사항은 실제리서치에서 발견,프로토타입 역시 실제 현실에서 구현
- 전체 : 전체 서비스와 비즈니스의 관점에서 이해관계자의 요구사항을 만족</code></pre></li>
</ul>
<p><br /><br /></p>
<h2 id="디자인-노하우">디자인 노하우</h2>
<h3 id="기능-구조화">기능 구조화</h3>
<ul>
<li>정보구조 IA : 분류와 계층 , 네비게이션 , 검색 , 레이블링</li>
<li>사이트 맵 </li>
<li>플로우 차트 </li>
<li>유저 플로우</li>
<li>레이블 : 카드 소팅<ul>
<li>오픈 / 클로즈드 카드 소팅 : 네이밍 가능여부</li>
<li>멘탈모델</li>
</ul>
</li>
</ul>
<h3 id="사용성-분석">사용성 분석</h3>
<ul>
<li>사용성 테스트 (Usability Test)<ul>
<li>대면 / 비대면
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/6f6c3b9a-8e6b-49b3-a707-6e4a26773d09/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li><p>평가 (Evaluation)</p>
<ul>
<li>휴리스틱 평가 (Heuristic) : 체험적이고, 경험적인. 최소 3명, 평균 5명 평가자    <blockquote>
<ol>
<li>제품 상태의 가시성 : 제품은 현재의 상태에 대해 사용자에게 적절한 반응을 적시에 제공해야 한다. </li>
<li>제품과 사용자 현실 세계의 조화 : 제품은 사용자에게 친숙한 언어로 사용자와 소통해야 한다.</li>
<li>사용자에게 자유와 주도권 제공 : 제품은 사용자가 실수를 해도 언제든지 취소 또는 재실행 할 수 있는 방법을 제공해야 한다.</li>
<li>일관성과 표준성 : 사용자가 혼란스럽지 않도록 제품이 사용하는 정보 표현방법, 인터페이스등이 일관성이 있어야 한다.</li>
<li>오류방지 : 사용자가 실수할 수 있는 상황을 제거하여 미연에 사용자 실수를 방지해야 한다.</li>
<li>보는 것만으로도 이해할 수 있는 디자인 : 사용자가 제품을 이용하는데 기억에 의존하지 않도록 직관적으로 디자인되어야 한다.</li>
<li>유연성과 효율성 : 제품은 초보자나 숙련자 모두 유연하게 사용할 수 있아야 한다.</li>
<li>심미적이고 단순한 디자인 : 제품은 불필요한 정보를 배제하여 가능한 단순하고 미학적으로 아름다운 디자인을 제공해야 한다.</li>
<li>사용자가 오류를 인식하고 진단하고 복구할 수 있도록 지원 : 제품을 사용하는 사용자들이 스스로 상황을 인식하고 대처할 수 있는 방법을 제공해야 한다.</li>
<li>도움말과 설명서 : 제품은 도움말, 매뉴얼 등을 제공하여 사용자가 쉽게 사용할 수 있도록 해야 한다.  </li>
</ol>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sjgaru-dev/post/d1fd7397-9022-41b9-a16e-f0babd6fc56d/image.png" alt=""></p>
</li>
</ul>
<h3 id="벤치마킹">벤치마킹</h3>
<ul>
<li>비즈니스 </li>
<li>정보구조</li>
<li>사용성</li>
<li>SEQ (single ease question) 을 통한 벤치마킹 : 동일한 테스크를 완료한 후 전반적으로 얼마나 어렵거나 쉬웠는지를 측정하여 여러 회사를 비교 분석</li>
</ul>
<p><br /><br /></p>
<h2 id="모바일-ux">모바일 UX</h2>
<h3 id="픽셀-밀도">픽셀 밀도</h3>
<ul>
<li>옛날 일반 디스플레이 72ppi 기준</li>
<li>PT ( Point ) = DP ( Density-Independent Pixel ) 
PPI ( Pixel per Inch ) = DPI ( Dot per Inch )</li>
<li>4배수 xxxxhdpi</li>
</ul>
<h3 id="앱-아이콘">앱 아이콘</h3>
<ul>
<li>ios 20 x 20 x @3x </li>
<li>and 48 x 48 (3x)</li>
</ul>
<p><br /><br /></p>
<h2 id="uxui-디자인-심리학">UX/UI 디자인 심리학</h2>
<h3 id="00의-심리학-법칙"><a href="https://post.naver.com/viewer/postView.naver?volumeNo=35698262&amp;memberNo=6457418&amp;vType=VERTICAL">00의 심리학 법칙</a></h3>
<h3 id="게슈탈트-심리학">게슈탈트 심리학</h3>
<p><br /><br /></p>
<h2 id="디자인-시스템">디자인 시스템</h2>
<h3 id="구성-요소">구성 요소</h3>
<ul>
<li>레이아웃 : 간격 , 그리드시스템</li>
<li>스타일 : 컬러 , 아이코노그라피 , 타이포그라피</li>
<li>컴포넌트 : 버튼, 폼 등의 UI요소</li>
<li>패턴 : 내비게이션, 검색 등의 패턴</li>
<li>컨텐츠 : 용어 , 보이스톤</li>
<li>사용성 : 접근성 , 글로벌 서비스 원칙
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/f511dfb2-5d56-4e36-b0ac-898957505bb6/image.png" alt=""></li>
</ul>
<br/>

<h3 id="vs">vs</h3>
<ul>
<li>스타일 가이드 
브랜드 요소가 UI에 적용되는 방법을 제공 ( 컬러, 아이코노그라피, 타이포그라피 제공)</li>
<li>컴포넌트 라이브러리 
팀내에서 사용되는 공통 스타일과 컴포넌트 제공 (디자인 툴을 통해 자동 동기화되며 추가적으로 코드 제공)</li>
<li>디자인 시스템
엘러먼트, 컴포넌트, 영역 등을 문서와 코드로 제공 (디자인 원칙과 규칙 등을 추가적으로 제공)
<a href="https://adele.uxpin.com/">https://adele.uxpin.com/</a></li>
</ul>
<p><br /><br /></p>
<h2 id="디자인-데이터-전달">디자인 데이터 전달</h2>
<h3 id="디자인-핸드오프-hand-0ff">디자인 핸드오프 hand-0ff</h3>
<ul>
<li>좌표, 크기, 컬러 / 플로우 / 레이아웃  / 에셋 / 인터랙션  / 코멘트</li>
</ul>
<h3 id="제플린">제플린</h3>
<h3 id="오버플로우">오버플로우</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[241216 - PMPO]]></title>
            <link>https://velog.io/@sjgaru-dev/241216-PM01-P1</link>
            <guid>https://velog.io/@sjgaru-dev/241216-PM01-P1</guid>
            <pubDate>Mon, 16 Dec 2024 12:39:59 GMT</pubDate>
            <description><![CDATA[<h2 id="1-문제발견-및-기회-창출">1. 문제발견 및 기회 창출</h2>
<h3 id="페인포인트">페인포인트</h3>
<ul>
<li>Journey Map</li>
<li>데이터 분석 <ul>
<li>분류 분석 : 제품 및 속성에 대한 분류 체계 마련하여 분석하는 방법</li>
<li>감성 분석 : 긍정어, 부정어에 대한 사전 구축을 통해 뉘앙스 파악</li>
<li>키워드 분석 : 언급이 많은 키워드를 파악하고, 감성 분석과 결합하여 분석</li>
</ul>
</li>
</ul>
<h3 id="spt">SPT</h3>
<ul>
<li>시장세분화 Segmentation : 인구통계학적 지리적 심리적 행동적</li>
<li>표적시장 Targeting : 우리 서비스를 선택할 가능성이 높은 핵심 소비자층</li>
<li>포지셔닝 Positionin : 잠재고객 마음속에 제품을 인지시키는 Identity, Image를 설정</li>
</ul>
<h3 id="swot-분석">SWOT 분석</h3>
<ul>
<li>강점Strengths , 약점Weaknesses , 기회 Opportunities , 위협 Threats
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/e4a91b4c-2e81-42f1-b928-6bad41ea8d0d/image.png" alt=""></li>
</ul>
<h3 id="차별화-전략">차별화 전략</h3>
<ul>
<li>제품(서비스) , 가격 , 이미지 
</br></br></br><h2 id="2-마켓리서치">2. 마켓리서치</h2>
<h3 id="ux리서치">UX리서치</h3>
</li>
<li>정성적 리서치 : why?<ul>
<li>사용자 인터뷰, 포커스 그룹 인터뷰, 필드 스터디</li>
</ul>
</li>
<li>정량적 리서치 : How many? How much?<ul>
<li>A/B test, 사용자 설문, 웹로그 분석
</br></br></br></li>
</ul>
</li>
</ul>
<h2 id="3-사용자--서비스-분석">3. 사용자 &amp; 서비스 분석</h2>
<h3 id="페르소나">페르소나</h3>
<ul>
<li>실제 사용자들의 행동 패턴과 특징을 수집하여 = 근거있게 만들어진 주요 고객을 대표하는 특정 인물</li>
<li>기본정보 : 프로필, 이름, 나이, 성별, 직업, 거주지</li>
<li>니즈파악 : 동기, 불만사항, 목적<h3 id="저니맵">저니맵</h3>
</li>
<li><a href="https://www.slidesalad.com">https://www.slidesalad.com</a>   customer journey map</li>
<li>고객 또는 잠재고객이 회사에서 목표를 달성하기 위해서 거치는 프로세스를 시각적으로 표현한 것<ul>
<li>고객의 동기 motivation , 즉 고객의 니즈 needs, 고충 pain point 파악</li>
<li>고객 중심의 사고방식, 서비스 개선의 우선순위, 새로운 타겟 고객층 발굴</li>
</ul>
</li>
</ul>
<p>① Phase ② User Action ③  User Feeling ④ Touch Point ⑤ Strength ⑥ Weakness ⑦ Opportunities 
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/8b770590-6817-455e-8570-7a55476ee9db/image.png" alt=""></p>
<h3 id="ab-test">AB Test</h3>
<ul>
<li>서비스분석 &gt; 가설수립 &gt; AB 디자인 &gt; 테스트 진행 &gt; 분석 및 의사결정 &gt; 고객경험 개선</li>
<li>사용자 그룹분리 <ul>
<li>노출 분산 방식 : 페이지가 보여질 때 일정 확률로 A와 B를 나눠 노출함</li>
<li>사용자 분산 방식 : 사용자를 A그룹과 B그룹으로 분리하여 고정적으로 A안과 B안을 노출함</li>
<li>시간 분할 방식 : 시간대를 분할하여 A안과 B안을 노출</li>
</ul>
</li>
<li>결과 데이터분석 <a href="https://abtestguide.com/calc/">https://abtestguide.com/calc/</a></li>
<li>AB테스트 사례 <a href="https://goodui.ogr/leaks">https://goodui.ogr/leaks</a></li>
</ul>
<p></br></br></br></p>
<h2 id="4-uxui">4. UXUI</h2>
<p></br></br></br></p>
<h2 id="5-기획부터-런칭-운영-회고">5. 기획부터 런칭, 운영, 회고</h2>
<p><img src="https://velog.velcdn.com/images/sjgaru-dev/post/d65b1ad7-f5e8-4e01-8400-4d12e381848b/image.png" alt=""></p>
<h3 id="목표설정">목표설정</h3>
<ul>
<li>OKR (Objective &amp; Key Results  목표 &amp; 핵심결과지표)
회사, 팀 등의 조직 및 구성원 개인들의 목표를 설정하고 성과를 측정할 수 있는 방법</li>
<li>이상적+공격적으로 목표 설정하고, 핵심 결과는 측정 가능</li>
<li>CFR : Conversation 대화 ㅡ Feedback 피드백 ㅡ Recognition 인정 (단기적, 갱신)</li>
<li>vs KPI (Key Performance Indicator)</li>
</ul>
<h3 id="제품로드맵">제품로드맵</h3>
<ul>
<li>시간 경과에 따라서 제품/서비스 또는 팀의 비전, 방향, 우선순위에 따라 제품/서비스가 앞으로 어떻게 진행될 것인지 나타내는 문서</li>
<li>제품의 전략, 방향성과 명확하게 연결되어야 함</li>
<li>고객 피드백 및 경쟁 환경의 변화에 대응해</li>
<li><a href="https://www.productplan.com">https://www.productplan.com</a> ,  <a href="https://www.aha.io/roadmaps">https://www.aha.io/roadmaps</a> 
<a href="https://miro.com">https://miro.com</a> , <a href="https://marimba.team">https://marimba.team</a> , </li>
</ul>
<h3 id="요구사항-정의서-prd-product-requirements-document">요구사항 정의서 PRD (Product Requirements Document)</h3>
<ul>
<li>기획단계 : 왜 이 제품/서비스를 만들어야 하는가?</li>
<li>각 이해관계자들의 관점 차이를 해소, 기획한 의도 및 주요기능을 유관부서 등에게 명확하게 전달</li>
<li>구성요소 <ul>
<li>개요 : 문제정의, 목적 및 배경, 유저, 유저 스토리/저니맵, 사용자 가치, 개발 원칙 </li>
<li>기회 및 임팩트 : 기회, 가설 및 가설 검증지표, 임팩트 예측(사용자가 얻게 될 가치)</li>
<li>제품 정의 및 요구사항 , 마일스톤 또는 WBS , FAQ</li>
</ul>
</li>
</ul>
<h3 id="wbs-work-breakdown-structure">WBS (Work Breakdown Structure)</h3>
<h3 id="정보구조도-ia-information-architecture">정보구조도 IA (Information Architecture)</h3>
<ul>
<li>패턴
  계층 Hierarchy , 탭 Taps , 허브 앤 스포크 Hub Spoke , 라이너 Linear , 네스트 돌 Nested Doll , 벤토 박스 Bento Box </li>
</ul>
<h3 id="와이어프레임">와이어프레임</h3>
<ul>
<li>포함할 내용<pre><code>- 화면에 어떤 정보가 나타나야 하는지?
- 어떤 레이아웃, 모습을 보여줘야 하는지? 
- 세부 컨텐츠가 있다면 어떻게 표현해야하는지?
- 다음 화면으로는 어떻게 이어지는지? 
- 공통영역 (내비게이션, 푸터 등)은 적절히 기능을 하는가?</code></pre></li>
<li>프로토타입</li>
</ul>
<h3 id="스토리보드">스토리보드</h3>
<ul>
<li>스토리보드 = 상세기획서 = 화면설계서</li>
<li>구성요소 <pre><code>- 서비스 개요 : 목표, 주요기능 
- 서비스 구성 : IA, 서비스 정책 • 주요 서비스 프로세스 
- 상세 기획 : UI 시나리오 • 화면별 와이어프레임 + 기능 상세설</code></pre><h3 id="테스트">테스트</h3>
</li>
<li>QA (Quality Assuran)
순서 : 기획서 분석 &gt; 테스트 범위 설정 (단말 등) &gt; 테스트 케이스 (Test Case, T/C) 검토 및 작성 &gt; 테스트 진행 &gt; 버그 리포트 &gt; 최종 테스트 진행 &gt; 결과 리포트 작성</li>
<li>기능단위 테스트, 세니티 테스트</li>
</ul>
<h3 id="회고">회고</h3>
<ul>
<li>KPT (Keep, Problem, TRY) </li>
<li>타임라인</li>
<li>5F : 사실 Fact , 느낌 Feeling , 교훈 Finding , 향후 행동 Future action , 피드백 Feedback 
</br></br></br><h2 id="6-데이터-흐름">6. 데이터 흐름</h2>
<h3 id="mvp-minimum-viable-product">MVP Minimum Viable Product</h3>
</li>
<li>Build &gt; Measure &gt; Learn &gt; Build ...</li>
<li>Product-Market Fit (Product , Price , Market)</li>
</ul>
<h3 id="그로스해킹">그로스해킹</h3>
<ul>
<li>리텐션 (Retention) , 전환율 (Conversion) , 순수 추천 지수 (Net Promotor Score , NPS)
<img src="https://velog.velcdn.com/images/sjgaru-dev/post/6baae3cb-98ad-4733-addb-3ac51603e2e7/image.png" alt=""></li>
</ul>
<h3 id="aarrr">AARRR</h3>
<p><img src="https://velog.velcdn.com/images/sjgaru-dev/post/384abdb5-60d0-4f1f-9cc4-0408db1578c8/image.png" alt=""></p>
<h3 id="omtm">OMTM</h3>
<ul>
<li>One Metric That Matters<ul>
<li>지금 가장 중요한 한가지 지표의 약자</li>
<li>제품/서비스 성공의 핵심 중 하나는 정확한 목표/방향을 정하고 그것을 유지하는 것</li>
<li>OMTM은 고정되지 않고, 시간이 흐르면서 변함</li>
</ul>
</li>
<li>좋은 지표 : 상대적, 이해하기 쉽다, 비율로 표현, 행동을 바꾼다</li>
<li>올바른 지표 : 정성적/정량적 , 허상/실질 , 탐색/보고 , 선행/후행 , 상관/인과 지표</li>
<li>vs KPI </li>
</ul>
<h2 id="7-etc">7. ETC</h2>
<h3 id="okr-objective---key---results">OKR Objective - Key - Results</h3>
<ul>
<li>목표를 정하고, 달성했는지 측정할 수 있는 결과지표 설정</li>
<li>목표는 가슴 뛰게, 결과지표는 너무 쉽지도 어렵지도 않게</li>
<li>현실적으로 C레벨 x 불가능 = 결과지표를 통해서 방향성을 제시, 이끌어 가는 것이 최중요</li>
<li>달성하기 위한 규칙을 반드시 설정</li>
<li>끊임 없이 결과지표를 구성원들에게 리마인드</li>
<li>우선순위를 정할 때 반드시 핵시결과를 중심으로 논의 : 달성 = 성과보상 , 실패 = 원인분석</li>
</ul>
<h3 id="프로세스">프로세스</h3>
<ul>
<li>상위기획 <pre><code>- 사업결과, 데이터, 트렌드, 리서치 등을 바탕으로 서비스 제안배경과 근거 제시
- 보고 및 의사결정 또는 제품 조직 구성원에게 배경 설명
- 컨셉이해를 돕기 위한 목업과 대략적인 로드맵 포함</code></pre></li>
<li>PRD <pre><code>- 사업결과, 데이터, 트렌드, 리서치 등을 바탕으로 서비스 제안배경과 근거 제시
- 무엇을 왜 어떻게 만들어야 하는지에 대한 구체적인 형상을 정의
- 핵심 기능 명세와 피쳐를 명시, 구체적으로 협의 가능한 수준의 프로젝트 마일스톤 제시</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/sjgaru-dev/post/dfca0939-37bc-4ae9-b0ab-7030f156158b/image.png" alt=""></p>
<h3 id="프로토타입">프로토타입</h3>
<ul>
<li>Low/High Fidelity : 사용자의 실제 인터랙션을 시뮬레이션하고 실험하기 위한 UI/UX 프로토타입</li>
<li>Proof of concept : 기술적인 관점에서 제품을 실제로 구현해낼 수 있는지 실험 (feat. 코드 with 엔지니어)</li>
<li>Minimum viable product : 최소한의 실제 기능과 데이터로 사용자의 특성을 수집하는 프로토타입</li>
<li>Wizard of OZ : 완성된 제품 같지만 뒤에서 모든 것을 사람이 수행하며 사용자의 실제 니즈를 검증하는 프로토타입</li>
<li>Fake door demand : 진짜 같은 링크를 제공하고, 사용자가 클릭하면 테스트임을 알려 수요를 측정하는 프로토타입</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[서비스기획 특강]]></title>
            <link>https://velog.io/@sjgaru-dev/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%ED%8A%B9%EA%B0%95</link>
            <guid>https://velog.io/@sjgaru-dev/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%ED%8A%B9%EA%B0%95</guid>
            <pubDate>Fri, 04 Oct 2024 01:03:18 GMT</pubDate>
            <description><![CDATA[<h3 id="애자일-방법론">애자일 방법론</h3>
<ul>
<li>워터폴 방식은 순차적, 애자일은 반복적이고 유연한 접근법</li>
<li>스크럼은 가장 널리 사용되는 애자일 프레임워크 중 하나</li>
<li>변화에 빠르게 대응하고 지속적인 개선을 강조</li>
</ul>
<h3 id="사용자-중심-설계-ux">사용자 중심 설계 (UX)</h3>
<ul>
<li>UX는 단순히 사용자가 말하는 것이 아닌 실제 원하는 것을 파악하는 것</li>
<li>컨텍스트, 행동, 니즈, 태도, 동기를 종합적으로 이해해야 함</li>
<li>관찰을 통해 핵심 인사이트를 도출하는 과정이 중요</li>
</ul>
<h3 id="mvp-minimum-viable-product-개념">MVP (Minimum Viable Product) 개념</h3>
<ul>
<li>최소한의 기능으로 사용자 가치를 검증하는 제품</li>
<li>빠른 출시와 피드백 수집을 통한 제품 개선에 초점</li>
<li>린 스타트업 방법론과 밀접하게 연관됨</li>
</ul>
<h3 id="문제-정의">문제 정의</h3>
<ul>
<li>5 Whys: 문제의 근본 원인을 찾기 위해 연속적으로 &quot;왜?&quot;를 질문하는 기법</li>
<li>AS-IS와 TO-BE 분석: 현재 상태와 목표 상태를 명확히 정의하여 문제 해결 방향 설정</li>
</ul>
<h3 id="페르소나">페르소나</h3>
<ul>
<li>타겟 사용자 그룹을 대표하는 가상의 인물 프로필 작성</li>
<li>이름, 나이, 직업, 행동 패턴, 니즈, 페인 포인트 등을 상세히 기술</li>
<li>Coupang, Volla 등의 실제 예시를 통해 페르소나 작성 방법 학습</li>
</ul>
<h3 id="사용자-스토리-작성법">사용자 스토리 작성법</h3>
<ul>
<li>&quot;As a [role], I want to [action], so that [benefit]&quot;</li>
<li>사용자의 관점에서 기능과 가치를 정의</li>
<li>Trello를 활용해 사용자 스토리를 관리하고 우선순위 설정</li>
</ul>
<h3 id="제품-기획-도구">제품 기획 도구</h3>
<ul>
<li>WBS: 프로젝트 작업을 구조화하고 세분화하는 도구</li>
<li>Product Board: 제품 로드맵과 우선순위를 시각화하는 도구</li>
<li>PRD: 제품 요구사항을 상세히 문서화하는 도구</li>
</ul>
<h3 id="제품-팀-구성-및-역할">제품 팀 구성 및 역할</h3>
<ul>
<li>PM/PO: 제품 비전 수립 및 백로그 관리</li>
<li>UX/UI 디자이너: 사용자 경험 및 인터페이스 설계</li>
<li>개발자: 프론트엔드, 백엔드, DevOps 등 기술 구현</li>
<li>QA: 품질 보증 및 테스트 수행</li>
</ul>
<h3 id="회고-retrospective-방법">회고 (Retrospective) 방법</h3>
<ul>
<li>KPT: Keep (유지할 점), Problem (문제점), Try (시도할 점)</li>
<li>4Ls: Liked, Lacked, Learned, Longed for</li>
<li>Mad/Sad/Glad: 감정을 기반으로 한 회고</li>
<li>기타: Start/Stop/Continue, Sail boat, Starfish, Speed Car 등</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[김민태 FE_DEV 소프트웨어 테스트 특강]]></title>
            <link>https://velog.io/@sjgaru-dev/%EA%B9%80%EB%AF%BC%ED%83%9C-FEDEV-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%8A%B9%EA%B0%95</link>
            <guid>https://velog.io/@sjgaru-dev/%EA%B9%80%EB%AF%BC%ED%83%9C-FEDEV-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%8A%B9%EA%B0%95</guid>
            <pubDate>Wed, 25 Sep 2024 08:59:43 GMT</pubDate>
            <description><![CDATA[<p>E2E는 토이 프로젝트 때 해봤는데, 
JEST를 실습으로 직접 해보면서 어떻게 적용할 수 있을지 배워보았다. 
전혀 어떻게 해야하는지도 모르겠지만, 그래도 AI가 있으니까!</p>
<p>CI/CD는 원래 관심있던 DevOps 부분이라 쉬웠던 느낌.</p>
<p></br></br></br></p>
<h3 id="테스트의-종류--e2e-test--integration-test--unit-test">테스트의 종류 : E2E Test &lt; Integration Test &lt; Unit Test</h3>
<h4 id="unit-test-단위-테스트-cypress--playwright">Unit Test (단위 테스트): Cypress , Playwright</h4>
<ul>
<li>가장 작은 단위의 테스트</li>
<li>개별 함수, 메소드, 클래스 등 코드의 최소 단위를 테스트</li>
<li>다른 컴포넌트와의 의존성 없이 독립적으로 수행</li>
<li>빠르고 간단하며, 버그를 조기에 발견하는 데 도움</li>
</ul>
<h4 id="integration-test-통합-테스트">Integration Test (통합 테스트):</h4>
<ul>
<li>여러 단위를 결합하여 테스트</li>
<li>컴포넌트 간의 상호작용과 인터페이스를 검증</li>
<li>데이터베이스, 파일 시스템 등 외부 의존성을 포함할 수 있음</li>
<li>Unit Test보다 더 넓은 범위의 기능을 테스트</li>
</ul>
<h4 id="e2e-test-end-to-end-테스트">E2E Test (End-to-End 테스트):</h4>
<ul>
<li>가장 큰 규모의 테스트</li>
<li>실제 사용자 시나리오를 시뮬레이션하여 전체 시스템을 테스트</li>
<li>사용자 인터페이스부터 백엔드 시스템까지 모든 계층을 포함</li>
<li>실제 환경과 유사한 조건에서 수행되어 전체 시스템의 동작을 검증</li>
</ul>
<p></br></br></br></p>
<h3 id="cicd">CI/CD</h3>
<h4 id="ci-continuous-integration-지속적-통합">CI (Continuous Integration, 지속적 통합):</h4>
<ul>
<li>코드 변경사항을 주기적으로 중앙 저장소에 통합하는 프로세스</li>
<li>자동화된 빌드와 테스트를 통해 통합 과정에서 발생할 수 있는 문제를 조기에 발견</li>
<li>코드 품질 향상 및 버그 조기 발견에 도움</li>
</ul>
<h4 id="cd-continuous-delivery-지속적-전달">CD (Continuous Delivery, 지속적 전달):</h4>
<ul>
<li>코드 변경사항을 자동으로 테스트하고 프로덕션 환경으로 릴리스할 준비를 하는 과정</li>
<li>수동 승인 후 배포가 이루어짐</li>
<li>언제든 안정적으로 배포할 수 있는 상태를 유지</li>
</ul>
<h4 id="cd-continuous-deployment-지속적-배포">CD (Continuous Deployment, 지속적 배포):</h4>
<ul>
<li>Continuous Delivery의 한 단계 더 나아간 형태</li>
<li>코드 변경사항이 자동으로 프로덕션 환경에 배포됨</li>
<li>수동 개입 없이 전체 프로세스가 자동화됨
</br></br></br></li>
</ul>
<h3 id="mock-up">Mock-up</h3>
<ul>
<li>실제 객체나 프로세스를 시뮬레이션하는 가짜 객체</li>
<li>복잡한 의존성을 단순화하고, 특정 동작을 시뮬레이션</li>
<li>테스트 속도 향상, 의존성 제거, 특정 시나리오 테스트 용이성</li>
</ul>
<h4 id="msw-mock-service-worker-httpsmswjsio">MSW (Mock Service Worker) <a href="https://mswjs.io/">https://mswjs.io/</a></h4>
<ul>
<li>Industry standard API mocking for JavaScript.
자바스크립트를 위한 산업 표준 API 모킹.</li>
<li>Mock Service Worker is an API mocking library that allows you to write client-agnostic mocks and reuse them across any frameworks, tools, and environments.
MSW는 클라이언트에 구애받지 않는 목(mock)을 작성하고 이를 모든 프레임워크, 도구, 환경에서 재사용할 수 있게 해주는 API 모킹 라이브러리입니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[슬랙 대체품]]></title>
            <link>https://velog.io/@sjgaru-dev/%EC%8A%AC%EB%9E%99-%EB%8C%80%EC%B2%B4%ED%92%88</link>
            <guid>https://velog.io/@sjgaru-dev/%EC%8A%AC%EB%9E%99-%EB%8C%80%EC%B2%B4%ED%92%88</guid>
            <pubDate>Sun, 18 Aug 2024 18:28:44 GMT</pubDate>
            <description><![CDATA[<p><a href="https://betwe.tistory.com/entry/Docker-mattermost-%ED%98%91%EC%97%85-%ED%88%B4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0">https://betwe.tistory.com/entry/Docker-mattermost-%ED%98%91%EC%97%85-%ED%88%B4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[우분투 ssh 차단]]></title>
            <link>https://velog.io/@sjgaru-dev/%EC%9A%B0%EB%B6%84%ED%88%AC-ssh-%EC%B0%A8%EB%8B%A8</link>
            <guid>https://velog.io/@sjgaru-dev/%EC%9A%B0%EB%B6%84%ED%88%AC-ssh-%EC%B0%A8%EB%8B%A8</guid>
            <pubDate>Fri, 16 Aug 2024 09:27:45 GMT</pubDate>
            <description><![CDATA[<p>네, SSH 접속 시도가 일정 횟수 이상 실패하면 해당 IP를 자동으로 차단하는 방법이 있습니다. 이를 위해 주로 사용되는 도구는 &#39;fail2ban&#39;입니다. fail2ban을 사용하여 SSH 접속 시도 실패를 모니터링하고 IP를 차단할 수 있습니다. 다음은 Ubuntu 서버에서 fail2ban을 설정하는 방법입니다:</p>
<ol>
<li><p>fail2ban 설치:</p>
<pre><code>sudo apt update
sudo apt install fail2ban</code></pre></li>
<li><p>fail2ban 설정 파일 복사:</p>
<pre><code>sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</code></pre></li>
<li><p>jail.local 파일 편집:</p>
<pre><code>sudo nano /etc/fail2ban/jail.local</code></pre></li>
<li><p>[sshd] 섹션을 찾아 다음과 같이 수정:</p>
<pre><code>[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 10
bantime = 600</code></pre><p>여기서:</p>
<ul>
<li>maxretry: 차단 전 허용되는 최대 실패 횟수</li>
<li>bantime: 차단 지속 시간(초 단위, 600은 10분)</li>
</ul>
</li>
<li><p>fail2ban 서비스 재시작:</p>
<pre><code>sudo systemctl restart fail2ban</code></pre></li>
</ol>
<p>이렇게 설정하면 10번의 실패한 접속 시도 후에 해당 IP가 10분 동안 차단됩니다.</p>
<p>추가 팁:</p>
<ul>
<li>bantime을 -1로 설정하면 영구 차단할 수 있습니다.</li>
<li>findtime 옵션을 사용하여 실패 시도를 카운트할 시간 범위를 설정할 수 있습니다.</li>
<li>ignoreip 옵션을 사용하여 특정 IP를 차단 대상에서 제외할 수 있습니다.</li>
</ul>
<p>fail2ban은 SSH뿐만 아니라 다양한 서비스에 대해 유사한 보호를 제공할 수 있으므로, 서버 보안을 강화하는 데 매우 유용한 도구입니다.</p>
<p>sudo fail2ban-client get sshd banip
sudo fail2ban-client status sshd</p>
<p>네, 이 세 가지 보안 관련 도구들에 대해 자세히 설명해드리겠습니다.</p>
<ol>
<li>정기적인 로그 분석 (Logwatch):</li>
</ol>
<p>Logwatch는 시스템 로그를 분석하고 요약하는 도구입니다.</p>
<p>설치:</p>
<pre><code>sudo apt install logwatch</code></pre><p>사용:</p>
<ul>
<li>기본 설정으로 실행: <code>sudo logwatch</code></li>
<li>특정 기간 분석: <code>sudo logwatch --range All</code></li>
<li>특정 서비스 분석: <code>sudo logwatch --service sshd</code></li>
</ul>
<p>특징:</p>
<ul>
<li>다양한 로그 파일을 자동으로 분석</li>
<li>일일 이메일 보고서 생성 가능</li>
<li>사용자 정의 필터 및 보고서 옵션</li>
</ul>
<p>설정:</p>
<ul>
<li>주요 설정 파일: <code>/etc/logwatch/conf/logwatch.conf</code></li>
<li>사용자 정의: <code>/etc/logwatch/conf/override.conf</code></li>
</ul>
<ol start="2">
<li>취약점 스캐닝 (Lynis):</li>
</ol>
<p>Lynis는 UNIX 기반 시스템의 보안 및 시스템 강화를 위한 오픈 소스 도구입니다.</p>
<p>설치:</p>
<pre><code>sudo apt install lynis</code></pre><p>사용:</p>
<ul>
<li>전체 시스템 스캔: <code>sudo lynis audit system</code></li>
<li>특정 테스트 실행: <code>sudo lynis audit system --tests SSH-7408</code></li>
<li>보고서 생성: <code>sudo lynis audit system --auditor &quot;Your Name&quot; --report-file /tmp/report.dat</code></li>
</ul>
<p>특징:</p>
<ul>
<li>시스템 구성, 소프트웨어 패치, 악성 소프트웨어 등을 검사</li>
<li>상세한 로그 및 보고서 제공</li>
<li>보안 강화를 위한 제안 사항 제공</li>
</ul>
<ol start="3">
<li>시스템 모니터링 (Zabbix):</li>
</ol>
<p>Zabbix는 네트워크와 애플리케이션을 모니터링하는 엔터프라이즈급 오픈 소스 솔루션입니다.</p>
<p>설치 (Ubuntu 20.04 기준):</p>
<pre><code>wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb
sudo dpkg -i zabbix-release_5.0-1+focal_all.deb
sudo apt update
sudo apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent</code></pre><p>데이터베이스 설정, 웹 인터페이스 설정 등 추가 단계가 필요합니다.</p>
<p>사용:</p>
<ul>
<li>웹 인터페이스를 통해 대시보드에서 모니터링</li>
<li>명령줄에서 상태 확인: <code>zabbix_get -s 127.0.0.1 -k system.cpu.load[all,avg1]</code></li>
</ul>
<p>특징:</p>
<ul>
<li>실시간 모니터링 및 알림</li>
<li>성능 및 가용성 모니터링</li>
<li>사용자 정의 대시보드 및 보고서</li>
<li>분산 모니터링 지원</li>
</ul>
<p>이 도구들을 효과적으로 사용하려면 초기 설정과 주기적인 관리가 필요합니다. Logwatch는 일일 로그 분석에, Lynis는 주간 또는 월간 보안 검사에, Zabbix는 지속적인 시스템 모니터링에 적합합니다. 각 도구의 문서를 참조하여 서버 환경에 맞게 구성하는 것이 중요합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스터디 네트워크 6]]></title>
            <link>https://velog.io/@sjgaru-dev/%EC%8A%A4%ED%84%B0%EB%94%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-6</link>
            <guid>https://velog.io/@sjgaru-dev/%EC%8A%A4%ED%84%B0%EB%94%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-6</guid>
            <pubDate>Thu, 15 Aug 2024 20:17:35 GMT</pubDate>
            <description><![CDATA[<h2 id="인증">인증</h2>
<h3 id="1-basic-인증">1. BASIC 인증</h3>
<ul>
<li>① 클라이언트 : 리퀘스트 
② 서버 : 401 응답, 인증 요청 
③ 클라이언트 : ID / PW  (Base64 : 암호화 X, 쉽게 복호화) 
④ 서버 : 성공 200, 실패 401 응답</li>
</ul>
<h3 id="2-digest-인증">2. DIGEST 인증</h3>
<ul>
<li>챌린지 코드를 사용해서 리스폰스 코드를 계산, 이 값을 송신하여 인증</li>
<li>① 클라이언트 : 리퀘스트
② 서버 : 401 응답 인증 요청 + <strong>패스워드 &amp; 챌린지코드 (nonce) 송신</strong> ,  realm/nonce 필수
③ 클라이언트 : 패스워드, 챌린지코드에서 리스폰스 코드를 계산해서 송신
④ 서버 : 성공 200, 실패 401 응답</li>
</ul>
<h3 id="3-ssl-클라이언트-인증">3. SSL 클라이언트 인증</h3>
<ul>
<li>클라이언트 인증서, 배포 설치 필요 → 비용발생</li>
<li>2-factor 인증</li>
</ul>
<h3 id="4-폼-베이스-인증">4. 폼 베이스 인증</h3>
<ul>
<li>사전 등록한 유저 정보로 웹 애플리케이션 측에 송신, 검증 </li>
<li>유저에게 세션ID 발행하고 인증 상태를 기록 → 쿠키로 세션 ID 검증</li>
</ul>
</br>

</br>

<h2 id="http--기능추가-프로토콜">HTTP + 기능추가 프로토콜</h2>
<h3 id="1-spdy">1. SPDY</h3>
<ul>
<li>병목현상 해소 목적</li>
<li>HTTP 클라이언트가 늘 서버로 정보 확인요청, 갱신X =&gt; 불필요한 통신 발생</li>
<li>클라이언스만 리퀘스트 가능, 리스폰스만은 X<ul>
<li>Ajax , Comet 로 사용성 개선 </li>
<li>HTTP 포르토콜의 근본적 제약 개선필요</li>
</ul>
</li>
</ul>
<h3 id="2-websocket">2. WebSocket</h3>
<ul>
<li>웹 서버와 클라이언트가 한번 접속을 확립하면 그 뒤의 통신을 모두 전용 프로토콜로 하는 방식<ul>
<li>서버 푸쉬 가능 , 통신량 삭감</li>
</ul>
</li>
</ul>
<h3 id="3-http20">3. HTTP/2.0</h3>
<ul>
<li>SPDY</li>
<li>HTTP Speed+Mobility</li>
<li>Hetwork-Friendly HTTP Upgrade</li>
</ul>
<h3 id="4-webdav">4. WebDAV</h3>
<ul>
<li>Web-based Distributed Authoring and Versioning </li>
<li>직접 파일 복사나 편집 작업등을 할 수 있는 분산 파일 시스템<ul>
<li>추가 개념 : 컬렉션, 자원, 프로퍼티, 잠금</li>
<li>추가 메소드 : PROPFIND. PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK</li>
<li>추가 상태코드 : 102 Processing, 207 Multi-Status, 422 Unprocessable Entity, 424, 507</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>